Documentation cleanup and bugfixes

This commit is contained in:
2026-05-05 20:01:45 -05:00
parent 2b9658fb01
commit bf058a046e
10 changed files with 162 additions and 39 deletions

View File

@@ -61,9 +61,6 @@ type serveConfig struct {
promptDir string
profileDir string
schemaDir string
llmBaseURL string
model string
timeout time.Duration
}
type listFlag []string
@@ -122,9 +119,7 @@ func runCommand(args []string, stdout, stderr io.Writer) int {
}
llmClient, err := llm.NewOpenAICompatibleClient(llm.OpenAICompatibleConfig{
BaseURL: cfg.llmBaseURL,
Model: cfg.model,
Timeout: cfg.timeout,
Timeout: defaults.LLMRequestTimeoutDefault,
})
if err != nil {
fmt.Fprintf(stderr, "llm client error: %v\n", err)
@@ -184,9 +179,7 @@ func serveCommand(args []string, stderr io.Writer) int {
}
llmClient, err := llm.NewOpenAICompatibleClient(llm.OpenAICompatibleConfig{
BaseURL: cfg.llmBaseURL,
Model: cfg.model,
Timeout: cfg.timeout,
Timeout: defaults.LLMRequestTimeoutDefault,
})
if err != nil {
fmt.Fprintf(stderr, "llm client error: %v\n", err)
@@ -285,9 +278,6 @@ func parseServeArgs(args []string) (*serveConfig, error) {
fs.StringVar(&cfg.promptDir, "prompt-dir", "", "directory containing prompt definition YAML files")
fs.StringVar(&cfg.profileDir, "profile-dir", "", "directory containing execution profile YAML files")
fs.StringVar(&cfg.schemaDir, "schema-dir", defaults.SchemaDirDefault, "base directory for validation schemas")
fs.StringVar(&cfg.llmBaseURL, "llm-base-url", "", "OpenAI-compatible base URL including /v1")
fs.StringVar(&cfg.model, "model", "", "optional default model")
fs.DurationVar(&cfg.timeout, "timeout", defaults.LLMRequestTimeoutDefault, "LLM request timeout")
if err := fs.Parse(args); err != nil {
return nil, err
@@ -397,5 +387,5 @@ func printSummary(stderr io.Writer, res *domain.RunResult) {
func printUsage(w io.Writer) {
fmt.Fprintln(w, "usage: scriptorium <run|serve> ...")
fmt.Fprintln(w, " run: scriptorium run --prompt-dir DIR --profile-dir DIR --prompt ID --input name=path [--input ...] [--profile ID] [--llm-base-url URL] [--model NAME] [--api-key-env ENV] [--temperature N] [--max-tokens N] [--top-p N] [--var k=v] [--out path] [--timeout 10m]")
fmt.Fprintf(w, " serve: scriptorium serve --addr %s --prompt-dir DIR --profile-dir DIR [--llm-base-url URL] [--schema-dir DIR] [--model NAME] [--timeout 10m]\n", defaults.HTTPAddrDefault)
fmt.Fprintf(w, " serve: scriptorium serve --addr %s --prompt-dir DIR --profile-dir DIR [--schema-dir DIR]\n", defaults.HTTPAddrDefault)
}

View File

@@ -155,8 +155,24 @@ func TestParseServeArgsRequiredFlags(t *testing.T) {
if cfg.addr != defaults.HTTPAddrDefault {
t.Fatalf("expected default addr %s, got %q", defaults.HTTPAddrDefault, cfg.addr)
}
if cfg.timeout != defaults.LLMRequestTimeoutDefault {
t.Fatalf("expected default timeout %s, got %s", defaults.LLMRequestTimeoutDefault, cfg.timeout)
if cfg.schemaDir != defaults.SchemaDirDefault {
t.Fatalf("expected default schema dir %q, got %q", defaults.SchemaDirDefault, cfg.schemaDir)
}
}
func TestParseServeArgsRejectsRuntimeOverrideFlags(t *testing.T) {
base := []string{"--prompt-dir", "./prompts", "--profile-dir", "./profiles"}
tests := [][]string{
{"--llm-base-url", "http://localhost:8000/v1"},
{"--model", "gpt-4o-mini"},
{"--timeout", "30s"},
}
for _, tc := range tests {
_, err := parseServeArgs(append(base, tc...))
if err == nil {
t.Fatalf("expected unknown flag error for %q", tc[0])
}
}
}
@@ -213,7 +229,7 @@ func TestRunCommandVarsOptional(t *testing.T) {
"--profile-dir", "./profiles",
"--prompt", "p",
"--input", "transcript=./t.md",
"--llm-base-url", "://bad-url",
"--llm-base-url", "http://[::1",
"--model", "m",
}, &stdout, &stderr)
@@ -223,8 +239,8 @@ func TestRunCommandVarsOptional(t *testing.T) {
if strings.Contains(stderr.String(), "var parse error") {
t.Fatalf("expected --var to be optional, got stderr=%q", stderr.String())
}
if !strings.Contains(stderr.String(), "llm client error") {
t.Fatalf("expected llm client error after parsing succeeds, got stderr=%q", stderr.String())
if !strings.Contains(stderr.String(), "llm client error") && !strings.Contains(stderr.String(), "run error") {
t.Fatalf("expected post-parse execution error, got stderr=%q", stderr.String())
}
if stdout.Len() != 0 {
t.Fatalf("expected no stdout output on error, got %q", stdout.String())