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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic openai-compatible adapter — Phase 4 addendum A1
|
|
3
|
+
* (provider-coverage-plan §1: "the DeepSeek adapter is its
|
|
4
|
+
* parameterization"). One adapter covers every OpenAI-dialect host; what
|
|
5
|
+
* varies is INJECTED: base URL, auth key, model-id shaping, and — the
|
|
6
|
+
* doctrine part — the per-model capability profile READ FROM THE REGISTRY.
|
|
7
|
+
* Speaking the dialect proves nothing: strict schema enforcement, caching,
|
|
8
|
+
* grounding are all probe-established facts, never dialect assumptions.
|
|
9
|
+
*
|
|
10
|
+
* Host quirks referenced from LiteLLM's per-provider transformation modules
|
|
11
|
+
* (vendor/litellm-upstream/litellm/llms/{deepinfra,fireworks_ai}/):
|
|
12
|
+
* DeepInfra base URL https://api.deepinfra.com/v1/openai (standard Bearer,
|
|
13
|
+
* OpenAI params incl. response_format); Fireworks base URL
|
|
14
|
+
* https://api.fireworks.ai/inference/v1 with model ids on the wire as
|
|
15
|
+
* accounts/fireworks/models/<short>.
|
|
16
|
+
* Portions derived from LiteLLM (https://github.com/BerriAI/litellm),
|
|
17
|
+
* Copyright (c) 2023 Berri AI, MIT License — retained per
|
|
18
|
+
* litellm-vendoring-strategy.md.
|
|
19
|
+
*/
|
|
20
|
+
import type { CapabilityFlag, ProviderAdapter, ProviderId } from "../types/provider";
|
|
21
|
+
import type { ClassifiedFailure, ShapingInput } from "./gemini";
|
|
22
|
+
import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
|
|
23
|
+
/** Fireworks serves models at accounts/fireworks/models/<short> — routes
|
|
24
|
+
* declare the short name; the wire gets the full path (LiteLLM
|
|
25
|
+
* fireworks_ai transformation, harvested). */
|
|
26
|
+
export declare function shapeFireworksModelId(model: string): string;
|
|
27
|
+
export interface OpenAICompatHost {
|
|
28
|
+
readonly baseUrl: string;
|
|
29
|
+
readonly shapeModelId?: (model: string) => string;
|
|
30
|
+
}
|
|
31
|
+
/** The researched Tier-2 hosts (provider-coverage-plan §2, architect pick
|
|
32
|
+
* 2026-08-02): DeepInfra (widest open catalog, lowest price) + Fireworks
|
|
33
|
+
* (SOC 2/HIPAA reliability counterweight). Same weights on both on purpose
|
|
34
|
+
* — host-level conformance/latency/price deltas become registry facts. */
|
|
35
|
+
export declare const OPENAI_COMPAT_HOSTS: Readonly<Record<"deepinfra" | "fireworks", OpenAICompatHost>>;
|
|
36
|
+
export declare function classifyCompatFailure(message: string, host: string): ClassifiedFailure;
|
|
37
|
+
interface ChatMessage {
|
|
38
|
+
readonly role: "system" | "user";
|
|
39
|
+
readonly content: string;
|
|
40
|
+
}
|
|
41
|
+
export interface OpenAICompatShapedParams {
|
|
42
|
+
readonly model: string;
|
|
43
|
+
readonly max_tokens: number;
|
|
44
|
+
readonly messages: readonly ChatMessage[];
|
|
45
|
+
readonly stream: true;
|
|
46
|
+
readonly stream_options: {
|
|
47
|
+
readonly include_usage: true;
|
|
48
|
+
};
|
|
49
|
+
/** CE-6 declared sampling — present only when the route/raw asks for them. */
|
|
50
|
+
readonly temperature?: number;
|
|
51
|
+
readonly top_p?: number;
|
|
52
|
+
readonly response_format?: {
|
|
53
|
+
readonly type: "json_object";
|
|
54
|
+
} | {
|
|
55
|
+
readonly type: "json_schema";
|
|
56
|
+
readonly json_schema: {
|
|
57
|
+
readonly name: string;
|
|
58
|
+
readonly strict: true;
|
|
59
|
+
readonly schema: object;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
readonly tools?: readonly OpenAIWireTool[];
|
|
63
|
+
readonly tool_choice?: OpenAIWireToolChoice;
|
|
64
|
+
}
|
|
65
|
+
/** Pure request shaping. The PROFILE decides the wire shape: strict
|
|
66
|
+
* json_schema only when the registry granted structured_native for this
|
|
67
|
+
* model; else json_object (ajv still arbitrates above). */
|
|
68
|
+
export declare function buildOpenAICompatParams(model: string, req: ShapingInput, profileFlags: ReadonlySet<CapabilityFlag>): OpenAICompatShapedParams;
|
|
69
|
+
export interface OpenAICompatAdapterConfig {
|
|
70
|
+
readonly providerId: ProviderId;
|
|
71
|
+
readonly baseUrl: string;
|
|
72
|
+
readonly apiKey: string;
|
|
73
|
+
readonly shapeModelId?: (model: string) => string;
|
|
74
|
+
/** Registry-fed per-model capability flags — the ONLY capability source.
|
|
75
|
+
* The conservative dialect baseline is json_mode alone. */
|
|
76
|
+
readonly capabilityProfile: (model: string) => ReadonlySet<CapabilityFlag>;
|
|
77
|
+
}
|
|
78
|
+
export declare function createOpenAICompatAdapter(config: OpenAICompatAdapterConfig): ProviderAdapter;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=openai-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compat.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EACf,UAAU,EACX,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;AAQhG;;8CAE8C;AAC9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAED;;;0EAG0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW,EAAE,gBAAgB,CAAC,CAG7F,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAiBtF;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,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,EACrB;QAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,GAChC;QACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACjG,CAAC;IACN,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAOD;;2DAE2D;AAC3D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,EACjB,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,GACxC,wBAAwB,CAqC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD;+DAC2D;IAC3D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC;CAC5E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB,GAAG,eAAe,CAwK5F"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic openai-compatible adapter — Phase 4 addendum A1
|
|
4
|
+
* (provider-coverage-plan §1: "the DeepSeek adapter is its
|
|
5
|
+
* parameterization"). One adapter covers every OpenAI-dialect host; what
|
|
6
|
+
* varies is INJECTED: base URL, auth key, model-id shaping, and — the
|
|
7
|
+
* doctrine part — the per-model capability profile READ FROM THE REGISTRY.
|
|
8
|
+
* Speaking the dialect proves nothing: strict schema enforcement, caching,
|
|
9
|
+
* grounding are all probe-established facts, never dialect assumptions.
|
|
10
|
+
*
|
|
11
|
+
* Host quirks referenced from LiteLLM's per-provider transformation modules
|
|
12
|
+
* (vendor/litellm-upstream/litellm/llms/{deepinfra,fireworks_ai}/):
|
|
13
|
+
* DeepInfra base URL https://api.deepinfra.com/v1/openai (standard Bearer,
|
|
14
|
+
* OpenAI params incl. response_format); Fireworks base URL
|
|
15
|
+
* https://api.fireworks.ai/inference/v1 with model ids on the wire as
|
|
16
|
+
* accounts/fireworks/models/<short>.
|
|
17
|
+
* Portions derived from LiteLLM (https://github.com/BerriAI/litellm),
|
|
18
|
+
* Copyright (c) 2023 Berri AI, MIT License — retained per
|
|
19
|
+
* litellm-vendoring-strategy.md.
|
|
20
|
+
*/
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.OPENAI_COMPAT_HOSTS = void 0;
|
|
26
|
+
exports.shapeFireworksModelId = shapeFireworksModelId;
|
|
27
|
+
exports.classifyCompatFailure = classifyCompatFailure;
|
|
28
|
+
exports.buildOpenAICompatParams = buildOpenAICompatParams;
|
|
29
|
+
exports.createOpenAICompatAdapter = createOpenAICompatAdapter;
|
|
30
|
+
const openai_1 = __importDefault(require("openai"));
|
|
31
|
+
const tool_mapping_1 = require("./tool-mapping");
|
|
32
|
+
const openai_stream_1 = require("./openai-stream");
|
|
33
|
+
const sampling_1 = require("./sampling");
|
|
34
|
+
const DEFAULT_MAX_TOKENS = 32000;
|
|
35
|
+
/** Fireworks serves models at accounts/fireworks/models/<short> — routes
|
|
36
|
+
* declare the short name; the wire gets the full path (LiteLLM
|
|
37
|
+
* fireworks_ai transformation, harvested). */
|
|
38
|
+
function shapeFireworksModelId(model) {
|
|
39
|
+
return model.startsWith("accounts/") ? model : `accounts/fireworks/models/${model}`;
|
|
40
|
+
}
|
|
41
|
+
/** The researched Tier-2 hosts (provider-coverage-plan §2, architect pick
|
|
42
|
+
* 2026-08-02): DeepInfra (widest open catalog, lowest price) + Fireworks
|
|
43
|
+
* (SOC 2/HIPAA reliability counterweight). Same weights on both on purpose
|
|
44
|
+
* — host-level conformance/latency/price deltas become registry facts. */
|
|
45
|
+
exports.OPENAI_COMPAT_HOSTS = {
|
|
46
|
+
deepinfra: { baseUrl: "https://api.deepinfra.com/v1/openai" },
|
|
47
|
+
fireworks: { baseUrl: "https://api.fireworks.ai/inference/v1", shapeModelId: shapeFireworksModelId },
|
|
48
|
+
};
|
|
49
|
+
function classifyCompatFailure(message, host) {
|
|
50
|
+
const msg = message.toLowerCase();
|
|
51
|
+
if (/\b429\b|rate limit|\brate\b/.test(msg))
|
|
52
|
+
return { cls: "capacity_shed" };
|
|
53
|
+
if (/\b50[023]\b|service unavailable|overloaded/.test(msg))
|
|
54
|
+
return { cls: "capacity_shed" };
|
|
55
|
+
if (/timeout|etimedout|abort/.test(msg))
|
|
56
|
+
return { cls: "timeout" };
|
|
57
|
+
if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
|
|
58
|
+
return { cls: "network" };
|
|
59
|
+
if (/\b401\b|\b403\b|api key|unauthorized/.test(msg)) {
|
|
60
|
+
// F2: non-retryable — a dead key never burns backoff retries.
|
|
61
|
+
return { cls: "config_auth", fixHint: `check the ${host} API key configured for this rig` };
|
|
62
|
+
}
|
|
63
|
+
if (/not found|does not exist/.test(msg)) {
|
|
64
|
+
return {
|
|
65
|
+
cls: "network",
|
|
66
|
+
fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return { cls: "network" };
|
|
70
|
+
}
|
|
71
|
+
/** json_object mode 400s on several compat backends when the literal word
|
|
72
|
+
* "JSON" appears nowhere in the prompt (the DeepSeek-family quirk; coached
|
|
73
|
+
* prompts normally guarantee it — this is belt-and-suspenders). */
|
|
74
|
+
const JSON_GUARD = "Respond with a single valid JSON object.";
|
|
75
|
+
/** Pure request shaping. The PROFILE decides the wire shape: strict
|
|
76
|
+
* json_schema only when the registry granted structured_native for this
|
|
77
|
+
* model; else json_object (ajv still arbitrates above). */
|
|
78
|
+
function buildOpenAICompatParams(model, req, profileFlags) {
|
|
79
|
+
const wantJson = req.outputSchema !== null;
|
|
80
|
+
const strict = wantJson && profileFlags.has("structured_native");
|
|
81
|
+
let systemPrompt = req.systemPrompt;
|
|
82
|
+
if (wantJson && !strict && !req.systemPrompt.includes("JSON") && !req.userPrompt.includes("JSON")) {
|
|
83
|
+
systemPrompt = systemPrompt === "" ? JSON_GUARD : `${systemPrompt}\n\n${JSON_GUARD}`;
|
|
84
|
+
}
|
|
85
|
+
const messages = [
|
|
86
|
+
...(systemPrompt !== "" ? [{ role: "system", content: systemPrompt }] : []),
|
|
87
|
+
{ role: "user", content: req.userPrompt },
|
|
88
|
+
];
|
|
89
|
+
return {
|
|
90
|
+
model,
|
|
91
|
+
max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
|
|
92
|
+
messages,
|
|
93
|
+
stream: true,
|
|
94
|
+
stream_options: { include_usage: true },
|
|
95
|
+
...(0, sampling_1.openAISamplingFields)(req),
|
|
96
|
+
...(wantJson
|
|
97
|
+
? strict
|
|
98
|
+
? {
|
|
99
|
+
response_format: {
|
|
100
|
+
type: "json_schema",
|
|
101
|
+
json_schema: { name: "output", strict: true, schema: req.outputSchema },
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
: { response_format: { type: "json_object" } }
|
|
105
|
+
: {}),
|
|
106
|
+
...(req.tools !== undefined && req.tools.length > 0
|
|
107
|
+
? {
|
|
108
|
+
tools: (0, tool_mapping_1.toOpenAITools)(req.tools),
|
|
109
|
+
...((0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) !== undefined
|
|
110
|
+
? { tool_choice: (0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) }
|
|
111
|
+
: {}),
|
|
112
|
+
}
|
|
113
|
+
: {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function createOpenAICompatAdapter(config) {
|
|
117
|
+
const shapeModel = config.shapeModelId ?? ((m) => m);
|
|
118
|
+
return {
|
|
119
|
+
id: config.providerId,
|
|
120
|
+
supports(feature, model) {
|
|
121
|
+
return config.capabilityProfile(model).has(feature);
|
|
122
|
+
},
|
|
123
|
+
supportsTools: () => true,
|
|
124
|
+
async call(req) {
|
|
125
|
+
const model = req.candidate.model;
|
|
126
|
+
const fail = (cls, message, fixHint, usage) => ({
|
|
127
|
+
ok: false,
|
|
128
|
+
failure: {
|
|
129
|
+
class: cls,
|
|
130
|
+
message,
|
|
131
|
+
provider: config.providerId,
|
|
132
|
+
model,
|
|
133
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
134
|
+
},
|
|
135
|
+
...(usage !== undefined ? { usage } : {}),
|
|
136
|
+
});
|
|
137
|
+
try {
|
|
138
|
+
const client = new openai_1.default({
|
|
139
|
+
apiKey: config.apiKey,
|
|
140
|
+
baseURL: config.baseUrl,
|
|
141
|
+
timeout: req.timeoutMs,
|
|
142
|
+
});
|
|
143
|
+
const params = buildOpenAICompatParams(shapeModel(model), req, config.capabilityProfile(model));
|
|
144
|
+
const dispatchedAt = Date.now();
|
|
145
|
+
const stream = await client.chat.completions.create(params);
|
|
146
|
+
let text = "";
|
|
147
|
+
let promptTokens = 0;
|
|
148
|
+
let completionTokens = 0;
|
|
149
|
+
let cachedTokens = 0;
|
|
150
|
+
let cacheWriteTokens = 0;
|
|
151
|
+
let finishReason = null;
|
|
152
|
+
// TTFB (Phase 4 WS3): first streamed chunk = first body byte.
|
|
153
|
+
let ttfbMs;
|
|
154
|
+
const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
|
|
155
|
+
for await (const chunk of stream) {
|
|
156
|
+
if (ttfbMs === undefined)
|
|
157
|
+
ttfbMs = Date.now() - dispatchedAt;
|
|
158
|
+
const choice = chunk.choices[0];
|
|
159
|
+
if (choice?.delta?.content)
|
|
160
|
+
text += choice.delta.content;
|
|
161
|
+
toolCallAcc.push(choice?.delta?.tool_calls);
|
|
162
|
+
if (choice?.finish_reason)
|
|
163
|
+
finishReason = choice.finish_reason;
|
|
164
|
+
if (chunk.usage) {
|
|
165
|
+
promptTokens = chunk.usage.prompt_tokens ?? 0;
|
|
166
|
+
completionTokens = chunk.usage.completion_tokens ?? 0;
|
|
167
|
+
cachedTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;
|
|
168
|
+
cacheWriteTokens = chunk.usage.input_tokens_details?.cache_write_tokens ?? 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Hosts have no service tiers in this dialect — standard, always.
|
|
172
|
+
// prompt_tokens already INCLUDES cached → tokensIn is subset-correct.
|
|
173
|
+
const usage = {
|
|
174
|
+
tokensIn: promptTokens,
|
|
175
|
+
tokensOut: completionTokens,
|
|
176
|
+
tokensCached: cachedTokens,
|
|
177
|
+
tokensCacheWrite: cacheWriteTokens,
|
|
178
|
+
servedTier: "standard",
|
|
179
|
+
...(ttfbMs !== undefined ? { ttfbMs } : {}),
|
|
180
|
+
};
|
|
181
|
+
// Tool-call turn (spec §4.4): surface normalized calls, skip content guards.
|
|
182
|
+
const toolCalls = toolCallAcc.finalize();
|
|
183
|
+
if (toolCalls !== undefined) {
|
|
184
|
+
return { ok: true, text, usage, toolCalls };
|
|
185
|
+
}
|
|
186
|
+
if (text.trim().length === 0) {
|
|
187
|
+
return fail("content_invalid", `empty response from ${config.providerId} (finish_reason=${finishReason ?? "none"})`, undefined, usage);
|
|
188
|
+
}
|
|
189
|
+
if (finishReason === "length" && req.outputSchema !== null) {
|
|
190
|
+
return fail("content_invalid", `${config.providerId} JSON output truncated (finish_reason=length)`, "raise maxOutputTokens for this route", usage);
|
|
191
|
+
}
|
|
192
|
+
return { ok: true, text, usage };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
196
|
+
const { cls, fixHint } = classifyCompatFailure(message, config.providerId);
|
|
197
|
+
return {
|
|
198
|
+
ok: false,
|
|
199
|
+
failure: {
|
|
200
|
+
class: cls,
|
|
201
|
+
message,
|
|
202
|
+
provider: config.providerId,
|
|
203
|
+
model,
|
|
204
|
+
cause: error,
|
|
205
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
async *stream(req) {
|
|
211
|
+
const model = req.candidate.model;
|
|
212
|
+
try {
|
|
213
|
+
const client = new openai_1.default({ apiKey: config.apiKey, baseURL: config.baseUrl, timeout: req.timeoutMs });
|
|
214
|
+
const params = buildOpenAICompatParams(shapeModel(model), req, config.capabilityProfile(model));
|
|
215
|
+
const dispatchedAt = Date.now();
|
|
216
|
+
const stream = await client.chat.completions.create(params);
|
|
217
|
+
// Compat hosts have no service tiers in this dialect — standard, always.
|
|
218
|
+
yield* (0, openai_stream_1.streamOpenAIDialect)(stream, req, dispatchedAt, {
|
|
219
|
+
provider: config.providerId,
|
|
220
|
+
cachedTokenSource: "details",
|
|
221
|
+
mapServedTier: () => "standard",
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
226
|
+
const { cls, fixHint } = classifyCompatFailure(message, config.providerId);
|
|
227
|
+
yield {
|
|
228
|
+
kind: "final",
|
|
229
|
+
result: {
|
|
230
|
+
ok: false,
|
|
231
|
+
failure: {
|
|
232
|
+
class: cls,
|
|
233
|
+
message,
|
|
234
|
+
provider: config.providerId,
|
|
235
|
+
model,
|
|
236
|
+
cause: error,
|
|
237
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared streaming loop for the OpenAI-dialect adapters (G-1/G-5 Phase A,
|
|
3
|
+
* spec §4.3). The openai / grok / deepseek / deepinfra / fireworks adapters all
|
|
4
|
+
* speak `client.chat.completions.create({ stream: true })`; this is the one
|
|
5
|
+
* place that drains such a stream into `AdapterStreamEvent`s — raw text deltas
|
|
6
|
+
* as they arrive, then a single terminal `final` carrying the same
|
|
7
|
+
* `AdapterResult` the adapter's buffered `call()` would return.
|
|
8
|
+
*
|
|
9
|
+
* ADDITIVE: `call()` is untouched. This powers the OPTIONAL `stream()` method
|
|
10
|
+
* the run loop uses only when a delta sink is wired (`rig.runStream`); every
|
|
11
|
+
* other path is byte-for-byte the pre-Phase-A behavior. Providers without a
|
|
12
|
+
* `stream()` (anthropic events / gemini non-streaming) fall back to buffered
|
|
13
|
+
* dispatch, which is the spec's sanctioned `buffered` mode.
|
|
14
|
+
*/
|
|
15
|
+
import type { AdapterRequest, AdapterStreamEvent, ProviderId, ServiceTier } from "../types/provider";
|
|
16
|
+
import type { OpenAIToolCallDelta } from "./tool-mapping";
|
|
17
|
+
/** The permissive chunk shape common to the OpenAI-dialect hosts. */
|
|
18
|
+
export interface OpenAIDialectChunk {
|
|
19
|
+
readonly service_tier?: string;
|
|
20
|
+
readonly choices: Array<{
|
|
21
|
+
readonly delta?: {
|
|
22
|
+
readonly content?: string | null;
|
|
23
|
+
readonly refusal?: string | null;
|
|
24
|
+
readonly tool_calls?: readonly OpenAIToolCallDelta[];
|
|
25
|
+
};
|
|
26
|
+
readonly finish_reason?: string | null;
|
|
27
|
+
}>;
|
|
28
|
+
readonly usage?: {
|
|
29
|
+
readonly prompt_tokens?: number;
|
|
30
|
+
readonly completion_tokens?: number;
|
|
31
|
+
readonly prompt_tokens_details?: {
|
|
32
|
+
readonly cached_tokens?: number;
|
|
33
|
+
};
|
|
34
|
+
readonly prompt_cache_hit_tokens?: number;
|
|
35
|
+
/** Cache-WRITE tokens — GPT-5.6+ bills explicit writes at 1.25× and reports
|
|
36
|
+
* them here (spec §2 table). Absent on ≤5.5 (writes free) and every non-
|
|
37
|
+
* openai dialect host, so cache-write is 0 there. */
|
|
38
|
+
readonly input_tokens_details?: {
|
|
39
|
+
readonly cache_write_tokens?: number;
|
|
40
|
+
};
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
|
43
|
+
export interface OpenAIStreamConfig {
|
|
44
|
+
readonly provider: ProviderId;
|
|
45
|
+
/** Where cached-token counts live in this dialect's usage block. */
|
|
46
|
+
readonly cachedTokenSource: "details" | "cache_hit";
|
|
47
|
+
/** Served-tier resolver (openai maps flex/priority; the rest are standard). */
|
|
48
|
+
readonly mapServedTier: (raw: string | null, requested: ServiceTier) => ServiceTier;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Drain an OpenAI-dialect completion stream into `AdapterStreamEvent`s. Emits a
|
|
52
|
+
* `delta` per content token, then exactly one `final`. The final result mirrors
|
|
53
|
+
* `call()`'s terminal decisions for the shared dialect: refusal → fail;
|
|
54
|
+
* tool-call turn → ok + normalized calls; empty → content_invalid; a
|
|
55
|
+
* schema-route truncation (`finish_reason=length`) → content_invalid.
|
|
56
|
+
*/
|
|
57
|
+
export declare function streamOpenAIDialect(chunks: AsyncIterable<OpenAIDialectChunk>, req: AdapterRequest, dispatchedAt: number, cfg: OpenAIStreamConfig): AsyncGenerator<AdapterStreamEvent>;
|
|
58
|
+
//# sourceMappingURL=openai-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-stream.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,UAAU,EACV,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;YACf,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;SACtD,CAAC;QACF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;YAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;QAC1C;;6DAEqD;QACrD,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1E,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,GAAG,WAAW,CAAC;IACpD,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,KAAK,WAAW,CAAC;CACrF;AAED;;;;;;GAMG;AACH,wBAAuB,mBAAmB,CACxC,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,EACzC,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,kBAAkB,GACtB,cAAc,CAAC,kBAAkB,CAAC,CAqGpC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared streaming loop for the OpenAI-dialect adapters (G-1/G-5 Phase A,
|
|
4
|
+
* spec §4.3). The openai / grok / deepseek / deepinfra / fireworks adapters all
|
|
5
|
+
* speak `client.chat.completions.create({ stream: true })`; this is the one
|
|
6
|
+
* place that drains such a stream into `AdapterStreamEvent`s — raw text deltas
|
|
7
|
+
* as they arrive, then a single terminal `final` carrying the same
|
|
8
|
+
* `AdapterResult` the adapter's buffered `call()` would return.
|
|
9
|
+
*
|
|
10
|
+
* ADDITIVE: `call()` is untouched. This powers the OPTIONAL `stream()` method
|
|
11
|
+
* the run loop uses only when a delta sink is wired (`rig.runStream`); every
|
|
12
|
+
* other path is byte-for-byte the pre-Phase-A behavior. Providers without a
|
|
13
|
+
* `stream()` (anthropic events / gemini non-streaming) fall back to buffered
|
|
14
|
+
* dispatch, which is the spec's sanctioned `buffered` mode.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.streamOpenAIDialect = streamOpenAIDialect;
|
|
18
|
+
const tool_mapping_1 = require("./tool-mapping");
|
|
19
|
+
/**
|
|
20
|
+
* Drain an OpenAI-dialect completion stream into `AdapterStreamEvent`s. Emits a
|
|
21
|
+
* `delta` per content token, then exactly one `final`. The final result mirrors
|
|
22
|
+
* `call()`'s terminal decisions for the shared dialect: refusal → fail;
|
|
23
|
+
* tool-call turn → ok + normalized calls; empty → content_invalid; a
|
|
24
|
+
* schema-route truncation (`finish_reason=length`) → content_invalid.
|
|
25
|
+
*/
|
|
26
|
+
async function* streamOpenAIDialect(chunks, req, dispatchedAt, cfg) {
|
|
27
|
+
let ttfbMs;
|
|
28
|
+
let text = "";
|
|
29
|
+
let refusalText = "";
|
|
30
|
+
const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
|
|
31
|
+
let promptTokens = 0;
|
|
32
|
+
let completionTokens = 0;
|
|
33
|
+
let cachedTokens = 0;
|
|
34
|
+
let cacheWriteTokens = 0;
|
|
35
|
+
let responseTier = null;
|
|
36
|
+
let finishReason = null;
|
|
37
|
+
for await (const chunk of chunks) {
|
|
38
|
+
if (ttfbMs === undefined)
|
|
39
|
+
ttfbMs = Date.now() - dispatchedAt;
|
|
40
|
+
if (responseTier === null && chunk.service_tier !== undefined)
|
|
41
|
+
responseTier = chunk.service_tier;
|
|
42
|
+
const choice = chunk.choices[0];
|
|
43
|
+
const content = choice?.delta?.content;
|
|
44
|
+
if (content) {
|
|
45
|
+
text += content;
|
|
46
|
+
yield { kind: "delta", text: content };
|
|
47
|
+
}
|
|
48
|
+
if (typeof choice?.delta?.refusal === "string" && choice.delta.refusal.length > 0) {
|
|
49
|
+
refusalText += choice.delta.refusal;
|
|
50
|
+
}
|
|
51
|
+
toolCallAcc.push(choice?.delta?.tool_calls);
|
|
52
|
+
if (choice?.finish_reason)
|
|
53
|
+
finishReason = choice.finish_reason;
|
|
54
|
+
if (chunk.usage) {
|
|
55
|
+
promptTokens = chunk.usage.prompt_tokens ?? 0;
|
|
56
|
+
completionTokens = chunk.usage.completion_tokens ?? 0;
|
|
57
|
+
cachedTokens =
|
|
58
|
+
cfg.cachedTokenSource === "cache_hit"
|
|
59
|
+
? chunk.usage.prompt_cache_hit_tokens ?? 0
|
|
60
|
+
: chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;
|
|
61
|
+
// Cache-write (GPT-5.6+): 0 on every dialect that does not report it.
|
|
62
|
+
cacheWriteTokens = chunk.usage.input_tokens_details?.cache_write_tokens ?? 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// prompt_tokens already INCLUDES cached (and any write) on the OpenAI dialect,
|
|
66
|
+
// so tokensIn = promptTokens honors the subset invariant as-is. There is no 1h
|
|
67
|
+
// TTL tier on this dialect (OpenAI 5.6 writes are a single 30m tier) → 1h = 0.
|
|
68
|
+
const usage = {
|
|
69
|
+
tokensIn: promptTokens,
|
|
70
|
+
tokensOut: completionTokens,
|
|
71
|
+
tokensCached: cachedTokens,
|
|
72
|
+
tokensCacheWrite: cacheWriteTokens,
|
|
73
|
+
servedTier: cfg.mapServedTier(responseTier, req.requestedTier),
|
|
74
|
+
...(ttfbMs !== undefined ? { ttfbMs } : {}),
|
|
75
|
+
};
|
|
76
|
+
const fail = (message, fixHint) => ({
|
|
77
|
+
kind: "final",
|
|
78
|
+
result: {
|
|
79
|
+
ok: false,
|
|
80
|
+
failure: {
|
|
81
|
+
class: "content_invalid",
|
|
82
|
+
message,
|
|
83
|
+
provider: cfg.provider,
|
|
84
|
+
model: req.candidate.model,
|
|
85
|
+
...(fixHint !== undefined ? { fixHint } : {}),
|
|
86
|
+
},
|
|
87
|
+
usage,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
if (refusalText.length > 0) {
|
|
91
|
+
yield {
|
|
92
|
+
kind: "final",
|
|
93
|
+
result: {
|
|
94
|
+
ok: false,
|
|
95
|
+
failure: {
|
|
96
|
+
class: "refusal",
|
|
97
|
+
message: `${cfg.provider} refused output: ${refusalText.slice(0, 200)}`,
|
|
98
|
+
provider: cfg.provider,
|
|
99
|
+
model: req.candidate.model,
|
|
100
|
+
},
|
|
101
|
+
usage,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const toolCalls = toolCallAcc.finalize();
|
|
107
|
+
if (toolCalls !== undefined) {
|
|
108
|
+
yield { kind: "final", result: { ok: true, text, usage, toolCalls } };
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (text.trim().length === 0) {
|
|
112
|
+
yield fail(`empty response from ${cfg.provider} (finish_reason=${finishReason ?? "none"})`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (finishReason === "length" && req.outputSchema !== null) {
|
|
116
|
+
yield fail(`${cfg.provider} output truncated (finish_reason=length)`, "raise maxOutputTokens for this route");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
yield { kind: "final", result: { ok: true, text, usage } };
|
|
120
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI ProviderAdapter — plan step 5.
|
|
3
|
+
* Transformation logic ported from apps/api/src/services/openai-provider.ts:
|
|
4
|
+
* response_format json_schema strict, service tiers (flex allowlist + served
|
|
5
|
+
* tier from the stream), prompt-cache key + retention passthrough, streaming
|
|
6
|
+
* with usage, structured-output refusal detection, suspicious-short guard.
|
|
7
|
+
* NOT ported: logging, pricing tables, env reads, the analyst-persona system
|
|
8
|
+
* prompt (route templates own prompt content).
|
|
9
|
+
*
|
|
10
|
+
* Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
|
|
11
|
+
* Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
|
|
12
|
+
* openai transformation logic is consulted during the port.
|
|
13
|
+
*/
|
|
14
|
+
import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
|
|
15
|
+
import type { ClassifiedFailure, ShapingInput } from "./gemini";
|
|
16
|
+
import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
|
|
17
|
+
export interface OpenAIAdapterConfig {
|
|
18
|
+
readonly apiKey: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function isModelFlexEligible(modelName: string): boolean;
|
|
21
|
+
export declare function openaiSupports(feature: CapabilityFlag, model: string): boolean;
|
|
22
|
+
export declare function classifyOpenAIFailure(message: string): ClassifiedFailure;
|
|
23
|
+
interface ChatMessage {
|
|
24
|
+
readonly role: "system" | "user";
|
|
25
|
+
readonly content: string;
|
|
26
|
+
}
|
|
27
|
+
export interface OpenAIShapedParams {
|
|
28
|
+
readonly model: string;
|
|
29
|
+
readonly max_completion_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 service_tier?: "flex" | "priority";
|
|
39
|
+
readonly prompt_cache_key?: string;
|
|
40
|
+
readonly prompt_cache_retention?: "24h";
|
|
41
|
+
readonly response_format?: {
|
|
42
|
+
readonly type: "json_schema";
|
|
43
|
+
readonly json_schema: {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly schema: object;
|
|
46
|
+
readonly strict: true;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
readonly tools?: readonly OpenAIWireTool[];
|
|
50
|
+
readonly tool_choice?: OpenAIWireToolChoice;
|
|
51
|
+
}
|
|
52
|
+
export declare function buildOpenAIParams(model: string, req: ShapingInput): OpenAIShapedParams;
|
|
53
|
+
export declare function createOpenAIAdapter(config: OpenAIAdapterConfig): ProviderAdapter;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAEhB,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,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAMD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAe9E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAiBxE;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,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,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;SAAE,CAAC;KACjG,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,kBAAkB,CA6CtF;AAcD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,eAAe,CAwMhF"}
|