modelrig 0.0.1 → 0.2.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/CHANGELOG.md +94 -0
- package/LICENSE +201 -0
- package/README.md +145 -8
- package/data/PROVENANCE.md +19 -0
- package/data/pricing-manual.json +22 -0
- package/data/pricing-map.json +46362 -0
- package/data/pricing-overlay.json +419 -0
- package/dist/adapters/anthropic.d.ts +90 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +296 -0
- package/dist/adapters/build-adapters.d.ts +11 -0
- package/dist/adapters/build-adapters.d.ts.map +1 -0
- package/dist/adapters/build-adapters.js +45 -0
- package/dist/adapters/deepseek.d.ts +47 -0
- package/dist/adapters/deepseek.d.ts.map +1 -0
- package/dist/adapters/deepseek.js +216 -0
- package/dist/adapters/gemini.d.ts +44 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +262 -0
- package/dist/adapters/grok.d.ts +53 -0
- package/dist/adapters/grok.d.ts.map +1 -0
- package/dist/adapters/grok.js +232 -0
- package/dist/adapters/openai-compat.d.ts +80 -0
- package/dist/adapters/openai-compat.d.ts.map +1 -0
- package/dist/adapters/openai-compat.js +244 -0
- package/dist/adapters/openai-stream.d.ts +58 -0
- package/dist/adapters/openai-stream.d.ts.map +1 -0
- package/dist/adapters/openai-stream.js +120 -0
- package/dist/adapters/openai.d.ts +55 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +281 -0
- package/dist/adapters/sampling.d.ts +28 -0
- package/dist/adapters/sampling.d.ts.map +1 -0
- package/dist/adapters/sampling.js +34 -0
- package/dist/adapters/tool-mapping.d.ts +92 -0
- package/dist/adapters/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/tool-mapping.js +143 -0
- package/dist/artifacts/artifact.d.ts +137 -0
- package/dist/artifacts/artifact.d.ts.map +1 -0
- package/dist/artifacts/artifact.js +377 -0
- package/dist/artifacts/content-uploader.d.ts +87 -0
- package/dist/artifacts/content-uploader.d.ts.map +1 -0
- package/dist/artifacts/content-uploader.js +124 -0
- package/dist/artifacts/index.d.ts +63 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +80 -0
- package/dist/artifacts/run-context.d.ts +129 -0
- package/dist/artifacts/run-context.d.ts.map +1 -0
- package/dist/artifacts/run-context.js +208 -0
- package/dist/artifacts/scrub.d.ts +60 -0
- package/dist/artifacts/scrub.d.ts.map +1 -0
- package/dist/artifacts/scrub.js +139 -0
- package/dist/artifacts/step.d.ts +26 -0
- package/dist/artifacts/step.d.ts.map +1 -0
- package/dist/artifacts/step.js +37 -0
- package/dist/artifacts/taint.d.ts +63 -0
- package/dist/artifacts/taint.d.ts.map +1 -0
- package/dist/artifacts/taint.js +76 -0
- package/dist/bakeoff/cache-sim.d.ts +99 -0
- package/dist/bakeoff/cache-sim.d.ts.map +1 -0
- package/dist/bakeoff/cache-sim.js +126 -0
- package/dist/bakeoff/engine.d.ts +52 -0
- package/dist/bakeoff/engine.d.ts.map +1 -0
- package/dist/bakeoff/engine.js +163 -0
- package/dist/bakeoff/eval-cases.d.ts +96 -0
- package/dist/bakeoff/eval-cases.d.ts.map +1 -0
- package/dist/bakeoff/eval-cases.js +105 -0
- package/dist/bakeoff/replay.d.ts +52 -0
- package/dist/bakeoff/replay.d.ts.map +1 -0
- package/dist/bakeoff/replay.js +94 -0
- package/dist/bakeoff/report.d.ts +41 -0
- package/dist/bakeoff/report.d.ts.map +1 -0
- package/dist/bakeoff/report.js +142 -0
- package/dist/bakeoff/samples.d.ts +77 -0
- package/dist/bakeoff/samples.d.ts.map +1 -0
- package/dist/bakeoff/samples.js +148 -0
- package/dist/bakeoff/stats.d.ts +13 -0
- package/dist/bakeoff/stats.d.ts.map +1 -0
- package/dist/bakeoff/stats.js +48 -0
- package/dist/bakeoff/types.d.ts +37 -0
- package/dist/bakeoff/types.d.ts.map +1 -0
- package/dist/bakeoff/types.js +10 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +590 -0
- package/dist/config.d.ts +204 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +252 -0
- package/dist/deprecations.d.ts +32 -0
- package/dist/deprecations.d.ts.map +1 -0
- package/dist/deprecations.js +59 -0
- package/dist/feedback/coverage.d.ts +32 -0
- package/dist/feedback/coverage.d.ts.map +1 -0
- package/dist/feedback/coverage.js +95 -0
- package/dist/feedback/feedback.d.ts +35 -0
- package/dist/feedback/feedback.d.ts.map +1 -0
- package/dist/feedback/feedback.js +39 -0
- package/dist/gateway/http-protocol.d.ts +175 -0
- package/dist/gateway/http-protocol.d.ts.map +1 -0
- package/dist/gateway/http-protocol.js +105 -0
- package/dist/index.d.ts +242 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +576 -0
- package/dist/init/finder.d.ts +94 -0
- package/dist/init/finder.d.ts.map +1 -0
- package/dist/init/finder.js +343 -0
- package/dist/init/init-cli.d.ts +10 -0
- package/dist/init/init-cli.d.ts.map +1 -0
- package/dist/init/init-cli.js +86 -0
- package/dist/init/observe-cli.d.ts +19 -0
- package/dist/init/observe-cli.d.ts.map +1 -0
- package/dist/init/observe-cli.js +73 -0
- package/dist/init/observe.d.ts +81 -0
- package/dist/init/observe.d.ts.map +1 -0
- package/dist/init/observe.js +245 -0
- package/dist/init/run.d.ts +99 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +281 -0
- package/dist/init/signatures.d.ts +39 -0
- package/dist/init/signatures.d.ts.map +1 -0
- package/dist/init/signatures.js +116 -0
- package/dist/matrix/aggregate.d.ts +89 -0
- package/dist/matrix/aggregate.d.ts.map +1 -0
- package/dist/matrix/aggregate.js +186 -0
- package/dist/query/grammar.d.ts +35 -0
- package/dist/query/grammar.d.ts.map +1 -0
- package/dist/query/grammar.js +279 -0
- package/dist/query/run.d.ts +8 -0
- package/dist/query/run.d.ts.map +1 -0
- package/dist/query/run.js +21 -0
- package/dist/registry/build.d.ts +219 -0
- package/dist/registry/build.d.ts.map +1 -0
- package/dist/registry/build.js +313 -0
- package/dist/registry/cache-policy.d.ts +94 -0
- package/dist/registry/cache-policy.d.ts.map +1 -0
- package/dist/registry/cache-policy.js +238 -0
- package/dist/registry/call-notes.d.ts +11 -0
- package/dist/registry/call-notes.d.ts.map +1 -0
- package/dist/registry/call-notes.js +110 -0
- package/dist/registry/claims.d.ts +63 -0
- package/dist/registry/claims.d.ts.map +1 -0
- package/dist/registry/claims.js +107 -0
- package/dist/registry/effective-rate.d.ts +151 -0
- package/dist/registry/effective-rate.d.ts.map +1 -0
- package/dist/registry/effective-rate.js +156 -0
- package/dist/registry/facts.d.ts +32 -0
- package/dist/registry/facts.d.ts.map +1 -0
- package/dist/registry/facts.js +136 -0
- package/dist/registry/fingerprint.d.ts +20 -0
- package/dist/registry/fingerprint.d.ts.map +1 -0
- package/dist/registry/fingerprint.js +150 -0
- package/dist/registry/parity.d.ts +52 -0
- package/dist/registry/parity.d.ts.map +1 -0
- package/dist/registry/parity.js +82 -0
- package/dist/registry/pricing-shape.d.ts +113 -0
- package/dist/registry/pricing-shape.d.ts.map +1 -0
- package/dist/registry/pricing-shape.js +123 -0
- package/dist/registry/pricing.d.ts +43 -0
- package/dist/registry/pricing.d.ts.map +1 -0
- package/dist/registry/pricing.js +127 -0
- package/dist/registry/rows.d.ts +16 -0
- package/dist/registry/rows.d.ts.map +1 -0
- package/dist/registry/rows.js +57 -0
- package/dist/registry/seed.d.ts +43 -0
- package/dist/registry/seed.d.ts.map +1 -0
- package/dist/registry/seed.js +97 -0
- package/dist/registry/select.d.ts +68 -0
- package/dist/registry/select.d.ts.map +1 -0
- package/dist/registry/select.js +141 -0
- package/dist/registry/staleness.d.ts +18 -0
- package/dist/registry/staleness.d.ts.map +1 -0
- package/dist/registry/staleness.js +39 -0
- package/dist/rigindex/bootstrap.d.ts +36 -0
- package/dist/rigindex/bootstrap.d.ts.map +1 -0
- package/dist/rigindex/bootstrap.js +97 -0
- package/dist/rigindex/fit.d.ts +24 -0
- package/dist/rigindex/fit.d.ts.map +1 -0
- package/dist/rigindex/fit.js +76 -0
- package/dist/rigindex/gates.d.ts +52 -0
- package/dist/rigindex/gates.d.ts.map +1 -0
- package/dist/rigindex/gates.js +109 -0
- package/dist/rigindex/graph.d.ts +31 -0
- package/dist/rigindex/graph.d.ts.map +1 -0
- package/dist/rigindex/graph.js +120 -0
- package/dist/rigindex/index.d.ts +23 -0
- package/dist/rigindex/index.d.ts.map +1 -0
- package/dist/rigindex/index.js +112 -0
- package/dist/rigindex/types.d.ts +76 -0
- package/dist/rigindex/types.d.ts.map +1 -0
- package/dist/rigindex/types.js +8 -0
- package/dist/routes/cache-lint.d.ts +41 -0
- package/dist/routes/cache-lint.d.ts.map +1 -0
- package/dist/routes/cache-lint.js +81 -0
- package/dist/routes/draft.d.ts +83 -0
- package/dist/routes/draft.d.ts.map +1 -0
- package/dist/routes/draft.js +135 -0
- package/dist/routes/loader.d.ts +63 -0
- package/dist/routes/loader.d.ts.map +1 -0
- package/dist/routes/loader.js +574 -0
- package/dist/routes/manifest.d.ts +24 -0
- package/dist/routes/manifest.d.ts.map +1 -0
- package/dist/routes/manifest.js +118 -0
- package/dist/routes/resolved-bundle.d.ts +79 -0
- package/dist/routes/resolved-bundle.d.ts.map +1 -0
- package/dist/routes/resolved-bundle.js +148 -0
- package/dist/routes/sampling-config.d.ts +32 -0
- package/dist/routes/sampling-config.d.ts.map +1 -0
- package/dist/routes/sampling-config.js +91 -0
- package/dist/routes/serveability.d.ts +52 -0
- package/dist/routes/serveability.d.ts.map +1 -0
- package/dist/routes/serveability.js +73 -0
- package/dist/routes/template.d.ts +18 -0
- package/dist/routes/template.d.ts.map +1 -0
- package/dist/routes/template.js +94 -0
- package/dist/run/ajv.d.ts +22 -0
- package/dist/run/ajv.d.ts.map +1 -0
- package/dist/run/ajv.js +32 -0
- package/dist/run/cache-handle.d.ts +58 -0
- package/dist/run/cache-handle.d.ts.map +1 -0
- package/dist/run/cache-handle.js +54 -0
- package/dist/run/cache-stamp.d.ts +65 -0
- package/dist/run/cache-stamp.d.ts.map +1 -0
- package/dist/run/cache-stamp.js +0 -0
- package/dist/run/capture-write.d.ts +33 -0
- package/dist/run/capture-write.d.ts.map +1 -0
- package/dist/run/capture-write.js +55 -0
- package/dist/run/cost.d.ts +26 -0
- package/dist/run/cost.d.ts.map +1 -0
- package/dist/run/cost.js +41 -0
- package/dist/run/dispatch.d.ts +99 -0
- package/dist/run/dispatch.d.ts.map +1 -0
- package/dist/run/dispatch.js +191 -0
- package/dist/run/envelope.d.ts +21 -0
- package/dist/run/envelope.d.ts.map +1 -0
- package/dist/run/envelope.js +45 -0
- package/dist/run/grounding.d.ts +56 -0
- package/dist/run/grounding.d.ts.map +1 -0
- package/dist/run/grounding.js +89 -0
- package/dist/run/raw.d.ts +88 -0
- package/dist/run/raw.d.ts.map +1 -0
- package/dist/run/raw.js +286 -0
- package/dist/run/record-attempt.d.ts +40 -0
- package/dist/run/record-attempt.d.ts.map +1 -0
- package/dist/run/record-attempt.js +99 -0
- package/dist/run/repair.d.ts +36 -0
- package/dist/run/repair.d.ts.map +1 -0
- package/dist/run/repair.js +61 -0
- package/dist/run/resolve.d.ts +99 -0
- package/dist/run/resolve.d.ts.map +1 -0
- package/dist/run/resolve.js +203 -0
- package/dist/run/retry.d.ts +19 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +50 -0
- package/dist/run/run.d.ts +55 -0
- package/dist/run/run.d.ts.map +1 -0
- package/dist/run/run.js +540 -0
- package/dist/run/stream.d.ts +49 -0
- package/dist/run/stream.d.ts.map +1 -0
- package/dist/run/stream.js +87 -0
- package/dist/run/validate.d.ts +15 -0
- package/dist/run/validate.d.ts.map +1 -0
- package/dist/run/validate.js +55 -0
- package/dist/savings/cache-ledger.d.ts +108 -0
- package/dist/savings/cache-ledger.d.ts.map +1 -0
- package/dist/savings/cache-ledger.js +174 -0
- package/dist/savings/cache-reconcile.d.ts +64 -0
- package/dist/savings/cache-reconcile.d.ts.map +1 -0
- package/dist/savings/cache-reconcile.js +59 -0
- package/dist/savings/cache-stats.d.ts +63 -0
- package/dist/savings/cache-stats.d.ts.map +1 -0
- package/dist/savings/cache-stats.js +108 -0
- package/dist/savings/emit.d.ts +38 -0
- package/dist/savings/emit.d.ts.map +1 -0
- package/dist/savings/emit.js +100 -0
- package/dist/savings/odometer.d.ts +32 -0
- package/dist/savings/odometer.d.ts.map +1 -0
- package/dist/savings/odometer.js +70 -0
- package/dist/savings/swap-execute.d.ts +58 -0
- package/dist/savings/swap-execute.d.ts.map +1 -0
- package/dist/savings/swap-execute.js +130 -0
- package/dist/savings/swaps-client.d.ts +55 -0
- package/dist/savings/swaps-client.d.ts.map +1 -0
- package/dist/savings/swaps-client.js +95 -0
- package/dist/settings/api-fetcher.d.ts +39 -0
- package/dist/settings/api-fetcher.d.ts.map +1 -0
- package/dist/settings/api-fetcher.js +92 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +15 -0
- package/dist/settings/task-settings.d.ts +91 -0
- package/dist/settings/task-settings.d.ts.map +1 -0
- package/dist/settings/task-settings.js +116 -0
- package/dist/status.d.ts +77 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +113 -0
- package/dist/telemetry/artifact-store.d.ts +48 -0
- package/dist/telemetry/artifact-store.d.ts.map +1 -0
- package/dist/telemetry/artifact-store.js +189 -0
- package/dist/telemetry/cache-miss-streak.d.ts +79 -0
- package/dist/telemetry/cache-miss-streak.d.ts.map +1 -0
- package/dist/telemetry/cache-miss-streak.js +99 -0
- package/dist/telemetry/capture.d.ts +31 -0
- package/dist/telemetry/capture.d.ts.map +1 -0
- package/dist/telemetry/capture.js +81 -0
- package/dist/telemetry/exporter-setup.d.ts +28 -0
- package/dist/telemetry/exporter-setup.d.ts.map +1 -0
- package/dist/telemetry/exporter-setup.js +34 -0
- package/dist/telemetry/exporter.d.ts +137 -0
- package/dist/telemetry/exporter.d.ts.map +1 -0
- package/dist/telemetry/exporter.js +510 -0
- package/dist/telemetry/health.d.ts +76 -0
- package/dist/telemetry/health.d.ts.map +1 -0
- package/dist/telemetry/health.js +92 -0
- package/dist/telemetry/ingest-protocol.d.ts +310 -0
- package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
- package/dist/telemetry/ingest-protocol.js +363 -0
- package/dist/telemetry/load-error-report.d.ts +24 -0
- package/dist/telemetry/load-error-report.d.ts.map +1 -0
- package/dist/telemetry/load-error-report.js +50 -0
- package/dist/telemetry/otel-map.d.ts +121 -0
- package/dist/telemetry/otel-map.d.ts.map +1 -0
- package/dist/telemetry/otel-map.js +224 -0
- package/dist/telemetry/otel-normalize.d.ts +104 -0
- package/dist/telemetry/otel-normalize.d.ts.map +1 -0
- package/dist/telemetry/otel-normalize.js +530 -0
- package/dist/telemetry/otlp-emitter.d.ts +52 -0
- package/dist/telemetry/otlp-emitter.d.ts.map +1 -0
- package/dist/telemetry/otlp-emitter.js +144 -0
- package/dist/telemetry/otlp-proto.d.ts +29 -0
- package/dist/telemetry/otlp-proto.d.ts.map +1 -0
- package/dist/telemetry/otlp-proto.js +266 -0
- package/dist/telemetry/sinks.d.ts +90 -0
- package/dist/telemetry/sinks.d.ts.map +1 -0
- package/dist/telemetry/sinks.js +180 -0
- package/dist/telemetry/store.d.ts +65 -0
- package/dist/telemetry/store.d.ts.map +1 -0
- package/dist/telemetry/store.js +547 -0
- package/dist/tenancy/api-key-format.d.ts +77 -0
- package/dist/tenancy/api-key-format.d.ts.map +1 -0
- package/dist/tenancy/api-key-format.js +110 -0
- package/dist/tenancy/constants.d.ts +23 -0
- package/dist/tenancy/constants.d.ts.map +1 -0
- package/dist/tenancy/constants.js +25 -0
- package/dist/tenancy/scrub.d.ts +47 -0
- package/dist/tenancy/scrub.d.ts.map +1 -0
- package/dist/tenancy/scrub.js +85 -0
- package/dist/types/config-teaching.d.ts +62 -0
- package/dist/types/config-teaching.d.ts.map +1 -0
- package/dist/types/config-teaching.js +183 -0
- package/dist/types/failures-teaching.d.ts +56 -0
- package/dist/types/failures-teaching.d.ts.map +1 -0
- package/dist/types/failures-teaching.js +177 -0
- package/dist/types/failures.d.ts +27 -0
- package/dist/types/failures.d.ts.map +1 -0
- package/dist/types/failures.js +41 -0
- package/dist/types/provider.d.ts +200 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +40 -0
- package/dist/types/route.d.ts +205 -0
- package/dist/types/route.d.ts.map +1 -0
- package/dist/types/route.js +6 -0
- package/dist/types/telemetry.d.ts +206 -0
- package/dist/types/telemetry.d.ts.map +1 -0
- package/dist/types/telemetry.js +6 -0
- package/dist/validate-cli.d.ts +12 -0
- package/dist/validate-cli.d.ts.map +1 -0
- package/dist/validate-cli.js +57 -0
- package/dist/verify/capture.d.ts +66 -0
- package/dist/verify/capture.d.ts.map +1 -0
- package/dist/verify/capture.js +180 -0
- package/dist/verify/cli-run.d.ts +23 -0
- package/dist/verify/cli-run.d.ts.map +1 -0
- package/dist/verify/cli-run.js +57 -0
- package/dist/verify/diff.d.ts +48 -0
- package/dist/verify/diff.d.ts.map +1 -0
- package/dist/verify/diff.js +157 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +24 -0
- package/dist/verify/report.d.ts +14 -0
- package/dist/verify/report.d.ts.map +1 -0
- package/dist/verify/report.js +88 -0
- package/dist/verify/types.d.ts +101 -0
- package/dist/verify/types.d.ts.map +1 -0
- package/dist/verify/types.js +17 -0
- package/dist/verify/verify.d.ts +29 -0
- package/dist/verify/verify.d.ts.map +1 -0
- package/dist/verify/verify.js +148 -0
- package/dist/watch/budget.d.ts +19 -0
- package/dist/watch/budget.d.ts.map +1 -0
- package/dist/watch/budget.js +35 -0
- package/dist/watch/evaluate.d.ts +225 -0
- package/dist/watch/evaluate.d.ts.map +1 -0
- package/dist/watch/evaluate.js +155 -0
- package/dist/watch/monitor.d.ts +116 -0
- package/dist/watch/monitor.d.ts.map +1 -0
- package/dist/watch/monitor.js +199 -0
- package/dist/watch/proposals.d.ts +89 -0
- package/dist/watch/proposals.d.ts.map +1 -0
- package/dist/watch/proposals.js +197 -0
- package/dist/watch/run-record.d.ts +64 -0
- package/dist/watch/run-record.d.ts.map +1 -0
- package/dist/watch/run-record.js +86 -0
- package/dist/watch/run-reported.d.ts +20 -0
- package/dist/watch/run-reported.d.ts.map +1 -0
- package/dist/watch/run-reported.js +53 -0
- package/dist/watch/run.d.ts +73 -0
- package/dist/watch/run.d.ts.map +1 -0
- package/dist/watch/run.js +83 -0
- package/dist/watch/state-store.d.ts +48 -0
- package/dist/watch/state-store.d.ts.map +1 -0
- package/dist/watch/state-store.js +86 -0
- package/dist/watch/state.d.ts +21 -0
- package/dist/watch/state.d.ts.map +1 -0
- package/dist/watch/state.js +93 -0
- package/package.json +56 -14
- package/registry/LICENSE +20 -0
- package/registry/leaderboard.json +3639 -0
- package/registry/registry.json +7263 -0
- package/index.js +0 -3
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Anthropic ProviderAdapter — provider expansion 2026-08-02. Messages API
|
|
4
|
+
* via @anthropic-ai/sdk with streaming. Structured output is a FORCED TOOL
|
|
5
|
+
* CALL: the route schema becomes the single tool's input_schema and
|
|
6
|
+
* tool_choice pins it, so the accumulated input_json_delta stream IS the
|
|
7
|
+
* JSON output (Anthropic's recommended structured-output pattern; the run
|
|
8
|
+
* loop still ajv-validates like every provider). Prompt caching (WS-C) is
|
|
9
|
+
* explicit `cache_control` on Anthropic: when the request opts in, the system
|
|
10
|
+
* prefix is marked with an ephemeral breakpoint (buildAnthropicParams) and the
|
|
11
|
+
* `context_cache_explicit` capability is advertised per the cache-policy registry.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.isStrictSchemaRejection = isStrictSchemaRejection;
|
|
18
|
+
exports.anthropicSupports = anthropicSupports;
|
|
19
|
+
exports.classifyAnthropicFailure = classifyAnthropicFailure;
|
|
20
|
+
exports.buildAnthropicParams = buildAnthropicParams;
|
|
21
|
+
exports.normalizeAnthropicInputUsage = normalizeAnthropicInputUsage;
|
|
22
|
+
exports.createAnthropicAdapter = createAnthropicAdapter;
|
|
23
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
24
|
+
const tool_mapping_1 = require("./tool-mapping");
|
|
25
|
+
const sampling_1 = require("./sampling");
|
|
26
|
+
const DEFAULT_MAX_TOKENS = 32000;
|
|
27
|
+
const OUTPUT_TOOL_NAME = "route_output";
|
|
28
|
+
/** Strict tool use (constrained decoding) — public beta. Schemas that
|
|
29
|
+
* exceed Anthropic's compile limits (e.g. >16 union-typed parameters) are
|
|
30
|
+
* rejected with a 400; the call() path downgrades to advisory mode then. */
|
|
31
|
+
const STRUCTURED_OUTPUTS_BETA = "structured-outputs-2025-11-13";
|
|
32
|
+
/** True when a 400 says the schema cannot compile for strict mode —
|
|
33
|
+
* downgrade to advisory, do NOT surface as a failure. */
|
|
34
|
+
function isStrictSchemaRejection(message) {
|
|
35
|
+
return /union|exponential compilation|does not support strict|strict.*not supported/i.test(message);
|
|
36
|
+
}
|
|
37
|
+
function anthropicSupports(feature, _model) {
|
|
38
|
+
switch (feature) {
|
|
39
|
+
case "structured_native": // forced tool call with the route schema
|
|
40
|
+
case "json_mode":
|
|
41
|
+
case "context_cache_explicit": // cache_control ephemeral blocks (WS-C) — cache-policy registry truth
|
|
42
|
+
return true;
|
|
43
|
+
case "grounded_native": // web-search tool exists but is not wired
|
|
44
|
+
case "prompt_cache_key": // anthropic ignores keys — caching is prefix-based via cache_control
|
|
45
|
+
case "prefix_cache_implicit":
|
|
46
|
+
case "tier_flex":
|
|
47
|
+
case "trace_visible": // extended thinking not enabled by this adapter
|
|
48
|
+
case "zero_retention": // never a static adapter attestation — set only from the credential-scoped registry facts (claims.ts)
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function classifyAnthropicFailure(message) {
|
|
53
|
+
const msg = message.toLowerCase();
|
|
54
|
+
if (/\b429\b|rate limit|rate_limit/.test(msg))
|
|
55
|
+
return { cls: "capacity_shed" };
|
|
56
|
+
if (/\b529\b|overloaded|\b50[023]\b|service unavailable/.test(msg)) {
|
|
57
|
+
return { cls: "capacity_shed" };
|
|
58
|
+
}
|
|
59
|
+
if (/timeout|etimedout|abort/.test(msg))
|
|
60
|
+
return { cls: "timeout" };
|
|
61
|
+
if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
|
|
62
|
+
return { cls: "network" };
|
|
63
|
+
if (/\b401\b|authentication|x-api-key|api key/.test(msg)) {
|
|
64
|
+
// F2: non-retryable — a dead key never burns backoff retries.
|
|
65
|
+
return { cls: "config_auth", fixHint: "check the Anthropic API key configured for this rig" };
|
|
66
|
+
}
|
|
67
|
+
if (/credit|spending limit|insufficient_quota|billing/.test(msg)) {
|
|
68
|
+
// Account-level hard stop — retrying burns nothing but time (learned
|
|
69
|
+
// from the 2026-08-03 xAI credit exhaustion mid-bake-off).
|
|
70
|
+
return { cls: "config_auth", fixHint: "the Anthropic account is out of credits or over its spending limit" };
|
|
71
|
+
}
|
|
72
|
+
if (/not_found|not found|does not exist/.test(msg)) {
|
|
73
|
+
return {
|
|
74
|
+
cls: "network",
|
|
75
|
+
fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return { cls: "network" };
|
|
79
|
+
}
|
|
80
|
+
function buildAnthropicParams(model, req, strict = false) {
|
|
81
|
+
// Structured output is a FORCED tool call on the route schema (existing
|
|
82
|
+
// path). Otherwise, caller-supplied `tools` (spec §4.4) map to Anthropic's
|
|
83
|
+
// tool_use — the two are mutually exclusive here (a structured route does
|
|
84
|
+
// not also expose free tools in Phase A).
|
|
85
|
+
const toolBlock = req.outputSchema !== null
|
|
86
|
+
? {
|
|
87
|
+
tools: [
|
|
88
|
+
{
|
|
89
|
+
name: OUTPUT_TOOL_NAME,
|
|
90
|
+
description: "Emit the structured output for this route.",
|
|
91
|
+
input_schema: req.outputSchema,
|
|
92
|
+
...(strict ? { strict: true } : {}),
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
tool_choice: { type: "tool", name: OUTPUT_TOOL_NAME },
|
|
96
|
+
}
|
|
97
|
+
: req.tools !== undefined && req.tools.length > 0
|
|
98
|
+
? {
|
|
99
|
+
tools: (0, tool_mapping_1.toAnthropicTools)(req.tools),
|
|
100
|
+
...((0, tool_mapping_1.toAnthropicToolChoice)(req.toolChoice) !== undefined
|
|
101
|
+
? { tool_choice: (0, tool_mapping_1.toAnthropicToolChoice)(req.toolChoice) }
|
|
102
|
+
: {}),
|
|
103
|
+
}
|
|
104
|
+
: {};
|
|
105
|
+
// Prompt caching (WS-C): when the request opts in (`cache` set by the run
|
|
106
|
+
// loop's policy-gated stamp), mark the system prompt — the stable prefix in
|
|
107
|
+
// ModelRig's system-carries-the-task convention — with a `cache_control`
|
|
108
|
+
// ephemeral breakpoint. Anthropic caches the prefix up to and including the
|
|
109
|
+
// marked block (default 5m TTL, refreshes free on read); the `cache.key` is
|
|
110
|
+
// ignored (caching is prefix-based, not key-based — that is why the telemetry
|
|
111
|
+
// `cache_key` for anthropic is null). Extended 1h TTL is a documented
|
|
112
|
+
// follow-up (needs the extended-cache beta header; WS-A already accounts the
|
|
113
|
+
// 5m/1h split when the provider reports it).
|
|
114
|
+
const wantsCache = req.cache?.key !== undefined && req.cache.key !== "";
|
|
115
|
+
const systemField = req.systemPrompt === ""
|
|
116
|
+
? {}
|
|
117
|
+
: wantsCache
|
|
118
|
+
? {
|
|
119
|
+
system: [
|
|
120
|
+
{ type: "text", text: req.systemPrompt, cache_control: { type: "ephemeral" } },
|
|
121
|
+
],
|
|
122
|
+
}
|
|
123
|
+
: { system: req.systemPrompt };
|
|
124
|
+
return {
|
|
125
|
+
model,
|
|
126
|
+
max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
|
|
127
|
+
...(0, sampling_1.openAISamplingFields)(req),
|
|
128
|
+
...systemField,
|
|
129
|
+
messages: [{ role: "user", content: req.userPrompt }],
|
|
130
|
+
stream: true,
|
|
131
|
+
...toolBlock,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Normalize Anthropic's `message_start` usage to ModelRig's convention
|
|
136
|
+
* (research §4 fix). Anthropic's `input_tokens` is the UNCACHED portion only;
|
|
137
|
+
* ModelRig requires `tokensIn` to INCLUDE cache reads and writes as subsets, so
|
|
138
|
+
* we add them back. Pure and total — the fixture-tested seam for the subset
|
|
139
|
+
* invariant and the 5m/1h split.
|
|
140
|
+
*/
|
|
141
|
+
function normalizeAnthropicInputUsage(u) {
|
|
142
|
+
const uncached = u.input_tokens ?? 0;
|
|
143
|
+
const read = u.cache_read_input_tokens ?? 0;
|
|
144
|
+
const write = u.cache_creation_input_tokens ?? 0;
|
|
145
|
+
// 1h split when the extended-TTL beta reports it; clamp to the total write so
|
|
146
|
+
// a malformed payload can never make the 1h bucket exceed the write bucket.
|
|
147
|
+
const write1h = Math.min(u.cache_creation?.ephemeral_1h_input_tokens ?? 0, write);
|
|
148
|
+
return {
|
|
149
|
+
tokensIn: uncached + read + write,
|
|
150
|
+
tokensCached: read,
|
|
151
|
+
tokensCacheWrite: write,
|
|
152
|
+
tokensCacheWrite1h: write1h,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function createAnthropicAdapter(config) {
|
|
156
|
+
return {
|
|
157
|
+
id: "anthropic",
|
|
158
|
+
supports: anthropicSupports,
|
|
159
|
+
supportsTools: () => true,
|
|
160
|
+
async call(req) {
|
|
161
|
+
const model = req.candidate.model;
|
|
162
|
+
// F1: post-stream failures still billed tokens — attach usage.
|
|
163
|
+
const fail = (cls, message, fixHint, usage) => ({
|
|
164
|
+
ok: false,
|
|
165
|
+
failure: {
|
|
166
|
+
class: cls,
|
|
167
|
+
message,
|
|
168
|
+
provider: "anthropic",
|
|
169
|
+
model,
|
|
170
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
171
|
+
},
|
|
172
|
+
...(usage !== undefined ? { usage } : {}),
|
|
173
|
+
});
|
|
174
|
+
const wantJson = req.outputSchema !== null;
|
|
175
|
+
try {
|
|
176
|
+
const client = new sdk_1.default({ apiKey: config.apiKey, timeout: req.timeoutMs });
|
|
177
|
+
// Strict-first (constrained decoding, structured-outputs beta): the
|
|
178
|
+
// strongest available rung. Schemas over Anthropic's compile limits
|
|
179
|
+
// (e.g. >16 union-typed parameters — hit live by earnings_5c on
|
|
180
|
+
// 2026-08-03) get an immediate 400; downgrade to advisory mode and
|
|
181
|
+
// let the run loop's ajv validation arbitrate, like every provider.
|
|
182
|
+
let stream;
|
|
183
|
+
if (wantJson) {
|
|
184
|
+
try {
|
|
185
|
+
stream = await client.messages.create(buildAnthropicParams(model, req, true), { headers: { "anthropic-beta": STRUCTURED_OUTPUTS_BETA } });
|
|
186
|
+
}
|
|
187
|
+
catch (strictError) {
|
|
188
|
+
const message = strictError instanceof Error ? strictError.message : String(strictError);
|
|
189
|
+
if (!isStrictSchemaRejection(message))
|
|
190
|
+
throw strictError;
|
|
191
|
+
stream = await client.messages.create(buildAnthropicParams(model, req));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
stream = await client.messages.create(buildAnthropicParams(model, req));
|
|
196
|
+
}
|
|
197
|
+
const events = stream;
|
|
198
|
+
// Caller-supplied tools (spec §4.4) live on the non-structured path:
|
|
199
|
+
// accumulate each `tool_use` block's input_json_delta by block index.
|
|
200
|
+
const wantTools = req.outputSchema === null && req.tools !== undefined && req.tools.length > 0;
|
|
201
|
+
const toolBlocks = new Map();
|
|
202
|
+
let text = "";
|
|
203
|
+
// Input-side usage, normalized at message_start (subset invariant +
|
|
204
|
+
// research §4 tokensIn fix + 5m/1h split live in normalizeAnthropicInputUsage).
|
|
205
|
+
let inputUsage = {
|
|
206
|
+
tokensIn: 0,
|
|
207
|
+
tokensCached: 0,
|
|
208
|
+
tokensCacheWrite: 0,
|
|
209
|
+
tokensCacheWrite1h: 0,
|
|
210
|
+
};
|
|
211
|
+
let completionTokens = 0;
|
|
212
|
+
let stopReason = null;
|
|
213
|
+
for await (const event of events) {
|
|
214
|
+
if (event.type === "message_start" && event.message?.usage !== undefined) {
|
|
215
|
+
inputUsage = normalizeAnthropicInputUsage(event.message.usage);
|
|
216
|
+
}
|
|
217
|
+
else if (event.type === "content_block_start" &&
|
|
218
|
+
wantTools &&
|
|
219
|
+
event.content_block?.type === "tool_use") {
|
|
220
|
+
toolBlocks.set(event.index ?? 0, {
|
|
221
|
+
id: event.content_block.id ?? "",
|
|
222
|
+
name: event.content_block.name ?? "",
|
|
223
|
+
json: "",
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
else if (event.type === "content_block_delta") {
|
|
227
|
+
// Tools path: input_json_delta is the tool's arguments, per block.
|
|
228
|
+
// Schema path: the forced tool's input_json_delta IS the output.
|
|
229
|
+
// Plain path: text deltas. Never mix the buffers.
|
|
230
|
+
if (wantTools && event.delta?.type === "input_json_delta" && event.delta.partial_json) {
|
|
231
|
+
const blk = toolBlocks.get(event.index ?? 0);
|
|
232
|
+
if (blk !== undefined)
|
|
233
|
+
blk.json += event.delta.partial_json;
|
|
234
|
+
}
|
|
235
|
+
else if (wantJson && event.delta?.type === "input_json_delta" && event.delta.partial_json) {
|
|
236
|
+
text += event.delta.partial_json;
|
|
237
|
+
}
|
|
238
|
+
else if (event.delta?.type === "text_delta" && event.delta.text) {
|
|
239
|
+
text += event.delta.text;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else if (event.type === "message_delta") {
|
|
243
|
+
if (event.usage?.output_tokens !== undefined) {
|
|
244
|
+
completionTokens = event.usage.output_tokens;
|
|
245
|
+
}
|
|
246
|
+
if (event.delta?.stop_reason)
|
|
247
|
+
stopReason = event.delta.stop_reason;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Anthropic has no service tiers on this path — served is standard.
|
|
251
|
+
// The input side (tokensIn incl. cached+write, the write buckets) was
|
|
252
|
+
// normalized by normalizeAnthropicInputUsage (research §4 fix).
|
|
253
|
+
const usage = {
|
|
254
|
+
...inputUsage,
|
|
255
|
+
tokensOut: completionTokens,
|
|
256
|
+
servedTier: "standard",
|
|
257
|
+
};
|
|
258
|
+
// Tool-call turn (spec §4.4): `arguments` is the raw JSON string the
|
|
259
|
+
// model streamed (OpenAI parity) — text may be empty, skip the guards.
|
|
260
|
+
if (wantTools && toolBlocks.size > 0) {
|
|
261
|
+
const toolCalls = [...toolBlocks.values()].map((b, i) => ({
|
|
262
|
+
id: b.id !== "" ? b.id : `call_${i}`,
|
|
263
|
+
type: "function",
|
|
264
|
+
function: { name: b.name, arguments: b.json === "" ? "{}" : b.json },
|
|
265
|
+
}));
|
|
266
|
+
return { ok: true, text, usage, toolCalls };
|
|
267
|
+
}
|
|
268
|
+
if (stopReason === "refusal") {
|
|
269
|
+
return fail("refusal", "Anthropic refused this request (stop_reason=refusal)", undefined, usage);
|
|
270
|
+
}
|
|
271
|
+
if (text.trim().length === 0) {
|
|
272
|
+
return fail("content_invalid", `empty response from Anthropic (stop_reason=${stopReason ?? "none"})`, undefined, usage);
|
|
273
|
+
}
|
|
274
|
+
if (stopReason === "max_tokens" && wantJson) {
|
|
275
|
+
return fail("content_invalid", "Anthropic structured output truncated (stop_reason=max_tokens)", "raise maxOutputTokens for this route", usage);
|
|
276
|
+
}
|
|
277
|
+
return { ok: true, text, usage };
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
281
|
+
const { cls, fixHint } = classifyAnthropicFailure(message);
|
|
282
|
+
return {
|
|
283
|
+
ok: false,
|
|
284
|
+
failure: {
|
|
285
|
+
class: cls,
|
|
286
|
+
message,
|
|
287
|
+
provider: "anthropic",
|
|
288
|
+
model,
|
|
289
|
+
cause: error,
|
|
290
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the provider-adapter map from resolved config + registry facts.
|
|
3
|
+
* Extracted from index.ts (the SDK entrypoint) so that file stays under the LOC
|
|
4
|
+
* cap — the same reason wireRigArtifacts / buildExportedRouteMirrors live apart.
|
|
5
|
+
* Mechanical, one caller; behaviour is byte-identical to the prior inline block.
|
|
6
|
+
*/
|
|
7
|
+
import type { RigConfig } from "../config";
|
|
8
|
+
import type { RegistryFacts } from "../registry/facts";
|
|
9
|
+
import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
|
|
10
|
+
export declare function buildAdapters(config: RigConfig, registryFacts: RegistryFacts, compatStatic: ReadonlySet<CapabilityFlag>): Map<string, ProviderAdapter>;
|
|
11
|
+
//# sourceMappingURL=build-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-adapters.d.ts","sourceRoot":"","sources":["../../src/adapters/build-adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQzE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,GACxC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA6B9B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Build the provider-adapter map from resolved config + registry facts.
|
|
4
|
+
* Extracted from index.ts (the SDK entrypoint) so that file stays under the LOC
|
|
5
|
+
* cap — the same reason wireRigArtifacts / buildExportedRouteMirrors live apart.
|
|
6
|
+
* Mechanical, one caller; behaviour is byte-identical to the prior inline block.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.buildAdapters = buildAdapters;
|
|
10
|
+
const anthropic_1 = require("./anthropic");
|
|
11
|
+
const deepseek_1 = require("./deepseek");
|
|
12
|
+
const gemini_1 = require("./gemini");
|
|
13
|
+
const grok_1 = require("./grok");
|
|
14
|
+
const openai_1 = require("./openai");
|
|
15
|
+
const openai_compat_1 = require("./openai-compat");
|
|
16
|
+
function buildAdapters(config, registryFacts, compatStatic) {
|
|
17
|
+
const adapters = new Map();
|
|
18
|
+
if (config.keys.gemini)
|
|
19
|
+
adapters.set("gemini", (0, gemini_1.createGeminiAdapter)({ apiKey: config.keys.gemini }));
|
|
20
|
+
if (config.keys.openai)
|
|
21
|
+
adapters.set("openai", (0, openai_1.createOpenAIAdapter)({ apiKey: config.keys.openai }));
|
|
22
|
+
if (config.keys.deepseek) {
|
|
23
|
+
adapters.set("deepseek", (0, deepseek_1.createDeepSeekAdapter)({ apiKey: config.keys.deepseek }));
|
|
24
|
+
}
|
|
25
|
+
if (config.keys.anthropic) {
|
|
26
|
+
adapters.set("anthropic", (0, anthropic_1.createAnthropicAdapter)({ apiKey: config.keys.anthropic }));
|
|
27
|
+
}
|
|
28
|
+
if (config.keys.grok)
|
|
29
|
+
adapters.set("grok", (0, grok_1.createGrokAdapter)({ apiKey: config.keys.grok }));
|
|
30
|
+
// A1 aggregator hosts behind the generic openai-compatible adapter.
|
|
31
|
+
for (const hostId of ["deepinfra", "fireworks"]) {
|
|
32
|
+
const apiKey = config.keys[hostId];
|
|
33
|
+
if (!apiKey)
|
|
34
|
+
continue;
|
|
35
|
+
const host = openai_compat_1.OPENAI_COMPAT_HOSTS[hostId];
|
|
36
|
+
adapters.set(hostId, (0, openai_compat_1.createOpenAICompatAdapter)({
|
|
37
|
+
providerId: hostId,
|
|
38
|
+
baseUrl: host.baseUrl,
|
|
39
|
+
apiKey,
|
|
40
|
+
...(host.shapeModelId !== undefined ? { shapeModelId: host.shapeModelId } : {}),
|
|
41
|
+
capabilityProfile: (model) => registryFacts.flagsFor(hostId, model, compatStatic) ?? compatStatic,
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return adapters;
|
|
45
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepSeek ProviderAdapter — plan step 5 (sanctioned cut if C1 date at risk).
|
|
3
|
+
* Transformation logic ported from apps/api/src/services/deepseek-provider.ts:
|
|
4
|
+
* OpenAI-compatible API at api.deepseek.com, json_object forcing (DeepSeek has
|
|
5
|
+
* NO native strict json_schema — the run loop's json_mode path injects the
|
|
6
|
+
* schema-coached prompt; this adapter receives it already coached),
|
|
7
|
+
* prompt_cache_hit_tokens accounting, reasoning_content excluded from the
|
|
8
|
+
* JSON buffer (only delta.content is accumulated).
|
|
9
|
+
* NOT ported: logging, pricing tables, env reads, the analyst-persona prompt.
|
|
10
|
+
*
|
|
11
|
+
* Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
|
|
12
|
+
* Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
|
|
13
|
+
* deepseek transformation logic is consulted during the port.
|
|
14
|
+
*/
|
|
15
|
+
import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
|
|
16
|
+
import type { ClassifiedFailure, ShapingInput } from "./gemini";
|
|
17
|
+
import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
|
|
18
|
+
export interface DeepSeekAdapterConfig {
|
|
19
|
+
readonly apiKey: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function deepseekSupports(feature: CapabilityFlag, model: string): boolean;
|
|
22
|
+
export declare function classifyDeepSeekFailure(message: string): ClassifiedFailure;
|
|
23
|
+
interface ChatMessage {
|
|
24
|
+
readonly role: "system" | "user";
|
|
25
|
+
readonly content: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DeepSeekShapedParams {
|
|
28
|
+
readonly model: string;
|
|
29
|
+
readonly max_tokens: number;
|
|
30
|
+
readonly messages: readonly ChatMessage[];
|
|
31
|
+
readonly stream: true;
|
|
32
|
+
readonly stream_options: {
|
|
33
|
+
readonly include_usage: true;
|
|
34
|
+
};
|
|
35
|
+
/** CE-6 declared sampling — present only when the route/raw asks for them. */
|
|
36
|
+
readonly temperature?: number;
|
|
37
|
+
readonly top_p?: number;
|
|
38
|
+
readonly response_format?: {
|
|
39
|
+
readonly type: "json_object";
|
|
40
|
+
};
|
|
41
|
+
readonly tools?: readonly OpenAIWireTool[];
|
|
42
|
+
readonly tool_choice?: OpenAIWireToolChoice;
|
|
43
|
+
}
|
|
44
|
+
export declare function buildDeepSeekParams(model: string, req: ShapingInput): DeepSeekShapedParams;
|
|
45
|
+
export declare function createDeepSeekAdapter(config: DeepSeekAdapterConfig): ProviderAdapter;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/adapters/deepseek.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMhE,OAAO,KAAK,EAAuB,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAMhG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMhF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAiB1E;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAA;KAAE,CAAC;IAC1D,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,oBAAoB,CA2B1F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CA8JpF"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DeepSeek ProviderAdapter — plan step 5 (sanctioned cut if C1 date at risk).
|
|
4
|
+
* Transformation logic ported from apps/api/src/services/deepseek-provider.ts:
|
|
5
|
+
* OpenAI-compatible API at api.deepseek.com, json_object forcing (DeepSeek has
|
|
6
|
+
* NO native strict json_schema — the run loop's json_mode path injects the
|
|
7
|
+
* schema-coached prompt; this adapter receives it already coached),
|
|
8
|
+
* prompt_cache_hit_tokens accounting, reasoning_content excluded from the
|
|
9
|
+
* JSON buffer (only delta.content is accumulated).
|
|
10
|
+
* NOT ported: logging, pricing tables, env reads, the analyst-persona prompt.
|
|
11
|
+
*
|
|
12
|
+
* Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
|
|
13
|
+
* Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
|
|
14
|
+
* deepseek transformation logic is consulted during the port.
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.deepseekSupports = deepseekSupports;
|
|
21
|
+
exports.classifyDeepSeekFailure = classifyDeepSeekFailure;
|
|
22
|
+
exports.buildDeepSeekParams = buildDeepSeekParams;
|
|
23
|
+
exports.createDeepSeekAdapter = createDeepSeekAdapter;
|
|
24
|
+
const openai_1 = __importDefault(require("openai"));
|
|
25
|
+
const tool_mapping_1 = require("./tool-mapping");
|
|
26
|
+
const openai_stream_1 = require("./openai-stream");
|
|
27
|
+
const sampling_1 = require("./sampling");
|
|
28
|
+
const DEEPSEEK_BASE_URL = "https://api.deepseek.com";
|
|
29
|
+
const DEFAULT_MAX_TOKENS = 64000; // R1/V3 max — full capacity for long reports (ported)
|
|
30
|
+
function deepseekSupports(feature, model) {
|
|
31
|
+
if (feature === "trace_visible") {
|
|
32
|
+
// Reasoner models stream reasoning_content — the trace IS caller-visible.
|
|
33
|
+
return model.includes("reasoner");
|
|
34
|
+
}
|
|
35
|
+
return feature === "json_mode" || feature === "prefix_cache_implicit";
|
|
36
|
+
}
|
|
37
|
+
function classifyDeepSeekFailure(message) {
|
|
38
|
+
const msg = message.toLowerCase();
|
|
39
|
+
if (/\b429\b|rate limit|\brate\b/.test(msg))
|
|
40
|
+
return { cls: "capacity_shed" };
|
|
41
|
+
if (/\b50[023]\b|service unavailable|overloaded/.test(msg))
|
|
42
|
+
return { cls: "capacity_shed" };
|
|
43
|
+
if (/timeout|etimedout|abort/.test(msg))
|
|
44
|
+
return { cls: "timeout" };
|
|
45
|
+
if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
|
|
46
|
+
return { cls: "network" };
|
|
47
|
+
if (/\b401\b|api key/.test(msg)) {
|
|
48
|
+
// F2: non-retryable — a dead key never burns backoff retries.
|
|
49
|
+
return { cls: "config_auth", fixHint: "check the DeepSeek API key configured for this rig" };
|
|
50
|
+
}
|
|
51
|
+
if (/not found|does not exist/.test(msg)) {
|
|
52
|
+
return {
|
|
53
|
+
cls: "network",
|
|
54
|
+
fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { cls: "network" };
|
|
58
|
+
}
|
|
59
|
+
/** DeepSeek's json_object mode 400s when the literal word "JSON" appears
|
|
60
|
+
* nowhere in the prompt. The run loop's coached prompt normally guarantees
|
|
61
|
+
* it; this one-line guard is the adapter's belt-and-suspenders (ported). */
|
|
62
|
+
const JSON_GUARD = "Respond with a single valid JSON object.";
|
|
63
|
+
function buildDeepSeekParams(model, req) {
|
|
64
|
+
const wantJson = req.outputSchema !== null;
|
|
65
|
+
let systemPrompt = req.systemPrompt;
|
|
66
|
+
if (wantJson && !req.systemPrompt.includes("JSON") && !req.userPrompt.includes("JSON")) {
|
|
67
|
+
systemPrompt = systemPrompt === "" ? JSON_GUARD : `${systemPrompt}\n\n${JSON_GUARD}`;
|
|
68
|
+
}
|
|
69
|
+
const messages = [
|
|
70
|
+
...(systemPrompt !== "" ? [{ role: "system", content: systemPrompt }] : []),
|
|
71
|
+
{ role: "user", content: req.userPrompt },
|
|
72
|
+
];
|
|
73
|
+
return {
|
|
74
|
+
model,
|
|
75
|
+
max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
|
|
76
|
+
messages,
|
|
77
|
+
stream: true,
|
|
78
|
+
stream_options: { include_usage: true },
|
|
79
|
+
...(0, sampling_1.openAISamplingFields)(req),
|
|
80
|
+
...(wantJson ? { response_format: { type: "json_object" } } : {}),
|
|
81
|
+
...(req.tools !== undefined && req.tools.length > 0
|
|
82
|
+
? {
|
|
83
|
+
tools: (0, tool_mapping_1.toOpenAITools)(req.tools),
|
|
84
|
+
...((0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) !== undefined
|
|
85
|
+
? { tool_choice: (0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) }
|
|
86
|
+
: {}),
|
|
87
|
+
}
|
|
88
|
+
: {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function createDeepSeekAdapter(config) {
|
|
92
|
+
return {
|
|
93
|
+
id: "deepseek",
|
|
94
|
+
supports: deepseekSupports,
|
|
95
|
+
supportsTools: () => true,
|
|
96
|
+
async call(req) {
|
|
97
|
+
const model = req.candidate.model;
|
|
98
|
+
// F1: post-stream failures still billed tokens — attach usage.
|
|
99
|
+
const fail = (cls, message, fixHint, usage) => ({
|
|
100
|
+
ok: false,
|
|
101
|
+
failure: {
|
|
102
|
+
class: cls,
|
|
103
|
+
message,
|
|
104
|
+
provider: "deepseek",
|
|
105
|
+
model,
|
|
106
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
107
|
+
},
|
|
108
|
+
...(usage !== undefined ? { usage } : {}),
|
|
109
|
+
});
|
|
110
|
+
try {
|
|
111
|
+
const client = new openai_1.default({
|
|
112
|
+
apiKey: config.apiKey,
|
|
113
|
+
baseURL: DEEPSEEK_BASE_URL,
|
|
114
|
+
timeout: req.timeoutMs,
|
|
115
|
+
});
|
|
116
|
+
const params = buildDeepSeekParams(model, req);
|
|
117
|
+
const dispatchedAt = Date.now();
|
|
118
|
+
const stream = await client.chat.completions.create(params);
|
|
119
|
+
let text = "";
|
|
120
|
+
let promptTokens = 0;
|
|
121
|
+
let completionTokens = 0;
|
|
122
|
+
let cachedTokens = 0;
|
|
123
|
+
let finishReason = null;
|
|
124
|
+
// TTFB (Phase 4 WS3): first streamed chunk = first body byte.
|
|
125
|
+
let ttfbMs;
|
|
126
|
+
const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
|
|
127
|
+
// Only delta.content is accumulated — a reasoner's reasoning_content
|
|
128
|
+
// (chain-of-thought) must never leak into the JSON buffer (ported).
|
|
129
|
+
for await (const chunk of stream) {
|
|
130
|
+
if (ttfbMs === undefined)
|
|
131
|
+
ttfbMs = Date.now() - dispatchedAt;
|
|
132
|
+
const choice = chunk.choices[0];
|
|
133
|
+
if (choice?.delta?.content)
|
|
134
|
+
text += choice.delta.content;
|
|
135
|
+
toolCallAcc.push(choice?.delta?.tool_calls);
|
|
136
|
+
if (choice?.finish_reason)
|
|
137
|
+
finishReason = choice.finish_reason;
|
|
138
|
+
if (chunk.usage) {
|
|
139
|
+
promptTokens = chunk.usage.prompt_tokens ?? 0;
|
|
140
|
+
completionTokens = chunk.usage.completion_tokens ?? 0;
|
|
141
|
+
// DeepSeek's automatic prefix cache: tokens billed ~10x cheaper.
|
|
142
|
+
cachedTokens = chunk.usage.prompt_cache_hit_tokens ?? 0;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// DeepSeek has no service tiers — served is always standard.
|
|
146
|
+
const usage = {
|
|
147
|
+
tokensIn: promptTokens,
|
|
148
|
+
tokensOut: completionTokens,
|
|
149
|
+
tokensCached: cachedTokens,
|
|
150
|
+
servedTier: "standard",
|
|
151
|
+
...(ttfbMs !== undefined ? { ttfbMs } : {}),
|
|
152
|
+
};
|
|
153
|
+
// Tool-call turn (spec §4.4): surface normalized calls, skip content guards.
|
|
154
|
+
const toolCalls = toolCallAcc.finalize();
|
|
155
|
+
if (toolCalls !== undefined) {
|
|
156
|
+
return { ok: true, text, usage, toolCalls };
|
|
157
|
+
}
|
|
158
|
+
if (text.trim().length === 0) {
|
|
159
|
+
return fail("content_invalid", `empty response from DeepSeek (finish_reason=${finishReason ?? "none"})`, undefined, usage);
|
|
160
|
+
}
|
|
161
|
+
if (finishReason === "length" && req.outputSchema !== null) {
|
|
162
|
+
return fail("content_invalid", "DeepSeek JSON output truncated (finish_reason=length)", "raise maxOutputTokens for this route", usage);
|
|
163
|
+
}
|
|
164
|
+
return { ok: true, text, usage };
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
168
|
+
const { cls, fixHint } = classifyDeepSeekFailure(message);
|
|
169
|
+
return {
|
|
170
|
+
ok: false,
|
|
171
|
+
failure: {
|
|
172
|
+
class: cls,
|
|
173
|
+
message,
|
|
174
|
+
provider: "deepseek",
|
|
175
|
+
model,
|
|
176
|
+
cause: error,
|
|
177
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
async *stream(req) {
|
|
183
|
+
const model = req.candidate.model;
|
|
184
|
+
try {
|
|
185
|
+
const client = new openai_1.default({ apiKey: config.apiKey, baseURL: DEEPSEEK_BASE_URL, timeout: req.timeoutMs });
|
|
186
|
+
const params = buildDeepSeekParams(model, req);
|
|
187
|
+
const dispatchedAt = Date.now();
|
|
188
|
+
const stream = await client.chat.completions.create(params);
|
|
189
|
+
// DeepSeek: cached tokens surface as prompt_cache_hit_tokens; no tiers.
|
|
190
|
+
yield* (0, openai_stream_1.streamOpenAIDialect)(stream, req, dispatchedAt, {
|
|
191
|
+
provider: "deepseek",
|
|
192
|
+
cachedTokenSource: "cache_hit",
|
|
193
|
+
mapServedTier: () => "standard",
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
198
|
+
const { cls, fixHint } = classifyDeepSeekFailure(message);
|
|
199
|
+
yield {
|
|
200
|
+
kind: "final",
|
|
201
|
+
result: {
|
|
202
|
+
ok: false,
|
|
203
|
+
failure: {
|
|
204
|
+
class: cls,
|
|
205
|
+
message,
|
|
206
|
+
provider: "deepseek",
|
|
207
|
+
model,
|
|
208
|
+
cause: error,
|
|
209
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|