74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"gitea.maximumdirect.net/eric/promptkit/internal/domain"
|
|
)
|
|
|
|
type resolvedPromptDefinition struct {
|
|
definition *domain.PromptDefinition
|
|
hash string
|
|
}
|
|
|
|
func (r *Runner) resolvePromptDefinition(
|
|
ctx context.Context,
|
|
promptID string,
|
|
promptVersion string,
|
|
) (*resolvedPromptDefinition, error) {
|
|
if strings.TrimSpace(promptID) == "" {
|
|
return nil, fmt.Errorf("%w: prompt id is required", ErrInvalidRequest)
|
|
}
|
|
if r == nil || r.promptDefs == nil {
|
|
return nil, fmt.Errorf("%w: prompt repository is not configured", ErrPromptLoad)
|
|
}
|
|
|
|
definition, err := r.promptDefs.GetPromptDefinition(ctx, promptID, promptVersion)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %w", ErrPromptLoad, err)
|
|
}
|
|
if definition == nil {
|
|
return nil, fmt.Errorf("%w: prompt repository returned nil definition", ErrPromptLoad)
|
|
}
|
|
|
|
hash, err := hashPromptDefinition(definition)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: failed to hash prompt definition: %v", ErrPromptLoad, err)
|
|
}
|
|
return &resolvedPromptDefinition{definition: definition, hash: hash}, nil
|
|
}
|
|
|
|
// InspectPrompt resolves one explicit prompt without execution work.
|
|
func (r *Runner) InspectPrompt(
|
|
ctx context.Context,
|
|
promptID string,
|
|
promptVersion string,
|
|
) (*domain.PromptInspection, error) {
|
|
if strings.TrimSpace(promptID) == "" {
|
|
return nil, fmt.Errorf("%w: prompt id is required", ErrInvalidRequest)
|
|
}
|
|
select {
|
|
case <-ctx.Done():
|
|
return nil, fmt.Errorf("%w: %w", ErrPromptLoad, ctx.Err())
|
|
default:
|
|
}
|
|
|
|
selection, err := r.resolvePromptDefinition(ctx, promptID, promptVersion)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
inputs := make([]domain.PromptInput, len(selection.definition.Inputs))
|
|
copy(inputs, selection.definition.Inputs)
|
|
|
|
return &domain.PromptInspection{
|
|
PromptID: selection.definition.ID,
|
|
PromptVersion: selection.definition.Version,
|
|
PromptHash: selection.hash,
|
|
DefaultProfileID: selection.definition.DefaultProfile,
|
|
Inputs: inputs,
|
|
OutputContract: selection.definition.Validation,
|
|
}, nil
|
|
}
|