@theoremjs/agents 0.3.0 → 0.3.1
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/README.md +276 -995
- package/esm/mod.d.ts +33 -19
- package/esm/mod.js +18 -11
- package/esm/src/cli/commands/bench.js +36 -14
- package/esm/src/cli/commands/detect-compile.d.ts +17 -0
- package/esm/src/cli/commands/detect-compile.js +22 -0
- package/esm/src/cli/commands/eval.d.ts +3 -3
- package/esm/src/cli/commands/fuzz-canary.js +55 -16
- package/esm/src/cli/commands/profile.js +4 -4
- package/esm/src/cli/commands/run.d.ts +2 -2
- package/esm/src/cli/commands/run.js +1 -1
- package/esm/src/cli/commands/test.d.ts +4 -3
- package/esm/src/cli/commands/test.js +2 -2
- package/esm/src/cli/index.js +9 -9
- package/esm/src/cli/matrix/fixtures.js +25 -30
- package/esm/src/evals/attachments.d.ts +1 -0
- package/esm/src/evals/attachments.js +4 -2
- package/esm/src/evals/breakdown.d.ts +2 -0
- package/esm/src/evals/breakdown.js +1 -0
- package/esm/src/evals/graders/answer.d.ts +3 -0
- package/esm/src/evals/graders/answer.js +1 -0
- package/esm/src/evals/graders/code.d.ts +7 -31
- package/esm/src/evals/graders/code.js +4 -25
- package/esm/src/evals/graders/judge.d.ts +4 -0
- package/esm/src/evals/graders/judge.js +7 -5
- package/esm/src/evals/graders/latency.d.ts +1 -0
- package/esm/src/evals/graders/latency.js +3 -2
- package/esm/src/evals/graders/live.d.ts +3 -0
- package/esm/src/evals/graders/live.js +2 -0
- package/esm/src/evals/graders/media.js +1 -2
- package/esm/src/evals/graders/shared.js +1 -1
- package/esm/src/evals/graders/transcript.d.ts +2 -0
- package/esm/src/evals/graders/transcript.js +5 -3
- package/esm/src/evals/mod.d.ts +1 -9
- package/esm/src/evals/mod.js +1 -9
- package/esm/src/evals/record.d.ts +6 -0
- package/esm/src/evals/record.js +4 -2
- package/esm/src/evals/rubrics/mod.d.ts +1 -1
- package/esm/src/evals/rubrics/mod.js +1 -1
- package/esm/src/evals/rubrics/mustache.js +1 -1
- package/esm/src/evals/rubrics/types.js +1 -1
- package/esm/src/evals/run.d.ts +9 -52
- package/esm/src/evals/run.js +12 -46
- package/esm/src/evals/suite.d.ts +12 -3
- package/esm/src/evals/suite.js +9 -4
- package/esm/src/evals/summary.d.ts +3 -0
- package/esm/src/evals/summary.js +1 -0
- package/esm/src/evals/trial.d.ts +3 -16
- package/esm/src/evals/trial.js +7 -30
- package/esm/src/evals/types.d.ts +30 -121
- package/esm/src/evals/types.js +3 -16
- package/esm/src/evals/verdict.d.ts +5 -0
- package/esm/src/evals/verdict.js +4 -1
- package/esm/src/guardrails/boundaries.d.ts +41 -0
- package/esm/src/guardrails/boundaries.js +103 -0
- package/esm/src/guardrails/canary-gate.d.ts +1 -0
- package/esm/src/guardrails/canary.d.ts +49 -15
- package/esm/src/guardrails/canary.js +103 -30
- package/esm/src/guardrails/compile-egress.d.ts +6 -5
- package/esm/src/guardrails/compile-egress.js +6 -5
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
- package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
- package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
- package/esm/src/guardrails/corpus/live-attacks.js +6 -1
- package/esm/src/guardrails/corpus/mod.d.ts +1 -1
- package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
- package/esm/src/guardrails/corpus/secrets.js +2 -2
- package/esm/src/guardrails/corpus/strings.d.ts +1 -1
- package/esm/src/guardrails/corpus/strings.js +1 -1
- package/esm/src/guardrails/corpus/types.d.ts +5 -1
- package/esm/src/guardrails/credential-rules.d.ts +36 -0
- package/esm/src/guardrails/credential-rules.js +3001 -0
- package/esm/src/guardrails/credential-scan.d.ts +45 -0
- package/esm/src/guardrails/credential-scan.js +172 -0
- package/esm/src/guardrails/destinations.d.ts +45 -0
- package/esm/src/guardrails/destinations.js +234 -0
- package/esm/src/guardrails/detect-at.d.ts +107 -0
- package/esm/src/guardrails/detect-at.js +434 -0
- package/esm/src/guardrails/detect-reply.d.ts +61 -0
- package/esm/src/guardrails/detect-reply.js +95 -0
- package/esm/src/guardrails/detect-stream.d.ts +33 -0
- package/esm/src/guardrails/detect-stream.js +77 -0
- package/esm/src/guardrails/detectors.d.ts +216 -0
- package/esm/src/guardrails/detectors.js +503 -0
- package/esm/src/guardrails/egress-automata.d.ts +4 -6
- package/esm/src/guardrails/egress-automata.js +24095 -4572
- package/esm/src/guardrails/egress-compiler.d.ts +38 -16
- package/esm/src/guardrails/egress-compiler.js +254 -60
- package/esm/src/guardrails/egress-patterns.d.ts +4 -2
- package/esm/src/guardrails/egress-patterns.js +6 -2
- package/esm/src/guardrails/egress-stream.d.ts +54 -36
- package/esm/src/guardrails/egress-stream.js +253 -124
- package/esm/src/guardrails/egress-urls.d.ts +6 -3
- package/esm/src/guardrails/egress-urls.js +14 -22
- package/esm/src/guardrails/egress.d.ts +26 -86
- package/esm/src/guardrails/egress.js +59 -309
- package/esm/src/guardrails/error.d.ts +13 -8
- package/esm/src/guardrails/error.js +23 -18
- package/esm/src/guardrails/event-schemas.d.ts +46 -3
- package/esm/src/guardrails/event-schemas.js +12 -5
- package/esm/src/guardrails/events.d.ts +5 -1
- package/esm/src/guardrails/events.js +4 -1
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +7 -1
- package/esm/src/guardrails/hits.js +12 -1
- package/esm/src/guardrails/host-patterns.d.ts +85 -0
- package/esm/src/guardrails/host-patterns.js +173 -0
- package/esm/src/guardrails/injection-patterns.d.ts +6 -1
- package/esm/src/guardrails/injection-patterns.js +33 -1
- package/esm/src/guardrails/injection-reversed.d.ts +9 -0
- package/esm/src/guardrails/injection-reversed.js +49 -0
- package/esm/src/guardrails/injection.d.ts +17 -1
- package/esm/src/guardrails/injection.js +259 -36
- package/esm/src/guardrails/labels.d.ts +40 -0
- package/esm/src/guardrails/labels.js +874 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
- package/esm/src/guardrails/live-outbound-gate.js +100 -107
- package/esm/src/guardrails/mod.d.ts +29 -21
- package/esm/src/guardrails/mod.js +18 -13
- package/esm/src/guardrails/network.d.ts +4 -0
- package/esm/src/guardrails/network.js +21 -19
- package/esm/src/guardrails/normalize.d.ts +15 -1
- package/esm/src/guardrails/normalize.js +34 -1
- package/esm/src/guardrails/policy.d.ts +2 -17
- package/esm/src/guardrails/policy.js +12 -41
- package/esm/src/guardrails/progressive-yield.d.ts +65 -24
- package/esm/src/guardrails/progressive-yield.js +191 -147
- package/esm/src/guardrails/prompt-echo.d.ts +4 -2
- package/esm/src/guardrails/prompt-echo.js +87 -6
- package/esm/src/guardrails/quota.d.ts +1 -0
- package/esm/src/guardrails/quota.js +1 -1
- package/esm/src/guardrails/rules.d.ts +20 -29
- package/esm/src/guardrails/rules.js +23 -30
- package/esm/src/guardrails/sanitize.d.ts +32 -15
- package/esm/src/guardrails/sanitize.js +100 -124
- package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
- package/esm/src/guardrails/sensitive-groups.js +12 -0
- package/esm/src/guardrails/sensitive.d.ts +16 -23
- package/esm/src/guardrails/sensitive.js +168 -47
- package/esm/src/guardrails/serialize.d.ts +1 -0
- package/esm/src/guardrails/testing.d.ts +4 -2
- package/esm/src/guardrails/testing.js +4 -2
- package/esm/src/guardrails/theorem-error.d.ts +4 -1
- package/esm/src/guardrails/theorem-error.js +3 -2
- package/esm/src/guardrails/thought-guard.d.ts +34 -13
- package/esm/src/guardrails/thought-guard.js +264 -64
- package/esm/src/guardrails/tool-directives.d.ts +29 -10
- package/esm/src/guardrails/tool-directives.js +133 -47
- package/esm/src/guardrails/tool-leak.d.ts +26 -0
- package/esm/src/guardrails/tool-leak.js +45 -0
- package/esm/src/guardrails/tool-result.d.ts +45 -14
- package/esm/src/guardrails/tool-result.js +94 -70
- package/esm/src/guardrails/types.d.ts +79 -71
- package/esm/src/guardrails/types.js +11 -7
- package/esm/src/host/client-turn.d.ts +29 -2
- package/esm/src/host/client-turn.js +46 -4
- package/esm/src/host/mint-trace.d.ts +1 -0
- package/esm/src/host/mint-trace.js +3 -2
- package/esm/src/host/mod.d.ts +2 -2
- package/esm/src/host/mod.js +1 -1
- package/esm/src/host/readStreamingJsonStringField.js +2 -43
- package/esm/src/host/reply.d.ts +6 -0
- package/esm/src/host/reply.js +7 -1
- package/esm/src/interface/blocks.d.ts +3 -0
- package/esm/src/interface/blocks.js +84 -14
- package/esm/src/interface/composer-actions.d.ts +4 -0
- package/esm/src/interface/composer-actions.js +5 -3
- package/esm/src/interface/draft.d.ts +6 -0
- package/esm/src/interface/draft.js +22 -11
- package/esm/src/interface/from-profile.d.ts +13 -1
- package/esm/src/interface/from-profile.js +66 -31
- package/esm/src/interface/history.d.ts +9 -3
- package/esm/src/interface/history.js +33 -24
- package/esm/src/interface/inputs.d.ts +1 -0
- package/esm/src/interface/inputs.js +3 -0
- package/esm/src/interface/mod.d.ts +4 -2
- package/esm/src/interface/mod.js +3 -2
- package/esm/src/interface/models.d.ts +7 -0
- package/esm/src/interface/models.js +5 -0
- package/esm/src/interface/pending.d.ts +9 -0
- package/esm/src/interface/pending.js +9 -3
- package/esm/src/interface/profile-interface.js +54 -40
- package/esm/src/interface/session.d.ts +12 -5
- package/esm/src/interface/session.js +17 -10
- package/esm/src/interface/stop.d.ts +13 -0
- package/esm/src/interface/stop.js +28 -0
- package/esm/src/interface/tool-calls.d.ts +14 -2
- package/esm/src/interface/tool-calls.js +64 -10
- package/esm/src/interface/tool-invoke.d.ts +2 -0
- package/esm/src/interface/tool-invoke.js +3 -1
- package/esm/src/interface/tool-media.d.ts +2 -0
- package/esm/src/interface/tool-media.js +2 -1
- package/esm/src/interface/types.d.ts +105 -40
- package/esm/src/interface/types.js +1 -0
- package/esm/src/kernel/api-catalog.d.ts +85 -0
- package/esm/src/kernel/api-catalog.js +229 -0
- package/esm/src/kernel/auth/crypto.d.ts +7 -2
- package/esm/src/kernel/auth/crypto.js +12 -10
- package/esm/src/kernel/auth/oauth.d.ts +2 -1
- package/esm/src/kernel/auth/oauth.js +23 -22
- package/esm/src/kernel/auth/typed-secret.js +2 -2
- package/esm/src/kernel/auth/types.d.ts +13 -0
- package/esm/src/kernel/checkpoint.d.ts +43 -0
- package/esm/src/kernel/checkpoint.js +58 -0
- package/esm/src/kernel/default-scope.d.ts +43 -5
- package/esm/src/kernel/default-scope.js +54 -5
- package/esm/src/kernel/engine/call-trace.d.ts +19 -0
- package/esm/src/kernel/engine/call-trace.js +29 -0
- package/esm/src/kernel/engine/compaction.d.ts +6 -5
- package/esm/src/kernel/engine/compaction.js +12 -11
- package/esm/src/kernel/engine/decision.d.ts +10 -8
- package/esm/src/kernel/engine/decision.js +173 -146
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
- package/esm/src/kernel/engine/live-inbound.js +36 -11
- package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
- package/esm/src/kernel/engine/live-ingress.js +6 -1
- package/esm/src/kernel/engine/repair.js +12 -12
- package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
- package/esm/src/kernel/engine/runner/gates.js +287 -101
- package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
- package/esm/src/kernel/engine/runner/mod.js +107 -56
- package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
- package/esm/src/kernel/engine/runner/nested.js +134 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
- package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
- package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
- package/esm/src/kernel/engine/runner/stages.js +1 -8
- package/esm/src/kernel/engine/runner/state.d.ts +33 -12
- package/esm/src/kernel/engine/runner/state.js +11 -1
- package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
- package/esm/src/kernel/engine/runner/step-order.js +165 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
- package/esm/src/kernel/engine/runner/steps.js +328 -169
- package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
- package/esm/src/kernel/engine/runner/stream.js +197 -46
- package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
- package/esm/src/kernel/engine/runner/usage.js +12 -14
- package/esm/src/kernel/engine/session/mod.d.ts +8 -6
- package/esm/src/kernel/engine/session/mod.js +360 -129
- package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
- package/esm/src/kernel/engine/session/session-trace.js +41 -30
- package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
- package/esm/src/kernel/engine/token-estimate.js +14 -194
- package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
- package/esm/src/kernel/engine/tool-trace.js +2 -1
- package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
- package/esm/src/kernel/engine/turn-trace.js +28 -36
- package/esm/src/kernel/engine/usage.d.ts +6 -0
- package/esm/src/kernel/engine/usage.js +17 -0
- package/esm/src/kernel/interaction-parts.d.ts +3 -0
- package/esm/src/kernel/interaction-parts.js +18 -0
- package/esm/src/kernel/json.d.ts +10 -0
- package/esm/src/kernel/json.js +3 -0
- package/esm/src/kernel/mod.d.ts +38 -11
- package/esm/src/kernel/mod.js +22 -7
- package/esm/src/kernel/profile-graph.d.ts +11 -6
- package/esm/src/kernel/profile-graph.js +14 -7
- package/esm/src/kernel/profile-presence.d.ts +10 -1
- package/esm/src/kernel/profile-presence.js +90 -75
- package/esm/src/kernel/profile-scope.d.ts +7 -3
- package/esm/src/kernel/profile-scope.js +67 -55
- package/esm/src/kernel/protocols/binding.d.ts +65 -0
- package/esm/src/kernel/protocols/binding.js +125 -0
- package/esm/src/kernel/protocols/limits.d.ts +15 -0
- package/esm/src/kernel/protocols/limits.js +28 -0
- package/esm/src/kernel/protocols/mod.d.ts +5 -0
- package/esm/src/kernel/protocols/mod.js +5 -0
- package/esm/src/kernel/protocols/prices.d.ts +36 -0
- package/esm/src/kernel/protocols/prices.js +37 -0
- package/esm/src/kernel/protocols/protocol.d.ts +253 -0
- package/esm/src/kernel/protocols/protocol.js +253 -0
- package/esm/src/kernel/protocols/provider.d.ts +108 -0
- package/esm/src/kernel/protocols/provider.js +143 -0
- package/esm/src/kernel/protocols/runtime.d.ts +55 -0
- package/esm/src/kernel/protocols/runtime.js +534 -0
- package/esm/src/kernel/provider-budget.d.ts +32 -0
- package/esm/src/kernel/provider-budget.js +262 -0
- package/esm/src/kernel/provider-dispatch.d.ts +13 -0
- package/esm/src/kernel/provider-dispatch.js +36 -0
- package/esm/src/kernel/provider-live.d.ts +7 -0
- package/esm/src/kernel/provider-live.js +189 -0
- package/esm/src/kernel/provider-runtime.d.ts +57 -0
- package/esm/src/kernel/provider-runtime.js +524 -0
- package/esm/src/kernel/registry/attachments.d.ts +15 -4
- package/esm/src/kernel/registry/attachments.js +31 -22
- package/esm/src/kernel/registry/catalog.d.ts +6 -0
- package/esm/src/kernel/registry/catalog.js +9 -2
- package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
- package/esm/src/kernel/registry/embedding-rules.js +66 -0
- package/esm/src/kernel/registry/ingress.d.ts +6 -2
- package/esm/src/kernel/registry/ingress.js +55 -10
- package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
- package/esm/src/kernel/registry/kernel-registry.js +9 -2
- package/esm/src/kernel/registry/profile-outputs.js +4 -1
- package/esm/src/kernel/registry/profiles.d.ts +38 -14
- package/esm/src/kernel/registry/profiles.js +280 -205
- package/esm/src/kernel/registry/provider-request.d.ts +3 -3
- package/esm/src/kernel/registry/provider-request.js +5 -13
- package/esm/src/kernel/registry/resolve.d.ts +4 -1
- package/esm/src/kernel/registry/resolve.js +59 -58
- package/esm/src/kernel/registry/schemas.d.ts +3 -0
- package/esm/src/kernel/registry/schemas.js +3 -1
- package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
- package/esm/src/kernel/registry/slot-fill.js +22 -0
- package/esm/src/kernel/registry/system-prompt.js +7 -8
- package/esm/src/kernel/registry/vault.d.ts +14 -13
- package/esm/src/kernel/registry/vault.js +1 -14
- package/esm/src/kernel/schema.d.ts +100 -46
- package/esm/src/kernel/schema.js +499 -257
- package/esm/src/kernel/scope.d.ts +12 -5
- package/esm/src/kernel/scope.js +23 -3
- package/esm/src/kernel/stages.d.ts +38 -3
- package/esm/src/kernel/stages.js +82 -39
- package/esm/src/kernel/stop.d.ts +29 -6
- package/esm/src/kernel/stop.js +16 -4
- package/esm/src/kernel/system-parts.js +6 -6
- package/esm/src/kernel/tools/activity-label.d.ts +12 -6
- package/esm/src/kernel/tools/activity-label.js +258 -32
- package/esm/src/kernel/tools/agent.d.ts +66 -0
- package/esm/src/kernel/tools/agent.js +212 -0
- package/esm/src/kernel/tools/coordinate.d.ts +4 -0
- package/esm/src/kernel/tools/coordinate.js +165 -0
- package/esm/src/kernel/tools/events.d.ts +21 -6
- package/esm/src/kernel/tools/events.js +53 -18
- package/esm/src/kernel/tools/execute.d.ts +47 -11
- package/esm/src/kernel/tools/execute.js +508 -136
- package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
- package/esm/src/kernel/tools/gate-answer.js +17 -6
- package/esm/src/kernel/tools/handler-events.d.ts +45 -0
- package/esm/src/kernel/tools/handler-events.js +106 -0
- package/esm/src/kernel/tools/harness.d.ts +1 -0
- package/esm/src/kernel/tools/harness.js +2 -1
- package/esm/src/kernel/tools/http-limit.d.ts +27 -0
- package/esm/src/kernel/tools/http-limit.js +85 -0
- package/esm/src/kernel/tools/invoke.d.ts +27 -5
- package/esm/src/kernel/tools/invoke.js +223 -70
- package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
- package/esm/src/kernel/tools/mcp-sessions.js +13 -8
- package/esm/src/kernel/tools/mod.d.ts +4 -3
- package/esm/src/kernel/tools/mod.js +3 -2
- package/esm/src/kernel/tools/model-text.d.ts +10 -5
- package/esm/src/kernel/tools/model-text.js +18 -12
- package/esm/src/kernel/tools/operation.d.ts +76 -0
- package/esm/src/kernel/tools/operation.js +100 -0
- package/esm/src/kernel/tools/page-answer.d.ts +8 -0
- package/esm/src/kernel/tools/page-answer.js +19 -0
- package/esm/src/kernel/tools/permission.d.ts +11 -2
- package/esm/src/kernel/tools/permission.js +12 -12
- package/esm/src/kernel/tools/project.d.ts +4 -1
- package/esm/src/kernel/tools/project.js +32 -2
- package/esm/src/kernel/tools/registry.d.ts +9 -2
- package/esm/src/kernel/tools/registry.js +69 -10
- package/esm/src/kernel/tools/remote.d.ts +40 -6
- package/esm/src/kernel/tools/remote.js +219 -92
- package/esm/src/kernel/tools/resolve.d.ts +3 -0
- package/esm/src/kernel/tools/resolve.js +12 -4
- package/esm/src/kernel/tools/run.d.ts +28 -0
- package/esm/src/kernel/tools/run.js +86 -0
- package/esm/src/kernel/tools/schema.d.ts +3 -3
- package/esm/src/kernel/tools/schema.js +21 -100
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
- package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
- package/esm/src/kernel/tools/stage-run.d.ts +27 -4
- package/esm/src/kernel/tools/stage-run.js +75 -17
- package/esm/src/kernel/tools/types.d.ts +235 -25
- package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
- package/esm/src/kernel/tools/unchecked-output.js +18 -0
- package/esm/src/kernel/turn-events.d.ts +208 -31
- package/esm/src/kernel/turn-events.js +127 -9
- package/esm/src/kernel/types.d.ts +302 -161
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +2 -0
- package/esm/src/kernel/util/partial-json.d.ts +23 -0
- package/esm/src/kernel/util/partial-json.js +128 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +1 -0
- package/esm/src/observability/destinations.d.ts +5 -0
- package/esm/src/observability/destinations.js +7 -2
- package/esm/src/observability/jsonl.d.ts +2 -2
- package/esm/src/observability/jsonl.js +15 -22
- package/esm/src/observability/mod.d.ts +3 -3
- package/esm/src/observability/mod.js +2 -2
- package/esm/src/observability/openinference.d.ts +1 -1
- package/esm/src/observability/openinference.js +3 -3
- package/esm/src/observability/otlp.d.ts +3 -0
- package/esm/src/observability/otlp.js +3 -3
- package/esm/src/observability/phoenix.d.ts +1 -0
- package/esm/src/observability/policy.d.ts +3 -0
- package/esm/src/observability/policy.js +5 -1
- package/esm/src/observability/resolve-policy.js +11 -5
- package/esm/src/observability/spans.d.ts +8 -2
- package/esm/src/observability/spans.js +21 -5
- package/esm/src/observability/trace-catalog.d.ts +19 -2
- package/esm/src/observability/trace-catalog.js +128 -87
- package/esm/src/observability/trace-record.js +22 -17
- package/esm/src/observability/trace-schema.d.ts +3 -0
- package/esm/src/observability/trace-schema.js +1 -1
- package/esm/src/observability/trace-sink.d.ts +1 -0
- package/esm/src/observability/trace-sink.js +1 -1
- package/esm/src/observability/trace-span.d.ts +7 -1
- package/esm/src/observability/trace-span.js +3 -1
- package/esm/src/observability/trace.d.ts +2 -0
- package/esm/src/observability/trace.js +4 -2
- package/esm/src/observability/types.d.ts +35 -11
- package/esm/src/observability/types.js +1 -1
- package/esm/src/presets/google/speech-voices.d.ts +1 -0
- package/esm/src/presets/google-limits.d.ts +1 -0
- package/esm/src/presets/google.d.ts +27 -12
- package/esm/src/presets/google.js +34 -25
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +5 -4
- package/esm/src/presets/mod.js +4 -4
- package/esm/src/presets/openrouter.d.ts +14 -1
- package/esm/src/presets/openrouter.js +19 -1
- package/esm/src/providers/embedding-limits.d.ts +7 -0
- package/esm/src/providers/embedding-limits.js +12 -0
- package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/embedding-protocol.js +125 -0
- package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/interactions-protocol.js +105 -0
- package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
- package/esm/src/providers/gemini/live-protocol.js +191 -0
- package/esm/src/providers/gemini/prices.d.ts +3 -0
- package/esm/src/providers/gemini/prices.js +63 -0
- package/esm/src/providers/gemini/provider.d.ts +7 -0
- package/esm/src/providers/gemini/provider.js +39 -0
- package/esm/src/providers/google/builtins.d.ts +14 -0
- package/esm/src/providers/google/builtins.js +57 -0
- package/esm/src/providers/google/grounding.d.ts +4 -4
- package/esm/src/providers/google/interactions/framing.d.ts +20 -8
- package/esm/src/providers/google/interactions/framing.js +85 -44
- package/esm/src/providers/google/interactions/steps.d.ts +5 -5
- package/esm/src/providers/google/interactions/steps.js +4 -4
- package/esm/src/providers/google/interactions/stream.d.ts +10 -11
- package/esm/src/providers/google/interactions/stream.js +33 -100
- package/esm/src/providers/google/live/framing.d.ts +15 -5
- package/esm/src/providers/google/live/framing.js +25 -25
- package/esm/src/providers/google/live/stream.d.ts +6 -44
- package/esm/src/providers/google/live/stream.js +3 -209
- package/esm/src/providers/google/urls.d.ts +1 -3
- package/esm/src/providers/google/urls.js +1 -3
- package/esm/src/providers/google/usage.js +2 -2
- package/esm/src/providers/live.d.ts +6 -0
- package/esm/src/providers/live.js +6 -0
- package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
- package/esm/src/providers/local/embedding-protocol.js +60 -0
- package/esm/src/providers/local/provider.d.ts +7 -0
- package/esm/src/providers/local/provider.js +28 -0
- package/esm/src/providers/mod.d.ts +28 -7
- package/esm/src/providers/mod.js +19 -3
- package/esm/src/providers/open-ai/protocol.d.ts +3 -0
- package/esm/src/providers/open-ai/protocol.js +189 -0
- package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
- package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
- package/esm/src/providers/openrouter/image.d.ts +0 -9
- package/esm/src/providers/openrouter/image.js +0 -153
- package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
- package/esm/src/providers/openrouter/images-protocol.js +82 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/compat.js +6 -6
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
- package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
- package/esm/src/providers/openrouter/protocol.d.ts +8 -0
- package/esm/src/providers/openrouter/protocol.js +171 -0
- package/esm/src/providers/openrouter/provider.d.ts +10 -0
- package/esm/src/providers/openrouter/provider.js +50 -0
- package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
- package/esm/src/providers/shared/carried-tool-files.js +43 -0
- package/esm/src/providers/shared/pcm.js +2 -2
- package/esm/src/providers/shared/protocol-events.d.ts +8 -0
- package/esm/src/providers/shared/protocol-events.js +20 -0
- package/esm/src/providers/shared/response-identity.d.ts +2 -2
- package/esm/src/providers/shared/retry.d.ts +17 -0
- package/esm/src/providers/shared/retry.js +90 -0
- package/esm/src/providers/shared/sse.d.ts +0 -4
- package/esm/src/providers/shared/sse.js +50 -36
- package/esm/src/providers/shared/tool-args.d.ts +6 -7
- package/esm/src/providers/shared/tool-args.js +10 -6
- package/esm/src/providers/shared/tool-draft.d.ts +16 -0
- package/esm/src/providers/shared/tool-draft.js +14 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
- package/esm/src/providers/shared/upstream-tape.js +1 -1
- package/esm/src/providers/system-one/protocol.d.ts +8 -0
- package/esm/src/providers/system-one/protocol.js +93 -0
- package/esm/src/providers/types.d.ts +48 -16
- package/esm/src/providers/types.js +2 -1
- package/esm/src/providers/typesafe/provider.d.ts +7 -0
- package/esm/src/providers/typesafe/provider.js +24 -0
- package/esm/src/surface/formats.d.ts +19 -1
- package/esm/src/surface/formats.js +68 -29
- package/esm/src/surface/mod.d.ts +4 -2
- package/esm/src/surface/mod.js +4 -2
- package/esm/src/surface/runtime.d.ts +4 -0
- package/esm/src/surface/runtime.js +2 -0
- package/esm/src/surface/tools.d.ts +2 -8
- package/esm/src/surface/tools.js +4 -22
- package/esm/src/surface/types.d.ts +6 -0
- package/package.json +5 -13
- package/esm/src/cli/commands/egress-compile.d.ts +0 -17
- package/esm/src/cli/commands/egress-compile.js +0 -25
- package/esm/src/guardrails/egress-policy.d.ts +0 -27
- package/esm/src/guardrails/egress-policy.js +0 -76
- package/esm/src/guardrails/egress-rules.d.ts +0 -54
- package/esm/src/guardrails/egress-rules.js +0 -49
- package/esm/src/guardrails/lexicon.d.ts +0 -30
- package/esm/src/guardrails/lexicon.js +0 -478
- package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
- package/esm/src/kernel/engine/media-probe/audio.js +0 -342
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
- package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
- package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/image.js +0 -171
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
- package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
- package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
- package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
- package/esm/src/kernel/engine/media-probe/opus.js +0 -23
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
- package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
- package/esm/src/kernel/engine/media-probe/video.js +0 -49
- package/esm/src/presets/typesafe.d.ts +0 -2
- package/esm/src/presets/typesafe.js +0 -2
- package/esm/src/providers/create-provider.d.ts +0 -21
- package/esm/src/providers/create-provider.js +0 -90
- package/esm/src/providers/decision/usage.d.ts +0 -3
- package/esm/src/providers/decision/usage.js +0 -25
- package/esm/src/providers/google/interactions/mod.d.ts +0 -2
- package/esm/src/providers/google/interactions/mod.js +0 -2
- package/esm/src/providers/google/keys.d.ts +0 -20
- package/esm/src/providers/google/keys.js +0 -87
- package/esm/src/providers/google/live/mod.d.ts +0 -7
- package/esm/src/providers/google/live/mod.js +0 -7
- package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
- package/esm/src/providers/google/live/openapi-schema.js +0 -42
- package/esm/src/providers/google/live/session.d.ts +0 -14
- package/esm/src/providers/google/live/session.js +0 -150
- package/esm/src/providers/local/local.d.ts +0 -12
- package/esm/src/providers/local/local.js +0 -186
- package/esm/src/providers/local/mod.d.ts +0 -8
- package/esm/src/providers/local/mod.js +0 -8
- package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
- package/esm/src/providers/openrouter/cache-control.js +0 -4
- package/esm/src/providers/openrouter/chat.d.ts +0 -64
- package/esm/src/providers/openrouter/chat.js +0 -490
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
- package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
- package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
- package/esm/src/providers/openrouter/speech.d.ts +0 -18
- package/esm/src/providers/openrouter/speech.js +0 -109
- package/esm/src/providers/probe.d.ts +0 -5
- package/esm/src/providers/probe.js +0 -15
- package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
- package/esm/src/providers/shared/builtin-wire.js +0 -9
- package/esm/src/providers/shared/vault.d.ts +0 -13
- package/esm/src/providers/shared/vault.js +0 -41
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import type { TraceSink } from '../../../observability/trace-sink.js';
|
|
2
2
|
import { type SpanHandle, type TraceAttributes, type TraceTree } from '../../../observability/trace-span.js';
|
|
3
|
-
import type {
|
|
4
|
-
import type
|
|
3
|
+
import type { ResolvedObservabilityPolicy } from '../../../observability/types.js';
|
|
4
|
+
import { type LiveQueueItem } from '../../../providers/types.js';
|
|
5
5
|
import type { TurnEventOf } from '../../turn-events.js';
|
|
6
|
-
import type { ModelBinding,
|
|
7
|
-
import type { MediaTokenFamily } from '../token-estimate.js';
|
|
6
|
+
import type { ModelBinding, ModelRequest, Profile, ResolvedGeneration, SessionRequest, TurnEvent } from '../../types.js';
|
|
8
7
|
type LiveCloser = 'host' | 'provider' | 'theorem';
|
|
9
8
|
interface LiveTraceBinding {
|
|
10
|
-
request:
|
|
9
|
+
request: ModelRequest;
|
|
11
10
|
generation: ResolvedGeneration;
|
|
12
11
|
binding: ModelBinding | undefined;
|
|
13
|
-
family: MediaTokenFamily | undefined;
|
|
14
12
|
/** The system prompt as sent, canary bound. */
|
|
15
13
|
system: string;
|
|
16
14
|
canary: string;
|
|
@@ -41,6 +39,8 @@ declare class LiveTrace {
|
|
|
41
39
|
private endedByGoAway;
|
|
42
40
|
private socketHasClosed;
|
|
43
41
|
private closing?;
|
|
42
|
+
/** Canaries bound by the turns this session's agent tools ran: scrubbed from every record after. */
|
|
43
|
+
readonly agentCanaries: string[];
|
|
44
44
|
constructor(tree: TraceTree, out: {
|
|
45
45
|
sink: TraceSink;
|
|
46
46
|
policy: ResolvedObservabilityPolicy;
|
|
@@ -54,7 +54,7 @@ declare class LiveTrace {
|
|
|
54
54
|
private keyFallback;
|
|
55
55
|
setup(frame: Record<string, unknown>): void;
|
|
56
56
|
/** One received queue item, before guardrails. */
|
|
57
|
-
receive(item:
|
|
57
|
+
receive(item: LiveQueueItem): void;
|
|
58
58
|
/**
|
|
59
59
|
* One event as the host received it. Output reaches the host only after
|
|
60
60
|
* `receive` opened its response, so every output part lands on the open one;
|
|
@@ -74,7 +74,7 @@ declare class LiveTrace {
|
|
|
74
74
|
* session. A provider close carries its warning (`goAway`) and what the code
|
|
75
75
|
* means as a failure, so a warned close stays fully diagnosable.
|
|
76
76
|
*/
|
|
77
|
-
socketClosed(code: number, reason: string, initiator: LiveCloser, provider?: Extract<
|
|
77
|
+
socketClosed(code: number, reason: string, initiator: LiveCloser, provider?: Extract<LiveQueueItem, {
|
|
78
78
|
type: 'closed';
|
|
79
79
|
}>): void;
|
|
80
80
|
/**
|
|
@@ -108,8 +108,8 @@ declare class LiveTrace {
|
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
110
110
|
* Open a session's trace: its `invoke_agent` span under the host's `traceparent`,
|
|
111
|
-
* written under
|
|
111
|
+
* written under the session's profile's `observability` and cleaned with its detectors.
|
|
112
112
|
*/
|
|
113
|
-
declare function startLiveTrace(req: SessionRequest,
|
|
113
|
+
declare function startLiveTrace(req: SessionRequest, profile: Pick<Profile, 'observability' | 'guardrails'> | undefined, sinkOverride?: TraceSink): LiveTrace;
|
|
114
114
|
export type { LiveCloser, LiveTrace, LiveTraceBinding, LiveTraceEnd };
|
|
115
115
|
export { startLiveTrace };
|
|
@@ -3,8 +3,8 @@ import { resolveTraceWriter } from '../../../observability/policy.js';
|
|
|
3
3
|
import { writeTrace } from '../../../observability/trace.js';
|
|
4
4
|
import { buildRecord } from '../../../observability/trace-record.js';
|
|
5
5
|
import { startTrace, traceJson, } from '../../../observability/trace-span.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { liveSentInput } from '../../../providers/live.js';
|
|
7
|
+
import { KEY_FALLBACK_ROW } from '../../../providers/types.js';
|
|
8
8
|
import { base64ToBytes, bytesToBase64 } from '../../util/base64.js';
|
|
9
9
|
import { asRecord } from '../record.js';
|
|
10
10
|
import { callTokensEvent, heldAfter, observeCallEvent, startCallUsage, } from '../runner/usage.js';
|
|
@@ -33,7 +33,7 @@ function audioRunParts(run) {
|
|
|
33
33
|
return [{ type: 'audio', mimeType: run.mimeType, data: bytesToBase64(merged) }];
|
|
34
34
|
}
|
|
35
35
|
catch {
|
|
36
|
-
// Not base64: keep each chunk as sent, so the record labels what it holds.
|
|
36
|
+
// why: Not base64: keep each chunk as sent, so the record labels what it holds.
|
|
37
37
|
return run.chunks.map((data) => ({ type: 'audio', mimeType: run.mimeType, data }));
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -109,7 +109,7 @@ function sessionSignal(event) {
|
|
|
109
109
|
}
|
|
110
110
|
return undefined;
|
|
111
111
|
}
|
|
112
|
-
// Each record is written as soon as it is complete, so a long session never holds its whole trace.
|
|
112
|
+
// why: Each record is written as soon as it is complete, so a long session never holds its whole trace.
|
|
113
113
|
class LiveTrace {
|
|
114
114
|
tree;
|
|
115
115
|
out;
|
|
@@ -132,6 +132,8 @@ class LiveTrace {
|
|
|
132
132
|
endedByGoAway = false;
|
|
133
133
|
socketHasClosed = false;
|
|
134
134
|
closing;
|
|
135
|
+
/** Canaries bound by the turns this session's agent tools ran: scrubbed from every record after. */
|
|
136
|
+
agentCanaries = [];
|
|
135
137
|
constructor(tree, out, identity) {
|
|
136
138
|
this.tree = tree;
|
|
137
139
|
this.out = out;
|
|
@@ -144,10 +146,16 @@ class LiveTrace {
|
|
|
144
146
|
}
|
|
145
147
|
/** The adapter's `tapUpstream`: every frame sent, as it is sent. */
|
|
146
148
|
sent = (row) => {
|
|
147
|
-
if (row.eventType ===
|
|
149
|
+
if (row.eventType === KEY_FALLBACK_ROW) {
|
|
148
150
|
this.keyFallback(row);
|
|
149
151
|
return;
|
|
150
152
|
}
|
|
153
|
+
if (row.direction === 'receive') {
|
|
154
|
+
const body = asRecord(row.body);
|
|
155
|
+
if (body)
|
|
156
|
+
this.row(body);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
151
159
|
const frame = asRecord(row.body);
|
|
152
160
|
if (!frame)
|
|
153
161
|
return;
|
|
@@ -156,22 +164,21 @@ class LiveTrace {
|
|
|
156
164
|
this.root.event('theorem.wire.request', { body: traceJson(body) });
|
|
157
165
|
return;
|
|
158
166
|
}
|
|
159
|
-
this.pendingInput.add(
|
|
167
|
+
this.pendingInput.add(liveSentInput(row));
|
|
160
168
|
this.pendingFrames.push({ timeUnixNano: this.root.nowUnixNano(), body });
|
|
161
169
|
};
|
|
162
170
|
/** The pinned key was refused for quota at setup; the session reopens on the fallback slot, which its responses name. */
|
|
163
171
|
keyFallback(row) {
|
|
164
|
-
const to = String(row.keySlot);
|
|
165
172
|
this.root.event('theorem.session', {
|
|
166
173
|
kind: 'key_fallback',
|
|
167
174
|
key_slot: String(row.from),
|
|
168
|
-
to_key_slot:
|
|
175
|
+
to_key_slot: String(row.keySlot),
|
|
169
176
|
'error.type': String(row.errorKind),
|
|
170
177
|
error: String(row.error),
|
|
171
178
|
});
|
|
172
179
|
const bound = this.bound;
|
|
173
|
-
if (bound)
|
|
174
|
-
this.bound = { ...bound,
|
|
180
|
+
if (bound?.binding)
|
|
181
|
+
this.bound = { ...bound, binding: { ...bound.binding, keySlot: String(row.keySlot) } };
|
|
175
182
|
}
|
|
176
183
|
setup(frame) {
|
|
177
184
|
this.root.event('theorem.upstream.row', { row: traceJson(frame) });
|
|
@@ -195,7 +202,7 @@ class LiveTrace {
|
|
|
195
202
|
return;
|
|
196
203
|
case 'closed':
|
|
197
204
|
this.socketClosed(item.code, item.reason, 'provider', item);
|
|
198
|
-
// A close the provider warned of ends the session; it is not the session's failure.
|
|
205
|
+
// why: A close the provider warned of ends the session; it is not the session's failure.
|
|
199
206
|
if (item.goAway)
|
|
200
207
|
this.endedByGoAway = true;
|
|
201
208
|
else
|
|
@@ -303,7 +310,7 @@ class LiveTrace {
|
|
|
303
310
|
if (this.response) {
|
|
304
311
|
await this.endResponse(thrown === undefined ? { cancelled: true } : { thrown });
|
|
305
312
|
}
|
|
306
|
-
// Sent after the last response: no response read it.
|
|
313
|
+
// why: Sent after the last response: no response read it.
|
|
307
314
|
for (const frame of this.pendingFrames) {
|
|
308
315
|
this.root.event('theorem.wire.request', { body: traceJson(frame.body) }, frame.timeUnixNano);
|
|
309
316
|
}
|
|
@@ -319,7 +326,7 @@ class LiveTrace {
|
|
|
319
326
|
endThrownSpan(this.root, thrown);
|
|
320
327
|
}
|
|
321
328
|
else {
|
|
322
|
-
// A warned close is no verdict: neither failed nor known to be fine.
|
|
329
|
+
// why: A warned close is no verdict: neither failed nor known to be fine.
|
|
323
330
|
this.root.end(aborted || this.endedByGoAway ? { code: 'UNSET' } : { code: 'OK' });
|
|
324
331
|
}
|
|
325
332
|
this.write(this.tree.collect());
|
|
@@ -340,7 +347,7 @@ class LiveTrace {
|
|
|
340
347
|
}
|
|
341
348
|
const kind = event.type === 'evidence' ? event.evidence.kind : undefined;
|
|
342
349
|
if (kind === 'input_transcription' && !(this.response && !this.response.answering)) {
|
|
343
|
-
// Heard after the model began answering: input for the next response.
|
|
350
|
+
// why: Heard after the model began answering: input for the next response.
|
|
344
351
|
this.pendingHeard.push(event);
|
|
345
352
|
return;
|
|
346
353
|
}
|
|
@@ -352,7 +359,7 @@ class LiveTrace {
|
|
|
352
359
|
observeCallEvent(response.usage, event);
|
|
353
360
|
response.call.observe(event);
|
|
354
361
|
if (!response.answering && (OUTPUT_EVENTS.has(event.type) || kind === 'output_transcription')) {
|
|
355
|
-
// The reply's first chunk, from the response's first input frame: what a person waited.
|
|
362
|
+
// why: The reply's first chunk, from the response's first input frame: what a person waited.
|
|
356
363
|
response.call.span.set({
|
|
357
364
|
'gen_ai.response.time_to_first_chunk': response.call.span.msSinceStart() / MS_PER_S,
|
|
358
365
|
});
|
|
@@ -361,7 +368,9 @@ class LiveTrace {
|
|
|
361
368
|
if (event.type === 'tool' && event.tool.phase === undefined) {
|
|
362
369
|
this.callParents.set(event.tool.callId, response.call.span.traceparent());
|
|
363
370
|
}
|
|
364
|
-
if (event.type === 'done' &&
|
|
371
|
+
if (event.type === 'done' &&
|
|
372
|
+
response.stop?.kind !== 'interrupted' &&
|
|
373
|
+
!(event.stop.kind === 'completed' && response.stop?.kind === 'generation_complete')) {
|
|
365
374
|
response.stop = event.stop;
|
|
366
375
|
}
|
|
367
376
|
}
|
|
@@ -374,17 +383,17 @@ class LiveTrace {
|
|
|
374
383
|
return this.response;
|
|
375
384
|
const bound = this.bound;
|
|
376
385
|
if (!bound) {
|
|
377
|
-
//
|
|
386
|
+
// labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
378
387
|
throw new TheoremError('internal', 'Live trace received a response before it was bound');
|
|
379
388
|
}
|
|
380
389
|
const usage = startCallUsage(bound.system, { history: [], input: [] }, this.held);
|
|
381
|
-
// A response starts at its first input frame, so its duration includes the model's listening time.
|
|
390
|
+
// why: A response starts at its first input frame, so its duration includes the model's listening time.
|
|
382
391
|
const startTimeUnixNano = this.pendingFrames[0]?.timeUnixNano;
|
|
383
392
|
let tree;
|
|
384
393
|
const call = startCallTrace((name, options) => {
|
|
385
394
|
tree = startTrace(name, {
|
|
386
395
|
...options,
|
|
387
|
-
// Each record stands alone (the session record may never be written): it names its agent.
|
|
396
|
+
// why: Each record stands alone (the session record may never be written): it names its agent.
|
|
388
397
|
attributes: { ...this.identity, ...options.attributes },
|
|
389
398
|
traceparent: this.root.traceparent(),
|
|
390
399
|
clock: this.tree.clock,
|
|
@@ -399,10 +408,10 @@ class LiveTrace {
|
|
|
399
408
|
step: this.responses + 1,
|
|
400
409
|
});
|
|
401
410
|
if (!tree) {
|
|
402
|
-
//
|
|
411
|
+
// labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
403
412
|
throw new TheoremError('internal', 'Live response span was not opened');
|
|
404
413
|
}
|
|
405
|
-
// A Live response streams over the session socket; no HTTP try says so.
|
|
414
|
+
// why: A Live response streams over the session socket; no HTTP try says so.
|
|
406
415
|
call.span.set({ 'gen_ai.request.stream': true });
|
|
407
416
|
for (const frame of this.pendingFrames) {
|
|
408
417
|
call.span.event('theorem.wire.request', { body: traceJson(frame.body) }, frame.timeUnixNano);
|
|
@@ -437,12 +446,10 @@ class LiveTrace {
|
|
|
437
446
|
this.responses += 1;
|
|
438
447
|
response.usage.conversation = { history: response.input.messages(), input: [] };
|
|
439
448
|
const answered = end.thrown === undefined && !end.cancelled;
|
|
440
|
-
const tokens = answered
|
|
441
|
-
? await callTokensEvent(response.usage, bound.generation, bound.family)
|
|
442
|
-
: undefined;
|
|
449
|
+
const tokens = answered ? await callTokensEvent(response.usage, bound.generation) : undefined;
|
|
443
450
|
if (answered)
|
|
444
|
-
this.held = await heldAfter(response.usage
|
|
445
|
-
// Beside `output.messages` (what the model produced): what the host received of it.
|
|
451
|
+
this.held = await heldAfter(response.usage);
|
|
452
|
+
// why: Beside `output.messages` (what the model produced): what the host received of it.
|
|
446
453
|
response.call.span.set({
|
|
447
454
|
'theorem.output.delivered': [{ role: 'assistant', parts: response.delivered.parts }],
|
|
448
455
|
});
|
|
@@ -462,7 +469,7 @@ class LiveTrace {
|
|
|
462
469
|
const record = buildRecord({
|
|
463
470
|
spans,
|
|
464
471
|
policy: this.out.policy,
|
|
465
|
-
canaries: this.bound ? [this.bound.canary] : [],
|
|
472
|
+
canaries: [...(this.bound ? [this.bound.canary] : []), ...this.agentCanaries],
|
|
466
473
|
...(this.out.metadata ? { metadata: this.out.metadata } : {}),
|
|
467
474
|
});
|
|
468
475
|
this.writes = this.writes.then(() => writeTrace(this.out.sink, record, this.out.policy));
|
|
@@ -470,10 +477,14 @@ class LiveTrace {
|
|
|
470
477
|
}
|
|
471
478
|
/**
|
|
472
479
|
* Open a session's trace: its `invoke_agent` span under the host's `traceparent`,
|
|
473
|
-
* written under
|
|
480
|
+
* written under the session's profile's `observability` and cleaned with its detectors.
|
|
474
481
|
*/
|
|
475
|
-
function startLiveTrace(req,
|
|
476
|
-
const { sink, policy } = resolveTraceWriter({
|
|
482
|
+
function startLiveTrace(req, profile, sinkOverride) {
|
|
483
|
+
const { sink, policy } = resolveTraceWriter({
|
|
484
|
+
override: sinkOverride,
|
|
485
|
+
observability: profile?.observability,
|
|
486
|
+
guardrails: profile?.guardrails,
|
|
487
|
+
});
|
|
477
488
|
const identity = {
|
|
478
489
|
'gen_ai.agent.name': req.profile,
|
|
479
490
|
...optional('gen_ai.conversation.id', req.conversationId),
|
|
@@ -1,77 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* reports media as `unknownMedia`, never a borrowed rate.
|
|
5
|
-
*
|
|
6
|
-
* Gemini 3 (`gemini-3*` flash / pro text models, direct or via OpenRouter).
|
|
7
|
-
* Measured 22/09/2026 against the usage Gemini bills — Interactions `usage`
|
|
8
|
-
* and `generateContent` `usageMetadata` agree exactly — on gemini-3.8-flash
|
|
9
|
-
* at the default media resolution (THEOREM never sets `media_resolution`).
|
|
10
|
-
* `countTokens` is not the oracle: it reports 560 per PDF page and 32 tokens
|
|
11
|
-
* per audio second, and neither is what is billed.
|
|
12
|
-
* - image: a patch grid inside a 1120-token budget that keeps the aspect
|
|
13
|
-
* ratio — `⌊√(1120·w/h)⌋ × ⌊√(1120·h/w)⌋` (1024×1024 → 1089, 1920×1080 →
|
|
14
|
-
* 1100, 4032×3024 HEIC → 1064). Needs the pixel size from the image header.
|
|
15
|
-
* - audio: `⌈seconds × 25⌉`, seconds being decoded samples ÷ rate
|
|
16
|
-
* (`audioSeconds`): 2.2 s → 56, 0.5 s → 13. Sample rate, channels and
|
|
17
|
-
* silence do not matter. Raw PCM: bare `audio/pcm` is 16 kHz mono 16-bit;
|
|
18
|
-
* `audio/L16` needs both `rate` and `channels`. `audio/pcm` with parameters,
|
|
19
|
-
* `audio/alaw`, and `audio/mulaw` are refused by Interactions — unknown.
|
|
20
|
-
* Mono `audio/L16` is unknown: Gemini converts it first and adds text tokens
|
|
21
|
-
* no rule reproduces (about 31–33, plus 2 per second, plus 1 audio token
|
|
22
|
-
* away from 16 kHz).
|
|
23
|
-
* - video: `frames × ⌊√(70·w/h)⌋ × ⌊√(70·h/w)⌋ + ⌈min(audio, frames) × 25⌉`,
|
|
24
|
-
* `frames` = the video track's seconds rounded half up (66 per frame at
|
|
25
|
-
* 16:9, 63 at 4:3; fps, codec and container do not matter). Under half a
|
|
26
|
-
* second rounds to no frames, which Gemini refuses — unknown. MP4 / MOV /
|
|
27
|
-
* 3GP and WebM only (`videoInfo`); other containers are unknown.
|
|
28
|
-
* - PDF: 520 tokens per page. Text on the page adds nothing.
|
|
29
|
-
* - text documents (plain, Markdown, CSV, JSON, HTML, CSS, XML, RTF,
|
|
30
|
-
* JavaScript, Python) as their UTF-8 text. `text/md` and
|
|
31
|
-
* `application/x-python` are unknown: Gemini converts them first, adding
|
|
32
|
-
* about 30 text tokens no rule reproduces.
|
|
33
|
-
* - Provider file references (`uri`): unknown — the bytes are not here.
|
|
34
|
-
*
|
|
35
|
-
* Known gap: ADTS AAC. Gemini estimates its length from the bitrate; the
|
|
36
|
-
* decoded length here runs 2–3 tokens over at 10 s.
|
|
37
|
-
*
|
|
38
|
-
* Not yet checked against billed usage: video in WebM / MOV / 3GP, anamorphic
|
|
39
|
-
* video, and Gemini 3 models other than gemini-3.8-flash. The full probe and
|
|
40
|
-
* open decisions: https://github.com/masudl-hub/theoremai/issues/18
|
|
2
|
+
* Text counts use a characters / 4 heuristic for all model families. Media is never estimated: a
|
|
3
|
+
* media part is reported as `unknownMedia`, and the upstream's own count is used when it gives one.
|
|
41
4
|
*/
|
|
42
|
-
import { type Provider } from '../schema.js';
|
|
43
5
|
import type { InteractionPart, TurnHistoryMessage } from '../types.js';
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
export type MediaPayload = {
|
|
48
|
-
mimeType: string;
|
|
49
|
-
data: string;
|
|
50
|
-
} | {
|
|
51
|
-
mimeType: string;
|
|
52
|
-
uri: string;
|
|
53
|
-
};
|
|
6
|
+
/** Text estimation method; retained under this name for API compatibility. */
|
|
7
|
+
export declare const TOKEN_TEXT_ENCODING = "chars/4";
|
|
8
|
+
/** A token count and the number of media parts left out of it. */
|
|
54
9
|
export interface TokenCount {
|
|
55
10
|
tokens: number;
|
|
56
11
|
/** Media parts left out of `tokens` because their count is unknown. */
|
|
57
12
|
unknownMedia: number;
|
|
58
13
|
}
|
|
59
|
-
/**
|
|
14
|
+
/** Text counting is synchronous; anything with media is not. */
|
|
60
15
|
export interface TokenEstimator {
|
|
61
|
-
/**
|
|
16
|
+
/** Approximate tokens: UTF-16 code units divided by four, rounded up. */
|
|
62
17
|
text: (text: string) => number;
|
|
63
|
-
|
|
64
|
-
media: (payload: MediaPayload, family: MediaTokenFamily | undefined) => Promise<number | undefined>;
|
|
65
|
-
parts: (parts: InteractionPart[], family: MediaTokenFamily | undefined) => Promise<TokenCount>;
|
|
18
|
+
parts: (parts: InteractionPart[]) => TokenCount;
|
|
66
19
|
/** Content, parts, and tool-call arguments across history messages. */
|
|
67
|
-
messages: (messages: TurnHistoryMessage[]
|
|
20
|
+
messages: (messages: TurnHistoryMessage[]) => TokenCount;
|
|
68
21
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Media family for a model binding — `undefined` when no verified rule covers
|
|
71
|
-
* it. OpenRouter uses the routed model's family (`google/gemini-3…`).
|
|
72
|
-
*/
|
|
73
|
-
export declare function mediaTokenFamily(binding: {
|
|
74
|
-
provider: Provider;
|
|
75
|
-
apiId: string;
|
|
76
|
-
}): MediaTokenFamily | undefined;
|
|
22
|
+
/** Returns the heuristic estimator; async for compatibility with existing callers. */
|
|
77
23
|
export declare function loadTokenEstimator(): Promise<TokenEstimator>;
|
|
@@ -1,206 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* reports media as `unknownMedia`, never a borrowed rate.
|
|
5
|
-
*
|
|
6
|
-
* Gemini 3 (`gemini-3*` flash / pro text models, direct or via OpenRouter).
|
|
7
|
-
* Measured 22/09/2026 against the usage Gemini bills — Interactions `usage`
|
|
8
|
-
* and `generateContent` `usageMetadata` agree exactly — on gemini-3.8-flash
|
|
9
|
-
* at the default media resolution (THEOREM never sets `media_resolution`).
|
|
10
|
-
* `countTokens` is not the oracle: it reports 560 per PDF page and 32 tokens
|
|
11
|
-
* per audio second, and neither is what is billed.
|
|
12
|
-
* - image: a patch grid inside a 1120-token budget that keeps the aspect
|
|
13
|
-
* ratio — `⌊√(1120·w/h)⌋ × ⌊√(1120·h/w)⌋` (1024×1024 → 1089, 1920×1080 →
|
|
14
|
-
* 1100, 4032×3024 HEIC → 1064). Needs the pixel size from the image header.
|
|
15
|
-
* - audio: `⌈seconds × 25⌉`, seconds being decoded samples ÷ rate
|
|
16
|
-
* (`audioSeconds`): 2.2 s → 56, 0.5 s → 13. Sample rate, channels and
|
|
17
|
-
* silence do not matter. Raw PCM: bare `audio/pcm` is 16 kHz mono 16-bit;
|
|
18
|
-
* `audio/L16` needs both `rate` and `channels`. `audio/pcm` with parameters,
|
|
19
|
-
* `audio/alaw`, and `audio/mulaw` are refused by Interactions — unknown.
|
|
20
|
-
* Mono `audio/L16` is unknown: Gemini converts it first and adds text tokens
|
|
21
|
-
* no rule reproduces (about 31–33, plus 2 per second, plus 1 audio token
|
|
22
|
-
* away from 16 kHz).
|
|
23
|
-
* - video: `frames × ⌊√(70·w/h)⌋ × ⌊√(70·h/w)⌋ + ⌈min(audio, frames) × 25⌉`,
|
|
24
|
-
* `frames` = the video track's seconds rounded half up (66 per frame at
|
|
25
|
-
* 16:9, 63 at 4:3; fps, codec and container do not matter). Under half a
|
|
26
|
-
* second rounds to no frames, which Gemini refuses — unknown. MP4 / MOV /
|
|
27
|
-
* 3GP and WebM only (`videoInfo`); other containers are unknown.
|
|
28
|
-
* - PDF: 520 tokens per page. Text on the page adds nothing.
|
|
29
|
-
* - text documents (plain, Markdown, CSV, JSON, HTML, CSS, XML, RTF,
|
|
30
|
-
* JavaScript, Python) as their UTF-8 text. `text/md` and
|
|
31
|
-
* `application/x-python` are unknown: Gemini converts them first, adding
|
|
32
|
-
* about 30 text tokens no rule reproduces.
|
|
33
|
-
* - Provider file references (`uri`): unknown — the bytes are not here.
|
|
34
|
-
*
|
|
35
|
-
* Known gap: ADTS AAC. Gemini estimates its length from the bitrate; the
|
|
36
|
-
* decoded length here runs 2–3 tokens over at 10 s.
|
|
37
|
-
*
|
|
38
|
-
* Not yet checked against billed usage: video in WebM / MOV / 3GP, anamorphic
|
|
39
|
-
* video, and Gemini 3 models other than gemini-3.8-flash. The full probe and
|
|
40
|
-
* open decisions: https://github.com/masudl-hub/theoremai/issues/18
|
|
2
|
+
* Text counts use a characters / 4 heuristic for all model families. Media is never estimated: a
|
|
3
|
+
* media part is reported as `unknownMedia`, and the upstream's own count is used when it gives one.
|
|
41
4
|
*/
|
|
42
5
|
import { historyMessageParts } from '../interaction-parts.js';
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
import { pdfPageCount } from './media-probe/pdf.js';
|
|
49
|
-
import { videoInfo } from './media-probe/video.js';
|
|
50
|
-
export const TOKEN_TEXT_ENCODING = 'o200k_base';
|
|
51
|
-
const GEMINI_3_TEXT_MODEL = /^gemini-3(?:\.\d+)?-(?:flash|pro)(?:-lite)?(?:-preview)?$/;
|
|
52
|
-
const OPENROUTER_GOOGLE_PREFIX = 'google/';
|
|
53
|
-
const GEMINI_3_IMAGE_BUDGET = 1120;
|
|
54
|
-
const GEMINI_3_VIDEO_FRAME_BUDGET = 70;
|
|
55
|
-
const GEMINI_3_AUDIO_PER_SECOND = 25;
|
|
56
|
-
const GEMINI_3_PDF_PER_PAGE = 520;
|
|
57
|
-
/** Bare `audio/pcm`: 16-bit mono at 16 kHz. */
|
|
58
|
-
const PCM_DEFAULT_RATE = 16_000;
|
|
59
|
-
const PCM_BYTES_PER_SAMPLE = 2;
|
|
60
|
-
/** Document types Gemini reads as their own text. */
|
|
61
|
-
const GEMINI_3_TEXT_DOCUMENTS = new Set([
|
|
62
|
-
'text/plain',
|
|
63
|
-
'text/csv',
|
|
64
|
-
'text/markdown',
|
|
65
|
-
'text/html',
|
|
66
|
-
'text/css',
|
|
67
|
-
'text/xml',
|
|
68
|
-
'text/rtf',
|
|
69
|
-
'text/javascript',
|
|
70
|
-
'application/x-javascript',
|
|
71
|
-
'text/x-python',
|
|
72
|
-
'application/json',
|
|
73
|
-
]);
|
|
74
|
-
/**
|
|
75
|
-
* Media family for a model binding — `undefined` when no verified rule covers
|
|
76
|
-
* it. OpenRouter uses the routed model's family (`google/gemini-3…`).
|
|
77
|
-
*/
|
|
78
|
-
export function mediaTokenFamily(binding) {
|
|
79
|
-
const modelId = binding.provider === 'google'
|
|
80
|
-
? binding.apiId
|
|
81
|
-
: binding.provider === 'openrouter' && binding.apiId.startsWith(OPENROUTER_GOOGLE_PREFIX)
|
|
82
|
-
? binding.apiId.slice(OPENROUTER_GOOGLE_PREFIX.length)
|
|
83
|
-
: undefined;
|
|
84
|
-
if (modelId === undefined)
|
|
85
|
-
return undefined;
|
|
86
|
-
return GEMINI_3_TEXT_MODEL.test(modelId) ? 'gemini-3' : undefined;
|
|
87
|
-
}
|
|
88
|
-
function mimeParam(mimeType, name) {
|
|
89
|
-
for (const piece of mimeType.split(';').slice(1)) {
|
|
90
|
-
const [key, value] = piece.split('=').map((s) => s.trim().toLowerCase());
|
|
91
|
-
if (key === name) {
|
|
92
|
-
const n = Number(value);
|
|
93
|
-
return Number.isInteger(n) && n > 0 ? n : undefined;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return undefined;
|
|
97
|
-
}
|
|
98
|
-
function hasParams(mimeType) {
|
|
99
|
-
return mimeType.includes(';');
|
|
100
|
-
}
|
|
101
|
-
/** Seconds of raw 16-bit PCM, or `undefined` when Gemini refuses how it is declared. */
|
|
102
|
-
function pcmSeconds(mimeType, bytes) {
|
|
103
|
-
const essence = mimeEssence(mimeType);
|
|
104
|
-
let rate;
|
|
105
|
-
let channels;
|
|
106
|
-
if (essence === 'audio/pcm') {
|
|
107
|
-
if (hasParams(mimeType))
|
|
108
|
-
return undefined;
|
|
109
|
-
rate = PCM_DEFAULT_RATE;
|
|
110
|
-
channels = 1;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
rate = mimeParam(mimeType, 'rate');
|
|
114
|
-
channels = mimeParam(mimeType, 'channels');
|
|
115
|
-
// Mono L16 is converted before it is counted.
|
|
116
|
-
if (channels === 1)
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
|
-
if (!rate || !channels)
|
|
120
|
-
return undefined;
|
|
121
|
-
return Math.floor(bytes.length / (PCM_BYTES_PER_SAMPLE * channels)) / rate;
|
|
122
|
-
}
|
|
123
|
-
function gemini3Audio(mimeType, bytes) {
|
|
124
|
-
const essence = mimeEssence(mimeType);
|
|
125
|
-
const seconds = essence === 'audio/pcm' || essence === 'audio/l16'
|
|
126
|
-
? pcmSeconds(mimeType, bytes)
|
|
127
|
-
: essence === 'audio/alaw' || essence === 'audio/mulaw'
|
|
128
|
-
? undefined
|
|
129
|
-
: audioSeconds(bytes);
|
|
130
|
-
return seconds === undefined ? undefined : Math.ceil(seconds * GEMINI_3_AUDIO_PER_SECOND);
|
|
131
|
-
}
|
|
132
|
-
function patchGrid(budget, w, h) {
|
|
133
|
-
return Math.floor(Math.sqrt((budget * w) / h)) * Math.floor(Math.sqrt((budget * h) / w));
|
|
134
|
-
}
|
|
135
|
-
function gemini3Video(bytes) {
|
|
136
|
-
const info = videoInfo(bytes);
|
|
137
|
-
if (!info || info.audioSeconds === undefined)
|
|
138
|
-
return undefined;
|
|
139
|
-
const frames = Math.floor(info.seconds + 0.5);
|
|
140
|
-
if (frames === 0)
|
|
141
|
-
return undefined;
|
|
142
|
-
return (frames * patchGrid(GEMINI_3_VIDEO_FRAME_BUDGET, info.width, info.height) +
|
|
143
|
-
Math.ceil(Math.min(info.audioSeconds, frames) * GEMINI_3_AUDIO_PER_SECOND));
|
|
144
|
-
}
|
|
145
|
-
function utf8(bytes) {
|
|
146
|
-
try {
|
|
147
|
-
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
// Not UTF-8: what Gemini reads from it is unknown.
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
async function gemini3Media(payload, text) {
|
|
155
|
-
if (!('data' in payload))
|
|
156
|
-
return undefined;
|
|
157
|
-
const essence = mimeEssence(payload.mimeType);
|
|
158
|
-
const bytes = base64ToBytes(payload.data);
|
|
159
|
-
switch (MEDIA_INPUT_KINDS[essence]) {
|
|
160
|
-
case 'image': {
|
|
161
|
-
const size = imageSize(bytes);
|
|
162
|
-
return size ? patchGrid(GEMINI_3_IMAGE_BUDGET, size.width, size.height) : undefined;
|
|
163
|
-
}
|
|
164
|
-
case 'audio':
|
|
165
|
-
return gemini3Audio(payload.mimeType, bytes);
|
|
166
|
-
case 'video':
|
|
167
|
-
return gemini3Video(bytes);
|
|
168
|
-
case 'document': {
|
|
169
|
-
if (essence === 'application/pdf') {
|
|
170
|
-
const pages = await pdfPageCount(bytes);
|
|
171
|
-
return pages === undefined ? undefined : pages * GEMINI_3_PDF_PER_PAGE;
|
|
172
|
-
}
|
|
173
|
-
if (!GEMINI_3_TEXT_DOCUMENTS.has(essence))
|
|
174
|
-
return undefined;
|
|
175
|
-
const decoded = utf8(bytes);
|
|
176
|
-
return decoded === undefined ? undefined : text(decoded);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
181
|
-
let encodePromise = null;
|
|
182
|
-
function buildEstimator(encode) {
|
|
183
|
-
const text = (value) => (value ? encode(value).length : 0);
|
|
184
|
-
const media = async (payload, family) => family === 'gemini-3' ? await gemini3Media(payload, text) : undefined;
|
|
185
|
-
const parts = async (list, family) => {
|
|
6
|
+
/** Text estimation method; retained under this name for API compatibility. */
|
|
7
|
+
export const TOKEN_TEXT_ENCODING = 'chars/4';
|
|
8
|
+
function buildEstimator() {
|
|
9
|
+
const text = (value) => Math.ceil(value.length / 4);
|
|
10
|
+
const parts = (list) => {
|
|
186
11
|
const count = { tokens: 0, unknownMedia: 0 };
|
|
187
12
|
for (const part of list) {
|
|
188
13
|
if (part.type === 'text') {
|
|
189
14
|
count.tokens += text(part.text);
|
|
190
15
|
continue;
|
|
191
16
|
}
|
|
192
|
-
|
|
193
|
-
if (n === undefined)
|
|
194
|
-
count.unknownMedia += 1;
|
|
195
|
-
else
|
|
196
|
-
count.tokens += n;
|
|
17
|
+
count.unknownMedia += 1;
|
|
197
18
|
}
|
|
198
19
|
return count;
|
|
199
20
|
};
|
|
200
|
-
const messages =
|
|
21
|
+
const messages = (list) => {
|
|
201
22
|
const count = { tokens: 0, unknownMedia: 0 };
|
|
202
23
|
for (const msg of list) {
|
|
203
|
-
const fromParts =
|
|
24
|
+
const fromParts = parts(historyMessageParts(msg));
|
|
204
25
|
count.tokens += fromParts.tokens;
|
|
205
26
|
count.unknownMedia += fromParts.unknownMedia;
|
|
206
27
|
for (const tc of msg.tool_calls ?? []) {
|
|
@@ -209,10 +30,9 @@ function buildEstimator(encode) {
|
|
|
209
30
|
}
|
|
210
31
|
return count;
|
|
211
32
|
};
|
|
212
|
-
return { text,
|
|
33
|
+
return { text, parts, messages };
|
|
213
34
|
}
|
|
214
|
-
|
|
215
|
-
export
|
|
216
|
-
|
|
217
|
-
return buildEstimator(await encodePromise);
|
|
35
|
+
/** Returns the heuristic estimator; async for compatibility with existing callers. */
|
|
36
|
+
export function loadTokenEstimator() {
|
|
37
|
+
return Promise.resolve(buildEstimator());
|
|
218
38
|
}
|
|
@@ -4,8 +4,8 @@ import type { ToolPermission } from '../schema.js';
|
|
|
4
4
|
import type { ToolFailure } from '../tools/types.js';
|
|
5
5
|
import type { InteractionPart, TurnEvent } from '../types.js';
|
|
6
6
|
import { type GuardrailCheck, type SentToolCall } from './turn-trace.js';
|
|
7
|
-
/** A check at the tool boundary: the call's arguments, the remote-content gate, the result, or the network target. */
|
|
8
|
-
type ToolCheck = Extract<GuardrailCheck, 'tool_arguments' | 'taint' | 'tool_result' | 'tool_failure' | 'network' | 'network_request'>;
|
|
7
|
+
/** A check at the tool boundary: the call's arguments, the remote-content gate, its destinations, the result, or the network target. */
|
|
8
|
+
type ToolCheck = Extract<GuardrailCheck, 'tool_arguments' | 'taint' | 'destination' | 'tool_result' | 'tool_failure' | 'network' | 'network_request'>;
|
|
9
9
|
/**
|
|
10
10
|
* Records one tool-boundary check on the tool's span with the time it took:
|
|
11
11
|
* its decision, or a pass (`allow`) when it let the call or result through.
|
|
@@ -49,7 +49,7 @@ interface ToolCallTrace {
|
|
|
49
49
|
}
|
|
50
50
|
declare function toolSpanName(name: string): string;
|
|
51
51
|
/**
|
|
52
|
-
* Spans from before `pre_tool` to settlement, so it covers the hooks, the gates and the body.
|
|
52
|
+
* Spans from before `pre_tool` to settlement, so it covers the hooks, the gates, and the body.
|
|
53
53
|
* Provider-run tools (search, maps, code execution) get no span: Theorem did not run them.
|
|
54
54
|
* `open` places it: a child of the turn's root, or the root of a host-invoked tool's own record.
|
|
55
55
|
*/
|
|
@@ -5,6 +5,7 @@ import { guardrailAttributes, guardrailCheckAttributes, optional, recordExceptio
|
|
|
5
5
|
const TOOL_CHECK_STAGE = {
|
|
6
6
|
tool_arguments: 'tool_call',
|
|
7
7
|
taint: 'tool_call',
|
|
8
|
+
destination: 'tool_call',
|
|
8
9
|
tool_result: 'tool_result',
|
|
9
10
|
tool_failure: 'tool_result',
|
|
10
11
|
network: 'network',
|
|
@@ -73,7 +74,7 @@ const OUTCOME_STATUS = {
|
|
|
73
74
|
cancelled: 'UNSET',
|
|
74
75
|
};
|
|
75
76
|
/**
|
|
76
|
-
* Spans from before `pre_tool` to settlement, so it covers the hooks, the gates and the body.
|
|
77
|
+
* Spans from before `pre_tool` to settlement, so it covers the hooks, the gates, and the body.
|
|
77
78
|
* Provider-run tools (search, maps, code execution) get no span: Theorem did not run them.
|
|
78
79
|
* `open` places it: a child of the turn's root, or the root of a host-invoked tool's own record.
|
|
79
80
|
*/
|