11 KiB
Configuration Reference
Config Discovery And Precedence
Application settings are resolved in this order:
- built-in defaults
config.ymlvalues- CLI overrides
When --config is omitted, Scriptorium searches:
/usr/local/etc/scriptorium/config.yml/etc/scriptorium/config.yml
If neither file exists, Scriptorium uses built-in defaults. When
--config <path> is provided, that file must exist and decode successfully.
Minimal Working Config
prompt_dir: ./examples/prompts
This is enough for run and render when selected prompts use built-in
profiles. Set profile_dir when prompts or requests use custom profiles.
The maintained repository example is examples/config.yml.
Production-Oriented Config
prompt_dir: /opt/scriptorium/prompts
profile_dir: /opt/scriptorium/profiles
schema_dir: /opt/scriptorium/schemas
server:
addr: 127.0.0.1:8080
artifact_root: /var/lib/scriptorium/artifacts
max_request_bytes: 16777216
max_artifact_bytes: 16777216
max_response_bytes: 16777216
defaults:
render_format: text
The maintained full example is examples/config.full.yml.
App Config Reference
Top-level fields:
| Field | Default | Description |
|---|---|---|
prompt_dir |
unset | Directory containing prompt definition YAML files. Required effectively by run, render, and serve. |
profile_dir |
unset | Directory containing custom profile YAML files. Built-in profiles remain available when unset. |
schema_dir |
. |
Base directory for relative JSON Schema paths. |
server |
{} |
HTTP service settings used by serve. |
defaults |
{} |
Adapter defaults. |
server fields:
| Field | Default | Description |
|---|---|---|
server.addr |
:8080 |
Listen address for serve. |
server.artifact_root |
unset | Base directory for HTTP file input references. Without it, HTTP file refs are rejected. |
server.max_request_bytes |
16777216 |
Maximum encoded HTTP request body bytes. 0 disables the limit. |
server.max_artifact_bytes |
16777216 |
Maximum HTTP file artifact bytes. 0 disables the limit. |
server.max_response_bytes |
16777216 |
Maximum encoded HTTP response bytes. 0 disables the limit. |
defaults fields:
| Field | Default | Description |
|---|---|---|
defaults.render_format |
text |
Default render output format: text or json. |
Config rules:
- YAML decoding is strict; unknown fields are rejected.
- HTTP size limits must be greater than or equal to
0. - Empty string config values are ignored.
- Raw API key fields are not supported in app config.
Prompt Definition Files
Prompt definitions are YAML files anywhere under prompt_dir. Nested
directories are organizational; callers select prompts by YAML id, not file
path.
Example:
id: generic.structured_events
version: "1.0.0"
default_profile: local-quality
description: Produce structured event JSON from a transcript.
inputs:
- name: transcript
required: true
content_type: text/markdown
description: Source transcript content
- name: glossary
required: false
content_type: text/yaml
description: Optional glossary context
messages:
- role: system
content_file: ./generic.structured_events.system.md
- role: user
content_file: ./generic.structured_events.user.md
output:
format: json
validation_mode: json_schema
schema_path: structured_events.schema.json
repair_attempts: 0
Prompt fields:
| Field | Required | Description |
|---|---|---|
id |
yes | Prompt identifier used by --prompt and HTTP prompt_id. |
version |
yes | Prompt version. |
default_profile |
no | Profile ID used when a request does not provide a profile. |
description |
no | Human-readable description. |
session_id |
no | Go-template string rendered from request vars and forwarded as provider session_id when non-empty. |
inputs |
no | Named input declarations. |
messages |
yes | Chat message templates. |
output |
yes | Output format and validation contract. |
inputs[] fields:
name(required)required(optional boolean)content_type(optional metadata)description(optional)
messages[] fields:
role(required)- exactly one of
contentorcontent_file cache_control(optional)
Message rules:
content_fileresolves relative to the prompt YAML file location.- Repeated roles are allowed.
- Prompt YAML decoding is strict.
- Duplicate input names are invalid.
- Duplicate prompt IDs are invalid for a requested ID/version.
messages[].cache_control fields:
| Field | Required | Supported values |
|---|---|---|
type |
yes | ephemeral |
ttl |
no | 1h |
session_id behavior:
- Rendered with the same variable context as message templates.
- Trimmed and omitted when empty.
- Rejected when longer than 256 Unicode code points.
- CLI callers pass variables with
--var; HTTP callers usevars.
output fields:
| Field | Required | Supported values |
|---|---|---|
format |
yes | text, markdown, json |
validation_mode |
yes | none, basic, json, json_schema |
schema_path |
only for json_schema |
Relative to schema_dir unless absolute. |
repair_attempts |
yes | Integer greater than or equal to 0. |
Repair boundary:
repair_attemptsis part of the prompt contract.- The current CLI and HTTP wiring constructs the runner without a repairer, so normal
runandserveexecution does not perform repair attempts.
Profile Definition Files
Execution profiles are YAML files anywhere under profile_dir. Nested
directories are organizational; callers select profiles by YAML id, not file
path.
Scriptorium also ships built-in profiles. Custom profiles override built-ins with the same ID.
Example:
id: local-fast
endpoint: http://localhost:8000/v1
model: gpt-4o-mini
temperature: 0.2
max_tokens: 500
top_p: 1.0
timeout_seconds: 90
api_key_env: SCRIPTORIUM_API_KEY
service_tier: priority
reasoning_effort: medium
extra_params:
provider_route: primary
Profile fields:
| Field | Required | Description |
|---|---|---|
id |
yes | Profile identifier. |
endpoint |
yes | OpenAI-compatible base URL including /v1. |
model |
yes | Provider model name. |
temperature |
no | Range 0..2. |
max_tokens |
no | Integer greater than or equal to 0. |
top_p |
no | Range 0..1. |
timeout_seconds |
no | Integer greater than or equal to 0. |
service_tier |
no | Provider-specific request tier. |
reasoning_effort |
no | Provider-specific reasoning setting. |
api_key_env |
no | Environment variable name containing the API key. |
extra_params |
no | JSON-compatible provider-specific top-level request fields. |
Execution defaults before profile/request overrides:
| Field | Default |
|---|---|
temperature |
0.0 |
max_tokens |
0 |
top_p |
1.0 |
timeout_seconds |
600 |
Profile rules:
- Profile YAML decoding is strict.
- Duplicate custom profile IDs are invalid.
- Matching custom and built-in IDs are valid override behavior.
- Raw
api_keyis rejected; useapi_key_env. - If
api_key_envis set, the named environment variable must be set beforerun,render, or HTTP execution can prepare the request. - Profile numeric fields merge by non-zero value. Request overrides are presence-aware, so explicit zero values are supported through CLI flags or HTTP model overrides.
extra_paramskeys must not be empty and must not collide with reserved outbound fields:model,session_id,messages,temperature,max_tokens,top_p,service_tier,reasoning_effort, orresponse_format.
Built-in profile catalog:
| Provider | ID | Model | API key env |
|---|---|---|---|
| aion-labs | aion-2 |
aion-labs/aion-2.0 |
OPENROUTER_API_KEY |
| anthropic | claude-fable-latest |
~anthropic/claude-fable-latest |
OPENROUTER_API_KEY |
| anthropic | claude-haiku-latest |
~anthropic/claude-haiku-latest |
OPENROUTER_API_KEY |
| anthropic | claude-opus-latest |
~anthropic/claude-opus-latest |
OPENROUTER_API_KEY |
| anthropic | claude-sonnet-latest |
~anthropic/claude-sonnet-latest |
OPENROUTER_API_KEY |
| deepseek | deepseek-3-2 |
deepseek/deepseek-v3.2 |
OPENROUTER_API_KEY |
| deepseek | deepseek-4-pro |
deepseek/deepseek-v4-pro |
OPENROUTER_API_KEY |
gemini-2-flash |
google/gemini-2.5-flash |
OPENROUTER_API_KEY |
|
gemini-2-flash-lite |
google/gemini-2.5-flash-lite |
OPENROUTER_API_KEY |
|
gemini-2-pro |
google/gemini-2.5-pro |
OPENROUTER_API_KEY |
|
gemini-3-flash-lite |
google/gemini-3.1-flash-lite |
OPENROUTER_API_KEY |
|
gemini-flash-latest |
~google/gemini-flash-latest |
OPENROUTER_API_KEY |
|
gemini-pro-latest |
~google/gemini-pro-latest |
OPENROUTER_API_KEY |
|
gemma-4-31b |
google/gemma-4-31b-it:exacto |
OPENROUTER_API_KEY |
|
| minimax | minimax-m2 |
minimax/minimax-m2.5 |
OPENROUTER_API_KEY |
| minimax | minimax-m3 |
minimax/minimax-m3 |
OPENROUTER_API_KEY |
| mistral | mistral-large-2512 |
mistralai/mistral-large-2512 |
OPENROUTER_API_KEY |
| mistral | mistral-medium-3-5 |
mistralai/mistral-medium-3-5 |
OPENROUTER_API_KEY |
| mistral | mistral-small-3 |
mistralai/mistral-small-3.2-24b-instruct |
OPENROUTER_API_KEY |
| mistral | mistral-small-4 |
mistralai/mistral-small-2603 |
OPENROUTER_API_KEY |
| nvidia | nemotron-3-ultra |
nvidia/nemotron-3-ultra-550b-a55b |
OPENROUTER_API_KEY |
| openai | gpt-5-mini |
openai/gpt-5.4-mini |
OPENROUTER_API_KEY |
| openai | gpt-5-nano |
openai/gpt-5.4-nano |
OPENROUTER_API_KEY |
Schema Behavior
Schemas are JSON files, typically under schema_dir.
Rules:
output.validation_mode: json_schemarequiresoutput.schema_path.- Relative
schema_pathvalues resolve fromschema_dir. - Absolute
schema_pathvalues are used directly. - Nested schemas must be referenced by relative path; schemas are not searched recursively by basename.
- Missing or invalid schema documents are runtime validation errors.
- Invalid generated JSON produces validation status
failed, not a runtime error.
Artifact References
Supported request input artifact reference types are:
fileinline
CLI run and render create file references from --input name=path.
HTTP file references require server.artifact_root or serve --artifact-root. Relative file URIs resolve under that root. Absolute paths
and relative traversal outside the root are rejected by lexical checks. Symlinks
inside the root are followed by the operating system, including symlinks that
point outside the root.
HTTP inline references do not require an artifact root.
Secrets Handling
- Keep secret values in environment variables.
- Store only environment-variable names in
api_key_env. - Do not put raw API keys in config, prompts, profiles, CLI arguments, examples, or HTTP request bodies.
Maintained Examples
- Minimal app config:
examples/config.yml - Full app config:
examples/config.full.yml - Prompt examples:
examples/prompts/ - Custom profile examples:
examples/profiles/ - Schema examples:
examples/schemas/ - Input fixtures:
examples/fixtures/ - Render script:
examples/render-markdown-summary.sh - HTTP request-shape example:
examples/http-run.json