8.9 KiB
8.9 KiB
Configuration
Overview
Narratio loads three YAML files:
pipeline.yml: pipeline-level runtime settings.campaign.yml: stable campaign identity and campaign-level input defaults.session.yml: per-session metadata and input selection.
Commands that load and validate all three files include:
narratio runnarratio resumenarratio run-stagenarratio analyzenarratio publishnarratio session plannarratio session statusnarratio session validatenarratio session restorenarratio session artifactsnarratio session locksnarratio clean <session_id>
Validation behavior:
- strict YAML decode is enabled (
KnownFields(true)); unknown fields fail. - loaded
session.ymlfiles must be concrete YAML (no{{ ... }}placeholders). - defaults are applied for optional pipeline fields.
- campaign/session identity mismatches fail load.
File Discovery
Pipeline discovery order when --config is omitted:
/usr/local/etc/narratio/pipeline.yml/etc/narratio/pipeline.yml
Session discovery order when --session is omitted:
/usr/local/etc/narratio/session.yml/etc/narratio/session.yml
Campaign discovery when --campaign-file is omitted:
- if
--campaign <id>is set:{pipeline.campaigns.root}/{id}/campaign.yml - otherwise:
{pipeline.campaigns.root}/{pipeline.campaigns.default_campaign_id}/campaign.yml
Remote session.yml fallback:
- if local session discovery fails and storage is configured, Narratio can load:
{root_prefix}/campaigns/{campaign}/sessions/{session_id}/session.yml
Minimal Working Config
pipeline.yml
campaigns:
root: /usr/local/share/narratio/campaigns
default_campaign_id: sample-campaign
whisperx:
transcribe_url: "https://transcription.example.com/transcribe"
campaign.yml
campaign_id: sample-campaign
inputs:
speakers_file: ./speakers.yml
autocorrect_file: ./autocorrect.yml
glossary_file: ./glossary.yml
session.yml
session_id: 2026-05-03
inputs:
audio_dir: ./audio
Publish Config
Top-level publish settings live at pipeline.publish.
publish:
enabled: true
upload_run: true
outputs:
- source: narratio.transcript.final_trimmed
dest: transcripts/final.trimmed.json
required: true
- source: narratio.artifact.session_recap
dest: artifacts/session_recap.md
required: true
locks:
- source: narratio.artifact.session_recap
reason: Final recap was manually edited.
Rules:
outputs[].sourceis required.outputs[].destis optional; when omitted, Narratio derives destination from the source.outputs[].requireddefaults totrue.- static
publish.locksand remote{session_prefix}/locks.ymlare merged; static locks win on duplicates. - locks prevent overwrite of top-level published destinations.
Supported publish source families:
- built-ins:
narratio.transcript.base,narratio.transcript.polished,narratio.transcript.final,narratio.transcript.final_trimmed,narratio.bounds.session - configured artifacts:
narratio.artifact.<artifact_key>
Full Reference
Pipeline
| Path | Type | Required | Default |
|---|---|---|---|
pipeline.workspace.root |
string | No | /var/lib/narratio |
pipeline.workspace.cleanup_after_publish |
bool | No | false |
pipeline.campaigns.root |
string | No | /usr/local/share/narratio/campaigns |
pipeline.campaigns.default_campaign_id |
string | No | empty |
pipeline.secrets.env_dir |
string | No | empty |
pipeline.storage.backend |
string | No | empty |
pipeline.storage.s3.bucket |
string | Conditional | empty |
pipeline.storage.s3.root_prefix |
string | No | dnd |
pipeline.storage.s3.region |
string | No | empty |
pipeline.storage.s3.endpoint |
string | No | empty |
pipeline.storage.s3.force_path_style |
bool | No | false |
pipeline.storage.s3.access_key_id_env |
string | No | OBJECT_STORAGE_KEY_ID |
pipeline.storage.s3.secret_access_key_env |
string | No | OBJECT_STORAGE_KEY |
pipeline.spool.root |
string | No | /var/spool/narratio |
pipeline.spool.delete_audio_after_publish |
bool | No | false |
pipeline.cache.root |
string | No | /var/cache/narratio |
pipeline.cache.s3_audio |
bool | No | true |
pipeline.publish.enabled |
bool | No | true |
pipeline.publish.upload_run |
bool | No | true |
pipeline.publish.outputs[] |
list | No | one final-trimmed output rule |
pipeline.publish.outputs[].source |
string | Yes (per rule) | none |
pipeline.publish.outputs[].dest |
string | No | derived from source |
pipeline.publish.outputs[].required |
bool | No | true |
pipeline.publish.locks[] |
list | No | empty |
pipeline.publish.locks[].source |
string | Yes (per lock) | none |
pipeline.publish.locks[].reason |
string | No | empty |
pipeline.whisperx.transcribe_url |
string | Yes | none |
pipeline.whisperx.language |
string | No | en |
pipeline.whisperx.timeout |
duration string | No | 30m |
pipeline.whisperx.retries |
int | No | 3 |
pipeline.whisperx.retry_delay |
duration string | No | 2s |
pipeline.whisperx.concurrency |
int | No | 2 |
pipeline.seriatim.binary |
string | No | seriatim |
pipeline.seriatim.timeout |
duration string | No | 10m |
pipeline.seriatim.output_schema |
string | No | seriatim-intermediate |
pipeline.seriatim.coalesce_gap |
float | No | 3.0 |
pipeline.seriatim.report |
bool | No | true |
pipeline.seriatim.env.overlap_word_run_gap |
float | No | unset |
pipeline.seriatim.env.overlap_word_run_reorder_window |
float | No | unset |
pipeline.seriatim.env.backchannel_max_duration |
float | No | unset |
pipeline.seriatim.env.filler_max_duration |
float | No | unset |
pipeline.audita.binary |
string | No | audita |
pipeline.audita.timeout |
duration string | No | 3h |
pipeline.audita.llm_api_key_env |
string | No | empty |
pipeline.audita.modules[] |
list[string] | No | empty |
pipeline.audita.base_url |
string | No | empty |
pipeline.audita.model |
string | No | empty |
pipeline.audita.total_llm_concurrency |
int | No | unset |
pipeline.audita.proposal_llm_concurrency |
int | No | unset |
pipeline.audita.validation_model |
string | No | empty |
pipeline.audita.validation_llm_concurrency |
int | No | unset |
pipeline.audita.transcript_description |
string | No | empty |
pipeline.audita.config_path |
string | No | empty |
pipeline.audita.output_schema |
string | No | empty |
pipeline.audita.work_dir_retention |
string | No | empty |
pipeline.audita.report |
bool | No | true |
pipeline.normalize.output_path |
string | No | transcripts/final.json |
pipeline.normalize.output_schema |
string | No | seriatim-intermediate |
pipeline.normalize.report |
bool | No | true |
pipeline.trim.enabled |
bool | No | false |
pipeline.trim.output_path |
string | Conditional | none |
pipeline.trim.bounds.prompt_id |
string | Conditional | none |
pipeline.trim.bounds.profile_id |
string | No | empty |
pipeline.trim.bounds.transcript_input_name |
string | Conditional | none |
pipeline.trim.bounds.output_path |
string | Conditional | none |
pipeline.trim.bounds.timeout |
duration string | No | 10m |
pipeline.trim.bounds.render_debug |
bool | No | false |
pipeline.trim.bounds.render_output_path |
string | Conditional | none |
pipeline.trim.seriatim.report |
bool | No | false |
pipeline.scriptorium.binary |
string | No | scriptorium |
pipeline.scriptorium.config_path |
string | No | empty |
pipeline.scriptorium.timeout |
duration string | No | 10m |
pipeline.scriptorium.render_debug |
bool | No | false |
pipeline.scriptorium.artifacts |
map | No | empty |
pipeline.notification.backend |
string | No | empty |
pipeline.notification.recipient |
string | No | empty |
pipeline.notification.timeout |
duration string | No | 30s |
Campaign
| Path | Type | Required |
|---|---|---|
campaign_id |
string | Yes |
session_template_file |
string | No |
inputs.speakers_file |
string | Yes |
inputs.autocorrect_file |
string | Yes |
inputs.glossary_file |
string | Yes |
Session
| Path | Type | Required |
|---|---|---|
session_id |
string | Yes |
previous_session_id |
string | No |
campaign |
string | No |
date |
string | No |
title |
string | No |
inputs.speakers_file |
string | No |
inputs.autocorrect_file |
string | No |
inputs.glossary_file |
string | No |
inputs.audio_dir |
string | Conditional |
inputs.audio_files[] |
list[string] | Conditional |
inputs.audio_s3.prefix |
string | Conditional |
Maintained Examples
examples/pipeline.minimal.ymlexamples/pipeline.production.ymlexamples/pipeline.full.annotated.ymlexamples/campaigns/sample-campaign/campaign.ymlexamples/session.local-audio.ymlexamples/session.s3-audio.yml