Add production prompt registry coverage
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/notarius/internal/core/artifacts"
|
"gitea.maximumdirect.net/eric/notarius/internal/core/artifacts"
|
||||||
"gitea.maximumdirect.net/eric/notarius/internal/core/config"
|
"gitea.maximumdirect.net/eric/notarius/internal/core/config"
|
||||||
@@ -25,6 +26,7 @@ import (
|
|||||||
"gitea.maximumdirect.net/eric/notarius/internal/modules/merge/appendorder"
|
"gitea.maximumdirect.net/eric/notarius/internal/modules/merge/appendorder"
|
||||||
"gitea.maximumdirect.net/eric/notarius/internal/modules/normalize/noop"
|
"gitea.maximumdirect.net/eric/notarius/internal/modules/normalize/noop"
|
||||||
jsonoutput "gitea.maximumdirect.net/eric/notarius/internal/modules/output/json"
|
jsonoutput "gitea.maximumdirect.net/eric/notarius/internal/modules/output/json"
|
||||||
|
"gitea.maximumdirect.net/eric/scriptorium"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRunNoArgsWritesUsageToStdout(t *testing.T) {
|
func TestRunNoArgsWritesUsageToStdout(t *testing.T) {
|
||||||
@@ -179,6 +181,86 @@ func TestProductionCatalogIncludesDefaultModules(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProductionPromptAssetsRegisterAndPrepareDndPrompts(t *testing.T) {
|
||||||
|
registry, err := productionPromptAssets()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("productionPromptAssets() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
promptFS, err := registry.PromptFS()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("PromptFS() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
for _, name := range []string{
|
||||||
|
"common-dnd-system.md",
|
||||||
|
"common-dnd-transcript.md",
|
||||||
|
"common-dnd-references.md",
|
||||||
|
"dnd.scenes/dnd.scenes.yaml",
|
||||||
|
"dnd.scenes/task.md",
|
||||||
|
"dnd.scenes/instructions.md",
|
||||||
|
"dnd.spells/dnd.spells.yaml",
|
||||||
|
"dnd.spells/task.md",
|
||||||
|
"dnd.spells/instructions.md",
|
||||||
|
} {
|
||||||
|
if _, err := promptFS.Open(name); err != nil {
|
||||||
|
t.Fatalf("PromptFS().Open(%q) error = %v, want nil", name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
options, err := registry.ScriptoriumOptions()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ScriptoriumOptions() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
options = append(options, scriptorium.WithProfiles(scriptorium.OpenAICompatibleProfile(scriptorium.OpenAICompatibleProfileConfig{
|
||||||
|
ID: "production-test-profile",
|
||||||
|
Endpoint: "http://127.0.0.1:1/v1",
|
||||||
|
Model: "production-test-model",
|
||||||
|
})))
|
||||||
|
engine, err := scriptorium.NewEngine(scriptorium.Config{Timeout: time.Second}, options...)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("NewEngine() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
scenesPrepared, err := engine.Prepare(context.Background(), scriptorium.RunRequest{
|
||||||
|
PromptID: scenes.PromptID,
|
||||||
|
PromptVersion: scenes.ResponseSchemaVersion,
|
||||||
|
ProfileID: "production-test-profile",
|
||||||
|
Inputs: map[string]scriptorium.ArtifactRef{
|
||||||
|
"transcript": scriptorium.InlineWithURI("file:///session.json", `{"id":"session-1","segments":[{"id":"u1","text":"We enter the crypt."}]}`),
|
||||||
|
"roster": scriptorium.Inline("Aria: cleric"),
|
||||||
|
"glossary": scriptorium.Inline("Brightmantle: temple"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("scene Prepare() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
if got := len(scenesPrepared.Messages); got != 5 {
|
||||||
|
t.Fatalf("scene message count = %d, want 5", got)
|
||||||
|
}
|
||||||
|
if !strings.Contains(scenesPrepared.Messages[3].Content, "Divide the provided transcript") {
|
||||||
|
t.Fatalf("scene task message missing module text: %q", scenesPrepared.Messages[3].Content)
|
||||||
|
}
|
||||||
|
|
||||||
|
spellsPrepared, err := engine.Prepare(context.Background(), scriptorium.RunRequest{
|
||||||
|
PromptID: spells.PromptID,
|
||||||
|
PromptVersion: spells.SchemaVersion,
|
||||||
|
ProfileID: "production-test-profile",
|
||||||
|
Inputs: map[string]scriptorium.ArtifactRef{
|
||||||
|
"transcript": scriptorium.InlineWithURI("file:///session.json", `{"id":"session-1","segments":[{"id":"u1","text":"Mira casts shield."}]}`),
|
||||||
|
"roster": scriptorium.Inline("Mira: wizard"),
|
||||||
|
"glossary": scriptorium.Inline("Shield: abjuration"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("spell Prepare() error = %v, want nil", err)
|
||||||
|
}
|
||||||
|
if got := len(spellsPrepared.Messages); got != 5 {
|
||||||
|
t.Fatalf("spell message count = %d, want 5", got)
|
||||||
|
}
|
||||||
|
if !strings.Contains(spellsPrepared.Messages[3].Content, "Extract Dungeons & Dragons spell-cast artifacts") {
|
||||||
|
t.Fatalf("spell task message missing module text: %q", spellsPrepared.Messages[3].Content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRunConfigValidateUsesProductionCatalogByDefault(t *testing.T) {
|
func TestRunConfigValidateUsesProductionCatalogByDefault(t *testing.T) {
|
||||||
configPath := writeTestConfig(t, mvpConfigYAML("dnd-session", "dnd/spells"))
|
configPath := writeTestConfig(t, mvpConfigYAML("dnd-session", "dnd/spells"))
|
||||||
var stdout bytes.Buffer
|
var stdout bytes.Buffer
|
||||||
|
|||||||
Reference in New Issue
Block a user