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,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Optimization coverage, rungs 0–1 — Phase 4 WS2. Pure aggregation over
|
|
4
|
+
* telemetry + feedback rows; no store access, so the console, the server
|
|
5
|
+
* and tests all compute identically.
|
|
6
|
+
*
|
|
7
|
+
* Rungs (the eval ladder's bottom, per plan §4):
|
|
8
|
+
* rung 0 — implicit signals only: conformance / repair / refusal rates
|
|
9
|
+
* from telemetry. Enough confidence for schema-mechanical swap
|
|
10
|
+
* proposals (the bake-off gate).
|
|
11
|
+
* rung 1 — ≥ RUNG1_MIN_FEEDBACK human/agent verdicts attached: prose
|
|
12
|
+
* routes (no schema to conform to) gain proposal confidence.
|
|
13
|
+
* rung 2+ — judges; Phase 5+, out of scope by decision.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RUNG1_MIN_FEEDBACK = void 0;
|
|
17
|
+
exports.computeCoverage = computeCoverage;
|
|
18
|
+
exports.RUNG1_MIN_FEEDBACK = 10;
|
|
19
|
+
/** Attribution: a feedback row joins a route via its inference id, or via
|
|
20
|
+
* its episode key matching a row's run_id tag. Unmatched feedback attaches
|
|
21
|
+
* to nothing (never guessed). */
|
|
22
|
+
function computeCoverage(rows, feedback) {
|
|
23
|
+
const routeByInferenceId = new Map();
|
|
24
|
+
const routeByEpisode = new Map();
|
|
25
|
+
const byRoute = new Map();
|
|
26
|
+
for (const row of rows) {
|
|
27
|
+
// Exclude replay/shadow traffic (same convention as the console /routes
|
|
28
|
+
// view): bake-off replays are candidate-variant experiments, not the
|
|
29
|
+
// route's production serving — counting them skews conformance/repair
|
|
30
|
+
// rates with losing variants that never served a real request.
|
|
31
|
+
let replayTagged = false;
|
|
32
|
+
try {
|
|
33
|
+
replayTagged = JSON.parse(row.tagsJson).replay !== undefined;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
replayTagged = false;
|
|
37
|
+
}
|
|
38
|
+
if (replayTagged)
|
|
39
|
+
continue;
|
|
40
|
+
const agg = byRoute.get(row.route) ?? {
|
|
41
|
+
samples: 0,
|
|
42
|
+
conform: 0,
|
|
43
|
+
repaired: 0,
|
|
44
|
+
refused: 0,
|
|
45
|
+
feedback: 0,
|
|
46
|
+
};
|
|
47
|
+
agg.samples += 1;
|
|
48
|
+
if (row.failureClass === null)
|
|
49
|
+
agg.conform += 1;
|
|
50
|
+
if (row.repairedBy !== null)
|
|
51
|
+
agg.repaired += 1;
|
|
52
|
+
if (row.failureClass === "refusal")
|
|
53
|
+
agg.refused += 1;
|
|
54
|
+
byRoute.set(row.route, agg);
|
|
55
|
+
routeByInferenceId.set(row.id, row.route);
|
|
56
|
+
try {
|
|
57
|
+
const tags = JSON.parse(row.tagsJson);
|
|
58
|
+
if (typeof tags.run_id === "string" && tags.run_id !== "") {
|
|
59
|
+
routeByEpisode.set(tags.run_id, row.route);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Unparseable tags never break coverage — the row still counts above.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
for (const f of feedback) {
|
|
67
|
+
const route = (f.inferenceId !== null ? routeByInferenceId.get(f.inferenceId) : undefined) ??
|
|
68
|
+
(f.episodeKey !== null ? routeByEpisode.get(f.episodeKey) : undefined);
|
|
69
|
+
if (route === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
const agg = byRoute.get(route);
|
|
72
|
+
if (agg !== undefined)
|
|
73
|
+
agg.feedback += 1;
|
|
74
|
+
}
|
|
75
|
+
return [...byRoute.entries()]
|
|
76
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
77
|
+
.map(([route, agg]) => {
|
|
78
|
+
const rung = agg.feedback >= exports.RUNG1_MIN_FEEDBACK ? 1 : 0;
|
|
79
|
+
const nextRungUnlock = rung === 0
|
|
80
|
+
? `Attach ${exports.RUNG1_MIN_FEEDBACK - agg.feedback} more rig.feedback() verdicts ` +
|
|
81
|
+
`(${agg.feedback}/${exports.RUNG1_MIN_FEEDBACK}) to reach rung 1 — human-verdict confidence ` +
|
|
82
|
+
"for routes without a schema to conform to."
|
|
83
|
+
: "Rung 2 (LLM judges — value accuracy beyond mechanical conformance) arrives in Phase 5.";
|
|
84
|
+
return {
|
|
85
|
+
route,
|
|
86
|
+
samples: agg.samples,
|
|
87
|
+
conformRate: agg.samples === 0 ? 0 : agg.conform / agg.samples,
|
|
88
|
+
repairRate: agg.samples === 0 ? 0 : agg.repaired / agg.samples,
|
|
89
|
+
refusalRate: agg.samples === 0 ? 0 : agg.refused / agg.samples,
|
|
90
|
+
feedbackCount: agg.feedback,
|
|
91
|
+
rung,
|
|
92
|
+
nextRungUnlock,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rig.feedback() — Phase 4 WS2 (spec: judgment starts accumulating).
|
|
3
|
+
* The SDK surface normalizes a target (inference id or {episode}) + opts
|
|
4
|
+
* into a FeedbackRow; the write is a synchronous local SQLite insert
|
|
5
|
+
* (fire-and-forget from the caller's view — no network, never throws for
|
|
6
|
+
* sink reasons). The Supabase mirror rides the exporter, dual-store style.
|
|
7
|
+
*/
|
|
8
|
+
import type { FeedbackRow } from "../types/telemetry";
|
|
9
|
+
export type FeedbackTarget = string | {
|
|
10
|
+
readonly episode: string;
|
|
11
|
+
};
|
|
12
|
+
export interface FeedbackOpts {
|
|
13
|
+
readonly verdict: "up" | "down";
|
|
14
|
+
/** Optional graded signal in [0, 1]; verdict remains the primary axis. */
|
|
15
|
+
readonly score?: number;
|
|
16
|
+
readonly note?: string;
|
|
17
|
+
/** Who judged: "sdk" (default), a review-agent name, "human", … */
|
|
18
|
+
readonly source?: string;
|
|
19
|
+
/**
|
|
20
|
+
* The org this verdict belongs to (Phase 6 WS2). Omit from application code
|
|
21
|
+
* — a rig has one org and the exporter knows it.
|
|
22
|
+
*
|
|
23
|
+
* Supplied by modelrig-server, and only ever with an org it has ALREADY
|
|
24
|
+
* authorized the caller into: a value that arrived in a request body and was
|
|
25
|
+
* passed through here would be a tenant chosen by the client (T3). Setting
|
|
26
|
+
* it is what lets one hosted server hold verdicts for many orgs without
|
|
27
|
+
* misfiling any of them (QA-P6-010).
|
|
28
|
+
*/
|
|
29
|
+
readonly orgId?: string;
|
|
30
|
+
/** Authenticated user who recorded it. Same provenance rule as `orgId`:
|
|
31
|
+
* resolved from a session, never read off a request body. */
|
|
32
|
+
readonly createdBy?: string | null;
|
|
33
|
+
}
|
|
34
|
+
export declare function buildFeedbackRow(target: FeedbackTarget, opts: FeedbackOpts): FeedbackRow;
|
|
35
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/feedback/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;iEAC6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,CA0BxF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* rig.feedback() — Phase 4 WS2 (spec: judgment starts accumulating).
|
|
4
|
+
* The SDK surface normalizes a target (inference id or {episode}) + opts
|
|
5
|
+
* into a FeedbackRow; the write is a synchronous local SQLite insert
|
|
6
|
+
* (fire-and-forget from the caller's view — no network, never throws for
|
|
7
|
+
* sink reasons). The Supabase mirror rides the exporter, dual-store style.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.buildFeedbackRow = buildFeedbackRow;
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
function buildFeedbackRow(target, opts) {
|
|
13
|
+
let inferenceId = null;
|
|
14
|
+
let episodeKey = null;
|
|
15
|
+
if (typeof target === "string") {
|
|
16
|
+
inferenceId = target;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
episodeKey = target.episode;
|
|
20
|
+
}
|
|
21
|
+
if ((inferenceId === null || inferenceId === "") && (episodeKey === null || episodeKey === "")) {
|
|
22
|
+
throw new Error("feedback target must be a non-empty inference id or {episode}");
|
|
23
|
+
}
|
|
24
|
+
if (opts.score !== undefined && (!Number.isFinite(opts.score) || opts.score < 0 || opts.score > 1)) {
|
|
25
|
+
throw new Error(`feedback score must be in [0, 1], got ${opts.score}`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
29
|
+
ts: new Date().toISOString(),
|
|
30
|
+
inferenceId,
|
|
31
|
+
episodeKey,
|
|
32
|
+
verdict: opts.verdict,
|
|
33
|
+
score: opts.score ?? null,
|
|
34
|
+
note: opts.note ?? null,
|
|
35
|
+
source: opts.source ?? "sdk",
|
|
36
|
+
orgId: opts.orgId !== undefined && opts.orgId !== "" ? opts.orgId : null,
|
|
37
|
+
createdBy: opts.createdBy ?? null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The HTTP gateway wire contract — G-1/G-5 (http-gateway spec §3, §4.3, §4.4).
|
|
3
|
+
*
|
|
4
|
+
* ONE definition of what a `/v1/chat/completions` request, response, and SSE
|
|
5
|
+
* chunk look like, plus the lane-disambiguation rule and the `x-modelrig-*`
|
|
6
|
+
* provenance headers. Both sides compile against it:
|
|
7
|
+
*
|
|
8
|
+
* SDK (`packages/modelrig`) — this repo; consumes the streaming/tool
|
|
9
|
+
* surfaces the endpoint is built on.
|
|
10
|
+
* `modelrig-server` — separate repo (Phase B/C); implements the
|
|
11
|
+
* endpoint and imports these types so the wire
|
|
12
|
+
* shape cannot drift between the two.
|
|
13
|
+
*
|
|
14
|
+
* This mirrors `telemetry/ingest-protocol.ts`: a shared module is what makes
|
|
15
|
+
* "the two sides agree" enforceable rather than aspirational — a contract test
|
|
16
|
+
* round-trips the shapes on both sides instead of comparing two hand-written
|
|
17
|
+
* copies for similarity.
|
|
18
|
+
*
|
|
19
|
+
* TYPES + PURE FUNCTIONS ONLY. No transport, no auth, no I/O — the endpoint,
|
|
20
|
+
* SSE plumbing, and BYOK key resolution live server-side (spec §2).
|
|
21
|
+
*/
|
|
22
|
+
import type { ToolCall, ToolChoice, ToolDefinition } from "../types/provider";
|
|
23
|
+
/** The endpoint path. Spelled once. */
|
|
24
|
+
export declare const CHAT_COMPLETIONS_PATH = "/v1/chat/completions";
|
|
25
|
+
/** The model-catalog path (routes + registry models) for SDK discovery. */
|
|
26
|
+
export declare const MODELS_PATH = "/v1/models";
|
|
27
|
+
/** Bumped only for a breaking change to the shapes below. */
|
|
28
|
+
export declare const GATEWAY_PROTOCOL_VERSION = 1;
|
|
29
|
+
export declare const MODELRIG_HEADERS: {
|
|
30
|
+
/** "slug" (verified pipeline) or "raw" (zero-margin BYOK passthrough). */
|
|
31
|
+
readonly lane: "x-modelrig-lane";
|
|
32
|
+
/** Phase D (spec §13.1 rule 4): where the slug lane resolved its bundle —
|
|
33
|
+
* "local" (this deployment's own routes, the self-host path) or "mirror" (the
|
|
34
|
+
* org-scoped `routes` mirror, the hosted path). A deployment serves ONE or the
|
|
35
|
+
* OTHER and SAYS WHICH; the two must never silently blend. Absent on the raw
|
|
36
|
+
* lane. */
|
|
37
|
+
readonly routeSource: "x-modelrig-route-source";
|
|
38
|
+
readonly provider: "x-modelrig-provider";
|
|
39
|
+
readonly model: "x-modelrig-model";
|
|
40
|
+
/** "true"/"false" — was the output schema-validated (slug lane only). */
|
|
41
|
+
readonly validated: "x-modelrig-validated";
|
|
42
|
+
/** "provider/model" that repaired the output, when repair fired. */
|
|
43
|
+
readonly repairedBy: "x-modelrig-repaired-by";
|
|
44
|
+
readonly costUsd: "x-modelrig-cost-usd";
|
|
45
|
+
/** The `rig.feedback()` handle (telemetry inference id). */
|
|
46
|
+
readonly inferenceId: "x-modelrig-inference-id";
|
|
47
|
+
};
|
|
48
|
+
export declare const MODELRIG_REQUEST_HEADERS: {
|
|
49
|
+
/** Per-run envelope key (budget). */
|
|
50
|
+
readonly envelope: "x-modelrig-envelope";
|
|
51
|
+
/** Named route variant to serve. */
|
|
52
|
+
readonly variant: "x-modelrig-variant";
|
|
53
|
+
/** "buffered" opts out of true streaming for validated-only output (§4.3). */
|
|
54
|
+
readonly stream: "x-modelrig-stream";
|
|
55
|
+
};
|
|
56
|
+
export type Lane = "slug" | "raw";
|
|
57
|
+
/** The disambiguation verdict for a request's `model` field (spec §3.3). */
|
|
58
|
+
export type LaneResolution = {
|
|
59
|
+
readonly lane: "slug";
|
|
60
|
+
readonly slug: string;
|
|
61
|
+
} | {
|
|
62
|
+
readonly lane: "raw";
|
|
63
|
+
readonly provider: string;
|
|
64
|
+
readonly model: string;
|
|
65
|
+
} | {
|
|
66
|
+
readonly lane: "unknown";
|
|
67
|
+
readonly reason: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* The core routing rule (spec §3.3), as a pure function so both sides classify
|
|
71
|
+
* a `model` string identically:
|
|
72
|
+
* 1. `@rig/…` OR an exact known route slug → slug lane (verified pipeline).
|
|
73
|
+
* 2. `^<providerId>/<model>$`, providerId ∈ PROVIDER_IDS → raw-model lane.
|
|
74
|
+
* 3. otherwise → unknown (the endpoint 404s; never silently guess).
|
|
75
|
+
*
|
|
76
|
+
* The namespaces don't collide: a route slug is a bare handle
|
|
77
|
+
* (`example.support_summarize`); a raw model always carries a known
|
|
78
|
+
* `provider/` prefix.
|
|
79
|
+
*/
|
|
80
|
+
export declare function classifyLane(model: string, knownRouteSlugs?: ReadonlySet<string>): LaneResolution;
|
|
81
|
+
export interface ChatMessage {
|
|
82
|
+
readonly role: "system" | "user" | "assistant" | "tool";
|
|
83
|
+
readonly content: string | null;
|
|
84
|
+
/** Assistant turns that called tools carry them (echoed OpenAI shape). */
|
|
85
|
+
readonly tool_calls?: readonly ToolCall[];
|
|
86
|
+
/** `tool` role replies reference the call they answer. */
|
|
87
|
+
readonly tool_call_id?: string;
|
|
88
|
+
readonly name?: string;
|
|
89
|
+
}
|
|
90
|
+
export interface ChatCompletionRequest {
|
|
91
|
+
readonly model: string;
|
|
92
|
+
readonly messages: readonly ChatMessage[];
|
|
93
|
+
readonly stream?: boolean;
|
|
94
|
+
readonly temperature?: number;
|
|
95
|
+
readonly top_p?: number;
|
|
96
|
+
readonly max_tokens?: number;
|
|
97
|
+
readonly tools?: readonly ToolDefinition[];
|
|
98
|
+
readonly tool_choice?: ToolChoice;
|
|
99
|
+
/** OpenAI structured-output request; the slug lane maps it to the route. */
|
|
100
|
+
readonly response_format?: {
|
|
101
|
+
readonly type: "text";
|
|
102
|
+
} | {
|
|
103
|
+
readonly type: "json_object";
|
|
104
|
+
} | {
|
|
105
|
+
readonly type: "json_schema";
|
|
106
|
+
readonly json_schema: {
|
|
107
|
+
readonly name: string;
|
|
108
|
+
readonly schema: object;
|
|
109
|
+
readonly strict?: boolean;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
/** ModelRig extensions may ride here instead of headers (spec §3.4). */
|
|
113
|
+
readonly modelrig?: {
|
|
114
|
+
readonly envelope?: string;
|
|
115
|
+
readonly variant?: string;
|
|
116
|
+
readonly stream?: "buffered";
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export interface ChatCompletionUsage {
|
|
120
|
+
readonly prompt_tokens: number;
|
|
121
|
+
readonly completion_tokens: number;
|
|
122
|
+
readonly total_tokens: number;
|
|
123
|
+
}
|
|
124
|
+
export interface ChatCompletionChoice {
|
|
125
|
+
readonly index: number;
|
|
126
|
+
readonly message: {
|
|
127
|
+
readonly role: "assistant";
|
|
128
|
+
readonly content: string | null;
|
|
129
|
+
readonly tool_calls?: readonly ToolCall[];
|
|
130
|
+
};
|
|
131
|
+
readonly finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
|
|
132
|
+
}
|
|
133
|
+
export interface ChatCompletionResponse {
|
|
134
|
+
readonly id: string;
|
|
135
|
+
readonly object: "chat.completion";
|
|
136
|
+
readonly created: number;
|
|
137
|
+
readonly model: string;
|
|
138
|
+
readonly choices: readonly ChatCompletionChoice[];
|
|
139
|
+
readonly usage: ChatCompletionUsage;
|
|
140
|
+
}
|
|
141
|
+
export interface ChatCompletionChunkChoice {
|
|
142
|
+
readonly index: number;
|
|
143
|
+
readonly delta: {
|
|
144
|
+
readonly role?: "assistant";
|
|
145
|
+
readonly content?: string | null;
|
|
146
|
+
readonly tool_calls?: readonly ToolCall[];
|
|
147
|
+
};
|
|
148
|
+
readonly finish_reason: ChatCompletionChoice["finish_reason"];
|
|
149
|
+
}
|
|
150
|
+
export interface ChatCompletionChunk {
|
|
151
|
+
readonly id: string;
|
|
152
|
+
readonly object: "chat.completion.chunk";
|
|
153
|
+
readonly created: number;
|
|
154
|
+
readonly model: string;
|
|
155
|
+
readonly choices: readonly ChatCompletionChunkChoice[];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The structured-route terminal event (spec §4.3). Streamed bytes on a
|
|
159
|
+
* structured route are PRE-validation; the endpoint closes the stream with this
|
|
160
|
+
* authoritative event (as a chunk with a `modelrig` extension) before
|
|
161
|
+
* `data: [DONE]`. It carries the validation verdict and, when repair fired, the
|
|
162
|
+
* repaired final object.
|
|
163
|
+
*/
|
|
164
|
+
export interface TerminalValidationEvent {
|
|
165
|
+
readonly object: "modelrig.validation";
|
|
166
|
+
readonly validated: boolean;
|
|
167
|
+
/** The validated (and possibly repaired) output object. */
|
|
168
|
+
readonly output: unknown;
|
|
169
|
+
readonly repairedBy: string | null;
|
|
170
|
+
readonly inferenceId: string;
|
|
171
|
+
readonly errors?: readonly string[];
|
|
172
|
+
}
|
|
173
|
+
/** The SSE sentinel that closes an OpenAI-compatible stream. */
|
|
174
|
+
export declare const SSE_DONE = "[DONE]";
|
|
175
|
+
//# sourceMappingURL=http-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-protocol.d.ts","sourceRoot":"","sources":["../../src/gateway/http-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The HTTP gateway wire contract — G-1/G-5 (http-gateway spec §3, §4.3, §4.4).
|
|
4
|
+
*
|
|
5
|
+
* ONE definition of what a `/v1/chat/completions` request, response, and SSE
|
|
6
|
+
* chunk look like, plus the lane-disambiguation rule and the `x-modelrig-*`
|
|
7
|
+
* provenance headers. Both sides compile against it:
|
|
8
|
+
*
|
|
9
|
+
* SDK (`packages/modelrig`) — this repo; consumes the streaming/tool
|
|
10
|
+
* surfaces the endpoint is built on.
|
|
11
|
+
* `modelrig-server` — separate repo (Phase B/C); implements the
|
|
12
|
+
* endpoint and imports these types so the wire
|
|
13
|
+
* shape cannot drift between the two.
|
|
14
|
+
*
|
|
15
|
+
* This mirrors `telemetry/ingest-protocol.ts`: a shared module is what makes
|
|
16
|
+
* "the two sides agree" enforceable rather than aspirational — a contract test
|
|
17
|
+
* round-trips the shapes on both sides instead of comparing two hand-written
|
|
18
|
+
* copies for similarity.
|
|
19
|
+
*
|
|
20
|
+
* TYPES + PURE FUNCTIONS ONLY. No transport, no auth, no I/O — the endpoint,
|
|
21
|
+
* SSE plumbing, and BYOK key resolution live server-side (spec §2).
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.SSE_DONE = exports.MODELRIG_REQUEST_HEADERS = exports.MODELRIG_HEADERS = exports.GATEWAY_PROTOCOL_VERSION = exports.MODELS_PATH = exports.CHAT_COMPLETIONS_PATH = void 0;
|
|
25
|
+
exports.classifyLane = classifyLane;
|
|
26
|
+
const provider_1 = require("../types/provider");
|
|
27
|
+
/** The endpoint path. Spelled once. */
|
|
28
|
+
exports.CHAT_COMPLETIONS_PATH = "/v1/chat/completions";
|
|
29
|
+
/** The model-catalog path (routes + registry models) for SDK discovery. */
|
|
30
|
+
exports.MODELS_PATH = "/v1/models";
|
|
31
|
+
/** Bumped only for a breaking change to the shapes below. */
|
|
32
|
+
exports.GATEWAY_PROTOCOL_VERSION = 1;
|
|
33
|
+
// ── Provenance headers (spec §3.4) ───────────────────────────────────────────
|
|
34
|
+
// Response headers that make a completion auditable: which lane served it,
|
|
35
|
+
// which provider/model actually ran, whether the output was verified, and the
|
|
36
|
+
// feedback handle. Named once so the SDK, the server, and the console cannot
|
|
37
|
+
// disagree about the spelling.
|
|
38
|
+
exports.MODELRIG_HEADERS = {
|
|
39
|
+
/** "slug" (verified pipeline) or "raw" (zero-margin BYOK passthrough). */
|
|
40
|
+
lane: "x-modelrig-lane",
|
|
41
|
+
/** Phase D (spec §13.1 rule 4): where the slug lane resolved its bundle —
|
|
42
|
+
* "local" (this deployment's own routes, the self-host path) or "mirror" (the
|
|
43
|
+
* org-scoped `routes` mirror, the hosted path). A deployment serves ONE or the
|
|
44
|
+
* OTHER and SAYS WHICH; the two must never silently blend. Absent on the raw
|
|
45
|
+
* lane. */
|
|
46
|
+
routeSource: "x-modelrig-route-source",
|
|
47
|
+
provider: "x-modelrig-provider",
|
|
48
|
+
model: "x-modelrig-model",
|
|
49
|
+
/** "true"/"false" — was the output schema-validated (slug lane only). */
|
|
50
|
+
validated: "x-modelrig-validated",
|
|
51
|
+
/** "provider/model" that repaired the output, when repair fired. */
|
|
52
|
+
repairedBy: "x-modelrig-repaired-by",
|
|
53
|
+
costUsd: "x-modelrig-cost-usd",
|
|
54
|
+
/** The `rig.feedback()` handle (telemetry inference id). */
|
|
55
|
+
inferenceId: "x-modelrig-inference-id",
|
|
56
|
+
};
|
|
57
|
+
// Request-side extension headers (spec §3.4).
|
|
58
|
+
exports.MODELRIG_REQUEST_HEADERS = {
|
|
59
|
+
/** Per-run envelope key (budget). */
|
|
60
|
+
envelope: "x-modelrig-envelope",
|
|
61
|
+
/** Named route variant to serve. */
|
|
62
|
+
variant: "x-modelrig-variant",
|
|
63
|
+
/** "buffered" opts out of true streaming for validated-only output (§4.3). */
|
|
64
|
+
stream: "x-modelrig-stream",
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* The core routing rule (spec §3.3), as a pure function so both sides classify
|
|
68
|
+
* a `model` string identically:
|
|
69
|
+
* 1. `@rig/…` OR an exact known route slug → slug lane (verified pipeline).
|
|
70
|
+
* 2. `^<providerId>/<model>$`, providerId ∈ PROVIDER_IDS → raw-model lane.
|
|
71
|
+
* 3. otherwise → unknown (the endpoint 404s; never silently guess).
|
|
72
|
+
*
|
|
73
|
+
* The namespaces don't collide: a route slug is a bare handle
|
|
74
|
+
* (`example.support_summarize`); a raw model always carries a known
|
|
75
|
+
* `provider/` prefix.
|
|
76
|
+
*/
|
|
77
|
+
function classifyLane(model, knownRouteSlugs = new Set()) {
|
|
78
|
+
const trimmed = model.trim();
|
|
79
|
+
if (trimmed === "") {
|
|
80
|
+
return { lane: "unknown", reason: "empty model field" };
|
|
81
|
+
}
|
|
82
|
+
if (trimmed.startsWith("@rig/")) {
|
|
83
|
+
const slug = trimmed.slice("@rig/".length);
|
|
84
|
+
if (slug === "")
|
|
85
|
+
return { lane: "unknown", reason: "empty route slug after @rig/" };
|
|
86
|
+
return { lane: "slug", slug };
|
|
87
|
+
}
|
|
88
|
+
if (knownRouteSlugs.has(trimmed)) {
|
|
89
|
+
return { lane: "slug", slug: trimmed };
|
|
90
|
+
}
|
|
91
|
+
const slash = trimmed.indexOf("/");
|
|
92
|
+
if (slash > 0) {
|
|
93
|
+
const provider = trimmed.slice(0, slash);
|
|
94
|
+
const rest = trimmed.slice(slash + 1);
|
|
95
|
+
if (rest !== "" && provider_1.PROVIDER_IDS.includes(provider)) {
|
|
96
|
+
return { lane: "raw", provider, model: rest };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
lane: "unknown",
|
|
101
|
+
reason: `"${trimmed}" is neither a known route slug nor a <provider>/<model> for a supported provider`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** The SSE sentinel that closes an OpenAI-compatible stream. */
|
|
105
|
+
exports.SSE_DONE = "[DONE]";
|