@lingjingai/scriptctl 0.34.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -5
- package/changes/0.35.0.md +22 -0
- package/changes/0.36.0.md +22 -0
- package/changes/unreleased.md +3 -5
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +56 -128
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +0 -16
- package/dist/common.js +2 -342
- package/dist/common.js.map +1 -1
- package/dist/domain/ingest/apply-plan.d.ts +23 -0
- package/dist/domain/ingest/apply-plan.js +210 -0
- package/dist/domain/ingest/apply-plan.js.map +1 -0
- package/dist/domain/ingest/assembler.d.ts +57 -0
- package/dist/domain/ingest/assembler.js +181 -0
- package/dist/domain/ingest/assembler.js.map +1 -0
- package/dist/domain/ingest/chunker.d.ts +9 -0
- package/dist/domain/ingest/chunker.js +38 -0
- package/dist/domain/ingest/chunker.js.map +1 -0
- package/dist/domain/ingest/evidence.d.ts +5 -0
- package/dist/domain/ingest/evidence.js +66 -0
- package/dist/domain/ingest/evidence.js.map +1 -0
- package/dist/domain/ingest/govern.d.ts +3 -0
- package/dist/domain/ingest/govern.js +127 -0
- package/dist/domain/ingest/govern.js.map +1 -0
- package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
- package/dist/domain/ingest/jsonl-parser.js +187 -0
- package/dist/domain/ingest/jsonl-parser.js.map +1 -0
- package/dist/domain/ingest/markdown-parser.d.ts +6 -0
- package/dist/domain/ingest/markdown-parser.js +186 -0
- package/dist/domain/ingest/markdown-parser.js.map +1 -0
- package/dist/domain/ingest/records.d.ts +71 -0
- package/dist/domain/ingest/records.js +9 -0
- package/dist/domain/ingest/records.js.map +1 -0
- package/dist/domain/ingest/renumber.d.ts +14 -0
- package/dist/domain/ingest/renumber.js +130 -0
- package/dist/domain/ingest/renumber.js.map +1 -0
- package/dist/domain/ingest/script-v3.d.ts +94 -0
- package/dist/domain/ingest/script-v3.js +7 -0
- package/dist/domain/ingest/script-v3.js.map +1 -0
- package/dist/domain/ingest/state-reconcile.d.ts +11 -0
- package/dist/domain/ingest/state-reconcile.js +90 -0
- package/dist/domain/ingest/state-reconcile.js.map +1 -0
- package/dist/domain/ingest/validation.d.ts +11 -0
- package/dist/domain/ingest/validation.js +168 -0
- package/dist/domain/ingest/validation.js.map +1 -0
- package/dist/domain/ingest/video-aggregate.d.ts +23 -0
- package/dist/domain/ingest/video-aggregate.js +89 -0
- package/dist/domain/ingest/video-aggregate.js.map +1 -0
- package/dist/domain/ingest/video-apply.d.ts +37 -0
- package/dist/domain/ingest/video-apply.js +236 -0
- package/dist/domain/ingest/video-apply.js.map +1 -0
- package/dist/domain/ingest/video-md-parser.d.ts +2 -0
- package/dist/domain/ingest/video-md-parser.js +233 -0
- package/dist/domain/ingest/video-md-parser.js.map +1 -0
- package/dist/domain/ingest/video-records.d.ts +56 -0
- package/dist/domain/ingest/video-records.js +9 -0
- package/dist/domain/ingest/video-records.js.map +1 -0
- package/dist/domain/loom/index.d.ts +2 -1
- package/dist/domain/loom/index.js +12 -10
- package/dist/domain/loom/index.js.map +1 -1
- package/dist/domain/loom/types.d.ts +3 -2
- package/dist/domain/script/lookups.d.ts +3 -2
- package/dist/domain/script/lookups.js +25 -8
- package/dist/domain/script/lookups.js.map +1 -1
- package/dist/domain/script/patch/apply.js +2 -2
- package/dist/domain/script/patch/apply.js.map +1 -1
- package/dist/domain/script/patch/helpers.d.ts +3 -7
- package/dist/domain/script/patch/helpers.js +23 -96
- package/dist/domain/script/patch/helpers.js.map +1 -1
- package/dist/domain/script/patch/ops-action.d.ts +0 -2
- package/dist/domain/script/patch/ops-action.js +34 -100
- package/dist/domain/script/patch/ops-action.js.map +1 -1
- package/dist/domain/script/patch/ops-asset.d.ts +1 -0
- package/dist/domain/script/patch/ops-asset.js +102 -155
- package/dist/domain/script/patch/ops-asset.js.map +1 -1
- package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
- package/dist/domain/script/patch/ops-dialogue.js +43 -220
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
- package/dist/domain/script/patch/ops-extend.js +8 -2
- package/dist/domain/script/patch/ops-extend.js.map +1 -1
- package/dist/domain/script/patch/ops-meta.js.map +1 -1
- package/dist/domain/script/patch/ops-scene.js +26 -39
- package/dist/domain/script/patch/ops-scene.js.map +1 -1
- package/dist/domain/script/patch/ops-state.d.ts +3 -3
- package/dist/domain/script/patch/ops-state.js +33 -49
- package/dist/domain/script/patch/ops-state.js.map +1 -1
- package/dist/domain/script/patch/registry.js +9 -13
- package/dist/domain/script/patch/registry.js.map +1 -1
- package/dist/domain/script/refs.js +23 -111
- package/dist/domain/script/refs.js.map +1 -1
- package/dist/domain/script/scene-refs.d.ts +3 -0
- package/dist/domain/script/scene-refs.js +35 -0
- package/dist/domain/script/scene-refs.js.map +1 -0
- package/dist/domain/script/schema.js +17 -21
- package/dist/domain/script/schema.js.map +1 -1
- package/dist/domain/script/text-util.d.ts +7 -0
- package/dist/domain/script/text-util.js +91 -0
- package/dist/domain/script/text-util.js.map +1 -0
- package/dist/help-text.js +145 -414
- package/dist/help-text.js.map +1 -1
- package/dist/infra/converters.js +1 -1
- package/dist/infra/converters.js.map +1 -1
- package/dist/infra/episode-title.d.ts +4 -0
- package/dist/infra/episode-title.js +129 -0
- package/dist/infra/episode-title.js.map +1 -0
- package/dist/infra/ingest/review-renderer.d.ts +1 -0
- package/dist/infra/ingest/review-renderer.js +431 -0
- package/dist/infra/ingest/review-renderer.js.map +1 -0
- package/dist/infra/ingest/source-resolver.d.ts +21 -0
- package/dist/infra/ingest/source-resolver.js +51 -0
- package/dist/infra/ingest/source-resolver.js.map +1 -0
- package/dist/infra/ingest/text-reader.d.ts +3 -0
- package/dist/infra/ingest/text-reader.js +27 -0
- package/dist/infra/ingest/text-reader.js.map +1 -0
- package/dist/infra/ingest/video-discovery.d.ts +8 -0
- package/dist/infra/ingest/video-discovery.js +60 -0
- package/dist/infra/ingest/video-discovery.js.map +1 -0
- package/dist/infra/ingest/workspace-store.d.ts +18 -0
- package/dist/infra/ingest/workspace-store.js +70 -0
- package/dist/infra/ingest/workspace-store.js.map +1 -0
- package/dist/infra/llm/anthropic-model.d.ts +11 -0
- package/dist/infra/llm/anthropic-model.js +109 -0
- package/dist/infra/llm/anthropic-model.js.map +1 -0
- package/dist/infra/llm/gemini-upload.d.ts +9 -0
- package/dist/infra/llm/gemini-upload.js +94 -0
- package/dist/infra/llm/gemini-upload.js.map +1 -0
- package/dist/infra/llm/gemini-video-model.d.ts +47 -0
- package/dist/infra/llm/gemini-video-model.js +167 -0
- package/dist/infra/llm/gemini-video-model.js.map +1 -0
- package/dist/infra/llm/openai-compatible-model.d.ts +13 -0
- package/dist/infra/llm/openai-compatible-model.js +143 -0
- package/dist/infra/llm/openai-compatible-model.js.map +1 -0
- package/dist/infra/llm/proxy.d.ts +1 -0
- package/dist/infra/llm/proxy.js +30 -0
- package/dist/infra/llm/proxy.js.map +1 -0
- package/dist/infra/llm/retry.d.ts +5 -0
- package/dist/infra/llm/retry.js +20 -0
- package/dist/infra/llm/retry.js.map +1 -0
- package/dist/llm/composition.d.ts +5 -0
- package/dist/llm/composition.js +5 -0
- package/dist/llm/composition.js.map +1 -0
- package/dist/llm/config.d.ts +26 -0
- package/dist/llm/config.js +201 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/registry.d.ts +44 -0
- package/dist/llm/registry.js +48 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/router.d.ts +23 -0
- package/dist/llm/router.js +0 -0
- package/dist/llm/router.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
- package/dist/llm/tasks/ingest/asset-curate.js +45 -0
- package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
- package/dist/llm/tasks/ingest/asset-extract.js +51 -0
- package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
- package/dist/llm/tasks/ingest/asset-govern.js +143 -0
- package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
- package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
- package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
- package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
- package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
- package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
- package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
- package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
- package/dist/llm/tasks/ingest/roster-merge.js +235 -0
- package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
- package/dist/llm/tasks/ingest/state-merge.js +84 -0
- package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
- package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
- package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
- package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
- package/dist/llm/tasks/ingest/text-normalize.js +89 -0
- package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
- package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
- package/dist/llm/tasks/ingest/video-correct.js +144 -0
- package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
- package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
- package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
- package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
- package/dist/llm/tasks/schemas.d.ts +5 -0
- package/dist/llm/tasks/schemas.js +107 -0
- package/dist/llm/tasks/schemas.js.map +1 -0
- package/dist/llm/types.d.ts +97 -0
- package/dist/llm/types.js +13 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/usecases/doctor.d.ts +1 -1
- package/dist/usecases/doctor.js +36 -9
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/ingest/command.d.ts +5 -0
- package/dist/usecases/ingest/command.js +57 -0
- package/dist/usecases/ingest/command.js.map +1 -0
- package/dist/usecases/ingest/fanout.d.ts +10 -0
- package/dist/usecases/ingest/fanout.js +23 -0
- package/dist/usecases/ingest/fanout.js.map +1 -0
- package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
- package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
- package/dist/usecases/ingest/pass5-extract.js +50 -0
- package/dist/usecases/ingest/pass5-extract.js.map +1 -0
- package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
- package/dist/usecases/ingest/pass5-govern.js +155 -0
- package/dist/usecases/ingest/pass5-govern.js.map +1 -0
- package/dist/usecases/ingest/pipeline.d.ts +28 -0
- package/dist/usecases/ingest/pipeline.js +144 -0
- package/dist/usecases/ingest/pipeline.js.map +1 -0
- package/dist/usecases/ingest/publish-command.d.ts +4 -0
- package/dist/usecases/ingest/publish-command.js +77 -0
- package/dist/usecases/ingest/publish-command.js.map +1 -0
- package/dist/usecases/ingest/status.d.ts +39 -0
- package/dist/usecases/ingest/status.js +155 -0
- package/dist/usecases/ingest/status.js.map +1 -0
- package/dist/usecases/ingest/video-pass3.d.ts +26 -0
- package/dist/usecases/ingest/video-pass3.js +0 -0
- package/dist/usecases/ingest/video-pass3.js.map +1 -0
- package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
- package/dist/usecases/ingest/video-pipeline.js +202 -0
- package/dist/usecases/ingest/video-pipeline.js.map +1 -0
- package/dist/usecases/ingest/view-command.d.ts +4 -0
- package/dist/usecases/ingest/view-command.js +51 -0
- package/dist/usecases/ingest/view-command.js.map +1 -0
- package/dist/usecases/script/actions.js +2 -2
- package/dist/usecases/script/actions.js.map +1 -1
- package/dist/usecases/script/actor.js.map +1 -1
- package/dist/usecases/script/actors.js +1 -0
- package/dist/usecases/script/actors.js.map +1 -1
- package/dist/usecases/script/add-actor.js.map +1 -1
- package/dist/usecases/script/add-episode.js.map +1 -1
- package/dist/usecases/script/add-location.js.map +1 -1
- package/dist/usecases/script/add-prop.js.map +1 -1
- package/dist/usecases/script/alias.js.map +1 -1
- package/dist/usecases/script/assets.js +2 -1
- package/dist/usecases/script/assets.js.map +1 -1
- package/dist/usecases/script/context.js.map +1 -1
- package/dist/usecases/script/create.js +3 -6
- package/dist/usecases/script/create.js.map +1 -1
- package/dist/usecases/script/delete.js.map +1 -1
- package/dist/usecases/script/describe.js.map +1 -1
- package/dist/usecases/script/dialogue.js +6 -13
- package/dist/usecases/script/dialogue.js.map +1 -1
- package/dist/usecases/script/do.js +1 -1
- package/dist/usecases/script/do.js.map +1 -1
- package/dist/usecases/script/episodes.js.map +1 -1
- package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
- package/dist/usecases/script/importance.js +17 -0
- package/dist/usecases/script/importance.js.map +1 -0
- package/dist/usecases/script/insert.js.map +1 -1
- package/dist/usecases/script/issues.js.map +1 -1
- package/dist/usecases/script/lib.d.ts +19 -6
- package/dist/usecases/script/lib.js +173 -99
- package/dist/usecases/script/lib.js.map +1 -1
- package/dist/usecases/script/locations.js +1 -0
- package/dist/usecases/script/locations.js.map +1 -1
- package/dist/usecases/script/merge.js.map +1 -1
- package/dist/usecases/script/move.js.map +1 -1
- package/dist/usecases/script/props.js +1 -0
- package/dist/usecases/script/props.js.map +1 -1
- package/dist/usecases/script/refs.js.map +1 -1
- package/dist/usecases/script/rename.js.map +1 -1
- package/dist/usecases/script/replace.js.map +1 -1
- package/dist/usecases/script/role.js.map +1 -1
- package/dist/usecases/script/scenes.js +8 -15
- package/dist/usecases/script/scenes.js.map +1 -1
- package/dist/usecases/script/script-patch.js +1 -1
- package/dist/usecases/script/script-patch.js.map +1 -1
- package/dist/usecases/script/script-validate.js +1 -1
- package/dist/usecases/script/script-validate.js.map +1 -1
- package/dist/usecases/script/session.d.ts +4 -4
- package/dist/usecases/script/session.js +57 -78
- package/dist/usecases/script/session.js.map +1 -1
- package/dist/usecases/script/split.js.map +1 -1
- package/dist/usecases/script/state-add.js.map +1 -1
- package/dist/usecases/script/state-delete.js.map +1 -1
- package/dist/usecases/script/state-rename.js.map +1 -1
- package/dist/usecases/script/states.js +58 -13
- package/dist/usecases/script/states.js.map +1 -1
- package/dist/usecases/script/summary.js +8 -0
- package/dist/usecases/script/summary.js.map +1 -1
- package/dist/usecases/script/synopsis-generate.d.ts +4 -5
- package/dist/usecases/script/synopsis-generate.js +30 -46
- package/dist/usecases/script/synopsis-generate.js.map +1 -1
- package/dist/usecases/script/transition.js.map +1 -1
- package/dist/usecases/script/type.js.map +1 -1
- package/dist/usecases/script/worldview.js.map +1 -1
- package/package.json +11 -3
- package/scripts/install-skill.mjs +120 -0
- package/skills/scriptctl/SKILL.md +293 -0
- package/skills/scriptctl/references/atomic-write-workflow.md +117 -0
- package/skills/scriptctl/references/ingest-workflow.md +85 -0
- package/skills/scriptctl/references/state-reference-repair.md +59 -0
- package/dist/domain/direct/runner.d.ts +0 -25
- package/dist/domain/direct/runner.js +0 -88
- package/dist/domain/direct/runner.js.map +0 -1
- package/dist/domain/direct/stage.d.ts +0 -108
- package/dist/domain/direct/stage.js +0 -134
- package/dist/domain/direct/stage.js.map +0 -1
- package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
- package/dist/domain/direct/stages/asset-curation.js +0 -10
- package/dist/domain/direct/stages/asset-curation.js.map +0 -1
- package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
- package/dist/domain/direct/stages/batch-extract.js +0 -12
- package/dist/domain/direct/stages/batch-extract.js.map +0 -1
- package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
- package/dist/domain/direct/stages/batch-plan.js +0 -9
- package/dist/domain/direct/stages/batch-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
- package/dist/domain/direct/stages/episode-merge.js +0 -11
- package/dist/domain/direct/stages/episode-merge.js.map +0 -1
- package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
- package/dist/domain/direct/stages/episode-plan.js +0 -9
- package/dist/domain/direct/stages/episode-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/episode-synopsis.js +0 -12
- package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
- package/dist/domain/direct/stages/episode-titles.js +0 -12
- package/dist/domain/direct/stages/episode-titles.js.map +0 -1
- package/dist/domain/direct/stages/index.d.ts +0 -19
- package/dist/domain/direct/stages/index.js +0 -41
- package/dist/domain/direct/stages/index.js.map +0 -1
- package/dist/domain/direct/stages/metadata.d.ts +0 -2
- package/dist/domain/direct/stages/metadata.js +0 -11
- package/dist/domain/direct/stages/metadata.js.map +0 -1
- package/dist/domain/direct/stages/script-merge.d.ts +0 -2
- package/dist/domain/direct/stages/script-merge.js +0 -15
- package/dist/domain/direct/stages/script-merge.js.map +0 -1
- package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/script-synopsis.js +0 -12
- package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
- package/dist/domain/direct/stages/source-prepare.js +0 -9
- package/dist/domain/direct/stages/source-prepare.js.map +0 -1
- package/dist/domain/direct/stages/state-binding.d.ts +0 -2
- package/dist/domain/direct/stages/state-binding.js +0 -9
- package/dist/domain/direct/stages/state-binding.js.map +0 -1
- package/dist/domain/direct/stages/state-curation.d.ts +0 -2
- package/dist/domain/direct/stages/state-curation.js +0 -10
- package/dist/domain/direct/stages/state-curation.js.map +0 -1
- package/dist/domain/direct/stages/validate.d.ts +0 -2
- package/dist/domain/direct/stages/validate.js +0 -10
- package/dist/domain/direct/stages/validate.js.map +0 -1
- package/dist/domain/direct-core.d.ts +0 -313
- package/dist/domain/direct-core.js +0 -8516
- package/dist/domain/direct-core.js.map +0 -1
- package/dist/domain/script/validate.d.ts +0 -22
- package/dist/domain/script/validate.js +0 -997
- package/dist/domain/script/validate.js.map +0 -1
- package/dist/infra/providers.d.ts +0 -97
- package/dist/infra/providers.js +0 -1396
- package/dist/infra/providers.js.map +0 -1
- package/dist/usecases/direct.d.ts +0 -27
- package/dist/usecases/direct.js +0 -4172
- package/dist/usecases/direct.js.map +0 -1
- package/dist/usecases/parse.d.ts +0 -15
- package/dist/usecases/parse.js +0 -429
- package/dist/usecases/parse.js.map +0 -1
- package/dist/usecases/script/add-speaker.js +0 -22
- package/dist/usecases/script/add-speaker.js.map +0 -1
- package/dist/usecases/script/export.d.ts +0 -3
- package/dist/usecases/script/export.js +0 -111
- package/dist/usecases/script/export.js.map +0 -1
- package/dist/usecases/script/overlap.d.ts +0 -3
- package/dist/usecases/script/overlap.js +0 -21
- package/dist/usecases/script/overlap.js.map +0 -1
- package/dist/usecases/script/speakers.d.ts +0 -3
- package/dist/usecases/script/speakers.js +0 -28
- package/dist/usecases/script/speakers.js.map +0 -1
- package/dist/usecases/script/state-change.d.ts +0 -3
- package/dist/usecases/script/state-change.js +0 -24
- package/dist/usecases/script/state-change.js.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { LlmTransportError, } from "../../llm/types.js";
|
|
2
|
+
import { withTransientRetry } from "./retry.js";
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function endpoint(baseUrl) {
|
|
7
|
+
const base = baseUrl.trim().replace(/\/+$/, "");
|
|
8
|
+
if (base.endsWith("/chat/completions"))
|
|
9
|
+
return base;
|
|
10
|
+
if (base.endsWith("/v1"))
|
|
11
|
+
return `${base}/chat/completions`;
|
|
12
|
+
return `${base}/v1/chat/completions`;
|
|
13
|
+
}
|
|
14
|
+
function firstChoice(payload) {
|
|
15
|
+
if (!isRecord(payload) || !Array.isArray(payload["choices"]))
|
|
16
|
+
return null;
|
|
17
|
+
return payload["choices"].find(isRecord) ?? null;
|
|
18
|
+
}
|
|
19
|
+
function finishReason(choice) {
|
|
20
|
+
return choice && typeof choice["finish_reason"] === "string" ? choice["finish_reason"] : "";
|
|
21
|
+
}
|
|
22
|
+
function message(choice) {
|
|
23
|
+
return choice && isRecord(choice["message"]) ? choice["message"] : null;
|
|
24
|
+
}
|
|
25
|
+
function messageText(choice) {
|
|
26
|
+
const content = message(choice)?.["content"];
|
|
27
|
+
if (typeof content === "string")
|
|
28
|
+
return content.trim();
|
|
29
|
+
if (!Array.isArray(content))
|
|
30
|
+
return "";
|
|
31
|
+
return content.flatMap((part) => isRecord(part) && typeof part["text"] === "string" ? [part["text"]] : []).join("\n").trim();
|
|
32
|
+
}
|
|
33
|
+
function parseJson(raw) {
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new LlmTransportError("invalid_response", "Provider returned invalid JSON.", { details: [raw.slice(0, 500)] });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class OpenAiCompatibleModel {
|
|
42
|
+
provider;
|
|
43
|
+
model;
|
|
44
|
+
apiKey;
|
|
45
|
+
url;
|
|
46
|
+
constructor(provider, model, apiKey) {
|
|
47
|
+
this.provider = provider;
|
|
48
|
+
this.model = model;
|
|
49
|
+
this.apiKey = apiKey;
|
|
50
|
+
if (!provider.baseUrl)
|
|
51
|
+
throw new LlmTransportError("endpoint", "OpenAI-compatible provider endpoint is missing.");
|
|
52
|
+
this.url = endpoint(provider.baseUrl);
|
|
53
|
+
}
|
|
54
|
+
async post(body, signal) {
|
|
55
|
+
const result = await withTransientRetry(this.provider.maxAttempts, async () => {
|
|
56
|
+
const timeoutSignal = AbortSignal.timeout(this.provider.timeoutMs);
|
|
57
|
+
const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
58
|
+
let response;
|
|
59
|
+
try {
|
|
60
|
+
response = await fetch(this.url, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { authorization: `Bearer ${this.apiKey}`, "content-type": "application/json" },
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
signal: combinedSignal,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
+
const timeout = combinedSignal.aborted && !signal?.aborted;
|
|
70
|
+
throw new LlmTransportError(timeout ? "timeout" : "request_failed", "OpenAI-compatible request failed.", {
|
|
71
|
+
retryable: !signal?.aborted,
|
|
72
|
+
details: [message.slice(0, 500)],
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const raw = await response.text();
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
const retryable = response.status === 408 || response.status === 429 || response.status >= 500;
|
|
78
|
+
const code = response.status === 401 || response.status === 403 ? "auth" : response.status === 429 ? "rate_limited" : "request_failed";
|
|
79
|
+
throw new LlmTransportError(code, "OpenAI-compatible request failed.", {
|
|
80
|
+
retryable,
|
|
81
|
+
details: [`status: ${response.status}`, raw.slice(0, 500)],
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return parseJson(raw);
|
|
85
|
+
});
|
|
86
|
+
return { payload: result.value, attempts: result.attempts };
|
|
87
|
+
}
|
|
88
|
+
baseBody(request) {
|
|
89
|
+
const messages = [];
|
|
90
|
+
if (request.system.trim())
|
|
91
|
+
messages.push({ role: "system", content: request.system });
|
|
92
|
+
messages.push({ role: "user", content: request.user });
|
|
93
|
+
return {
|
|
94
|
+
model: this.model.model,
|
|
95
|
+
messages,
|
|
96
|
+
max_tokens: request.maxOutputTokens,
|
|
97
|
+
...(this.model.reasoning ? { reasoning_effort: this.model.reasoning } : {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async generateText(request) {
|
|
101
|
+
const { payload, attempts } = await this.post(this.baseBody(request), request.signal);
|
|
102
|
+
const choice = firstChoice(payload);
|
|
103
|
+
const reason = finishReason(choice);
|
|
104
|
+
if (reason === "length")
|
|
105
|
+
throw new LlmTransportError("truncated", "Provider output was truncated.");
|
|
106
|
+
if (reason === "content_filter")
|
|
107
|
+
throw new LlmTransportError("content_filtered", "Provider filtered the response.");
|
|
108
|
+
const text = messageText(choice);
|
|
109
|
+
if (!text)
|
|
110
|
+
throw new LlmTransportError("empty_response", "Provider returned an empty text response.");
|
|
111
|
+
return { text, finishReason: reason, attempts, raw: payload };
|
|
112
|
+
}
|
|
113
|
+
async generateTool(request) {
|
|
114
|
+
const { payload, attempts } = await this.post({
|
|
115
|
+
...this.baseBody(request),
|
|
116
|
+
tools: [{
|
|
117
|
+
type: "function",
|
|
118
|
+
function: { name: request.tool.name, description: request.tool.description, parameters: request.tool.inputSchema },
|
|
119
|
+
}],
|
|
120
|
+
tool_choice: { type: "function", function: { name: request.tool.name } },
|
|
121
|
+
parallel_tool_calls: false,
|
|
122
|
+
}, request.signal);
|
|
123
|
+
const choice = firstChoice(payload);
|
|
124
|
+
const reason = finishReason(choice);
|
|
125
|
+
if (reason === "length")
|
|
126
|
+
throw new LlmTransportError("truncated", "Provider tool output was truncated.");
|
|
127
|
+
if (reason === "content_filter")
|
|
128
|
+
throw new LlmTransportError("content_filtered", "Provider filtered the response.");
|
|
129
|
+
const calls = message(choice)?.["tool_calls"];
|
|
130
|
+
if (!Array.isArray(calls))
|
|
131
|
+
throw new LlmTransportError("invalid_response", "Provider did not return a tool call.");
|
|
132
|
+
for (const call of calls) {
|
|
133
|
+
if (!isRecord(call) || !isRecord(call["function"]))
|
|
134
|
+
continue;
|
|
135
|
+
const fn = call["function"];
|
|
136
|
+
if (fn["name"] !== request.tool.name || typeof fn["arguments"] !== "string")
|
|
137
|
+
continue;
|
|
138
|
+
return { input: parseJson(fn["arguments"]), finishReason: reason, attempts, raw: payload };
|
|
139
|
+
}
|
|
140
|
+
throw new LlmTransportError("invalid_response", "Provider did not return the required tool call.");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=openai-compatible-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible-model.js","sourceRoot":"","sources":["../../../src/infra/llm/openai-compatible-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installProxyFromEnv(): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Proxy bootstrap for Google (Gemini). Node's built-in fetch (undici) ignores
|
|
2
|
+
// HTTPS_PROXY/https_proxy, so direct calls to googleapis.com time out behind a
|
|
3
|
+
// local proxy (e.g. Clash on 127.0.0.1). Installing undici's EnvHttpProxyAgent
|
|
4
|
+
// makes fetch honor the proxy env. We add the LiteLLM gateway host + localhost to
|
|
5
|
+
// no_proxy so domestic/loopback traffic (roster merge, govern, mock gateway)
|
|
6
|
+
// stays DIRECT and only Google egress is proxied. Idempotent no-op when no proxy
|
|
7
|
+
// env is set.
|
|
8
|
+
import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
|
|
9
|
+
let installed = false;
|
|
10
|
+
export function installProxyFromEnv() {
|
|
11
|
+
if (installed)
|
|
12
|
+
return;
|
|
13
|
+
installed = true;
|
|
14
|
+
const proxy = (process.env.https_proxy ?? process.env.HTTPS_PROXY ?? process.env.http_proxy ?? process.env.HTTP_PROXY ?? "").trim();
|
|
15
|
+
if (!proxy)
|
|
16
|
+
return; // nothing to do — direct connectivity assumed
|
|
17
|
+
const exclude = new Set(["localhost", "127.0.0.1", "::1"]);
|
|
18
|
+
const gatewayUrl = (process.env.PROJECT_LITELLM_GATEWAY_BASE_URL ?? "").trim();
|
|
19
|
+
if (gatewayUrl) {
|
|
20
|
+
try {
|
|
21
|
+
exclude.add(new URL(gatewayUrl).hostname);
|
|
22
|
+
}
|
|
23
|
+
catch { /* ignore malformed */ }
|
|
24
|
+
}
|
|
25
|
+
for (const h of (process.env.no_proxy ?? process.env.NO_PROXY ?? "").split(",").map((s) => s.trim()).filter(Boolean))
|
|
26
|
+
exclude.add(h);
|
|
27
|
+
process.env.no_proxy = [...exclude].join(",");
|
|
28
|
+
setGlobalDispatcher(new EnvHttpProxyAgent());
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/infra/llm/proxy.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,cAAc;AAEd,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAEhE,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,mBAAmB;IACjC,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,8CAA8C;IAElE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrI,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9C,mBAAmB,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LlmTransportError } from "../../llm/types.js";
|
|
2
|
+
function delay(ms) {
|
|
3
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
|
+
}
|
|
5
|
+
export async function withTransientRetry(maxAttempts, operation) {
|
|
6
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
7
|
+
try {
|
|
8
|
+
return { value: await operation(), attempts: attempt };
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (!(error instanceof LlmTransportError) || !error.retryable || attempt === maxAttempts)
|
|
12
|
+
throw error;
|
|
13
|
+
// Exponential backoff (30s cap) — a shared LAN gateway under load needs the
|
|
14
|
+
// retries spaced out, not hammered within a few seconds.
|
|
15
|
+
await delay(Math.min(30_000, 1000 * 2 ** (attempt - 1)));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
throw new Error("unreachable retry state");
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/infra/llm/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,WAAmB,EAAE,SAA2B;IAC1F,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,WAAW;gBAAE,MAAM,KAAK,CAAC;YACtG,4EAA4E;YAC5E,yDAAyD;YACzD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/llm/composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOhD,MAAM,CAAC,MAAM,0BAA0B,GAAmB;IACxD,cAAc,EAAE,iBAAiB;CAClC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { LlmProtocol, LlmTaskId } from "./types.js";
|
|
2
|
+
export interface LlmProviderConfig {
|
|
3
|
+
protocol: LlmProtocol;
|
|
4
|
+
baseUrl: string | null;
|
|
5
|
+
apiKeyEnv: string;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
maxAttempts: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LlmModelConfig {
|
|
10
|
+
provider: string;
|
|
11
|
+
model: string;
|
|
12
|
+
thinkingBudgetTokens?: number;
|
|
13
|
+
reasoning?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ResolvedLlmConfig {
|
|
16
|
+
version: 1;
|
|
17
|
+
providers: Readonly<Record<string, LlmProviderConfig>>;
|
|
18
|
+
models: Readonly<Record<string, LlmModelConfig>>;
|
|
19
|
+
tasks: Readonly<Partial<Record<LlmTaskId, string>>>;
|
|
20
|
+
source: "builtin" | "file";
|
|
21
|
+
sourcePath: string | null;
|
|
22
|
+
}
|
|
23
|
+
export declare function parseLlmConfig(value: unknown, sourcePath: string): ResolvedLlmConfig;
|
|
24
|
+
export declare const BUILTIN_LLM_CONFIG: ResolvedLlmConfig;
|
|
25
|
+
export declare function builtinLlmConfig(): ResolvedLlmConfig;
|
|
26
|
+
export declare function loadLlmConfig(explicitPath?: string): ResolvedLlmConfig;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { parseDocument } from "yaml";
|
|
5
|
+
import { CliError, EXIT_INPUT, isDebug } from "../common.js";
|
|
6
|
+
import { isLlmTaskId } from "./registry.js";
|
|
7
|
+
const PROVIDER_KEYS = new Set(["protocol", "baseUrl", "apiKey", "timeoutMs", "maxAttempts"]);
|
|
8
|
+
const MODEL_KEYS = new Set(["provider", "model", "thinking", "reasoning"]);
|
|
9
|
+
const API_KEY_KEYS = new Set(["env"]);
|
|
10
|
+
const THINKING_KEYS = new Set(["budgetTokens"]);
|
|
11
|
+
function configError(message, received = []) {
|
|
12
|
+
return new CliError("LLM CONFIG INVALID", message, {
|
|
13
|
+
exitCode: EXIT_INPUT,
|
|
14
|
+
errorCode: "LLM_CONFIG_INVALID",
|
|
15
|
+
required: ["valid scriptctl LLM YAML configuration"],
|
|
16
|
+
received,
|
|
17
|
+
nextSteps: ["Fix the selected LLM configuration or environment and rerun `scriptctl doctor`."],
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function httpUrlAt(value, label) {
|
|
21
|
+
let parsedUrl;
|
|
22
|
+
try {
|
|
23
|
+
parsedUrl = new URL(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw configError(`${label} must be an absolute URL.`);
|
|
27
|
+
}
|
|
28
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
29
|
+
throw configError(`${label} must use http or https.`);
|
|
30
|
+
}
|
|
31
|
+
return parsedUrl.toString().replace(/\/$/, "");
|
|
32
|
+
}
|
|
33
|
+
function isRecord(value) {
|
|
34
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
35
|
+
}
|
|
36
|
+
function recordAt(value, label) {
|
|
37
|
+
if (!isRecord(value))
|
|
38
|
+
throw configError(`${label} must be a mapping.`, [`${label}: ${typeof value}`]);
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function stringAt(value, label) {
|
|
42
|
+
if (typeof value !== "string" || !value.trim())
|
|
43
|
+
throw configError(`${label} must be a non-empty string.`);
|
|
44
|
+
return value.trim();
|
|
45
|
+
}
|
|
46
|
+
function integerAt(value, label, min, max) {
|
|
47
|
+
if (!Number.isInteger(value) || typeof value !== "number" || value < min || (max !== undefined && value > max)) {
|
|
48
|
+
throw configError(`${label} must be an integer in ${max === undefined ? `[${min}, +∞)` : `[${min}, ${max}]`}.`);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function rejectUnknownKeys(record, allowed, label) {
|
|
53
|
+
const unknown = Object.keys(record).filter((key) => !allowed.has(key));
|
|
54
|
+
if (unknown.length > 0)
|
|
55
|
+
throw configError(`${label} contains unknown fields.`, unknown);
|
|
56
|
+
}
|
|
57
|
+
function parseProvider(name, raw) {
|
|
58
|
+
const provider = recordAt(raw, `providers.${name}`);
|
|
59
|
+
rejectUnknownKeys(provider, PROVIDER_KEYS, `providers.${name}`);
|
|
60
|
+
const protocolRaw = stringAt(provider["protocol"], `providers.${name}.protocol`);
|
|
61
|
+
if (protocolRaw !== "anthropic" && protocolRaw !== "openai-compatible" && protocolRaw !== "google-gemini") {
|
|
62
|
+
throw configError(`providers.${name}.protocol is unsupported.`, [protocolRaw]);
|
|
63
|
+
}
|
|
64
|
+
// Only openai-compatible needs an explicit endpoint; anthropic and
|
|
65
|
+
// google-gemini use their SDK default when baseUrl is omitted.
|
|
66
|
+
const baseUrl = provider["baseUrl"] === undefined && protocolRaw !== "openai-compatible"
|
|
67
|
+
? null
|
|
68
|
+
: httpUrlAt(stringAt(provider["baseUrl"], `providers.${name}.baseUrl`), `providers.${name}.baseUrl`);
|
|
69
|
+
const apiKey = recordAt(provider["apiKey"], `providers.${name}.apiKey`);
|
|
70
|
+
rejectUnknownKeys(apiKey, API_KEY_KEYS, `providers.${name}.apiKey`);
|
|
71
|
+
const apiKeyEnv = stringAt(apiKey["env"], `providers.${name}.apiKey.env`);
|
|
72
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(apiKeyEnv)) {
|
|
73
|
+
throw configError(`providers.${name}.apiKey.env must be an environment variable name.`);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
protocol: protocolRaw,
|
|
77
|
+
baseUrl,
|
|
78
|
+
apiKeyEnv,
|
|
79
|
+
timeoutMs: integerAt(provider["timeoutMs"], `providers.${name}.timeoutMs`, 1),
|
|
80
|
+
maxAttempts: integerAt(provider["maxAttempts"], `providers.${name}.maxAttempts`, 1, 6),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseModel(name, raw, providers) {
|
|
84
|
+
const model = recordAt(raw, `models.${name}`);
|
|
85
|
+
rejectUnknownKeys(model, MODEL_KEYS, `models.${name}`);
|
|
86
|
+
const providerName = stringAt(model["provider"], `models.${name}.provider`);
|
|
87
|
+
const provider = providers[providerName];
|
|
88
|
+
if (!provider)
|
|
89
|
+
throw configError(`models.${name} references an unknown provider.`, [providerName]);
|
|
90
|
+
const result = {
|
|
91
|
+
provider: providerName,
|
|
92
|
+
model: stringAt(model["model"], `models.${name}.model`),
|
|
93
|
+
};
|
|
94
|
+
if (model["reasoning"] !== undefined)
|
|
95
|
+
result.reasoning = stringAt(model["reasoning"], `models.${name}.reasoning`);
|
|
96
|
+
if (model["thinking"] !== undefined) {
|
|
97
|
+
if (provider.protocol !== "anthropic")
|
|
98
|
+
throw configError(`models.${name}.thinking is only valid for anthropic providers.`);
|
|
99
|
+
const thinking = recordAt(model["thinking"], `models.${name}.thinking`);
|
|
100
|
+
rejectUnknownKeys(thinking, THINKING_KEYS, `models.${name}.thinking`);
|
|
101
|
+
result.thinkingBudgetTokens = integerAt(thinking["budgetTokens"], `models.${name}.thinking.budgetTokens`, 1024);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
export function parseLlmConfig(value, sourcePath) {
|
|
106
|
+
const root = recordAt(value, "config");
|
|
107
|
+
rejectUnknownKeys(root, new Set(["version", "providers", "models", "tasks"]), "config");
|
|
108
|
+
if (root["version"] !== 1)
|
|
109
|
+
throw configError("config.version must be 1.");
|
|
110
|
+
const rawProviders = recordAt(root["providers"], "providers");
|
|
111
|
+
const providers = {};
|
|
112
|
+
for (const [name, provider] of Object.entries(rawProviders))
|
|
113
|
+
providers[name] = parseProvider(name, provider);
|
|
114
|
+
const rawModels = recordAt(root["models"], "models");
|
|
115
|
+
const models = {};
|
|
116
|
+
for (const [name, model] of Object.entries(rawModels))
|
|
117
|
+
models[name] = parseModel(name, model, providers);
|
|
118
|
+
if (!models["default"])
|
|
119
|
+
throw configError("models.default is required.");
|
|
120
|
+
const tasks = {};
|
|
121
|
+
if (root["tasks"] !== undefined) {
|
|
122
|
+
const rawTasks = recordAt(root["tasks"], "tasks");
|
|
123
|
+
for (const [task, profileValue] of Object.entries(rawTasks)) {
|
|
124
|
+
if (!isLlmTaskId(task))
|
|
125
|
+
throw configError("tasks contains an unknown task id.", [task]);
|
|
126
|
+
const profile = stringAt(profileValue, `tasks.${task}`);
|
|
127
|
+
if (!models[profile])
|
|
128
|
+
throw configError(`tasks.${task} references an unknown model profile.`, [profile]);
|
|
129
|
+
tasks[task] = profile;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return { version: 1, providers, models, tasks, source: "file", sourcePath };
|
|
133
|
+
}
|
|
134
|
+
export const BUILTIN_LLM_CONFIG = {
|
|
135
|
+
version: 1,
|
|
136
|
+
providers: {
|
|
137
|
+
// baseUrl comes from PROJECT_LITELLM_GATEWAY_BASE_URL (see builtinLlmConfig);
|
|
138
|
+
// null until resolved, so the built-in config never bakes in a host.
|
|
139
|
+
gw: { protocol: "openai-compatible", baseUrl: null, apiKeyEnv: "PROJECT_LITELLM_GATEWAY_API_KEY", timeoutMs: 300_000, maxAttempts: 3 },
|
|
140
|
+
// Video goes direct to Google (not the LiteLLM gateway); longer timeout for
|
|
141
|
+
// upload+processing of large episode files. Credential: GEMINI_API_KEY.
|
|
142
|
+
"google-gemini": { protocol: "google-gemini", baseUrl: null, apiKeyEnv: "GEMINI_API_KEY", timeoutMs: 600_000, maxAttempts: 3 },
|
|
143
|
+
},
|
|
144
|
+
models: {
|
|
145
|
+
default: { provider: "gw", model: "deepseek-v4-pro_official" },
|
|
146
|
+
"ingest-low": { provider: "gw", model: "deepseek-v4-flash_budget", reasoning: "max" },
|
|
147
|
+
"ingest-normalize": { provider: "gw", model: "deepseek-v4-pro_official", reasoning: "max" },
|
|
148
|
+
"ingest-video": { provider: "google-gemini", model: "gemini-3.5-flash" },
|
|
149
|
+
},
|
|
150
|
+
tasks: {
|
|
151
|
+
// Ingest: cheap model for chunk normalization + pronoun resolve + recall;
|
|
152
|
+
// everything else (governance/refine/state, synopsis, metadata) falls to
|
|
153
|
+
// the high `default` model.
|
|
154
|
+
"ingest.text-normalize": "ingest-low",
|
|
155
|
+
"ingest.mention-resolve": "ingest-low",
|
|
156
|
+
"ingest.asset-recall": "ingest-low",
|
|
157
|
+
// Video understanding → Gemini (§10.3).
|
|
158
|
+
"ingest.video-transcribe": "ingest-video",
|
|
159
|
+
"ingest.video-correct": "ingest-video",
|
|
160
|
+
},
|
|
161
|
+
source: "builtin",
|
|
162
|
+
sourcePath: null,
|
|
163
|
+
};
|
|
164
|
+
export function builtinLlmConfig() {
|
|
165
|
+
const rawBaseUrl = (process.env.PROJECT_LITELLM_GATEWAY_BASE_URL ?? "").trim();
|
|
166
|
+
const baseUrl = rawBaseUrl ? httpUrlAt(rawBaseUrl, "PROJECT_LITELLM_GATEWAY_BASE_URL") : null;
|
|
167
|
+
return {
|
|
168
|
+
...BUILTIN_LLM_CONFIG,
|
|
169
|
+
providers: {
|
|
170
|
+
gw: { ...BUILTIN_LLM_CONFIG.providers["gw"], baseUrl },
|
|
171
|
+
// Gemini is not gateway-routed; keep its SDK-default endpoint (null).
|
|
172
|
+
"google-gemini": { ...BUILTIN_LLM_CONFIG.providers["google-gemini"] },
|
|
173
|
+
},
|
|
174
|
+
models: { ...BUILTIN_LLM_CONFIG.models },
|
|
175
|
+
tasks: { ...BUILTIN_LLM_CONFIG.tasks },
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function defaultConfigPath() {
|
|
179
|
+
const xdg = (process.env.XDG_CONFIG_HOME ?? "").trim();
|
|
180
|
+
return xdg ? path.join(xdg, "scriptctl", "llm.yaml") : path.join(os.homedir(), ".config", "scriptctl", "llm.yaml");
|
|
181
|
+
}
|
|
182
|
+
function readYamlConfig(filePath) {
|
|
183
|
+
if (!fs.existsSync(filePath))
|
|
184
|
+
throw configError("LLM configuration file does not exist.", [isDebug() ? filePath : "selected config file: missing"]);
|
|
185
|
+
const document = parseDocument(fs.readFileSync(filePath, "utf-8"), { uniqueKeys: true });
|
|
186
|
+
if (document.errors.length > 0)
|
|
187
|
+
throw configError("LLM configuration YAML is invalid.", document.errors.map((error) => error.message));
|
|
188
|
+
const value = document.toJS();
|
|
189
|
+
return parseLlmConfig(value, path.resolve(filePath));
|
|
190
|
+
}
|
|
191
|
+
export function loadLlmConfig(explicitPath) {
|
|
192
|
+
const flagPath = (explicitPath ?? "").trim();
|
|
193
|
+
if (flagPath)
|
|
194
|
+
return readYamlConfig(flagPath);
|
|
195
|
+
const envPath = (process.env.SCRIPTCTL_LLM_CONFIG ?? "").trim();
|
|
196
|
+
if (envPath)
|
|
197
|
+
return readYamlConfig(envPath);
|
|
198
|
+
const conventionalPath = defaultConfigPath();
|
|
199
|
+
return fs.existsSync(conventionalPath) ? readYamlConfig(conventionalPath) : builtinLlmConfig();
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/llm/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LlmTaskId, LlmTaskMode } from "./types.js";
|
|
2
|
+
export interface LlmTaskSpec {
|
|
3
|
+
id: LlmTaskId;
|
|
4
|
+
mode: LlmTaskMode;
|
|
5
|
+
version: string;
|
|
6
|
+
maxOutputTokens: number;
|
|
7
|
+
defaultProfile: "default";
|
|
8
|
+
}
|
|
9
|
+
export declare const LLM_TASK_REGISTRY: {
|
|
10
|
+
"direct.episode-titles": LlmTaskSpec;
|
|
11
|
+
"direct.batch-extract": LlmTaskSpec;
|
|
12
|
+
"direct.episode-synopsis": LlmTaskSpec;
|
|
13
|
+
"direct.synopsis-reduction": LlmTaskSpec;
|
|
14
|
+
"direct.script-synopsis": LlmTaskSpec;
|
|
15
|
+
"direct.asset-grouping": LlmTaskSpec;
|
|
16
|
+
"direct.asset-curation": LlmTaskSpec;
|
|
17
|
+
"direct.asset-curation-audit": LlmTaskSpec;
|
|
18
|
+
"direct.location-canonicalization": LlmTaskSpec;
|
|
19
|
+
"direct.state-curation": LlmTaskSpec;
|
|
20
|
+
"direct.state-binding": LlmTaskSpec;
|
|
21
|
+
"metadata.global": LlmTaskSpec;
|
|
22
|
+
"metadata.descriptions": LlmTaskSpec;
|
|
23
|
+
"synopsis.chunk": LlmTaskSpec;
|
|
24
|
+
"synopsis.episode": LlmTaskSpec;
|
|
25
|
+
"synopsis.arc": LlmTaskSpec;
|
|
26
|
+
"synopsis.script-overview": LlmTaskSpec;
|
|
27
|
+
"ingest.text-normalize": LlmTaskSpec;
|
|
28
|
+
"ingest.mention-resolve": LlmTaskSpec;
|
|
29
|
+
"ingest.asset-extract": LlmTaskSpec;
|
|
30
|
+
"ingest.asset-curate": LlmTaskSpec;
|
|
31
|
+
"ingest.asset-recall": LlmTaskSpec;
|
|
32
|
+
"ingest.asset-refine": LlmTaskSpec;
|
|
33
|
+
"ingest.state-reconcile": LlmTaskSpec;
|
|
34
|
+
"ingest.speaker-audit": LlmTaskSpec;
|
|
35
|
+
"ingest.video-transcribe": LlmTaskSpec;
|
|
36
|
+
"ingest.video-correct": LlmTaskSpec;
|
|
37
|
+
"ingest.roster-recall": LlmTaskSpec;
|
|
38
|
+
"ingest.roster-refine": LlmTaskSpec;
|
|
39
|
+
"ingest.roster-canon": LlmTaskSpec;
|
|
40
|
+
"ingest.roster-remerge": LlmTaskSpec;
|
|
41
|
+
"ingest.state-merge": LlmTaskSpec;
|
|
42
|
+
};
|
|
43
|
+
export declare const LLM_TASK_IDS: LlmTaskId[];
|
|
44
|
+
export declare function isLlmTaskId(value: string): value is LlmTaskId;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function spec(id, mode, maxOutputTokens) {
|
|
2
|
+
return { id, mode, version: "1", maxOutputTokens, defaultProfile: "default" };
|
|
3
|
+
}
|
|
4
|
+
export const LLM_TASK_REGISTRY = {
|
|
5
|
+
"direct.episode-titles": spec("direct.episode-titles", "tool", 4096),
|
|
6
|
+
"direct.batch-extract": spec("direct.batch-extract", "text", 16000),
|
|
7
|
+
"direct.episode-synopsis": spec("direct.episode-synopsis", "tool", 2048),
|
|
8
|
+
"direct.synopsis-reduction": spec("direct.synopsis-reduction", "tool", 4096),
|
|
9
|
+
"direct.script-synopsis": spec("direct.script-synopsis", "tool", 2048),
|
|
10
|
+
"direct.asset-grouping": spec("direct.asset-grouping", "text", 8000),
|
|
11
|
+
"direct.asset-curation": spec("direct.asset-curation", "text", 20000),
|
|
12
|
+
"direct.asset-curation-audit": spec("direct.asset-curation-audit", "text", 20000),
|
|
13
|
+
"direct.location-canonicalization": spec("direct.location-canonicalization", "text", 20000),
|
|
14
|
+
"direct.state-curation": spec("direct.state-curation", "text", 20000),
|
|
15
|
+
"direct.state-binding": spec("direct.state-binding", "tool", 16000),
|
|
16
|
+
"metadata.global": spec("metadata.global", "text", 16000),
|
|
17
|
+
"metadata.descriptions": spec("metadata.descriptions", "text", 16000),
|
|
18
|
+
"synopsis.chunk": spec("synopsis.chunk", "text", 4096),
|
|
19
|
+
"synopsis.episode": spec("synopsis.episode", "text", 4096),
|
|
20
|
+
"synopsis.arc": spec("synopsis.arc", "text", 4096),
|
|
21
|
+
"synopsis.script-overview": spec("synopsis.script-overview", "text", 4096),
|
|
22
|
+
"ingest.text-normalize": spec("ingest.text-normalize", "text", 16000),
|
|
23
|
+
"ingest.mention-resolve": spec("ingest.mention-resolve", "text", 8000),
|
|
24
|
+
"ingest.asset-extract": spec("ingest.asset-extract", "text", 8000),
|
|
25
|
+
"ingest.asset-curate": spec("ingest.asset-curate", "text", 32000),
|
|
26
|
+
"ingest.asset-recall": spec("ingest.asset-recall", "text", 65536),
|
|
27
|
+
"ingest.asset-refine": spec("ingest.asset-refine", "text", 32000),
|
|
28
|
+
"ingest.state-reconcile": spec("ingest.state-reconcile", "text", 32000),
|
|
29
|
+
"ingest.speaker-audit": spec("ingest.speaker-audit", "tool", 16000),
|
|
30
|
+
// Video understanding (Gemini). Transcribe emits a full-episode markdown
|
|
31
|
+
// transcript; correct emits structured JSON corrections. Both need a large
|
|
32
|
+
// output budget (§10.5 verified 65536 for transcription).
|
|
33
|
+
"ingest.video-transcribe": spec("ingest.video-transcribe", "video", 65536),
|
|
34
|
+
"ingest.video-correct": spec("ingest.video-correct", "video", 65536),
|
|
35
|
+
// Video roster merge (§10.2 pass3): cross-episode identity via forced tool
|
|
36
|
+
// calls. Recall sees the full roster (large output); refine/remerge per group;
|
|
37
|
+
// canon is tiny. State merge collapses outfit-wording fragmentation.
|
|
38
|
+
"ingest.roster-recall": spec("ingest.roster-recall", "tool", 65536),
|
|
39
|
+
"ingest.roster-refine": spec("ingest.roster-refine", "tool", 8000),
|
|
40
|
+
"ingest.roster-canon": spec("ingest.roster-canon", "tool", 2048),
|
|
41
|
+
"ingest.roster-remerge": spec("ingest.roster-remerge", "tool", 8000),
|
|
42
|
+
"ingest.state-merge": spec("ingest.state-merge", "tool", 8000),
|
|
43
|
+
};
|
|
44
|
+
export const LLM_TASK_IDS = Object.keys(LLM_TASK_REGISTRY).filter(isLlmTaskId);
|
|
45
|
+
export function isLlmTaskId(value) {
|
|
46
|
+
return Object.hasOwn(LLM_TASK_REGISTRY, value);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/llm/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ResolvedLlmConfig } from "./config.js";
|
|
2
|
+
import type { LlmRouteInfo, LlmRouteUsage, LlmTaskExecutor, LlmTaskId, TaskVideoPort, TextGenerationRequest, TextGenerationResponse, ToolGenerationRequest, ToolGenerationResponse } from "./types.js";
|
|
3
|
+
export declare class ModelRouter implements LlmTaskExecutor {
|
|
4
|
+
private readonly config;
|
|
5
|
+
private readonly adapters;
|
|
6
|
+
private readonly videoAdapters;
|
|
7
|
+
private readonly resolvedRoutes;
|
|
8
|
+
private readonly usageByTask;
|
|
9
|
+
constructor(config: ResolvedLlmConfig);
|
|
10
|
+
get configSource(): "builtin" | "file";
|
|
11
|
+
private resolve;
|
|
12
|
+
route(task: LlmTaskId): LlmRouteInfo;
|
|
13
|
+
routes(): LlmRouteInfo[];
|
|
14
|
+
recordReuse(task: LlmTaskId): void;
|
|
15
|
+
usage(): LlmRouteUsage[];
|
|
16
|
+
private recordCall;
|
|
17
|
+
private adapter;
|
|
18
|
+
private videoAdapter;
|
|
19
|
+
videoPort(task: LlmTaskId): TaskVideoPort;
|
|
20
|
+
generateText(task: LlmTaskId, request: Omit<TextGenerationRequest, "maxOutputTokens">): Promise<TextGenerationResponse>;
|
|
21
|
+
generateTool(task: LlmTaskId, request: Omit<ToolGenerationRequest, "maxOutputTokens">): Promise<ToolGenerationResponse>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createLlmExecutor(explicitConfigPath?: string): ModelRouter;
|
|
Binary file
|