69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
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...)
|
|
}
|