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,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dispatch helpers extracted from run.ts (G-1/G-5 Phase A). The run loop is at
|
|
4
|
+
* its LOC cap, so the tool-passthrough and streaming seams live here — the same
|
|
5
|
+
* move G-2 made when it pulled applyRunRequirements/candidateFilterFromOptions
|
|
6
|
+
* into resolve.ts. Pure/near-pure: request shaping, the stream-vs-buffered
|
|
7
|
+
* dispatch fork, and the tool-call RunResult builder.
|
|
8
|
+
*
|
|
9
|
+
* Tool *execution* is never ours (spec §4.4); these helpers normalize the
|
|
10
|
+
* protocol and surface it — nothing here runs a tool.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.recordSearchCostRow = recordSearchCostRow;
|
|
14
|
+
exports.buildAdapterRequest = buildAdapterRequest;
|
|
15
|
+
exports.buildRepairAdapterRequest = buildRepairAdapterRequest;
|
|
16
|
+
exports.dispatchCandidate = dispatchCandidate;
|
|
17
|
+
exports.emitToolCallResult = emitToolCallResult;
|
|
18
|
+
const node_crypto_1 = require("node:crypto");
|
|
19
|
+
const cache_stamp_1 = require("./cache-stamp");
|
|
20
|
+
const cache_handle_1 = require("./cache-handle");
|
|
21
|
+
/** Record the grounding-inject search's own telemetry row (WS3): a $-only line
|
|
22
|
+
* under the synthetic "search" provider. Extracted from run.ts to keep it under
|
|
23
|
+
* the LOC cap; behaviour is byte-identical to the prior inline recorder. */
|
|
24
|
+
function recordSearchCostRow(telemetry, route, effectiveTags, servedVariant, searchProviderId, costUsd) {
|
|
25
|
+
telemetry.record({
|
|
26
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
27
|
+
ts: new Date().toISOString(),
|
|
28
|
+
route: route.route,
|
|
29
|
+
routeVersion: route.version,
|
|
30
|
+
provider: "search",
|
|
31
|
+
model: searchProviderId,
|
|
32
|
+
requestedTier: "standard",
|
|
33
|
+
servedTier: "standard",
|
|
34
|
+
tokensIn: 0,
|
|
35
|
+
tokensOut: 0,
|
|
36
|
+
tokensCached: 0,
|
|
37
|
+
tokensCacheWrite: 0,
|
|
38
|
+
tokensCacheWrite1h: 0,
|
|
39
|
+
costEstimateUsd: costUsd,
|
|
40
|
+
latencyMs: 0,
|
|
41
|
+
ttfbMs: null,
|
|
42
|
+
failureClass: null,
|
|
43
|
+
attemptsJson: "{}",
|
|
44
|
+
tagsJson: JSON.stringify(effectiveTags),
|
|
45
|
+
fingerprintCell: route.fingerprintCell,
|
|
46
|
+
servedVariant,
|
|
47
|
+
repairedBy: null,
|
|
48
|
+
pricingMissing: false,
|
|
49
|
+
cacheKey: null,
|
|
50
|
+
prefixFingerprint: null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Build the primary-attempt AdapterRequest — adds the grounding hint and the
|
|
54
|
+
* unified tools/toolChoice passthrough (spec §4.4). */
|
|
55
|
+
function buildAdapterRequest(parts) {
|
|
56
|
+
const { route, candidate, systemPrompt, userDirective, nativeGrounded, opts } = parts;
|
|
57
|
+
// Request-path caching, two layers with a strict precedence (CE-1 spec §2.2):
|
|
58
|
+
// (1) a CUSTOMER-supplied handle (RunOptions.cache) for the matching
|
|
59
|
+
// provider WINS — it is a real provider-native resource the customer
|
|
60
|
+
// owns. On gemini this is a `cachedContents/<id>`; the gemini adapter
|
|
61
|
+
// then drops systemInstruction+tools by design (they are BAKED INTO the
|
|
62
|
+
// cache at creation, and the API rejects setting both — gemini.ts:145).
|
|
63
|
+
// That is correct API behavior, not a bug; the teaching doc explains it.
|
|
64
|
+
// The WS-C gemini exclusion is untouched — it covers GENERATED keys only.
|
|
65
|
+
// (2) else the WS-C `cache: auto` generated stamp — same pure gate the
|
|
66
|
+
// recorder uses, so wire and telemetry never disagree (gemini excluded
|
|
67
|
+
// here by that gate, not by prose).
|
|
68
|
+
// Absent RunOptions.cache, (1) is null and this is byte-identical to main.
|
|
69
|
+
const customerCache = (0, cache_handle_1.customerCacheHandle)(opts.cache, candidate, parts.suppressCustomerCache === true);
|
|
70
|
+
const cacheStamp = (0, cache_stamp_1.cacheStampForCandidate)(route, candidate);
|
|
71
|
+
const cacheDirective = customerCache ?? cacheStamp.request;
|
|
72
|
+
return {
|
|
73
|
+
candidate,
|
|
74
|
+
systemPrompt,
|
|
75
|
+
userPrompt: userDirective,
|
|
76
|
+
outputSchema: route.outputSchema,
|
|
77
|
+
requestedTier: route.policy.tier,
|
|
78
|
+
timeoutMs: route.policy.timeoutMs,
|
|
79
|
+
...(cacheDirective !== null ? { cache: cacheDirective } : {}),
|
|
80
|
+
...(route.require.includes("grounded") && nativeGrounded ? { grounding: true } : {}),
|
|
81
|
+
// CE-6: the route's declared sampling rides every primary attempt. Absent ⇒
|
|
82
|
+
// no `sampling` key ⇒ adapters keep their constants/omissions (byte-identical).
|
|
83
|
+
...(route.policy.sampling !== undefined ? { sampling: route.policy.sampling } : {}),
|
|
84
|
+
...(opts.tools !== undefined ? { tools: opts.tools } : {}),
|
|
85
|
+
...(opts.toolChoice !== undefined ? { toolChoice: opts.toolChoice } : {}),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Build the repair-attempt AdapterRequest (no tools — repair re-asks for the
|
|
89
|
+
* structured object, never a tool call). */
|
|
90
|
+
function buildRepairAdapterRequest(route, candidate, systemPrompt, repairDirective) {
|
|
91
|
+
// No cache stamp (WS-C): a repair re-asks with a DIFFERENT prompt (error
|
|
92
|
+
// feedback / repair-model framing), so it does not share the route's cacheable
|
|
93
|
+
// prefix identity. Sending the primary fingerprint as a routing key here would
|
|
94
|
+
// point dissimilar prompts at the same cache slot (openai explicitly warns
|
|
95
|
+
// against that) and would misfile the row in WS-B's warm-set. The recorder
|
|
96
|
+
// (record-attempt.ts) skips repair rows symmetrically.
|
|
97
|
+
return {
|
|
98
|
+
candidate,
|
|
99
|
+
systemPrompt,
|
|
100
|
+
userPrompt: repairDirective,
|
|
101
|
+
outputSchema: route.outputSchema,
|
|
102
|
+
requestedTier: route.policy.tier,
|
|
103
|
+
timeoutMs: route.policy.timeoutMs,
|
|
104
|
+
// CE-6: repair / JSON-extractor followups inherit the route's sampling — one
|
|
105
|
+
// knob per route, not per rung (spec §3). A repair re-ask at a different
|
|
106
|
+
// temperature than the primary would be a silent behaviour split.
|
|
107
|
+
...(route.policy.sampling !== undefined ? { sampling: route.policy.sampling } : {}),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Dispatch a candidate. When a delta sink is supplied AND the adapter can
|
|
112
|
+
* stream, drain its stream — forwarding raw text deltas to the sink — and
|
|
113
|
+
* return the terminal `AdapterResult` (identical to what `call()` returns, so
|
|
114
|
+
* the run loop's cost/validation/telemetry logic is unchanged). Otherwise
|
|
115
|
+
* buffered `call()`.
|
|
116
|
+
*/
|
|
117
|
+
async function dispatchCandidate(adapter, req, onDelta) {
|
|
118
|
+
if (onDelta === undefined || adapter.stream === undefined) {
|
|
119
|
+
return adapter.call(req);
|
|
120
|
+
}
|
|
121
|
+
let final = null;
|
|
122
|
+
for await (const ev of adapter.stream(req)) {
|
|
123
|
+
if (ev.kind === "delta") {
|
|
124
|
+
if (ev.text !== "")
|
|
125
|
+
onDelta({ text: ev.text });
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
final = ev.result;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return (final ?? {
|
|
132
|
+
ok: false,
|
|
133
|
+
failure: {
|
|
134
|
+
class: "network",
|
|
135
|
+
message: "adapter stream ended without a terminal result",
|
|
136
|
+
provider: req.candidate.provider,
|
|
137
|
+
model: req.candidate.model,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Record a tool-call turn and build its RunResult (spec §4.4). A tool call is
|
|
143
|
+
* NOT a schema-validated JSON turn: it records a normal (non-failure) telemetry
|
|
144
|
+
* row, then returns a result with `validated: false`, `output: null` (the caller
|
|
145
|
+
* reads `meta.toolCalls`, runs the tool, and continues the exchange), and the
|
|
146
|
+
* normalized calls surfaced on the meta. Recording goes through run.ts's own
|
|
147
|
+
* `recordAttempt` so the ledger/tenancy stamping is identical to every other row.
|
|
148
|
+
*/
|
|
149
|
+
function emitToolCallResult(record, parts) {
|
|
150
|
+
const { route, candidate, result, costUsd, latencyMs, attemptsByClass, servedVariant } = parts;
|
|
151
|
+
const inferenceId = record({
|
|
152
|
+
candidate,
|
|
153
|
+
servedTier: result.usage.servedTier,
|
|
154
|
+
tokensIn: result.usage.tokensIn,
|
|
155
|
+
tokensOut: result.usage.tokensOut,
|
|
156
|
+
tokensCached: result.usage.tokensCached,
|
|
157
|
+
...(result.usage.tokensCacheWrite !== undefined
|
|
158
|
+
? { tokensCacheWrite: result.usage.tokensCacheWrite }
|
|
159
|
+
: {}),
|
|
160
|
+
...(result.usage.tokensCacheWrite1h !== undefined
|
|
161
|
+
? { tokensCacheWrite1h: result.usage.tokensCacheWrite1h }
|
|
162
|
+
: {}),
|
|
163
|
+
costUsd,
|
|
164
|
+
latencyMs,
|
|
165
|
+
...(result.usage.ttfbMs !== undefined ? { ttfbMs: result.usage.ttfbMs } : {}),
|
|
166
|
+
failure: null,
|
|
167
|
+
pricingMissing: parts.pricingMissing,
|
|
168
|
+
});
|
|
169
|
+
return {
|
|
170
|
+
output: null,
|
|
171
|
+
meta: {
|
|
172
|
+
inferenceId,
|
|
173
|
+
route: route.route,
|
|
174
|
+
routeVersion: route.version,
|
|
175
|
+
provider: candidate.provider,
|
|
176
|
+
model: candidate.model,
|
|
177
|
+
requestedTier: route.policy.tier,
|
|
178
|
+
servedTier: result.usage.servedTier,
|
|
179
|
+
tokensIn: result.usage.tokensIn,
|
|
180
|
+
tokensOut: result.usage.tokensOut,
|
|
181
|
+
tokensCached: result.usage.tokensCached,
|
|
182
|
+
costEstimateUsd: costUsd,
|
|
183
|
+
latencyMs,
|
|
184
|
+
validated: false,
|
|
185
|
+
attemptsByClass,
|
|
186
|
+
servedVariant,
|
|
187
|
+
repairedBy: null,
|
|
188
|
+
toolCalls: result.toolCalls,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-run budget envelopes v0 — spec §2. Hard stop only in Phase 1
|
|
3
|
+
* (degrade-before-die routes arrive in Phase 3). Backed by the telemetry
|
|
4
|
+
* store's envelopes table so envelopes survive process restarts within a run.
|
|
5
|
+
*/
|
|
6
|
+
import type { TelemetryStore } from "../types/telemetry";
|
|
7
|
+
import type { RigFailure } from "../types/failures";
|
|
8
|
+
export interface EnvelopeGuard {
|
|
9
|
+
/**
|
|
10
|
+
* Check + reserve before a dispatch. Returns null when spend may proceed,
|
|
11
|
+
* or a budget_exhausted RigFailure when the envelope is breached.
|
|
12
|
+
*/
|
|
13
|
+
precheck(estimatedNextCallUsd: number): RigFailure | null;
|
|
14
|
+
/** Record actual cost after a dispatch completes. */
|
|
15
|
+
settle(actualUsd: number): void;
|
|
16
|
+
}
|
|
17
|
+
/** Default per-envelope budget when the caller doesn't specify one (small on
|
|
18
|
+
* purpose — a hard stop that surprises is safer than silent unbounded spend). */
|
|
19
|
+
export declare const DEFAULT_ENVELOPE_BUDGET_USD = 25;
|
|
20
|
+
export declare function createEnvelopeGuard(store: TelemetryStore, envelopeKey: string, budgetUsd?: number): EnvelopeGuard;
|
|
21
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/run/envelope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC1D,qDAAqD;IACrD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;iFACiF;AACjF,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,aAAa,CAoCf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Per-run budget envelopes v0 — spec §2. Hard stop only in Phase 1
|
|
4
|
+
* (degrade-before-die routes arrive in Phase 3). Backed by the telemetry
|
|
5
|
+
* store's envelopes table so envelopes survive process restarts within a run.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DEFAULT_ENVELOPE_BUDGET_USD = void 0;
|
|
9
|
+
exports.createEnvelopeGuard = createEnvelopeGuard;
|
|
10
|
+
/** Default per-envelope budget when the caller doesn't specify one (small on
|
|
11
|
+
* purpose — a hard stop that surprises is safer than silent unbounded spend). */
|
|
12
|
+
exports.DEFAULT_ENVELOPE_BUDGET_USD = 25;
|
|
13
|
+
function createEnvelopeGuard(store, envelopeKey, budgetUsd) {
|
|
14
|
+
// Open-or-get: the first opener's budget wins; a pre-existing row (earlier
|
|
15
|
+
// step of the same run, or an operator-seeded envelope) is never resized.
|
|
16
|
+
store.openEnvelope(envelopeKey, budgetUsd ?? exports.DEFAULT_ENVELOPE_BUDGET_USD);
|
|
17
|
+
function exhaustedFailure(row) {
|
|
18
|
+
return {
|
|
19
|
+
class: "budget_exhausted",
|
|
20
|
+
message: `envelope "${envelopeKey}" exhausted: spent $${row.spentUsd.toFixed(4)} ` +
|
|
21
|
+
`of $${row.budgetUsd} budget`,
|
|
22
|
+
fixHint: "raise the envelope budget or investigate runaway retries for this run",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
precheck(estimatedNextCallUsd) {
|
|
27
|
+
const row = store.getEnvelope(envelopeKey);
|
|
28
|
+
if (row === null) {
|
|
29
|
+
// openEnvelope above guarantees a row; a vanished row means the store
|
|
30
|
+
// was externally mutated — fail closed rather than spend blind.
|
|
31
|
+
return {
|
|
32
|
+
class: "budget_exhausted",
|
|
33
|
+
message: `envelope "${envelopeKey}" row missing at precheck — failing closed`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (row.status === "exhausted" || row.spentUsd + estimatedNextCallUsd > row.budgetUsd) {
|
|
37
|
+
return exhaustedFailure(row);
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
},
|
|
41
|
+
settle(actualUsd) {
|
|
42
|
+
store.accrue(envelopeKey, actualUsd);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grounding-inject rung — Phase 3 spec WS3, plan §4. For candidates WITHOUT
|
|
3
|
+
* grounded_native on a `require: grounded` route: pre-dispatch search via a
|
|
4
|
+
* SearchProvider → results injected into the rendered system prompt →
|
|
5
|
+
* citations normalized to url_citation annotations in RunMeta. Search costs
|
|
6
|
+
* accrue to the envelope and telemetry.
|
|
7
|
+
*
|
|
8
|
+
* The Tavily-style provider ports the PATTERN from InferWealth's production
|
|
9
|
+
* websearch provider (query-length cap, basic/advanced depth, result shape)
|
|
10
|
+
* — logic only, no cross-package imports; key arrives via config.
|
|
11
|
+
*/
|
|
12
|
+
export interface SearchResultItem {
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly url: string;
|
|
15
|
+
readonly snippet: string;
|
|
16
|
+
readonly publishedDate?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SearchResponse {
|
|
19
|
+
readonly results: readonly SearchResultItem[];
|
|
20
|
+
/** What this search cost — accrued to the envelope + telemetry. */
|
|
21
|
+
readonly costUsd: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SearchProvider {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
search(query: string, opts?: {
|
|
26
|
+
readonly maxResults?: number;
|
|
27
|
+
}): Promise<SearchResponse>;
|
|
28
|
+
}
|
|
29
|
+
/** Ported cap: the Tavily API hard-rejects queries over 400 chars. */
|
|
30
|
+
export declare const SEARCH_QUERY_MAX_CHARS = 400;
|
|
31
|
+
export declare function capSearchQuery(query: string): string;
|
|
32
|
+
export interface TavilySearchConfig {
|
|
33
|
+
readonly apiKey: string;
|
|
34
|
+
/** Flat per-search cost (Tavily bills credits, not tokens) — default one
|
|
35
|
+
* basic-depth credit at the pay-as-you-go rate. */
|
|
36
|
+
readonly costPerSearchUsd?: number;
|
|
37
|
+
readonly searchDepth?: "basic" | "advanced";
|
|
38
|
+
readonly baseUrl?: string;
|
|
39
|
+
/** Injectable for tests; defaults to global fetch. */
|
|
40
|
+
readonly fetchFn?: typeof fetch;
|
|
41
|
+
}
|
|
42
|
+
export declare function createTavilySearchProvider(config: TavilySearchConfig): SearchProvider;
|
|
43
|
+
/** The injected block — appended to the rendered system prompt, before json
|
|
44
|
+
* coaching. Sources are numbered so outputs can cite by URL. */
|
|
45
|
+
export declare function searchInjectionBlock(results: readonly SearchResultItem[], retrievedAt: string): string;
|
|
46
|
+
/** Normalized citation annotation (spec WS3) — RunMeta carries these. */
|
|
47
|
+
export interface UrlCitation {
|
|
48
|
+
readonly type: "url_citation";
|
|
49
|
+
readonly url: string;
|
|
50
|
+
readonly title?: string;
|
|
51
|
+
}
|
|
52
|
+
/** Extract URLs cited in the model's output and normalize to url_citation
|
|
53
|
+
* annotations, enriching with titles from the injected sources. Deduped,
|
|
54
|
+
* trailing punctuation stripped (same normalization as the probe suite). */
|
|
55
|
+
export declare function extractCitations(outputText: string, sources: readonly SearchResultItem[]): UrlCitation[];
|
|
56
|
+
//# sourceMappingURL=grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grounding.d.ts","sourceRoot":"","sources":["../../src/run/grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACzF;AAED,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;uDACmD;IACnD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAaD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAoCrF;AAED;gEACgE;AAChE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAYtG;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAID;;4EAE4E;AAC5E,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,WAAW,EAAE,CAYf"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Grounding-inject rung — Phase 3 spec WS3, plan §4. For candidates WITHOUT
|
|
4
|
+
* grounded_native on a `require: grounded` route: pre-dispatch search via a
|
|
5
|
+
* SearchProvider → results injected into the rendered system prompt →
|
|
6
|
+
* citations normalized to url_citation annotations in RunMeta. Search costs
|
|
7
|
+
* accrue to the envelope and telemetry.
|
|
8
|
+
*
|
|
9
|
+
* The Tavily-style provider ports the PATTERN from InferWealth's production
|
|
10
|
+
* websearch provider (query-length cap, basic/advanced depth, result shape)
|
|
11
|
+
* — logic only, no cross-package imports; key arrives via config.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.SEARCH_QUERY_MAX_CHARS = void 0;
|
|
15
|
+
exports.capSearchQuery = capSearchQuery;
|
|
16
|
+
exports.createTavilySearchProvider = createTavilySearchProvider;
|
|
17
|
+
exports.searchInjectionBlock = searchInjectionBlock;
|
|
18
|
+
exports.extractCitations = extractCitations;
|
|
19
|
+
/** Ported cap: the Tavily API hard-rejects queries over 400 chars. */
|
|
20
|
+
exports.SEARCH_QUERY_MAX_CHARS = 400;
|
|
21
|
+
function capSearchQuery(query) {
|
|
22
|
+
return query.length <= exports.SEARCH_QUERY_MAX_CHARS ? query : query.slice(0, exports.SEARCH_QUERY_MAX_CHARS);
|
|
23
|
+
}
|
|
24
|
+
const TAVILY_BASE_URL = "https://api.tavily.com";
|
|
25
|
+
const DEFAULT_COST_PER_SEARCH_USD = 0.008;
|
|
26
|
+
const DEFAULT_MAX_RESULTS = 5;
|
|
27
|
+
function createTavilySearchProvider(config) {
|
|
28
|
+
const fetchFn = config.fetchFn ?? fetch;
|
|
29
|
+
const base = (config.baseUrl ?? TAVILY_BASE_URL).replace(/\/$/, "");
|
|
30
|
+
const costUsd = config.costPerSearchUsd ?? DEFAULT_COST_PER_SEARCH_USD;
|
|
31
|
+
return {
|
|
32
|
+
id: "tavily",
|
|
33
|
+
async search(query, opts) {
|
|
34
|
+
const response = await fetchFn(`${base}/search`, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: {
|
|
37
|
+
"content-type": "application/json",
|
|
38
|
+
authorization: `Bearer ${config.apiKey}`,
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify({
|
|
41
|
+
query: capSearchQuery(query),
|
|
42
|
+
search_depth: config.searchDepth ?? "basic",
|
|
43
|
+
max_results: opts?.maxResults ?? DEFAULT_MAX_RESULTS,
|
|
44
|
+
include_answer: false,
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
throw new Error(`tavily search → ${response.status} ${await response.text().catch(() => "")}`);
|
|
49
|
+
}
|
|
50
|
+
const body = (await response.json());
|
|
51
|
+
const results = (body.results ?? [])
|
|
52
|
+
.filter((r) => typeof r.url === "string" && r.url !== "")
|
|
53
|
+
.map((r) => ({
|
|
54
|
+
title: r.title ?? "",
|
|
55
|
+
url: r.url,
|
|
56
|
+
snippet: r.content ?? "",
|
|
57
|
+
...(r.published_date !== undefined ? { publishedDate: r.published_date } : {}),
|
|
58
|
+
}));
|
|
59
|
+
return { results, costUsd };
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** The injected block — appended to the rendered system prompt, before json
|
|
64
|
+
* coaching. Sources are numbered so outputs can cite by URL. */
|
|
65
|
+
function searchInjectionBlock(results, retrievedAt) {
|
|
66
|
+
const lines = results.map((r, i) => `${i + 1}. ${r.title || "(untitled)"} — ${r.url}` +
|
|
67
|
+
(r.publishedDate !== undefined ? ` (published ${r.publishedDate})` : "") +
|
|
68
|
+
(r.snippet !== "" ? `\n ${r.snippet}` : ""));
|
|
69
|
+
return (`\n\n---\nWEB SEARCH RESULTS (retrieved ${retrievedAt}). Ground your answer in these ` +
|
|
70
|
+
"sources and cite the URLs of the sources you actually rely on:\n" +
|
|
71
|
+
lines.join("\n"));
|
|
72
|
+
}
|
|
73
|
+
const URL_PATTERN = /https?:\/\/[^\s"'<>)\]\\]+/g;
|
|
74
|
+
/** Extract URLs cited in the model's output and normalize to url_citation
|
|
75
|
+
* annotations, enriching with titles from the injected sources. Deduped,
|
|
76
|
+
* trailing punctuation stripped (same normalization as the probe suite). */
|
|
77
|
+
function extractCitations(outputText, sources) {
|
|
78
|
+
const raw = outputText.match(URL_PATTERN) ?? [];
|
|
79
|
+
const urls = [...new Set(raw.map((u) => u.replace(/[.,;:]+$/, "")))];
|
|
80
|
+
const titleByUrl = new Map(sources.map((s) => [s.url, s.title]));
|
|
81
|
+
return urls.map((url) => {
|
|
82
|
+
const title = titleByUrl.get(url);
|
|
83
|
+
return {
|
|
84
|
+
type: "url_citation",
|
|
85
|
+
url,
|
|
86
|
+
...(title !== undefined && title !== "" ? { title } : {}),
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The RAW LANE — HTTP gateway Phase C (spec §4.2). A zero-margin BYOK
|
|
3
|
+
* passthrough: the caller names a `provider/model` and supplies (server-side,
|
|
4
|
+
* fail-closed) their own provider key; we dispatch DIRECTLY through the matching
|
|
5
|
+
* adapter and meter the call at the provider's list price. There is NO route, NO
|
|
6
|
+
* capability gate, NO validation, NO repair, NO envelope — and, by contract, NO
|
|
7
|
+
* ModelRig margin on the hop (the never-price-the-hop rule; the cost recorded is
|
|
8
|
+
* exactly `attemptCost`'s list price, which is what the verified lane records
|
|
9
|
+
* too). This module is the SDK half; the server half (BYOK resolution + the
|
|
10
|
+
* `key_ownership` tag) lives in `modelrig-server`.
|
|
11
|
+
*
|
|
12
|
+
* WHY THIS IS AN SDK PRIMITIVE, not server code: `AdapterRequest.candidate` is a
|
|
13
|
+
* branded `CandidateRef` mintable only in `run/resolve.ts`, and adapters are
|
|
14
|
+
* constructed with their key baked in — both live here. The server resolves the
|
|
15
|
+
* BYOK key fail-closed and calls `rig.runRaw`/`rig.runRawStream`; it never
|
|
16
|
+
* touches an adapter or the brand.
|
|
17
|
+
*
|
|
18
|
+
* KNOWN LIMITATIONS (flagged for the architect, not hidden):
|
|
19
|
+
* - The adapter contract is single `systemPrompt` + `userPrompt`, not a
|
|
20
|
+
* `messages[]` array, so a multi-turn transcript is flattened by the caller
|
|
21
|
+
* (see `modelrig-server`'s `deriveRawPrompts`).
|
|
22
|
+
* - CE-6: the raw lane now forwards `temperature`/`topP` (via
|
|
23
|
+
* `AdapterRequest.sampling`) when the caller supplies them; absent, they are
|
|
24
|
+
* still dropped and the dispatch is byte-identical to pre-CE-6. `max_tokens`
|
|
25
|
+
* maps to `maxOutputTokens` (unchanged).
|
|
26
|
+
*/
|
|
27
|
+
import type { AdapterRequest, CandidateRef, ProviderId, ToolChoice, ToolDefinition } from "../types/provider";
|
|
28
|
+
import type { RunResult, RunTags } from "../types/route";
|
|
29
|
+
import type { RunStreamHandle } from "./stream";
|
|
30
|
+
import type { TelemetryStore } from "../types/telemetry";
|
|
31
|
+
/** Raw-lane request. `systemPrompt`/`userPrompt` are already flattened from the
|
|
32
|
+
* OpenAI `messages[]` by the caller; `tags` carries the caller's dimensions
|
|
33
|
+
* (the server stamps `key_ownership` here). `lane: "raw"` is stamped by this
|
|
34
|
+
* module and cannot be overridden. */
|
|
35
|
+
export interface RawRunInput {
|
|
36
|
+
readonly provider: ProviderId;
|
|
37
|
+
readonly model: string;
|
|
38
|
+
/** The caller's BYOK provider secret, resolved fail-closed server-side. Held
|
|
39
|
+
* in memory for this one call, then dropped (never logged, never stored). */
|
|
40
|
+
readonly apiKey: string;
|
|
41
|
+
readonly systemPrompt: string;
|
|
42
|
+
readonly userPrompt: string;
|
|
43
|
+
readonly tags?: RunTags;
|
|
44
|
+
readonly maxOutputTokens?: number;
|
|
45
|
+
/** CE-6 sampling on the raw lane (spec §2). `temperature`/`topP` are the raw
|
|
46
|
+
* lane's exposure of the same knobs `RoutePolicy.sampling` gives the routed
|
|
47
|
+
* lane; `maxOutputTokens` above already existed. Absent ⇒ byte-identical raw
|
|
48
|
+
* dispatch (the params were previously dropped, per the header note). */
|
|
49
|
+
readonly temperature?: number;
|
|
50
|
+
readonly topP?: number;
|
|
51
|
+
readonly timeoutMs?: number;
|
|
52
|
+
readonly tools?: readonly ToolDefinition[];
|
|
53
|
+
readonly toolChoice?: ToolChoice;
|
|
54
|
+
/** CE-1 customer cache-handle pass-through on the Lane-B seam (spec §1.3
|
|
55
|
+
* success metric: "…passes its existing cachedContent handle through
|
|
56
|
+
* rig.run/runRaw"). The raw lane has exactly ONE provider (`provider` above),
|
|
57
|
+
* so the handle is unconditionally for it — no provider matching. Forwarded
|
|
58
|
+
* verbatim to `AdapterRequest.cache`; ModelRig never manages the resource. The
|
|
59
|
+
* stamped row carries the customer key with a null `prefix_fingerprint` (the
|
|
60
|
+
* raw lane runs no WS-C stamping), so provenance reads `customer` by the
|
|
61
|
+
* derivation rule. */
|
|
62
|
+
readonly cache?: {
|
|
63
|
+
readonly key: string;
|
|
64
|
+
readonly ttlSeconds?: number;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface RawRunDeps {
|
|
68
|
+
readonly telemetry: TelemetryStore;
|
|
69
|
+
/** Mirrors RunDeps: the conservative per-MTok rate for an unpriced model.
|
|
70
|
+
* Used only to keep `attemptCost` honest — the raw lane has no envelope, so
|
|
71
|
+
* it never charges the unpriced fallback; a missing price records `$0`. */
|
|
72
|
+
readonly unpricedRateUsdPerMTok?: number;
|
|
73
|
+
}
|
|
74
|
+
/** Pure raw-lane request shaping — exported for unit tests (no network). */
|
|
75
|
+
export declare function buildRawRequest(candidate: CandidateRef, input: RawRunInput): AdapterRequest;
|
|
76
|
+
/** Buffered raw dispatch (spec §4.2). Records telemetry, returns the RunResult,
|
|
77
|
+
* or throws `RigFailureError` on an adapter failure. */
|
|
78
|
+
export declare function runRaw(deps: RawRunDeps, input: RawRunInput): Promise<RunResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Streaming raw dispatch (spec §4.3, "raw lane: true streaming, deltas passed
|
|
81
|
+
* through"). Drains the adapter's own stream when it has one, forwarding raw
|
|
82
|
+
* text deltas, and emits a single terminal `final` RunResult; adapters without
|
|
83
|
+
* `stream` (anthropic/gemini) fall back to a buffered `call()` with no deltas.
|
|
84
|
+
* There is NO terminal-validation event — that is a structured-route concept;
|
|
85
|
+
* the raw lane has no schema and the streamed bytes ARE the answer.
|
|
86
|
+
*/
|
|
87
|
+
export declare function runRawStream(deps: RawRunDeps, input: RawRunInput): RunStreamHandle;
|
|
88
|
+
//# sourceMappingURL=raw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../src/run/raw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAYH,OAAO,KAAK,EACV,cAAc,EAGd,YAAY,EAGZ,UAAU,EACV,UAAU,EACV,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAW,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;sCAGsC;AACtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;iFAC6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;6EAGyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC;;;;;;;0BAOsB;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC;;+EAE2E;IAC3E,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AA0CD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,CAyB3F;AA+ID;wDACwD;AACxD,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAMrF;AAcD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,eAAe,CAyClF"}
|