@theoremjs/agents 0.0.0-stage → 0.3.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/LICENSE +21 -0
- package/README.md +1264 -2
- package/esm/_dnt.polyfills.d.ts +66 -0
- package/esm/_dnt.polyfills.js +51 -0
- package/esm/mod.d.ts +65 -0
- package/esm/mod.js +42 -0
- package/esm/package.json +3 -0
- package/esm/src/cli/bin.d.ts +7 -0
- package/esm/src/cli/bin.js +9 -0
- package/esm/src/cli/commands/bench.d.ts +6 -0
- package/esm/src/cli/commands/bench.js +458 -0
- package/esm/src/cli/commands/egress-compile.d.ts +17 -0
- package/esm/src/cli/commands/egress-compile.js +25 -0
- package/esm/src/cli/commands/eval.d.ts +37 -0
- package/esm/src/cli/commands/eval.js +190 -0
- package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
- package/esm/src/cli/commands/fuzz-canary.js +202 -0
- package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
- package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
- package/esm/src/cli/commands/profile.d.ts +2 -0
- package/esm/src/cli/commands/profile.js +80 -0
- package/esm/src/cli/commands/run.d.ts +13 -0
- package/esm/src/cli/commands/run.js +45 -0
- package/esm/src/cli/commands/test.d.ts +25 -0
- package/esm/src/cli/commands/test.js +143 -0
- package/esm/src/cli/event-log.d.ts +15 -0
- package/esm/src/cli/event-log.js +136 -0
- package/esm/src/cli/index.d.ts +10 -0
- package/esm/src/cli/index.js +267 -0
- package/esm/src/cli/matrix/fixtures.d.ts +10 -0
- package/esm/src/cli/matrix/fixtures.js +72 -0
- package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
- package/esm/src/cli/matrix/synthesizer.js +103 -0
- package/esm/src/evals/attachments.d.ts +4 -0
- package/esm/src/evals/attachments.js +53 -0
- package/esm/src/evals/breakdown.d.ts +28 -0
- package/esm/src/evals/breakdown.js +68 -0
- package/esm/src/evals/graders/answer.d.ts +13 -0
- package/esm/src/evals/graders/answer.js +133 -0
- package/esm/src/evals/graders/code.d.ts +64 -0
- package/esm/src/evals/graders/code.js +205 -0
- package/esm/src/evals/graders/judge.d.ts +20 -0
- package/esm/src/evals/graders/judge.js +365 -0
- package/esm/src/evals/graders/latency.d.ts +5 -0
- package/esm/src/evals/graders/latency.js +81 -0
- package/esm/src/evals/graders/live.d.ts +11 -0
- package/esm/src/evals/graders/live.js +40 -0
- package/esm/src/evals/graders/media.d.ts +18 -0
- package/esm/src/evals/graders/media.js +92 -0
- package/esm/src/evals/graders/shared.d.ts +11 -0
- package/esm/src/evals/graders/shared.js +62 -0
- package/esm/src/evals/graders/transcript.d.ts +17 -0
- package/esm/src/evals/graders/transcript.js +200 -0
- package/esm/src/evals/mod.d.ts +42 -0
- package/esm/src/evals/mod.js +30 -0
- package/esm/src/evals/record.d.ts +35 -0
- package/esm/src/evals/record.js +105 -0
- package/esm/src/evals/rubrics/catalog.d.ts +148 -0
- package/esm/src/evals/rubrics/catalog.js +846 -0
- package/esm/src/evals/rubrics/mod.d.ts +24 -0
- package/esm/src/evals/rubrics/mod.js +55 -0
- package/esm/src/evals/rubrics/mustache.d.ts +23 -0
- package/esm/src/evals/rubrics/mustache.js +154 -0
- package/esm/src/evals/rubrics/types.d.ts +54 -0
- package/esm/src/evals/rubrics/types.js +74 -0
- package/esm/src/evals/run.d.ts +118 -0
- package/esm/src/evals/run.js +452 -0
- package/esm/src/evals/suite.d.ts +19 -0
- package/esm/src/evals/suite.js +92 -0
- package/esm/src/evals/summary.d.ts +32 -0
- package/esm/src/evals/summary.js +30 -0
- package/esm/src/evals/trial.d.ts +27 -0
- package/esm/src/evals/trial.js +158 -0
- package/esm/src/evals/types.d.ts +260 -0
- package/esm/src/evals/types.js +126 -0
- package/esm/src/evals/verdict.d.ts +18 -0
- package/esm/src/evals/verdict.js +45 -0
- package/esm/src/guardrails/canary-gate.d.ts +21 -0
- package/esm/src/guardrails/canary-gate.js +40 -0
- package/esm/src/guardrails/canary.d.ts +112 -0
- package/esm/src/guardrails/canary.js +901 -0
- package/esm/src/guardrails/compile-egress.d.ts +11 -0
- package/esm/src/guardrails/compile-egress.js +11 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
- package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
- package/esm/src/guardrails/corpus/live-attacks.js +224 -0
- package/esm/src/guardrails/corpus/mod.d.ts +7 -0
- package/esm/src/guardrails/corpus/mod.js +4 -0
- package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
- package/esm/src/guardrails/corpus/secrets.js +16 -0
- package/esm/src/guardrails/corpus/strings.d.ts +23 -0
- package/esm/src/guardrails/corpus/strings.js +29 -0
- package/esm/src/guardrails/corpus/types.d.ts +32 -0
- package/esm/src/guardrails/corpus/types.js +1 -0
- package/esm/src/guardrails/egress-automata.d.ts +14 -0
- package/esm/src/guardrails/egress-automata.js +6059 -0
- package/esm/src/guardrails/egress-compiler.d.ts +33 -0
- package/esm/src/guardrails/egress-compiler.js +237 -0
- package/esm/src/guardrails/egress-patterns.d.ts +24 -0
- package/esm/src/guardrails/egress-patterns.js +32 -0
- package/esm/src/guardrails/egress-policy.d.ts +27 -0
- package/esm/src/guardrails/egress-policy.js +76 -0
- package/esm/src/guardrails/egress-rules.d.ts +54 -0
- package/esm/src/guardrails/egress-rules.js +49 -0
- package/esm/src/guardrails/egress-stream.d.ts +105 -0
- package/esm/src/guardrails/egress-stream.js +645 -0
- package/esm/src/guardrails/egress-urls.d.ts +83 -0
- package/esm/src/guardrails/egress-urls.js +917 -0
- package/esm/src/guardrails/egress.d.ts +106 -0
- package/esm/src/guardrails/egress.js +374 -0
- package/esm/src/guardrails/error.d.ts +26 -0
- package/esm/src/guardrails/error.js +91 -0
- package/esm/src/guardrails/event-schemas.d.ts +57 -0
- package/esm/src/guardrails/event-schemas.js +41 -0
- package/esm/src/guardrails/events.d.ts +9 -0
- package/esm/src/guardrails/events.js +42 -0
- package/esm/src/guardrails/hits.d.ts +8 -0
- package/esm/src/guardrails/hits.js +19 -0
- package/esm/src/guardrails/injection-patterns.d.ts +15 -0
- package/esm/src/guardrails/injection-patterns.js +94 -0
- package/esm/src/guardrails/injection.d.ts +14 -0
- package/esm/src/guardrails/injection.js +237 -0
- package/esm/src/guardrails/lexicon.d.ts +30 -0
- package/esm/src/guardrails/lexicon.js +478 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
- package/esm/src/guardrails/live-outbound-gate.js +305 -0
- package/esm/src/guardrails/mod.d.ts +46 -0
- package/esm/src/guardrails/mod.js +29 -0
- package/esm/src/guardrails/network.d.ts +42 -0
- package/esm/src/guardrails/network.js +328 -0
- package/esm/src/guardrails/normalize.d.ts +6 -0
- package/esm/src/guardrails/normalize.js +132 -0
- package/esm/src/guardrails/policy.d.ts +19 -0
- package/esm/src/guardrails/policy.js +50 -0
- package/esm/src/guardrails/progressive-yield.d.ts +69 -0
- package/esm/src/guardrails/progressive-yield.js +237 -0
- package/esm/src/guardrails/prompt-echo.d.ts +38 -0
- package/esm/src/guardrails/prompt-echo.js +225 -0
- package/esm/src/guardrails/quota.d.ts +20 -0
- package/esm/src/guardrails/quota.js +80 -0
- package/esm/src/guardrails/rules.d.ts +56 -0
- package/esm/src/guardrails/rules.js +54 -0
- package/esm/src/guardrails/sanitize.d.ts +23 -0
- package/esm/src/guardrails/sanitize.js +184 -0
- package/esm/src/guardrails/sensitive.d.ts +29 -0
- package/esm/src/guardrails/sensitive.js +113 -0
- package/esm/src/guardrails/serialize.d.ts +14 -0
- package/esm/src/guardrails/serialize.js +37 -0
- package/esm/src/guardrails/testing.d.ts +9 -0
- package/esm/src/guardrails/testing.js +8 -0
- package/esm/src/guardrails/theorem-error.d.ts +18 -0
- package/esm/src/guardrails/theorem-error.js +53 -0
- package/esm/src/guardrails/thought-guard.d.ts +55 -0
- package/esm/src/guardrails/thought-guard.js +464 -0
- package/esm/src/guardrails/tool-directives.d.ts +19 -0
- package/esm/src/guardrails/tool-directives.js +109 -0
- package/esm/src/guardrails/tool-result.d.ts +61 -0
- package/esm/src/guardrails/tool-result.js +248 -0
- package/esm/src/guardrails/types.d.ts +242 -0
- package/esm/src/guardrails/types.js +54 -0
- package/esm/src/host/client-turn.d.ts +9 -0
- package/esm/src/host/client-turn.js +38 -0
- package/esm/src/host/mint-trace.d.ts +28 -0
- package/esm/src/host/mint-trace.js +59 -0
- package/esm/src/host/mod.d.ts +13 -0
- package/esm/src/host/mod.js +11 -0
- package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
- package/esm/src/host/readStreamingJsonStringField.js +68 -0
- package/esm/src/host/reply.d.ts +7 -0
- package/esm/src/host/reply.js +35 -0
- package/esm/src/interface/blocks.d.ts +8 -0
- package/esm/src/interface/blocks.js +213 -0
- package/esm/src/interface/composer-actions.d.ts +20 -0
- package/esm/src/interface/composer-actions.js +31 -0
- package/esm/src/interface/draft.d.ts +14 -0
- package/esm/src/interface/draft.js +28 -0
- package/esm/src/interface/from-profile.d.ts +12 -0
- package/esm/src/interface/from-profile.js +144 -0
- package/esm/src/interface/history.d.ts +40 -0
- package/esm/src/interface/history.js +269 -0
- package/esm/src/interface/inputs.d.ts +10 -0
- package/esm/src/interface/inputs.js +64 -0
- package/esm/src/interface/mod.d.ts +31 -0
- package/esm/src/interface/mod.js +21 -0
- package/esm/src/interface/models.d.ts +19 -0
- package/esm/src/interface/models.js +45 -0
- package/esm/src/interface/pending.d.ts +48 -0
- package/esm/src/interface/pending.js +146 -0
- package/esm/src/interface/profile-interface.d.ts +4 -0
- package/esm/src/interface/profile-interface.js +223 -0
- package/esm/src/interface/session.d.ts +64 -0
- package/esm/src/interface/session.js +121 -0
- package/esm/src/interface/tool-calls.d.ts +20 -0
- package/esm/src/interface/tool-calls.js +73 -0
- package/esm/src/interface/tool-invoke.d.ts +4 -0
- package/esm/src/interface/tool-invoke.js +20 -0
- package/esm/src/interface/tool-media.d.ts +9 -0
- package/esm/src/interface/tool-media.js +112 -0
- package/esm/src/interface/types.d.ts +213 -0
- package/esm/src/interface/types.js +4 -0
- package/esm/src/kernel/auth/credential-source.d.ts +23 -0
- package/esm/src/kernel/auth/credential-source.js +11 -0
- package/esm/src/kernel/auth/crypto.d.ts +51 -0
- package/esm/src/kernel/auth/crypto.js +161 -0
- package/esm/src/kernel/auth/mod.d.ts +5 -0
- package/esm/src/kernel/auth/mod.js +5 -0
- package/esm/src/kernel/auth/oauth.d.ts +17 -0
- package/esm/src/kernel/auth/oauth.js +438 -0
- package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
- package/esm/src/kernel/auth/scope-refusal.js +8 -0
- package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
- package/esm/src/kernel/auth/typed-secret.js +23 -0
- package/esm/src/kernel/auth/types.d.ts +139 -0
- package/esm/src/kernel/auth/types.js +1 -0
- package/esm/src/kernel/default-scope.d.ts +34 -0
- package/esm/src/kernel/default-scope.js +72 -0
- package/esm/src/kernel/engine/compaction.d.ts +70 -0
- package/esm/src/kernel/engine/compaction.js +202 -0
- package/esm/src/kernel/engine/decision.d.ts +41 -0
- package/esm/src/kernel/engine/decision.js +412 -0
- package/esm/src/kernel/engine/hash.d.ts +6 -0
- package/esm/src/kernel/engine/hash.js +22 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
- package/esm/src/kernel/engine/live-inbound.js +19 -0
- package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
- package/esm/src/kernel/engine/live-ingress.js +37 -0
- package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
- package/esm/src/kernel/engine/media-probe/audio.js +342 -0
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
- package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
- package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
- package/esm/src/kernel/engine/media-probe/image.js +171 -0
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
- package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
- package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
- package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
- package/esm/src/kernel/engine/media-probe/opus.js +23 -0
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
- package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
- package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
- package/esm/src/kernel/engine/media-probe/video.js +49 -0
- package/esm/src/kernel/engine/record.d.ts +3 -0
- package/esm/src/kernel/engine/record.js +11 -0
- package/esm/src/kernel/engine/repair.d.ts +7 -0
- package/esm/src/kernel/engine/repair.js +36 -0
- package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
- package/esm/src/kernel/engine/runner/gates.js +322 -0
- package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
- package/esm/src/kernel/engine/runner/mod.js +574 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
- package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
- package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
- package/esm/src/kernel/engine/runner/stages.js +48 -0
- package/esm/src/kernel/engine/runner/state.d.ts +76 -0
- package/esm/src/kernel/engine/runner/state.js +40 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
- package/esm/src/kernel/engine/runner/steps.js +360 -0
- package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
- package/esm/src/kernel/engine/runner/stream.js +225 -0
- package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
- package/esm/src/kernel/engine/runner/usage.js +150 -0
- package/esm/src/kernel/engine/session/mod.d.ts +31 -0
- package/esm/src/kernel/engine/session/mod.js +951 -0
- package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
- package/esm/src/kernel/engine/session/session-trace.js +489 -0
- package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
- package/esm/src/kernel/engine/token-estimate.js +218 -0
- package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
- package/esm/src/kernel/engine/tool-trace.js +131 -0
- package/esm/src/kernel/engine/tree.d.ts +2 -0
- package/esm/src/kernel/engine/tree.js +17 -0
- package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
- package/esm/src/kernel/engine/turn-trace.js +863 -0
- package/esm/src/kernel/engine/usage.d.ts +30 -0
- package/esm/src/kernel/engine/usage.js +134 -0
- package/esm/src/kernel/interaction-parts.d.ts +10 -0
- package/esm/src/kernel/interaction-parts.js +22 -0
- package/esm/src/kernel/mod.d.ts +47 -0
- package/esm/src/kernel/mod.js +30 -0
- package/esm/src/kernel/profile-graph.d.ts +140 -0
- package/esm/src/kernel/profile-graph.js +151 -0
- package/esm/src/kernel/profile-presence.d.ts +9 -0
- package/esm/src/kernel/profile-presence.js +143 -0
- package/esm/src/kernel/profile-scope.d.ts +36 -0
- package/esm/src/kernel/profile-scope.js +262 -0
- package/esm/src/kernel/registry/attachments.d.ts +35 -0
- package/esm/src/kernel/registry/attachments.js +211 -0
- package/esm/src/kernel/registry/catalog.d.ts +19 -0
- package/esm/src/kernel/registry/catalog.js +78 -0
- package/esm/src/kernel/registry/ingress.d.ts +8 -0
- package/esm/src/kernel/registry/ingress.js +134 -0
- package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
- package/esm/src/kernel/registry/kernel-registry.js +8 -0
- package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
- package/esm/src/kernel/registry/profile-outputs.js +7 -0
- package/esm/src/kernel/registry/profiles.d.ts +92 -0
- package/esm/src/kernel/registry/profiles.js +698 -0
- package/esm/src/kernel/registry/provider-request.d.ts +6 -0
- package/esm/src/kernel/registry/provider-request.js +42 -0
- package/esm/src/kernel/registry/resolve.d.ts +14 -0
- package/esm/src/kernel/registry/resolve.js +237 -0
- package/esm/src/kernel/registry/schemas.d.ts +9 -0
- package/esm/src/kernel/registry/schemas.js +25 -0
- package/esm/src/kernel/registry/sole-model.d.ts +2 -0
- package/esm/src/kernel/registry/sole-model.js +4 -0
- package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
- package/esm/src/kernel/registry/system-prompt.js +33 -0
- package/esm/src/kernel/registry/system-role.d.ts +3 -0
- package/esm/src/kernel/registry/system-role.js +9 -0
- package/esm/src/kernel/registry/vault.d.ts +13 -0
- package/esm/src/kernel/registry/vault.js +14 -0
- package/esm/src/kernel/schema.d.ts +172 -0
- package/esm/src/kernel/schema.js +653 -0
- package/esm/src/kernel/scope.d.ts +22 -0
- package/esm/src/kernel/scope.js +25 -0
- package/esm/src/kernel/stages.d.ts +141 -0
- package/esm/src/kernel/stages.js +388 -0
- package/esm/src/kernel/stop.d.ts +93 -0
- package/esm/src/kernel/stop.js +125 -0
- package/esm/src/kernel/system-parts.d.ts +26 -0
- package/esm/src/kernel/system-parts.js +98 -0
- package/esm/src/kernel/tools/activity-label.d.ts +16 -0
- package/esm/src/kernel/tools/activity-label.js +209 -0
- package/esm/src/kernel/tools/events.d.ts +51 -0
- package/esm/src/kernel/tools/events.js +149 -0
- package/esm/src/kernel/tools/execute.d.ts +64 -0
- package/esm/src/kernel/tools/execute.js +801 -0
- package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
- package/esm/src/kernel/tools/gate-answer.js +54 -0
- package/esm/src/kernel/tools/harness.d.ts +16 -0
- package/esm/src/kernel/tools/harness.js +42 -0
- package/esm/src/kernel/tools/invoke.d.ts +10 -0
- package/esm/src/kernel/tools/invoke.js +129 -0
- package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
- package/esm/src/kernel/tools/mcp-sessions.js +64 -0
- package/esm/src/kernel/tools/mod.d.ts +9 -0
- package/esm/src/kernel/tools/mod.js +6 -0
- package/esm/src/kernel/tools/model-text.d.ts +11 -0
- package/esm/src/kernel/tools/model-text.js +25 -0
- package/esm/src/kernel/tools/permission.d.ts +6 -0
- package/esm/src/kernel/tools/permission.js +38 -0
- package/esm/src/kernel/tools/project.d.ts +8 -0
- package/esm/src/kernel/tools/project.js +25 -0
- package/esm/src/kernel/tools/registry.d.ts +20 -0
- package/esm/src/kernel/tools/registry.js +84 -0
- package/esm/src/kernel/tools/remote.d.ts +110 -0
- package/esm/src/kernel/tools/remote.js +998 -0
- package/esm/src/kernel/tools/resolve.d.ts +28 -0
- package/esm/src/kernel/tools/resolve.js +259 -0
- package/esm/src/kernel/tools/schema.d.ts +10 -0
- package/esm/src/kernel/tools/schema.js +174 -0
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
- package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
- package/esm/src/kernel/tools/stage-run.d.ts +93 -0
- package/esm/src/kernel/tools/stage-run.js +140 -0
- package/esm/src/kernel/tools/types.d.ts +287 -0
- package/esm/src/kernel/tools/types.js +1 -0
- package/esm/src/kernel/turn-events.d.ts +599 -0
- package/esm/src/kernel/turn-events.js +425 -0
- package/esm/src/kernel/types.d.ts +884 -0
- package/esm/src/kernel/types.js +1 -0
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +13 -0
- package/esm/src/kernel/util/exact-type.d.ts +31 -0
- package/esm/src/kernel/util/exact-type.js +1 -0
- package/esm/src/kernel/util/find-last.d.ts +3 -0
- package/esm/src/kernel/util/find-last.js +9 -0
- package/esm/src/kernel/util/mime.d.ts +2 -0
- package/esm/src/kernel/util/mime.js +4 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +3 -0
- package/esm/src/observability/destinations.d.ts +9 -0
- package/esm/src/observability/destinations.js +38 -0
- package/esm/src/observability/jsonl.d.ts +18 -0
- package/esm/src/observability/jsonl.js +117 -0
- package/esm/src/observability/mod.d.ts +22 -0
- package/esm/src/observability/mod.js +16 -0
- package/esm/src/observability/openinference.d.ts +11 -0
- package/esm/src/observability/openinference.js +205 -0
- package/esm/src/observability/otlp.d.ts +68 -0
- package/esm/src/observability/otlp.js +98 -0
- package/esm/src/observability/phoenix.d.ts +29 -0
- package/esm/src/observability/phoenix.js +71 -0
- package/esm/src/observability/policy.d.ts +14 -0
- package/esm/src/observability/policy.js +69 -0
- package/esm/src/observability/resolve-policy.d.ts +8 -0
- package/esm/src/observability/resolve-policy.js +58 -0
- package/esm/src/observability/spans.d.ts +16 -0
- package/esm/src/observability/spans.js +56 -0
- package/esm/src/observability/trace-catalog.d.ts +111 -0
- package/esm/src/observability/trace-catalog.js +865 -0
- package/esm/src/observability/trace-record.d.ts +23 -0
- package/esm/src/observability/trace-record.js +223 -0
- package/esm/src/observability/trace-schema.d.ts +54 -0
- package/esm/src/observability/trace-schema.js +59 -0
- package/esm/src/observability/trace-sink.d.ts +13 -0
- package/esm/src/observability/trace-sink.js +3 -0
- package/esm/src/observability/trace-span.d.ts +92 -0
- package/esm/src/observability/trace-span.js +199 -0
- package/esm/src/observability/trace.d.ts +11 -0
- package/esm/src/observability/trace.js +35 -0
- package/esm/src/observability/types.d.ts +85 -0
- package/esm/src/observability/types.js +3 -0
- package/esm/src/presets/google/speech-voices.d.ts +8 -0
- package/esm/src/presets/google/speech-voices.js +38 -0
- package/esm/src/presets/google-limits.d.ts +12 -0
- package/esm/src/presets/google-limits.js +18 -0
- package/esm/src/presets/google.d.ts +104 -0
- package/esm/src/presets/google.js +188 -0
- package/esm/src/presets/mod.d.ts +10 -0
- package/esm/src/presets/mod.js +9 -0
- package/esm/src/presets/openrouter.d.ts +13 -0
- package/esm/src/presets/openrouter.js +13 -0
- package/esm/src/presets/typesafe.d.ts +2 -0
- package/esm/src/presets/typesafe.js +2 -0
- package/esm/src/providers/create-provider.d.ts +21 -0
- package/esm/src/providers/create-provider.js +90 -0
- package/esm/src/providers/decision/usage.d.ts +3 -0
- package/esm/src/providers/decision/usage.js +25 -0
- package/esm/src/providers/google/api-error.d.ts +8 -0
- package/esm/src/providers/google/api-error.js +123 -0
- package/esm/src/providers/google/grounding.d.ts +5 -0
- package/esm/src/providers/google/grounding.js +226 -0
- package/esm/src/providers/google/interactions/framing.d.ts +15 -0
- package/esm/src/providers/google/interactions/framing.js +263 -0
- package/esm/src/providers/google/interactions/mod.d.ts +2 -0
- package/esm/src/providers/google/interactions/mod.js +2 -0
- package/esm/src/providers/google/interactions/steps.d.ts +12 -0
- package/esm/src/providers/google/interactions/steps.js +200 -0
- package/esm/src/providers/google/interactions/stream.d.ts +24 -0
- package/esm/src/providers/google/interactions/stream.js +297 -0
- package/esm/src/providers/google/keys.d.ts +20 -0
- package/esm/src/providers/google/keys.js +87 -0
- package/esm/src/providers/google/live/framing.d.ts +51 -0
- package/esm/src/providers/google/live/framing.js +597 -0
- package/esm/src/providers/google/live/mod.d.ts +7 -0
- package/esm/src/providers/google/live/mod.js +7 -0
- package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
- package/esm/src/providers/google/live/openapi-schema.js +42 -0
- package/esm/src/providers/google/live/session.d.ts +14 -0
- package/esm/src/providers/google/live/session.js +150 -0
- package/esm/src/providers/google/live/stream.d.ts +51 -0
- package/esm/src/providers/google/live/stream.js +263 -0
- package/esm/src/providers/google/thinking.d.ts +3 -0
- package/esm/src/providers/google/thinking.js +8 -0
- package/esm/src/providers/google/urls.d.ts +6 -0
- package/esm/src/providers/google/urls.js +6 -0
- package/esm/src/providers/google/usage.d.ts +7 -0
- package/esm/src/providers/google/usage.js +49 -0
- package/esm/src/providers/local/local.d.ts +12 -0
- package/esm/src/providers/local/local.js +186 -0
- package/esm/src/providers/local/mod.d.ts +8 -0
- package/esm/src/providers/local/mod.js +8 -0
- package/esm/src/providers/mod.d.ts +11 -0
- package/esm/src/providers/mod.js +7 -0
- package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
- package/esm/src/providers/openrouter/cache-control.js +4 -0
- package/esm/src/providers/openrouter/chat.d.ts +64 -0
- package/esm/src/providers/openrouter/chat.js +490 -0
- package/esm/src/providers/openrouter/image.d.ts +24 -0
- package/esm/src/providers/openrouter/image.js +187 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
- package/esm/src/providers/openrouter/openai/compat.js +162 -0
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
- package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
- package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
- package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
- package/esm/src/providers/openrouter/openai/usage.js +56 -0
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
- package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
- package/esm/src/providers/openrouter/speech.d.ts +18 -0
- package/esm/src/providers/openrouter/speech.js +109 -0
- package/esm/src/providers/probe.d.ts +5 -0
- package/esm/src/providers/probe.js +15 -0
- package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
- package/esm/src/providers/shared/builtin-wire.js +9 -0
- package/esm/src/providers/shared/pcm.d.ts +14 -0
- package/esm/src/providers/shared/pcm.js +78 -0
- package/esm/src/providers/shared/response-identity.d.ts +11 -0
- package/esm/src/providers/shared/response-identity.js +12 -0
- package/esm/src/providers/shared/sse.d.ts +10 -0
- package/esm/src/providers/shared/sse.js +79 -0
- package/esm/src/providers/shared/structured-output.d.ts +4 -0
- package/esm/src/providers/shared/structured-output.js +11 -0
- package/esm/src/providers/shared/tool-args.d.ts +25 -0
- package/esm/src/providers/shared/tool-args.js +84 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
- package/esm/src/providers/shared/upstream-tap.js +85 -0
- package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
- package/esm/src/providers/shared/upstream-tape.js +88 -0
- package/esm/src/providers/shared/vault.d.ts +13 -0
- package/esm/src/providers/shared/vault.js +41 -0
- package/esm/src/providers/types.d.ts +19 -0
- package/esm/src/providers/types.js +1 -0
- package/esm/src/surface/formats.d.ts +28 -0
- package/esm/src/surface/formats.js +139 -0
- package/esm/src/surface/mod.d.ts +14 -0
- package/esm/src/surface/mod.js +10 -0
- package/esm/src/surface/runtime.d.ts +40 -0
- package/esm/src/surface/runtime.js +439 -0
- package/esm/src/surface/tools.d.ts +15 -0
- package/esm/src/surface/tools.js +80 -0
- package/esm/src/surface/types.d.ts +104 -0
- package/esm/src/surface/types.js +4 -0
- package/package.json +108 -4
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
|
|
2
|
+
import { CANARY_HIT, eventPromptLeakHits, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
|
|
3
|
+
import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
|
|
4
|
+
import { guardrailFromHits } from '../../../guardrails/events.js';
|
|
5
|
+
import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
6
|
+
import { createOutboundProgressiveGate, } from '../../../guardrails/progressive-yield.js';
|
|
7
|
+
import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
|
|
8
|
+
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
9
|
+
function shouldSkipStreamEvent(event, profile) {
|
|
10
|
+
return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
|
|
11
|
+
}
|
|
12
|
+
/** The offending text never reaches the host: redaction cannot cover a partial or encoded token. */
|
|
13
|
+
function* yieldCanaryLeak(hits = [CANARY_HIT]) {
|
|
14
|
+
yield* yieldDeltaBlock(hits);
|
|
15
|
+
const reason = promptLeakReason(hits);
|
|
16
|
+
yield toErrorEvent(new TheoremError('safety', reason));
|
|
17
|
+
// The turn ends because our guardrail blocked the output, not because the model finished.
|
|
18
|
+
const native = reason === WITHHELD_REASON.canary
|
|
19
|
+
? 'canary'
|
|
20
|
+
: reason === WITHHELD_REASON.promptEcho
|
|
21
|
+
? 'prompt_echo'
|
|
22
|
+
: 'provider_tool_leak';
|
|
23
|
+
yield { type: 'done', stop: { kind: 'filtered', native } };
|
|
24
|
+
}
|
|
25
|
+
function* yieldDeltaBlock(hits) {
|
|
26
|
+
const guardrail = guardrailFromHits('output_delta', 'untrusted', hits, 'block');
|
|
27
|
+
if (guardrail) {
|
|
28
|
+
yield guardrail;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** What the guard released, after the event saying what it omitted from it. */
|
|
32
|
+
function* yieldThought({ text, hits }, event) {
|
|
33
|
+
const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
|
|
34
|
+
if (guardrail)
|
|
35
|
+
yield guardrail;
|
|
36
|
+
if (text)
|
|
37
|
+
yield { ...event, text };
|
|
38
|
+
}
|
|
39
|
+
/** The thought held at the end of a call, and what the next call's thoughts read on from. */
|
|
40
|
+
function* flushThoughts(thoughts, control) {
|
|
41
|
+
if (!thoughts)
|
|
42
|
+
return;
|
|
43
|
+
yield* yieldThought(thoughts.flush(), { type: 'thought', text: '' });
|
|
44
|
+
if (control)
|
|
45
|
+
control.thoughtCarry = thoughts.carryOut();
|
|
46
|
+
}
|
|
47
|
+
/** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
|
|
48
|
+
function isWithheldOnBlock(event) {
|
|
49
|
+
return event.type === 'text' || event.type === 'media';
|
|
50
|
+
}
|
|
51
|
+
function canaryOnlyImmediateStop(policy) {
|
|
52
|
+
return !policy.egress?.enforce;
|
|
53
|
+
}
|
|
54
|
+
async function* yieldProviderEvents(args) {
|
|
55
|
+
const { profile, generation, request, privateSystem, provider, call, signal, control, givenUrls, } = args;
|
|
56
|
+
/** Runs one stream check and adds the run to the call's record of that check. */
|
|
57
|
+
async function timed(check, run) {
|
|
58
|
+
const start = performance.now();
|
|
59
|
+
try {
|
|
60
|
+
return await run();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
call.guardTime?.(check, performance.now() - start);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const { canary } = generation;
|
|
67
|
+
const policy = resolveGuardrailPolicy(profile.guardrails);
|
|
68
|
+
const context = {
|
|
69
|
+
stage: 'output_final',
|
|
70
|
+
trust: 'untrusted',
|
|
71
|
+
profileId: profile.id,
|
|
72
|
+
...(profile.lexicon ? { lexicon: profile.lexicon } : {}),
|
|
73
|
+
...(canary ? { canary } : {}),
|
|
74
|
+
// The system prompt is guarded against echo alongside the canary that binds it.
|
|
75
|
+
...(canary && policy.promptEcho && privateSystem.length > 0 ? { privateSystem } : {}),
|
|
76
|
+
givenUrls,
|
|
77
|
+
};
|
|
78
|
+
const { canaryCarry, thoughtCarry } = control ?? {};
|
|
79
|
+
const gate = createOutboundProgressiveGate(policy, context, canaryCarry);
|
|
80
|
+
const thoughts = thoughtGuardFor(policy.egress?.enforce, context, thoughtCarry);
|
|
81
|
+
/** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
|
|
82
|
+
let pendingStream = null;
|
|
83
|
+
let withholdVisible = false;
|
|
84
|
+
/**
|
|
85
|
+
* Under a host policy a withheld system-prompt leak goes to the
|
|
86
|
+
* end-of-attempt verdict, which it pins to block: no verdict may release it.
|
|
87
|
+
*/
|
|
88
|
+
function recordPromptLeak(hits) {
|
|
89
|
+
const leaks = hits.filter(isPromptLeakHit);
|
|
90
|
+
if (control && leaks.length > 0)
|
|
91
|
+
control.promptLeaks = leaks;
|
|
92
|
+
}
|
|
93
|
+
function armWithhold() {
|
|
94
|
+
withholdVisible = true;
|
|
95
|
+
if (control)
|
|
96
|
+
control.withholdVisible = true;
|
|
97
|
+
}
|
|
98
|
+
function withholding() {
|
|
99
|
+
return withholdVisible;
|
|
100
|
+
}
|
|
101
|
+
async function* drainBlockedDelta(hits, template) {
|
|
102
|
+
yield* yieldDeltaBlock(hits);
|
|
103
|
+
// Arm withhold before recording the unreleased tail so the step runner
|
|
104
|
+
// does not forward that text to the host.
|
|
105
|
+
armWithhold();
|
|
106
|
+
const tail = gate?.drainUnreleased();
|
|
107
|
+
if (tail)
|
|
108
|
+
yield { ...template, text: tail };
|
|
109
|
+
}
|
|
110
|
+
async function* flushGate() {
|
|
111
|
+
if (!(gate && pendingStream)) {
|
|
112
|
+
return 'pass';
|
|
113
|
+
}
|
|
114
|
+
const template = pendingStream;
|
|
115
|
+
const result = await timed('output_stream', () => gate.flush());
|
|
116
|
+
pendingStream = null;
|
|
117
|
+
return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Act on one gate step: release what it cleared, or block — stopping the turn
|
|
121
|
+
* when no host policy decides later, otherwise withholding for its verdict.
|
|
122
|
+
*/
|
|
123
|
+
async function* releaseOrBlock(result, template) {
|
|
124
|
+
if (result.blocked) {
|
|
125
|
+
if (canary && canaryOnlyImmediateStop(policy)) {
|
|
126
|
+
yield* yieldCanaryLeak(result.hits);
|
|
127
|
+
return 'stop';
|
|
128
|
+
}
|
|
129
|
+
recordPromptLeak(result.hits);
|
|
130
|
+
yield* drainBlockedDelta(result.hits, template);
|
|
131
|
+
return 'go';
|
|
132
|
+
}
|
|
133
|
+
if (result.emit) {
|
|
134
|
+
yield { ...template, text: result.emit };
|
|
135
|
+
}
|
|
136
|
+
return 'go';
|
|
137
|
+
}
|
|
138
|
+
async function* gateStreamEvent(event) {
|
|
139
|
+
if (!gate) {
|
|
140
|
+
yield event;
|
|
141
|
+
return 'continue';
|
|
142
|
+
}
|
|
143
|
+
if (withholding()) {
|
|
144
|
+
// Keep recording ungated fragments for egress context; host will not see them.
|
|
145
|
+
yield { ...event, text: event.text ?? '' };
|
|
146
|
+
return 'continue';
|
|
147
|
+
}
|
|
148
|
+
pendingStream = event;
|
|
149
|
+
const result = await timed('output_stream', () => gate.process(event.text ?? ''));
|
|
150
|
+
return (yield* releaseOrBlock(result, event)) === 'stop' ? 'stop' : 'continue';
|
|
151
|
+
}
|
|
152
|
+
/** Whether a thought has streamed since the guard last flushed. */
|
|
153
|
+
let thinking = false;
|
|
154
|
+
/** A thought, through the guard when there is one; false for any other event. */
|
|
155
|
+
function* guardThought(event) {
|
|
156
|
+
if (event.type !== 'thought' || !thoughts)
|
|
157
|
+
return false;
|
|
158
|
+
thinking = true;
|
|
159
|
+
yield* yieldThought(thoughts.push(event.text), event);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
/** The reply ends the thought: release its hold, as a call's end does, reading on from the carry. */
|
|
163
|
+
function* endThought() {
|
|
164
|
+
if (!thinking)
|
|
165
|
+
return;
|
|
166
|
+
thinking = false;
|
|
167
|
+
yield* flushThoughts(thoughts, control);
|
|
168
|
+
}
|
|
169
|
+
throwIfAborted(signal);
|
|
170
|
+
let providerFailed = false;
|
|
171
|
+
for await (const event of provider.complete({ ...request, signal, tapUpstream: call.tap })) {
|
|
172
|
+
call.observe(event);
|
|
173
|
+
throwIfAborted(signal);
|
|
174
|
+
if (event.type === 'response') {
|
|
175
|
+
// Identity is the trace's alone; the call span already recorded it.
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (yield* guardThought(event))
|
|
179
|
+
continue;
|
|
180
|
+
if (isStreamedCanaryEvent(event)) {
|
|
181
|
+
yield* endThought();
|
|
182
|
+
const status = yield* gateStreamEvent(event);
|
|
183
|
+
if (status === 'stop') {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// Release held reply text first so the host sees events in order.
|
|
189
|
+
const flushed = yield* flushGate();
|
|
190
|
+
if (flushed === 'stop') {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const leaks = canary
|
|
194
|
+
? await timed('stream_canary', () => eventPromptLeakHits(event, canary, context.privateSystem))
|
|
195
|
+
: [];
|
|
196
|
+
if (leaks.length > 0) {
|
|
197
|
+
yield* yieldCanaryLeak(leaks);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (withholding() && isWithheldOnBlock(event)) {
|
|
201
|
+
// Record for attempt egress / repair; step runner withholds from host.
|
|
202
|
+
yield event;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (event.type === 'error') {
|
|
206
|
+
providerFailed = true;
|
|
207
|
+
}
|
|
208
|
+
if (event.type === 'done')
|
|
209
|
+
yield* flushThoughts(thoughts, control);
|
|
210
|
+
yield event;
|
|
211
|
+
}
|
|
212
|
+
yield* flushThoughts(thoughts, control);
|
|
213
|
+
const flushed = yield* flushGate();
|
|
214
|
+
if (flushed === 'stop') {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (control && gate) {
|
|
218
|
+
control.canaryCarry = gate.carryOut();
|
|
219
|
+
}
|
|
220
|
+
if (providerFailed) {
|
|
221
|
+
// An error from the provider outranks any `done` it sent: the call's output is not whole.
|
|
222
|
+
yield { type: 'done', stop: { kind: 'provider_error' } };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ToolCallRequest } from '../../tools/types.js';
|
|
2
|
+
import type { InteractionPart, ProviderEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
|
|
3
|
+
import { type MediaTokenFamily, type TokenCount } from '../token-estimate.js';
|
|
4
|
+
type CallConversation = {
|
|
5
|
+
history: TurnHistoryMessage[];
|
|
6
|
+
input: InteractionPart[];
|
|
7
|
+
} | {
|
|
8
|
+
previous: CallUsage;
|
|
9
|
+
continuation: TurnHistoryMessage[];
|
|
10
|
+
};
|
|
11
|
+
/** What a call wrote that the output estimate counts: text, thoughts, media, and its tool calls. */
|
|
12
|
+
export type CallOutput = TurnEventOf<'text' | 'thought' | 'media'> | {
|
|
13
|
+
type: 'tool';
|
|
14
|
+
tool: ToolCallRequest;
|
|
15
|
+
};
|
|
16
|
+
interface CallUsage {
|
|
17
|
+
system: string;
|
|
18
|
+
/** Copied before the stream: the runner mutates history as tools run. */
|
|
19
|
+
conversation: CallConversation;
|
|
20
|
+
/** Context the provider already holds from earlier calls (a Live session). */
|
|
21
|
+
held?: TokenCount;
|
|
22
|
+
/** Last usage the provider reported for this call. */
|
|
23
|
+
reported?: TurnTokens;
|
|
24
|
+
output: CallOutput[];
|
|
25
|
+
failed: boolean;
|
|
26
|
+
}
|
|
27
|
+
declare function startCallUsage(system: string, conversation: CallConversation, held?: TokenCount): CallUsage;
|
|
28
|
+
/**
|
|
29
|
+
* Record one provider event. Returns true for a `tokens` event, which the
|
|
30
|
+
* runner holds instead of streaming; `callTokensEvent` emits it at call end.
|
|
31
|
+
*/
|
|
32
|
+
declare function observeCallEvent(usage: CallUsage, event: ProviderEvent): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* What the provider holds once `usage`'s call has ended: what it held before,
|
|
35
|
+
* what was sent for the call, and the call's output (not thoughts), counted
|
|
36
|
+
* as a continuation replays it.
|
|
37
|
+
*/
|
|
38
|
+
declare function heldAfter(usage: CallUsage, family: MediaTokenFamily | undefined): Promise<TokenCount>;
|
|
39
|
+
/**
|
|
40
|
+
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
41
|
+
* claim a completed read.
|
|
42
|
+
*/
|
|
43
|
+
declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration, family: MediaTokenFamily | undefined): Promise<TurnEventOf<'tokens'> | undefined>;
|
|
44
|
+
export type { CallConversation, CallUsage };
|
|
45
|
+
export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { loadTokenEstimator } from '../token-estimate.js';
|
|
2
|
+
function startCallUsage(system, conversation, held) {
|
|
3
|
+
return {
|
|
4
|
+
system,
|
|
5
|
+
...(held ? { held } : {}),
|
|
6
|
+
conversation: 'previous' in conversation
|
|
7
|
+
? { previous: conversation.previous, continuation: [...conversation.continuation] }
|
|
8
|
+
: { history: [...conversation.history], input: [...conversation.input] },
|
|
9
|
+
output: [],
|
|
10
|
+
failed: false,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Record one provider event. Returns true for a `tokens` event, which the
|
|
15
|
+
* runner holds instead of streaming; `callTokensEvent` emits it at call end.
|
|
16
|
+
*/
|
|
17
|
+
function observeCallEvent(usage, event) {
|
|
18
|
+
switch (event.type) {
|
|
19
|
+
case 'tokens':
|
|
20
|
+
usage.reported = event.tokens;
|
|
21
|
+
return true;
|
|
22
|
+
case 'error':
|
|
23
|
+
usage.failed = true;
|
|
24
|
+
return false;
|
|
25
|
+
case 'tool':
|
|
26
|
+
// The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
|
|
27
|
+
if (event.tool.phase === undefined)
|
|
28
|
+
usage.output.push({ type: 'tool', tool: event.tool });
|
|
29
|
+
return false;
|
|
30
|
+
case 'text':
|
|
31
|
+
case 'thought':
|
|
32
|
+
case 'media':
|
|
33
|
+
usage.output.push(event);
|
|
34
|
+
return false;
|
|
35
|
+
default:
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function addCounts(a, b) {
|
|
40
|
+
return { tokens: a.tokens + b.tokens, unknownMedia: a.unknownMedia + b.unknownMedia };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The output's streamed text as the model wrote it: consecutive chunks of one
|
|
44
|
+
* kind joined, so the estimate does not depend on how the stream was split.
|
|
45
|
+
*/
|
|
46
|
+
function textRuns(output, thoughts) {
|
|
47
|
+
const runs = [];
|
|
48
|
+
let kind;
|
|
49
|
+
for (const event of output) {
|
|
50
|
+
if (event.type === 'tool' || event.type === 'media') {
|
|
51
|
+
kind = undefined;
|
|
52
|
+
}
|
|
53
|
+
else if (event.text && (thoughts || event.type !== 'thought')) {
|
|
54
|
+
if (event.type === kind) {
|
|
55
|
+
runs.push(`${runs.pop() ?? ''}${event.text}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
runs.push(event.text);
|
|
59
|
+
kind = event.type;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return runs;
|
|
64
|
+
}
|
|
65
|
+
/** Output events counted; thoughts only when counting what the model wrote. */
|
|
66
|
+
async function countOutput(usage, thoughts) {
|
|
67
|
+
const estimator = await loadTokenEstimator();
|
|
68
|
+
const count = { tokens: 0, unknownMedia: 0 };
|
|
69
|
+
for (const event of usage.output) {
|
|
70
|
+
if (event.type === 'media') {
|
|
71
|
+
count.unknownMedia += 1;
|
|
72
|
+
}
|
|
73
|
+
else if (event.type === 'tool') {
|
|
74
|
+
count.tokens +=
|
|
75
|
+
estimator.text(event.tool.name) + estimator.text(JSON.stringify(event.tool.arguments));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for (const run of textRuns(usage.output, thoughts)) {
|
|
79
|
+
count.tokens += estimator.text(run);
|
|
80
|
+
}
|
|
81
|
+
return count;
|
|
82
|
+
}
|
|
83
|
+
async function countConversation(usage, family) {
|
|
84
|
+
const estimator = await loadTokenEstimator();
|
|
85
|
+
const { conversation } = usage;
|
|
86
|
+
if ('previous' in conversation) {
|
|
87
|
+
const earlier = await countConversation(conversation.previous, family);
|
|
88
|
+
const replayed = await countOutput(conversation.previous, false);
|
|
89
|
+
const continuation = await estimator.messages(conversation.continuation, family);
|
|
90
|
+
return addCounts(addCounts(earlier, replayed), continuation);
|
|
91
|
+
}
|
|
92
|
+
const history = await estimator.messages(conversation.history, family);
|
|
93
|
+
const sent = addCounts(history, await estimator.parts(conversation.input, family));
|
|
94
|
+
return usage.held ? addCounts(usage.held, sent) : sent;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* What the provider holds once `usage`'s call has ended: what it held before,
|
|
98
|
+
* what was sent for the call, and the call's output (not thoughts), counted
|
|
99
|
+
* as a continuation replays it.
|
|
100
|
+
*/
|
|
101
|
+
async function heldAfter(usage, family) {
|
|
102
|
+
return addCounts(await countConversation(usage, family), await countOutput(usage, false));
|
|
103
|
+
}
|
|
104
|
+
async function countPrompt(usage, generation, family) {
|
|
105
|
+
const estimator = await loadTokenEstimator();
|
|
106
|
+
const wire = generation.tools.wire;
|
|
107
|
+
const tools = wire.length > 0 ? estimator.text(JSON.stringify(wire)) : 0;
|
|
108
|
+
const schema = generation.structured
|
|
109
|
+
? estimator.text(JSON.stringify(generation.structured.jsonSchema))
|
|
110
|
+
: 0;
|
|
111
|
+
const conversation = await countConversation(usage, family);
|
|
112
|
+
return {
|
|
113
|
+
tokens: estimator.text(usage.system) + tools + schema + conversation.tokens,
|
|
114
|
+
unknownMedia: conversation.unknownMedia,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
119
|
+
* claim a completed read.
|
|
120
|
+
*/
|
|
121
|
+
async function callTokensEvent(usage, generation, family) {
|
|
122
|
+
const reported = usage.reported;
|
|
123
|
+
if (!reported && usage.failed)
|
|
124
|
+
return undefined;
|
|
125
|
+
const estimated = reported ? (reported.estimated ?? []) : ['input', 'output'];
|
|
126
|
+
if (reported && estimated.length === 0)
|
|
127
|
+
return { type: 'tokens', tokens: reported };
|
|
128
|
+
const prompt = estimated.includes('input')
|
|
129
|
+
? await countPrompt(usage, generation, family)
|
|
130
|
+
: undefined;
|
|
131
|
+
const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
|
|
132
|
+
const input = prompt?.tokens ?? reported?.input ?? 0;
|
|
133
|
+
const output = written?.tokens ?? reported?.output ?? 0;
|
|
134
|
+
const unknownMedia = {
|
|
135
|
+
...(prompt?.unknownMedia ? { input: prompt.unknownMedia } : {}),
|
|
136
|
+
...(written?.unknownMedia ? { output: written.unknownMedia } : {}),
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
type: 'tokens',
|
|
140
|
+
tokens: {
|
|
141
|
+
...reported,
|
|
142
|
+
input,
|
|
143
|
+
output,
|
|
144
|
+
total: input + output,
|
|
145
|
+
estimated: [...estimated],
|
|
146
|
+
...(Object.keys(unknownMedia).length > 0 ? { unknownMedia } : {}),
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { TraceSink } from '../../../observability/trace-sink.js';
|
|
2
|
+
import type { GeminiOptions } from '../../../providers/google/keys.js';
|
|
3
|
+
import type { KernelRegistry } from '../../registry/kernel-registry.js';
|
|
4
|
+
import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
|
|
5
|
+
export type { LiveSession, SessionRequest };
|
|
6
|
+
export interface RunSessionOptions {
|
|
7
|
+
/** The host's keys by slot; the session uses the slots its profile names. */
|
|
8
|
+
vault: KeyVault;
|
|
9
|
+
gemini?: GeminiOptions;
|
|
10
|
+
/** Override socket open (Cloudflare fetch-upgrade, tests). Default: `new WebSocket(url)`. */
|
|
11
|
+
openWebSocket?: (url: string) => Promise<WebSocket>;
|
|
12
|
+
/**
|
|
13
|
+
* Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
|
|
14
|
+
* refused (`session.gate_expired`), and the model reads the call as abandoned.
|
|
15
|
+
*/
|
|
16
|
+
gateTtlMs?: number;
|
|
17
|
+
/**
|
|
18
|
+
* `hold` (default): a sign-in gate waits for its decision, as any gate does. `answer`: the
|
|
19
|
+
* model reads the gate's pending note at once and the call is released, for a host whose
|
|
20
|
+
* sign-in finishes outside the session. A released call still takes its outcome for
|
|
21
|
+
* `gateTtlMs` (`executeTool` with a decision, or `answerToolCall`), which the model reads as
|
|
22
|
+
* the call's next result; unanswered by then, the model reads that the sign-in expired.
|
|
23
|
+
*/
|
|
24
|
+
signInGate?: SignInGatePolicy;
|
|
25
|
+
}
|
|
26
|
+
export type SignInGatePolicy = 'hold' | 'answer';
|
|
27
|
+
/**
|
|
28
|
+
* The session record is written however the session ends, including when opening fails. An unknown
|
|
29
|
+
* profile fails to open and is recorded under the standard observability policy.
|
|
30
|
+
*/
|
|
31
|
+
export declare function runSessionInRegistry(registry: KernelRegistry, req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;
|