package cli import ( "context" "errors" "fmt" "testing/fstest" "gitea.maximumdirect.net/eric/notarius/internal/core/config" "gitea.maximumdirect.net/eric/scriptorium" ) const profileCheckPromptID = "notarius.profile.check" var profileCheckPromptFS = fstest.MapFS{ "prompts/profile-check.yaml": &fstest.MapFile{Data: []byte(`id: notarius.profile.check version: "1.0.0" default_profile: mistral-small-3 inputs: - name: transcript required: true messages: - role: user content: "{{input \"transcript\"}}" output: format: text validation_mode: none repair_attempts: 0 `)}, } func validateExplicitScriptoriumProfiles(ctx context.Context, cfg config.Config, profileIDs []string) error { if len(profileIDs) == 0 { return nil } engine, err := newProfileValidationEngine(cfg) if err != nil { return fmt.Errorf("load Scriptorium profiles: %w", err) } for _, profileID := range profileIDs { if _, err := engine.Prepare(ctx, scriptorium.RunRequest{ PromptID: profileCheckPromptID, ProfileID: profileID, Inputs: map[string]scriptorium.ArtifactRef{ "transcript": scriptorium.Inline("profile check"), }, }); err != nil { if errors.Is(err, scriptorium.ErrProfileNotFound) { return fmt.Errorf("Scriptorium profile %q is not configured", profileID) } return fmt.Errorf("validate Scriptorium profile %q: %w", profileID, err) } } return nil } func newProfileValidationEngine(cfg config.Config) (*scriptorium.Engine, error) { opts := []scriptorium.Option{ scriptorium.WithPromptFS(profileCheckPromptFS, "prompts"), } if cfg.Scriptorium.ProfileFile != "" { opts = append(opts, scriptorium.WithProfileFile(cfg.Scriptorium.ProfileFile)) } return scriptorium.NewEngine(scriptorium.Config{ PromptDir: "unused", ProfileDir: cfg.Scriptorium.ProfileDir, }, opts...) }