@armadra/agent 0.4.0 → 0.5.1
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/CHANGELOG.md +184 -1
- package/README.md +202 -83
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/acp.d.ts +18 -0
- package/dist/acp.js +19 -0
- package/dist/agent/limits.d.ts +38 -0
- package/dist/agent/limits.js +127 -0
- package/dist/agent/loop-guard.d.ts +38 -0
- package/dist/agent/loop-guard.js +95 -0
- package/dist/agent/loop.d.ts +4 -0
- package/dist/agent/loop.js +7 -0
- package/dist/agent/prompt-rules.d.ts +12 -0
- package/dist/agent/prompt-rules.js +18 -0
- package/dist/agent/reminders.d.ts +59 -0
- package/dist/agent/reminders.js +327 -0
- package/dist/agent/session-cache.d.ts +5 -0
- package/dist/agent/session-cache.js +17 -1
- package/dist/agent/session-classifier.d.ts +1 -1
- package/dist/agent/session-classifier.js +3 -1
- package/dist/agent/session-compaction.d.ts +35 -6
- package/dist/agent/session-compaction.js +157 -31
- package/dist/agent/session-core.d.ts +27 -1
- package/dist/agent/session-extensions.d.ts +61 -0
- package/dist/agent/session-extensions.js +129 -0
- package/dist/agent/session-images.d.ts +23 -0
- package/dist/agent/session-images.js +97 -0
- package/dist/agent/session-plan.d.ts +21 -0
- package/dist/agent/session-plan.js +524 -0
- package/dist/agent/session-rewind.d.ts +81 -0
- package/dist/agent/session-rewind.js +354 -0
- package/dist/agent/session-run.d.ts +28 -1
- package/dist/agent/session-run.js +157 -6
- package/dist/agent/session-settings.d.ts +49 -0
- package/dist/agent/session-settings.js +95 -0
- package/dist/agent/session-subagent.d.ts +36 -24
- package/dist/agent/session-subagent.js +259 -129
- package/dist/agent/session-sync.d.ts +10 -3
- package/dist/agent/session-sync.js +37 -8
- package/dist/agent/session-telemetry.d.ts +39 -0
- package/dist/agent/session-telemetry.js +231 -0
- package/dist/agent/session-tools.js +40 -1
- package/dist/agent/session.d.ts +30 -29
- package/dist/agent/session.js +79 -123
- package/dist/agent/subagent-registry.d.ts +91 -0
- package/dist/agent/subagent-registry.js +494 -0
- package/dist/agent/system-prompt.d.ts +6 -3
- package/dist/agent/system-prompt.js +7 -2
- package/dist/agent/tool-runner.d.ts +8 -1
- package/dist/agent/tool-runner.js +57 -4
- package/dist/agent/types-w5.d.ts +192 -0
- package/dist/agent/types-w5.js +10 -0
- package/dist/agent/types.d.ts +47 -4
- package/dist/agent/types.js +2 -0
- package/dist/agent/worktree.d.ts +36 -0
- package/dist/agent/worktree.js +86 -0
- package/dist/agents/builtin.d.ts +14 -0
- package/dist/agents/builtin.js +39 -0
- package/dist/agents/catalog.d.ts +43 -0
- package/dist/agents/catalog.js +82 -0
- package/dist/agents/discover.d.ts +35 -0
- package/dist/agents/discover.js +83 -0
- package/dist/agents/external.d.ts +82 -0
- package/dist/agents/external.js +326 -0
- package/dist/agents/parse.d.ts +18 -0
- package/dist/agents/parse.js +116 -0
- package/dist/agents/result.d.ts +32 -0
- package/dist/agents/result.js +67 -0
- package/dist/agents/task-control.d.ts +17 -0
- package/dist/agents/task-control.js +17 -0
- package/dist/agents/task-record.d.ts +78 -0
- package/dist/agents/task-record.js +141 -0
- package/dist/agents/types.d.ts +46 -0
- package/dist/agents/types.js +8 -0
- package/dist/ai/apis/anthropic-compat.d.ts +36 -0
- package/dist/ai/apis/anthropic-compat.js +92 -0
- package/dist/ai/apis/anthropic-request.d.ts +7 -6
- package/dist/ai/apis/anthropic-request.js +10 -28
- package/dist/ai/apis/cache-params.d.ts +11 -2
- package/dist/ai/apis/cache-params.js +25 -6
- package/dist/ai/apis/openai-compat.d.ts +4 -1
- package/dist/ai/apis/openai-compat.js +8 -1
- package/dist/ai/image-limits.d.ts +45 -0
- package/dist/ai/image-limits.js +68 -0
- package/dist/ai/providers/builtin.d.ts +18 -6
- package/dist/ai/providers/builtin.js +135 -6
- package/dist/ai/providers/catalog-data.js +17 -13
- package/dist/ai/providers/catalog.d.ts +60 -7
- package/dist/ai/providers/catalog.js +197 -38
- package/dist/ai/providers/channels.d.ts +33 -3
- package/dist/ai/providers/channels.js +108 -7
- package/dist/ai/providers/enrich.d.ts +6 -3
- package/dist/ai/providers/enrich.js +19 -4
- package/dist/ai/providers/models-dev-cache.d.ts +28 -24
- package/dist/ai/providers/models-dev-cache.js +92 -78
- package/dist/ai/providers/models-dev-data.d.ts +7 -0
- package/dist/ai/providers/models-dev-data.js +32 -0
- package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
- package/dist/ai/providers/models-dev-snapshot.js +137 -0
- package/dist/ai/providers/models-dev.d.ts +51 -10
- package/dist/ai/providers/models-dev.js +132 -39
- package/dist/ai/providers/registry.d.ts +20 -10
- package/dist/ai/providers/registry.js +82 -43
- package/dist/ai/types.d.ts +28 -2
- package/dist/ai/types.js +5 -0
- package/dist/bundle/ama.cjs +37605 -21619
- package/dist/checkpoints/backend.d.ts +61 -0
- package/dist/checkpoints/backend.js +135 -0
- package/dist/checkpoints/blobs.d.ts +60 -0
- package/dist/checkpoints/blobs.js +203 -0
- package/dist/checkpoints/gc.d.ts +47 -0
- package/dist/checkpoints/gc.js +144 -0
- package/dist/checkpoints/git-head.d.ts +15 -0
- package/dist/checkpoints/git-head.js +89 -0
- package/dist/checkpoints/index.d.ts +17 -0
- package/dist/checkpoints/index.js +17 -0
- package/dist/checkpoints/replay.d.ts +48 -0
- package/dist/checkpoints/replay.js +154 -0
- package/dist/checkpoints/restore.d.ts +86 -0
- package/dist/checkpoints/restore.js +263 -0
- package/dist/checkpoints/settings.d.ts +14 -0
- package/dist/checkpoints/settings.js +23 -0
- package/dist/checkpoints/shadow-git.d.ts +108 -0
- package/dist/checkpoints/shadow-git.js +491 -0
- package/dist/checkpoints/shadow-restore.d.ts +25 -0
- package/dist/checkpoints/shadow-restore.js +128 -0
- package/dist/checkpoints/tracker.d.ts +64 -0
- package/dist/checkpoints/tracker.js +192 -0
- package/dist/checkpoints/types.d.ts +99 -0
- package/dist/checkpoints/types.js +12 -0
- package/dist/cli/args.d.ts +8 -4
- package/dist/cli/args.js +17 -97
- package/dist/cli/bootstrap.js +13 -1
- package/dist/cli/choice-prompt.d.ts +58 -0
- package/dist/cli/choice-prompt.js +140 -0
- package/dist/cli/codemode-notice.d.ts +3 -2
- package/dist/cli/codemode-notice.js +3 -2
- package/dist/cli/compose-agents.d.ts +27 -0
- package/dist/cli/compose-agents.js +111 -0
- package/dist/cli/compose-extensions.d.ts +29 -0
- package/dist/cli/compose-extensions.js +44 -0
- package/dist/cli/compose-session.d.ts +3 -0
- package/dist/cli/compose-session.js +47 -4
- package/dist/cli/compose.d.ts +3 -0
- package/dist/cli/compose.js +33 -6
- package/dist/cli/deps.d.ts +6 -0
- package/dist/cli/exit-codes.d.ts +10 -0
- package/dist/cli/exit-codes.js +12 -0
- package/dist/cli/help-text.d.ts +4 -0
- package/dist/cli/help-text.js +102 -0
- package/dist/cli/startup-screen.js +5 -3
- package/dist/cli/startup-steps.js +7 -1
- package/dist/cli/subcommands/config.d.ts +4 -1
- package/dist/cli/subcommands/config.js +17 -6
- package/dist/cli/subcommands/doctor.js +21 -0
- package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
- package/dist/cli/subcommands/models-cache-probe.js +3 -12
- package/dist/cli/subcommands/models-discover.js +5 -6
- package/dist/cli/subcommands/models.d.ts +2 -0
- package/dist/cli/subcommands/models.js +33 -14
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +8 -15
- package/dist/cli/subcommands/sessions.d.ts +3 -1
- package/dist/cli/subcommands/sessions.js +36 -2
- package/dist/codemode/capability.d.ts +24 -7
- package/dist/codemode/capability.js +38 -10
- package/dist/codemode/host-side.d.ts +14 -0
- package/dist/codemode/host-side.js +24 -1
- package/dist/codemode/tool.d.ts +1 -1
- package/dist/codemode/tool.js +6 -4
- package/dist/compaction/breaker.d.ts +25 -9
- package/dist/compaction/breaker.js +47 -17
- package/dist/compaction/estimate.d.ts +11 -3
- package/dist/compaction/estimate.js +64 -22
- package/dist/compaction/image-budget.d.ts +45 -0
- package/dist/compaction/image-budget.js +115 -0
- package/dist/compaction/post-compact.d.ts +38 -0
- package/dist/compaction/post-compact.js +152 -0
- package/dist/compaction/protect.d.ts +27 -0
- package/dist/compaction/protect.js +56 -0
- package/dist/compaction/prune-tier.d.ts +58 -12
- package/dist/compaction/prune-tier.js +120 -54
- package/dist/compaction/summarize-tier.d.ts +23 -4
- package/dist/compaction/summarize-tier.js +100 -29
- package/dist/config/checker.d.ts +28 -0
- package/dist/config/checker.js +97 -0
- package/dist/config/json-schema.js +63 -2
- package/dist/config/key-docs.js +72 -3
- package/dist/config/merge.d.ts +5 -3
- package/dist/config/merge.js +81 -7
- package/dist/config/profile.d.ts +2 -0
- package/dist/config/profile.js +2 -0
- package/dist/config/schema-w5.d.ts +18 -0
- package/dist/config/schema-w5.js +109 -0
- package/dist/config/schema.d.ts +5 -9
- package/dist/config/schema.js +68 -114
- package/dist/config/types-w5.d.ts +118 -0
- package/dist/config/types-w5.js +20 -0
- package/dist/config/types.d.ts +50 -1
- package/dist/config/types.js +12 -0
- package/dist/drivers/acp/client.d.ts +57 -0
- package/dist/drivers/acp/client.js +160 -0
- package/dist/drivers/acp/driver.d.ts +31 -0
- package/dist/drivers/acp/driver.js +274 -0
- package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
- package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
- package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
- package/dist/drivers/acp/testing/fake-agent.js +211 -0
- package/dist/drivers/acp/types.d.ts +285 -0
- package/dist/drivers/acp/types.js +36 -0
- package/dist/drivers/agents.d.ts +58 -0
- package/dist/drivers/agents.js +142 -0
- package/dist/drivers/base.d.ts +35 -0
- package/dist/drivers/base.js +59 -0
- package/dist/drivers/catalog.d.ts +46 -0
- package/dist/drivers/catalog.js +167 -0
- package/dist/drivers/env.d.ts +20 -0
- package/dist/drivers/env.js +46 -0
- package/dist/drivers/host-runners.d.ts +18 -0
- package/dist/drivers/host-runners.js +45 -0
- package/dist/drivers/jsonrpc.d.ts +58 -0
- package/dist/drivers/jsonrpc.js +180 -0
- package/dist/drivers/native/claude-normalize.d.ts +46 -0
- package/dist/drivers/native/claude-normalize.js +106 -0
- package/dist/drivers/native/claude-stream.d.ts +29 -0
- package/dist/drivers/native/claude-stream.js +456 -0
- package/dist/drivers/native/codex-app-server.d.ts +26 -0
- package/dist/drivers/native/codex-app-server.js +407 -0
- package/dist/drivers/native/codex-normalize.d.ts +38 -0
- package/dist/drivers/native/codex-normalize.js +124 -0
- package/dist/drivers/native/oneshot.d.ts +28 -0
- package/dist/drivers/native/oneshot.js +312 -0
- package/dist/drivers/permissions.d.ts +40 -0
- package/dist/drivers/permissions.js +92 -0
- package/dist/drivers/pids.d.ts +32 -0
- package/dist/drivers/pids.js +93 -0
- package/dist/drivers/pool.d.ts +28 -0
- package/dist/drivers/pool.js +96 -0
- package/dist/drivers/probe.d.ts +47 -0
- package/dist/drivers/probe.js +172 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.js +100 -0
- package/dist/drivers/runner.d.ts +61 -0
- package/dist/drivers/runner.js +388 -0
- package/dist/drivers/store.d.ts +49 -0
- package/dist/drivers/store.js +91 -0
- package/dist/drivers/turn.d.ts +41 -0
- package/dist/drivers/turn.js +99 -0
- package/dist/drivers/types.d.ts +122 -0
- package/dist/drivers/types.js +11 -0
- package/dist/git/info.d.ts +75 -0
- package/dist/git/info.js +191 -0
- package/dist/hooks/protocol.js +6 -1
- package/dist/hooks/types.d.ts +10 -1
- package/dist/hooks/types.js +2 -0
- package/dist/host/api-impl.d.ts +7 -0
- package/dist/host/api-impl.js +15 -0
- package/dist/host/types.d.ts +24 -2
- package/dist/host/types.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/modes/acp/acp-events.d.ts +46 -0
- package/dist/modes/acp/acp-events.js +233 -0
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.js +47 -0
- package/dist/modes/acp/acp-server.d.ts +79 -0
- package/dist/modes/acp/acp-server.js +315 -0
- package/dist/modes/commands-core.d.ts +13 -1
- package/dist/modes/commands-core.js +64 -0
- package/dist/modes/image-input.d.ts +12 -4
- package/dist/modes/image-input.js +22 -5
- package/dist/modes/interactive/agent-panels.d.ts +14 -0
- package/dist/modes/interactive/agent-panels.js +103 -0
- package/dist/modes/interactive/agent-ui.d.ts +73 -0
- package/dist/modes/interactive/agent-ui.js +234 -0
- package/dist/modes/interactive/approval-dialog.d.ts +21 -4
- package/dist/modes/interactive/approval-dialog.js +98 -20
- package/dist/modes/interactive/approval-merge.d.ts +41 -0
- package/dist/modes/interactive/approval-merge.js +89 -0
- package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
- package/dist/modes/interactive/clipboard-paste.js +28 -0
- package/dist/modes/interactive/commands.d.ts +12 -1
- package/dist/modes/interactive/commands.js +31 -1
- package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
- package/dist/modes/interactive/confirm-dialog.js +121 -0
- package/dist/modes/interactive/double-esc.d.ts +20 -0
- package/dist/modes/interactive/double-esc.js +34 -0
- package/dist/modes/interactive/event-notices.d.ts +32 -0
- package/dist/modes/interactive/event-notices.js +79 -0
- package/dist/modes/interactive/external-editor.d.ts +16 -0
- package/dist/modes/interactive/external-editor.js +39 -0
- package/dist/modes/interactive/interactive-mode.d.ts +14 -1
- package/dist/modes/interactive/interactive-mode.js +140 -136
- package/dist/modes/interactive/key-dispatch.d.ts +22 -2
- package/dist/modes/interactive/key-dispatch.js +66 -7
- package/dist/modes/interactive/line/line-mode.d.ts +4 -1
- package/dist/modes/interactive/line/line-mode.js +31 -5
- package/dist/modes/interactive/line/line-render.d.ts +2 -1
- package/dist/modes/interactive/line/line-render.js +40 -4
- package/dist/modes/interactive/message-view.d.ts +1 -1
- package/dist/modes/interactive/message-view.js +24 -2
- package/dist/modes/interactive/panels.d.ts +18 -1
- package/dist/modes/interactive/panels.js +19 -5
- package/dist/modes/interactive/plan-command.d.ts +40 -0
- package/dist/modes/interactive/plan-command.js +129 -0
- package/dist/modes/interactive/plan-dialog.d.ts +98 -0
- package/dist/modes/interactive/plan-dialog.js +290 -0
- package/dist/modes/interactive/plan-flow.d.ts +34 -0
- package/dist/modes/interactive/plan-flow.js +98 -0
- package/dist/modes/interactive/rewind-command.d.ts +31 -0
- package/dist/modes/interactive/rewind-command.js +106 -0
- package/dist/modes/interactive/rewind-flow.d.ts +37 -0
- package/dist/modes/interactive/rewind-flow.js +151 -0
- package/dist/modes/interactive/rewind-list.d.ts +36 -0
- package/dist/modes/interactive/rewind-list.js +123 -0
- package/dist/modes/interactive/rewind-panel.d.ts +77 -0
- package/dist/modes/interactive/rewind-panel.js +309 -0
- package/dist/modes/interactive/rewind-text.d.ts +40 -0
- package/dist/modes/interactive/rewind-text.js +139 -0
- package/dist/modes/interactive/session-events.d.ts +24 -0
- package/dist/modes/interactive/session-events.js +96 -0
- package/dist/modes/interactive/startup-ui.js +5 -1
- package/dist/modes/interactive/status-area.d.ts +73 -0
- package/dist/modes/interactive/status-area.js +190 -0
- package/dist/modes/interactive/status-bar.d.ts +99 -11
- package/dist/modes/interactive/status-bar.js +273 -90
- package/dist/modes/interactive/status-line.d.ts +33 -0
- package/dist/modes/interactive/status-line.js +113 -0
- package/dist/modes/interactive/subagent-view.d.ts +56 -0
- package/dist/modes/interactive/subagent-view.js +154 -0
- package/dist/modes/interactive/tasks-report.d.ts +27 -0
- package/dist/modes/interactive/tasks-report.js +114 -0
- package/dist/modes/interactive/tool-view.d.ts +12 -2
- package/dist/modes/interactive/tool-view.js +34 -4
- package/dist/modes/print/print-mode.d.ts +13 -4
- package/dist/modes/print/print-mode.js +56 -12
- package/dist/modes/rpc/commands.d.ts +9 -0
- package/dist/modes/rpc/commands.js +44 -0
- package/dist/modes/rpc/rpc-mode.js +7 -1
- package/dist/modes/session-report.d.ts +11 -0
- package/dist/modes/session-report.js +48 -1
- package/dist/permissions/auto-safe.d.ts +5 -0
- package/dist/permissions/auto-safe.js +18 -0
- package/dist/permissions/bypass.d.ts +32 -0
- package/dist/permissions/bypass.js +36 -0
- package/dist/permissions/classifier.d.ts +4 -0
- package/dist/permissions/classifier.js +2 -0
- package/dist/permissions/modes.js +1 -1
- package/dist/permissions/pipeline.d.ts +43 -4
- package/dist/permissions/pipeline.js +114 -9
- package/dist/permissions/readonly-bash.d.ts +30 -0
- package/dist/permissions/readonly-bash.js +118 -0
- package/dist/permissions/types.d.ts +42 -0
- package/dist/plan/compose.d.ts +9 -0
- package/dist/plan/compose.js +19 -0
- package/dist/plan/controller.d.ts +71 -0
- package/dist/plan/controller.js +27 -0
- package/dist/plan/done-markers.d.ts +17 -0
- package/dist/plan/done-markers.js +51 -0
- package/dist/plan/extract.d.ts +29 -0
- package/dist/plan/extract.js +160 -0
- package/dist/plan/prompts.d.ts +36 -0
- package/dist/plan/prompts.js +89 -0
- package/dist/plan/store.d.ts +37 -0
- package/dist/plan/store.js +90 -0
- package/dist/rpc.d.ts +58 -2
- package/dist/rpc.js +7 -0
- package/dist/sandbox/bash.d.ts +74 -0
- package/dist/sandbox/bash.js +126 -0
- package/dist/sandbox/detect.d.ts +48 -0
- package/dist/sandbox/detect.js +149 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/profile.d.ts +33 -0
- package/dist/sandbox/profile.js +76 -0
- package/dist/sandbox/wrap.d.ts +29 -0
- package/dist/sandbox/wrap.js +117 -0
- package/dist/sdk.d.ts +33 -2
- package/dist/sdk.js +24 -2
- package/dist/session/types.d.ts +3 -1
- package/dist/session/types.js +1 -0
- package/dist/skills/builtin.d.ts +31 -0
- package/dist/skills/builtin.js +109 -0
- package/dist/skills/discover.d.ts +2 -1
- package/dist/skills/index-prompt.js +5 -8
- package/dist/tools/background-jobs.d.ts +71 -0
- package/dist/tools/background-jobs.js +198 -0
- package/dist/tools/bash.d.ts +53 -1
- package/dist/tools/bash.js +158 -7
- package/dist/tools/clipboard-image.d.ts +44 -0
- package/dist/tools/clipboard-image.js +148 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +18 -3
- package/dist/tools/image-file.d.ts +38 -3
- package/dist/tools/image-file.js +81 -10
- package/dist/tools/image-resize.d.ts +58 -0
- package/dist/tools/image-resize.js +97 -0
- package/dist/tools/presets.d.ts +7 -2
- package/dist/tools/presets.js +11 -4
- package/dist/tools/read.d.ts +5 -2
- package/dist/tools/read.js +13 -10
- package/dist/tools/registry.d.ts +7 -1
- package/dist/tools/registry.js +27 -4
- package/dist/tools/task-ctl.d.ts +22 -0
- package/dist/tools/task-ctl.js +116 -0
- package/dist/tools/task.d.ts +22 -10
- package/dist/tools/task.js +66 -26
- package/dist/tools/todo.d.ts +22 -2
- package/dist/tools/todo.js +58 -14
- package/dist/tools/truncate.d.ts +15 -0
- package/dist/tools/truncate.js +25 -0
- package/dist/tools/types.d.ts +113 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/write.js +3 -0
- package/dist/tui/glyphs.d.ts +4 -0
- package/dist/tui/glyphs.js +4 -0
- package/dist/tui/keybindings.d.ts +6 -1
- package/dist/tui/keybindings.js +6 -1
- package/docs/acp.md +78 -0
- package/docs/agents.md +250 -0
- package/docs/codemode.md +12 -8
- package/docs/hooks.md +26 -22
- package/docs/permissions.md +78 -13
- package/docs/plan.md +107 -0
- package/docs/providers.md +228 -52
- package/docs/rewind-plan.md +181 -0
- package/docs/rpc.md +92 -5
- package/docs/sandbox.md +215 -0
- package/docs/session-format.md +41 -21
- package/docs/sessions.md +41 -1
- package/docs/tui-design.md +751 -0
- package/docs/tui.md +179 -21
- package/package.json +13 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 入库的 models.dev 快照(docs/wave5-plan.md §2.1、docs/providers.md「模型元数据」)。
|
|
3
|
+
*
|
|
4
|
+
* `models-dev/*.json` 由 `scripts/update-models-dev.mjs` 生成并内联进 `models-dev-data.ts`(单 bundle,
|
|
5
|
+
* 运行时不读 JSON 文件、不联网)。本模块解析内联数据,并提供与脚本同一口径的 `buildSnapshot()`
|
|
6
|
+
* (`ama models refresh` 用它裁剪联网拉到的 api.json)与新旧对比 `diffSnapshots()`。
|
|
7
|
+
*/
|
|
8
|
+
import { ModelsDevIndex, type ModelsDevData, type ModelsDevModel, type ModelsDevProvider } from "./models-dev.js";
|
|
9
|
+
export interface SnapshotMeta {
|
|
10
|
+
/** ISO 8601;只在内容 sha256 变化时更新。 */
|
|
11
|
+
fetchedAt: string;
|
|
12
|
+
license: string;
|
|
13
|
+
sha256: string;
|
|
14
|
+
source: string;
|
|
15
|
+
upstream: string;
|
|
16
|
+
}
|
|
17
|
+
/** 收录清单(`models-dev/_providers.json`):供应商 id 与 OpenRouter 一类聚合商的前缀白名单。 */
|
|
18
|
+
export interface SnapshotList {
|
|
19
|
+
providers: string[];
|
|
20
|
+
prefixes?: Record<string, string[]>;
|
|
21
|
+
}
|
|
22
|
+
export declare function snapshotMeta(): SnapshotMeta;
|
|
23
|
+
export declare function snapshotList(): SnapshotList;
|
|
24
|
+
/** 文件形状(模型不带 id)→ 运行时形状(补 id)。 */
|
|
25
|
+
export declare function fromSnapshotFile(file: {
|
|
26
|
+
id: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
api?: string;
|
|
29
|
+
models: Record<string, Omit<ModelsDevModel, "id">>;
|
|
30
|
+
}): ModelsDevProvider;
|
|
31
|
+
/** 运行时形状 → 文件形状(去掉模型 id 与 tool_call,与脚本写出的 JSON 一致)。 */
|
|
32
|
+
export declare function toSnapshotFile(provider: ModelsDevProvider): unknown;
|
|
33
|
+
/** 内置快照(同一进程只解析一次;调用方不得修改)。 */
|
|
34
|
+
export declare function builtinSnapshot(): ModelsDevData;
|
|
35
|
+
export declare function builtinSnapshotIndex(): ModelsDevIndex;
|
|
36
|
+
/**
|
|
37
|
+
* 按清单裁剪 api.json(与脚本同一口径)。`only` 只取其中几家。校验失败抛错:顶层不是对象、
|
|
38
|
+
* 清单里的供应商缺失或过滤后没有模型(防止上游改版把数据清空)。
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildSnapshot(raw: unknown, snapshot?: SnapshotList, only?: readonly string[]): ModelsDevData;
|
|
41
|
+
export interface SnapshotDiff {
|
|
42
|
+
added: string[];
|
|
43
|
+
removed: string[];
|
|
44
|
+
/** `provider/model:context a → b;cost …`。 */
|
|
45
|
+
changed: string[];
|
|
46
|
+
}
|
|
47
|
+
/** 新旧对比(与脚本摘要同一口径);只比较 `after` 里出现的供应商。 */
|
|
48
|
+
export declare function diffSnapshots(before: ModelsDevData, after: ModelsDevData): SnapshotDiff;
|
|
49
|
+
/** 快照 ⊕ 覆盖:同 provider/model 以覆盖为准,其余沿用快照。 */
|
|
50
|
+
export declare function mergeSnapshot(base: ModelsDevData, override: ModelsDevData): ModelsDevData;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 入库的 models.dev 快照(docs/wave5-plan.md §2.1、docs/providers.md「模型元数据」)。
|
|
3
|
+
*
|
|
4
|
+
* `models-dev/*.json` 由 `scripts/update-models-dev.mjs` 生成并内联进 `models-dev-data.ts`(单 bundle,
|
|
5
|
+
* 运行时不读 JSON 文件、不联网)。本模块解析内联数据,并提供与脚本同一口径的 `buildSnapshot()`
|
|
6
|
+
* (`ama models refresh` 用它裁剪联网拉到的 api.json)与新旧对比 `diffSnapshots()`。
|
|
7
|
+
*/
|
|
8
|
+
import { MODELS_DEV_SOURCES } from "./models-dev-data.js";
|
|
9
|
+
import { ModelsDevIndex, keepForSnapshot, trimProvider, } from "./models-dev.js";
|
|
10
|
+
function parse(id) {
|
|
11
|
+
const text = MODELS_DEV_SOURCES[id];
|
|
12
|
+
if (text === undefined)
|
|
13
|
+
throw new Error(`models.dev 快照缺少 ${id}`);
|
|
14
|
+
return JSON.parse(text);
|
|
15
|
+
}
|
|
16
|
+
let meta;
|
|
17
|
+
let list;
|
|
18
|
+
let data;
|
|
19
|
+
let index;
|
|
20
|
+
export function snapshotMeta() {
|
|
21
|
+
meta ??= parse("_meta");
|
|
22
|
+
return meta;
|
|
23
|
+
}
|
|
24
|
+
export function snapshotList() {
|
|
25
|
+
list ??= parse("_providers");
|
|
26
|
+
return list;
|
|
27
|
+
}
|
|
28
|
+
/** 文件形状(模型不带 id)→ 运行时形状(补 id)。 */
|
|
29
|
+
export function fromSnapshotFile(file) {
|
|
30
|
+
const models = {};
|
|
31
|
+
for (const [id, model] of Object.entries(file.models))
|
|
32
|
+
models[id] = { id, ...model };
|
|
33
|
+
return {
|
|
34
|
+
id: file.id,
|
|
35
|
+
...(file.name !== undefined ? { name: file.name } : {}),
|
|
36
|
+
...(file.api !== undefined ? { api: file.api } : {}),
|
|
37
|
+
models,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** 运行时形状 → 文件形状(去掉模型 id 与 tool_call,与脚本写出的 JSON 一致)。 */
|
|
41
|
+
export function toSnapshotFile(provider) {
|
|
42
|
+
const models = {};
|
|
43
|
+
for (const [id, model] of Object.entries(provider.models)) {
|
|
44
|
+
const { id: _id, tool_call: _toolCall, ...rest } = model;
|
|
45
|
+
models[id] = rest;
|
|
46
|
+
}
|
|
47
|
+
return { ...provider, models };
|
|
48
|
+
}
|
|
49
|
+
/** 内置快照(同一进程只解析一次;调用方不得修改)。 */
|
|
50
|
+
export function builtinSnapshot() {
|
|
51
|
+
if (data === undefined) {
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const id of snapshotList().providers)
|
|
54
|
+
out[id] = fromSnapshotFile(parse(id));
|
|
55
|
+
data = out;
|
|
56
|
+
}
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
export function builtinSnapshotIndex() {
|
|
60
|
+
index ??= new ModelsDevIndex(builtinSnapshot());
|
|
61
|
+
return index;
|
|
62
|
+
}
|
|
63
|
+
function isRecord(value) {
|
|
64
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 按清单裁剪 api.json(与脚本同一口径)。`only` 只取其中几家。校验失败抛错:顶层不是对象、
|
|
68
|
+
* 清单里的供应商缺失或过滤后没有模型(防止上游改版把数据清空)。
|
|
69
|
+
*/
|
|
70
|
+
export function buildSnapshot(raw, snapshot = snapshotList(), only) {
|
|
71
|
+
if (!isRecord(raw))
|
|
72
|
+
throw new Error("api.json 顶层不是对象");
|
|
73
|
+
const out = {};
|
|
74
|
+
for (const id of only ?? snapshot.providers) {
|
|
75
|
+
const provider = raw[id];
|
|
76
|
+
if (!isRecord(provider))
|
|
77
|
+
throw new Error(`api.json 缺少供应商 ${id}`);
|
|
78
|
+
const prefixes = snapshot.prefixes?.[id];
|
|
79
|
+
const trimmed = trimProvider(id, provider, (modelId, model) => keepForSnapshot(model) &&
|
|
80
|
+
(prefixes === undefined || prefixes.some((p) => modelId.startsWith(`${p}/`))));
|
|
81
|
+
if (Object.keys(trimmed.models).length === 0)
|
|
82
|
+
throw new Error(`${id} 过滤后没有模型`);
|
|
83
|
+
for (const model of Object.values(trimmed.models))
|
|
84
|
+
delete model.tool_call;
|
|
85
|
+
out[id] = trimmed;
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
function priceText(model) {
|
|
90
|
+
const c = model.cost;
|
|
91
|
+
return c === undefined
|
|
92
|
+
? "无"
|
|
93
|
+
: `${c.input}/${c.output}/${c.cache_read ?? "-"}/${c.cache_write ?? "-"}`;
|
|
94
|
+
}
|
|
95
|
+
/** 新旧对比(与脚本摘要同一口径);只比较 `after` 里出现的供应商。 */
|
|
96
|
+
export function diffSnapshots(before, after) {
|
|
97
|
+
const out = { added: [], removed: [], changed: [] };
|
|
98
|
+
for (const [providerId, provider] of Object.entries(after)) {
|
|
99
|
+
const old = before[providerId]?.models ?? {};
|
|
100
|
+
for (const id of Object.keys(old))
|
|
101
|
+
if (provider.models[id] === undefined)
|
|
102
|
+
out.removed.push(`${providerId}/${id}`);
|
|
103
|
+
for (const [id, next] of Object.entries(provider.models)) {
|
|
104
|
+
const prev = old[id];
|
|
105
|
+
if (prev === undefined) {
|
|
106
|
+
out.added.push(`${providerId}/${id}`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const parts = [];
|
|
110
|
+
for (const key of ["context", "output"]) {
|
|
111
|
+
if (prev.limit?.[key] !== next.limit?.[key])
|
|
112
|
+
parts.push(`${key} ${prev.limit?.[key] ?? "无"} → ${next.limit?.[key] ?? "无"}`);
|
|
113
|
+
}
|
|
114
|
+
if (priceText(prev) !== priceText(next))
|
|
115
|
+
parts.push(`cost ${priceText(prev)} → ${priceText(next)}`);
|
|
116
|
+
if (parts.length > 0)
|
|
117
|
+
out.changed.push(`${providerId}/${id}:${parts.join(";")}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
out.added.sort();
|
|
121
|
+
out.removed.sort();
|
|
122
|
+
out.changed.sort();
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
/** 快照 ⊕ 覆盖:同 provider/model 以覆盖为准,其余沿用快照。 */
|
|
126
|
+
export function mergeSnapshot(base, override) {
|
|
127
|
+
const out = { ...base };
|
|
128
|
+
for (const [id, provider] of Object.entries(override)) {
|
|
129
|
+
const prev = base[id];
|
|
130
|
+
out[id] = {
|
|
131
|
+
...prev,
|
|
132
|
+
...provider,
|
|
133
|
+
models: { ...prev?.models, ...provider.models },
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
@@ -9,10 +9,24 @@
|
|
|
9
9
|
* 本模块只做纯计算(不读文件、不联网);缓存与拉取在 models-dev-cache.ts。
|
|
10
10
|
*/
|
|
11
11
|
import type { ModelCost } from "../types.js";
|
|
12
|
-
/**
|
|
12
|
+
/** 价格($/1M token);input 与 output 都有才保留。 */
|
|
13
|
+
export interface ModelsDevPrices {
|
|
14
|
+
input: number;
|
|
15
|
+
output: number;
|
|
16
|
+
cache_read?: number;
|
|
17
|
+
cache_write?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 用到的模型字段(models.dev 原名);其余裁剪时丢掉。快照只多存 family / knowledge /
|
|
21
|
+
* release_date / limit.input / 价格档位 / interleaved / status(docs/wave5-plan.md §2.1)。
|
|
22
|
+
*/
|
|
13
23
|
export interface ModelsDevModel {
|
|
14
24
|
id: string;
|
|
15
25
|
name?: string;
|
|
26
|
+
family?: string;
|
|
27
|
+
/** 知识截止(`YYYY-MM` / `YYYY-MM-DD`)。 */
|
|
28
|
+
knowledge?: string;
|
|
29
|
+
release_date?: string;
|
|
16
30
|
reasoning?: boolean;
|
|
17
31
|
tool_call?: boolean;
|
|
18
32
|
modalities?: {
|
|
@@ -20,25 +34,37 @@ export interface ModelsDevModel {
|
|
|
20
34
|
};
|
|
21
35
|
limit?: {
|
|
22
36
|
context?: number;
|
|
23
|
-
output?: number;
|
|
24
|
-
};
|
|
25
|
-
cost?: {
|
|
26
37
|
input?: number;
|
|
27
38
|
output?: number;
|
|
28
|
-
cache_read?: number;
|
|
29
|
-
cache_write?: number;
|
|
30
39
|
};
|
|
40
|
+
cost?: ModelsDevPrices & {
|
|
41
|
+
context_over_200k?: ModelsDevPrices;
|
|
42
|
+
tiers?: (ModelsDevPrices & {
|
|
43
|
+
tier: {
|
|
44
|
+
size: number;
|
|
45
|
+
type: "context";
|
|
46
|
+
};
|
|
47
|
+
})[];
|
|
48
|
+
};
|
|
49
|
+
interleaved?: true | {
|
|
50
|
+
field: string;
|
|
51
|
+
};
|
|
52
|
+
/** 只留 beta(deprecated 在快照里已过滤)。 */
|
|
53
|
+
status?: "beta";
|
|
31
54
|
canonical_model_id?: string;
|
|
32
55
|
}
|
|
33
56
|
export interface ModelsDevProvider {
|
|
34
57
|
id: string;
|
|
35
58
|
name?: string;
|
|
59
|
+
/** 供应商级 OpenAI / Anthropic 兼容 baseUrl(协议线索,展示用)。 */
|
|
60
|
+
api?: string;
|
|
36
61
|
models: Record<string, ModelsDevModel>;
|
|
37
62
|
}
|
|
38
63
|
export type ModelsDevData = Record<string, ModelsDevProvider>;
|
|
39
64
|
/**
|
|
40
|
-
* 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、
|
|
41
|
-
*
|
|
65
|
+
* 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Meta 在 `meta`(Llama API
|
|
66
|
+
* 在 `llama`)、智谱国际站在 `zai`、豆包在 `volcengine`、混元在 `tencent-tokenhub`;models.dev 没有
|
|
67
|
+
* `qwen` 这样的供应商 id。
|
|
42
68
|
*/
|
|
43
69
|
export declare const FIRST_PARTY_PROVIDERS: readonly string[];
|
|
44
70
|
/** maxTokens 的上限:models.dev 给原厂上限(常与上下文相同),每次请求都会作为 max_tokens 发出。 */
|
|
@@ -66,7 +92,22 @@ export interface ModelsDevFields {
|
|
|
66
92
|
cost?: ModelCost;
|
|
67
93
|
/** models.dev 的 tool_call;Model 上没有对应字段,只用于展示与写入过滤。 */
|
|
68
94
|
toolCall?: boolean;
|
|
95
|
+
family?: string;
|
|
96
|
+
knowledge?: string;
|
|
97
|
+
releaseDate?: string;
|
|
98
|
+
inputLimit?: number;
|
|
99
|
+
status?: "beta";
|
|
69
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* 映射口径:`custom`(自定义模型补全,缺省)maxTokens 封顶 64k、缺的缓存价按输入价;
|
|
103
|
+
* `catalog`(内置目录继承)maxTokens 不封顶(目录模型的输出上限就是原厂值,有意调小的写在目录里)、
|
|
104
|
+
* 缺的缓存价记 0(与目录一贯写法一致:没有单独计价)。
|
|
105
|
+
*/
|
|
106
|
+
export type ModelsDevMapping = "custom" | "catalog";
|
|
107
|
+
/** 快照过滤:丢 deprecated、输出不含文本、上下文为 0 / 缺失、tool_call:false(docs/wave5-plan.md §2.1)。 */
|
|
108
|
+
export declare function keepForSnapshot(raw: unknown): boolean;
|
|
109
|
+
/** 裁剪一家供应商;`keep` 给出时只留它放行的模型(模型 id 按字典序)。 */
|
|
110
|
+
export declare function trimProvider(providerId: string, provider: Record<string, unknown>, keep?: (modelId: string, raw: unknown) => boolean): ModelsDevProvider;
|
|
70
111
|
/** 校验并裁剪 api.json:只留用到的字段;形状不对的供应商 / 模型跳过。整体不是对象抛错。 */
|
|
71
112
|
export declare function trimModelsDev(raw: unknown): ModelsDevData;
|
|
72
113
|
/**
|
|
@@ -90,8 +131,8 @@ export declare class ModelsDevIndex {
|
|
|
90
131
|
match(id: string, explicit?: string): ModelsDevMatch | undefined;
|
|
91
132
|
private choose;
|
|
92
133
|
}
|
|
93
|
-
/** models.dev 条目 → ama Model 字段(规则见 docs/providers.md
|
|
94
|
-
export declare function modelsDevFields(model: ModelsDevModel): ModelsDevFields;
|
|
134
|
+
/** models.dev 条目 → ama Model 字段(规则见 docs/providers.md「模型元数据」)。 */
|
|
135
|
+
export declare function modelsDevFields(model: ModelsDevModel, mapping?: ModelsDevMapping): ModelsDevFields;
|
|
95
136
|
/** 可由 models.dev 补的 Model 字段(展示来源用)。 */
|
|
96
137
|
export declare const ENRICHABLE_FIELDS: readonly ["contextWindow", "maxTokens", "input", "reasoning", "cost"];
|
|
97
138
|
export type EnrichableField = (typeof ENRICHABLE_FIELDS)[number];
|
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* 本模块只做纯计算(不读文件、不联网);缓存与拉取在 models-dev-cache.ts。
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
* 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、
|
|
13
|
-
*
|
|
12
|
+
* 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Meta 在 `meta`(Llama API
|
|
13
|
+
* 在 `llama`)、智谱国际站在 `zai`、豆包在 `volcengine`、混元在 `tencent-tokenhub`;models.dev 没有
|
|
14
|
+
* `qwen` 这样的供应商 id。
|
|
14
15
|
*/
|
|
15
16
|
export const FIRST_PARTY_PROVIDERS = [
|
|
16
17
|
"anthropic",
|
|
@@ -27,10 +28,14 @@ export const FIRST_PARTY_PROVIDERS = [
|
|
|
27
28
|
"mistral",
|
|
28
29
|
"minimax",
|
|
29
30
|
"minimax-cn",
|
|
31
|
+
"meta",
|
|
30
32
|
"llama",
|
|
31
33
|
"cohere",
|
|
32
34
|
"xiaomi",
|
|
33
35
|
"stepfun",
|
|
36
|
+
"stepfun-ai",
|
|
37
|
+
"volcengine",
|
|
38
|
+
"tencent-tokenhub",
|
|
34
39
|
"perplexity",
|
|
35
40
|
"ai21",
|
|
36
41
|
"upstage",
|
|
@@ -50,16 +55,59 @@ function nonNegative(value) {
|
|
|
50
55
|
function strings(value) {
|
|
51
56
|
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : undefined;
|
|
52
57
|
}
|
|
58
|
+
function prices(value) {
|
|
59
|
+
if (!isRecord(value))
|
|
60
|
+
return undefined;
|
|
61
|
+
const input = nonNegative(value["input"]);
|
|
62
|
+
const output = nonNegative(value["output"]);
|
|
63
|
+
if (input === undefined || output === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
const out = { input, output };
|
|
66
|
+
const read = nonNegative(value["cache_read"]);
|
|
67
|
+
if (read !== undefined)
|
|
68
|
+
out.cache_read = read;
|
|
69
|
+
const write = nonNegative(value["cache_write"]);
|
|
70
|
+
if (write !== undefined)
|
|
71
|
+
out.cache_write = write;
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function trimCost(value) {
|
|
75
|
+
const base = prices(value);
|
|
76
|
+
if (base === undefined || !isRecord(value))
|
|
77
|
+
return undefined;
|
|
78
|
+
const out = base;
|
|
79
|
+
const over = prices(value["context_over_200k"]);
|
|
80
|
+
if (over !== undefined)
|
|
81
|
+
out.context_over_200k = over;
|
|
82
|
+
const tiers = [];
|
|
83
|
+
for (const tier of Array.isArray(value["tiers"]) ? value["tiers"] : []) {
|
|
84
|
+
const p = prices(tier);
|
|
85
|
+
const spec = isRecord(tier) ? tier["tier"] : undefined;
|
|
86
|
+
const size = isRecord(spec) ? positive(spec["size"]) : undefined;
|
|
87
|
+
if (p !== undefined && size !== undefined && isRecord(spec) && spec["type"] === "context")
|
|
88
|
+
tiers.push({ ...p, tier: { size, type: "context" } });
|
|
89
|
+
}
|
|
90
|
+
if (tiers.length > 0)
|
|
91
|
+
out.tiers = tiers;
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
/** 字段裁剪(不过滤);与 scripts/update-models-dev.mjs 的 trimModel 同一口径,另多留 tool_call。 */
|
|
53
95
|
function trimModel(id, raw) {
|
|
54
96
|
const out = { id };
|
|
55
|
-
|
|
56
|
-
|
|
97
|
+
for (const key of ["name", "family", "knowledge", "release_date"]) {
|
|
98
|
+
const v = raw[key];
|
|
99
|
+
if (typeof v === "string" && v !== "")
|
|
100
|
+
out[key] = v;
|
|
101
|
+
}
|
|
57
102
|
for (const key of ["reasoning", "tool_call"]) {
|
|
58
|
-
|
|
59
|
-
|
|
103
|
+
const v = raw[key];
|
|
104
|
+
if (typeof v === "boolean")
|
|
105
|
+
out[key] = v;
|
|
60
106
|
}
|
|
61
107
|
if (typeof raw["canonical_model_id"] === "string")
|
|
62
108
|
out.canonical_model_id = raw["canonical_model_id"];
|
|
109
|
+
if (raw["status"] === "beta")
|
|
110
|
+
out.status = "beta";
|
|
63
111
|
const modalities = raw["modalities"];
|
|
64
112
|
if (isRecord(modalities)) {
|
|
65
113
|
const input = strings(modalities["input"]);
|
|
@@ -68,25 +116,55 @@ function trimModel(id, raw) {
|
|
|
68
116
|
}
|
|
69
117
|
const limit = raw["limit"];
|
|
70
118
|
if (isRecord(limit)) {
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
...(context !== undefined ? { context } : {}),
|
|
75
|
-
...(output !== undefined ? { output } : {}),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const cost = raw["cost"];
|
|
79
|
-
if (isRecord(cost)) {
|
|
80
|
-
const c = {};
|
|
81
|
-
for (const key of ["input", "output", "cache_read", "cache_write"]) {
|
|
82
|
-
const v = nonNegative(cost[key]);
|
|
119
|
+
const l = {};
|
|
120
|
+
for (const key of ["context", "input", "output"]) {
|
|
121
|
+
const v = positive(limit[key]);
|
|
83
122
|
if (v !== undefined)
|
|
84
|
-
|
|
123
|
+
l[key] = v;
|
|
85
124
|
}
|
|
86
|
-
|
|
125
|
+
if (Object.keys(l).length > 0)
|
|
126
|
+
out.limit = l;
|
|
87
127
|
}
|
|
128
|
+
const cost = trimCost(raw["cost"]);
|
|
129
|
+
if (cost !== undefined)
|
|
130
|
+
out.cost = cost;
|
|
131
|
+
const interleaved = raw["interleaved"];
|
|
132
|
+
if (interleaved === true)
|
|
133
|
+
out.interleaved = true;
|
|
134
|
+
else if (isRecord(interleaved) && typeof interleaved["field"] === "string")
|
|
135
|
+
out.interleaved = { field: interleaved["field"] };
|
|
88
136
|
return out;
|
|
89
137
|
}
|
|
138
|
+
/** 快照过滤:丢 deprecated、输出不含文本、上下文为 0 / 缺失、tool_call:false(docs/wave5-plan.md §2.1)。 */
|
|
139
|
+
export function keepForSnapshot(raw) {
|
|
140
|
+
if (!isRecord(raw))
|
|
141
|
+
return false;
|
|
142
|
+
if (raw["status"] === "deprecated" || raw["tool_call"] === false)
|
|
143
|
+
return false;
|
|
144
|
+
const modalities = raw["modalities"];
|
|
145
|
+
const output = isRecord(modalities) ? strings(modalities["output"]) : undefined;
|
|
146
|
+
if (output !== undefined && !output.includes("text"))
|
|
147
|
+
return false;
|
|
148
|
+
const limit = raw["limit"];
|
|
149
|
+
return isRecord(limit) && positive(limit["context"]) !== undefined;
|
|
150
|
+
}
|
|
151
|
+
/** 裁剪一家供应商;`keep` 给出时只留它放行的模型(模型 id 按字典序)。 */
|
|
152
|
+
export function trimProvider(providerId, provider, keep) {
|
|
153
|
+
const models = {};
|
|
154
|
+
const rawModels = isRecord(provider["models"]) ? provider["models"] : {};
|
|
155
|
+
for (const modelId of Object.keys(rawModels).sort()) {
|
|
156
|
+
const model = rawModels[modelId];
|
|
157
|
+
if (!isRecord(model) || (keep !== undefined && !keep(modelId, model)))
|
|
158
|
+
continue;
|
|
159
|
+
models[modelId] = trimModel(modelId, model);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
id: providerId,
|
|
163
|
+
...(typeof provider["name"] === "string" ? { name: provider["name"] } : {}),
|
|
164
|
+
...(typeof provider["api"] === "string" ? { api: provider["api"] } : {}),
|
|
165
|
+
models,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
90
168
|
/** 校验并裁剪 api.json:只留用到的字段;形状不对的供应商 / 模型跳过。整体不是对象抛错。 */
|
|
91
169
|
export function trimModelsDev(raw) {
|
|
92
170
|
if (!isRecord(raw))
|
|
@@ -95,16 +173,7 @@ export function trimModelsDev(raw) {
|
|
|
95
173
|
for (const [providerId, provider] of Object.entries(raw)) {
|
|
96
174
|
if (!isRecord(provider) || !isRecord(provider["models"]))
|
|
97
175
|
continue;
|
|
98
|
-
|
|
99
|
-
for (const [modelId, model] of Object.entries(provider["models"])) {
|
|
100
|
-
if (isRecord(model))
|
|
101
|
-
models[modelId] = trimModel(modelId, model);
|
|
102
|
-
}
|
|
103
|
-
out[providerId] = {
|
|
104
|
-
id: providerId,
|
|
105
|
-
...(typeof provider["name"] === "string" ? { name: provider["name"] } : {}),
|
|
106
|
-
models,
|
|
107
|
-
};
|
|
176
|
+
out[providerId] = trimProvider(providerId, provider);
|
|
108
177
|
}
|
|
109
178
|
return out;
|
|
110
179
|
}
|
|
@@ -260,8 +329,17 @@ export class ModelsDevIndex {
|
|
|
260
329
|
return match;
|
|
261
330
|
}
|
|
262
331
|
}
|
|
263
|
-
|
|
264
|
-
|
|
332
|
+
function toCost(p, mapping) {
|
|
333
|
+
const missing = mapping === "catalog" ? 0 : p.input;
|
|
334
|
+
return {
|
|
335
|
+
input: p.input,
|
|
336
|
+
output: p.output,
|
|
337
|
+
cacheRead: p.cache_read ?? missing,
|
|
338
|
+
cacheWrite: p.cache_write ?? missing,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/** models.dev 条目 → ama Model 字段(规则见 docs/providers.md「模型元数据」)。 */
|
|
342
|
+
export function modelsDevFields(model, mapping = "custom") {
|
|
265
343
|
const out = {};
|
|
266
344
|
if (model.name !== undefined)
|
|
267
345
|
out.name = model.name;
|
|
@@ -270,8 +348,12 @@ export function modelsDevFields(model) {
|
|
|
270
348
|
out.contextWindow = Math.floor(context);
|
|
271
349
|
const output = positive(model.limit?.output);
|
|
272
350
|
if (output !== undefined) {
|
|
273
|
-
|
|
351
|
+
const cap = mapping === "catalog" ? output : MODELS_DEV_MAX_OUTPUT;
|
|
352
|
+
out.maxTokens = Math.floor(Math.min(output, cap, context ?? output));
|
|
274
353
|
}
|
|
354
|
+
const inputLimit = positive(model.limit?.input);
|
|
355
|
+
if (inputLimit !== undefined && inputLimit !== context)
|
|
356
|
+
out.inputLimit = Math.floor(inputLimit);
|
|
275
357
|
const input = model.modalities?.input;
|
|
276
358
|
if (input !== undefined)
|
|
277
359
|
out.input = input.includes("image") ? ["text", "image"] : ["text"];
|
|
@@ -281,13 +363,24 @@ export function modelsDevFields(model) {
|
|
|
281
363
|
out.toolCall = model.tool_call;
|
|
282
364
|
const cost = model.cost;
|
|
283
365
|
if (cost?.input !== undefined && cost.output !== undefined) {
|
|
284
|
-
out.cost =
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
366
|
+
out.cost = toCost(cost, mapping);
|
|
367
|
+
// 档位:优先通用 tiers;只有 context_over_200k 时折成 200k 一档。
|
|
368
|
+
const tiers = cost.tiers !== undefined && cost.tiers.length > 0
|
|
369
|
+
? cost.tiers.map((t) => ({ inputTokensAbove: t.tier.size, ...toCost(t, mapping) }))
|
|
370
|
+
: cost.context_over_200k !== undefined
|
|
371
|
+
? [{ inputTokensAbove: 200_000, ...toCost(cost.context_over_200k, mapping) }]
|
|
372
|
+
: [];
|
|
373
|
+
if (tiers.length > 0)
|
|
374
|
+
out.cost.tiers = tiers.sort((a, b) => a.inputTokensAbove - b.inputTokensAbove);
|
|
290
375
|
}
|
|
376
|
+
if (model.family !== undefined)
|
|
377
|
+
out.family = model.family;
|
|
378
|
+
if (model.knowledge !== undefined)
|
|
379
|
+
out.knowledge = model.knowledge;
|
|
380
|
+
if (model.release_date !== undefined)
|
|
381
|
+
out.releaseDate = model.release_date;
|
|
382
|
+
if (model.status === "beta")
|
|
383
|
+
out.status = "beta";
|
|
291
384
|
return out;
|
|
292
385
|
}
|
|
293
386
|
/** 可由 models.dev 补的 Model 字段(展示来源用)。 */
|
|
@@ -19,14 +19,21 @@
|
|
|
19
19
|
* 重新物化(协议、地址、headers、compat 取渠道的,模型级 api / baseUrl 仍覆盖);渠道 key 经
|
|
20
20
|
* `resolveApiKey(provider, channel)`。没有 `channels` 的供应商行为不变。
|
|
21
21
|
*
|
|
22
|
+
* 内置渠道([W5-M2],builtin.ts):用户 `channels` 同名字段级覆盖、新名追加,`defaultChannel` 用户优先
|
|
23
|
+
* (也可只写 `defaultChannel`,或只写 `api` 选同协议的内置渠道);目录模型缺省挂全部渠道、缺省渠道在前。
|
|
24
|
+
* 用户(config / auth.json / `*_BASE_URL`)改了供应商级 baseUrl 而没写自己的 `channels` 时,内置渠道作废,
|
|
25
|
+
* 按单渠道回落(`api` 取用户写的或内置的回落协议)。
|
|
26
|
+
*
|
|
22
27
|
* models.dev(enrich.ts):config 里缺元数据的自定义模型与合成模型,用传入的索引(只读缓存)补
|
|
23
|
-
* contextWindow / maxTokens / input / reasoning / cost,来源记在 `modelMetadata()
|
|
28
|
+
* contextWindow / maxTokens / input / reasoning / cost,来源记在 `modelMetadata()`;内置目录按同一索引
|
|
29
|
+
* (快照 ⊕ `ama models refresh` 的覆盖)在 catalog.ts 合并,缺字段的条目退回内置快照。
|
|
24
30
|
*/
|
|
25
31
|
import type { AmaConfig } from "../../config/types.js";
|
|
26
32
|
import { ApiRegistry } from "../apis/api.js";
|
|
27
|
-
import type { Api, ApiImplementation, ApiKeyResolution, Model, ModelLookup,
|
|
33
|
+
import type { Api, ApiImplementation, ApiKeyResolution, Model, ModelLookup, ProviderData, ProviderRegistryApi } from "../types.js";
|
|
28
34
|
import { type KeyResolverOptions } from "./auth.js";
|
|
29
35
|
import { type ModelMetadata, type ModelsDevSource } from "./enrich.js";
|
|
36
|
+
export { materializeModel } from "./channels.js";
|
|
30
37
|
export type ModelSource = "builtin" | "config" | "discovered";
|
|
31
38
|
export interface ProviderRegistryOptions {
|
|
32
39
|
config?: AmaConfig | undefined;
|
|
@@ -48,14 +55,6 @@ export interface ModelEntry {
|
|
|
48
55
|
provider: ProviderData;
|
|
49
56
|
source: ModelSource;
|
|
50
57
|
}
|
|
51
|
-
/**
|
|
52
|
-
* 物化:模型补齐供应商级字段(不可变:返回新对象)。给了 `channel` 时协议与地址取渠道的(模型级
|
|
53
|
-
* `explicit` 覆盖优先),headers / compat 按 供应商 ← 渠道 ← 模型 合并,并记下渠道名。
|
|
54
|
-
*/
|
|
55
|
-
export declare function materializeModel(model: Model, provider: ProviderData, channel?: ProviderChannel, explicit?: {
|
|
56
|
-
api?: Api | undefined;
|
|
57
|
-
baseUrl?: string | undefined;
|
|
58
|
-
}): Model;
|
|
59
58
|
export declare class ProviderRegistry implements ProviderRegistryApi {
|
|
60
59
|
readonly warnings: string[];
|
|
61
60
|
private readonly providers;
|
|
@@ -64,6 +63,10 @@ export declare class ProviderRegistry implements ProviderRegistryApi {
|
|
|
64
63
|
private readonly envBaseUrls;
|
|
65
64
|
/** baseUrl 指向非官方主机的内置供应商:接受目录外的 model id。 */
|
|
66
65
|
private readonly relayed;
|
|
66
|
+
/** config 里写了自己 `channels` 的供应商(内置渠道不因改 baseUrl 作废)。 */
|
|
67
|
+
private readonly userChannels;
|
|
68
|
+
/** config 里写了供应商级 `api` 的供应商(单渠道回落时目录模型跟它走)。 */
|
|
69
|
+
private readonly userApi;
|
|
67
70
|
/** `provider/model` → 物化前的模型(多渠道供应商切换渠道时重新物化)。 */
|
|
68
71
|
private readonly raw;
|
|
69
72
|
/** `provider/model` → 元数据来源与 models.dev 匹配。 */
|
|
@@ -73,6 +76,13 @@ export declare class ProviderRegistry implements ProviderRegistryApi {
|
|
|
73
76
|
private readonly keys;
|
|
74
77
|
private readonly onWarning;
|
|
75
78
|
constructor(options?: ProviderRegistryOptions);
|
|
79
|
+
/** 内置目录(快照 ⊕ 用户刷新);刷新数据出任何问题都退回内置快照,不让启动失败。 */
|
|
80
|
+
private loadCatalog;
|
|
81
|
+
/**
|
|
82
|
+
* 内置供应商定渠道:供应商级 api / baseUrl 取缺省渠道的(discover 等单地址的用法看它);用户没指定渠道的
|
|
83
|
+
* 模型挂全部渠道(缺省在前)。渠道已作废的去掉模型上残留的 `channels`。
|
|
84
|
+
*/
|
|
85
|
+
private settleBuiltinChannels;
|
|
76
86
|
private warn;
|
|
77
87
|
/** 物化并记下原始模型;多渠道供应商用模型的首选渠道。 */
|
|
78
88
|
private materialize;
|