@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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsonObjectSchema } from '../../../kernel/json.js';
|
|
2
|
+
import { isRecord } from '../../../kernel/util/record.js';
|
|
3
|
+
export function collectReasoning(row, details) {
|
|
4
|
+
let content = '';
|
|
5
|
+
for (const choice of Array.isArray(row.choices) ? row.choices : []) {
|
|
6
|
+
if (!isRecord(choice))
|
|
7
|
+
continue;
|
|
8
|
+
const delta = isRecord(choice.delta)
|
|
9
|
+
? choice.delta
|
|
10
|
+
: isRecord(choice.message)
|
|
11
|
+
? choice.message
|
|
12
|
+
: undefined;
|
|
13
|
+
if (!delta)
|
|
14
|
+
continue;
|
|
15
|
+
if (typeof delta.reasoning === 'string')
|
|
16
|
+
content += delta.reasoning;
|
|
17
|
+
else if (typeof delta.reasoning_content === 'string')
|
|
18
|
+
content += delta.reasoning_content;
|
|
19
|
+
for (const raw of Array.isArray(delta.reasoning_details) ? delta.reasoning_details : []) {
|
|
20
|
+
const detail = jsonObjectSchema.parse(raw);
|
|
21
|
+
const key = JSON.stringify([detail.index ?? detail.id ?? details.size, detail.type]);
|
|
22
|
+
const previous = details.get(key);
|
|
23
|
+
const merged = { ...previous, ...detail };
|
|
24
|
+
for (const field of ['text', 'summary', 'data'])
|
|
25
|
+
if (previous && typeof previous[field] === 'string' && typeof detail[field] === 'string')
|
|
26
|
+
merged[field] = previous[field] + detail[field];
|
|
27
|
+
details.set(key, merged);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Protocol } from '../../kernel/protocols/mod.js';
|
|
2
|
+
import type { CacheSpec } from '../../kernel/types.js';
|
|
3
|
+
/** What an `openRouter` binding sets in `options`. */
|
|
4
|
+
export interface OpenRouterOptions {
|
|
5
|
+
cache?: CacheSpec;
|
|
6
|
+
}
|
|
7
|
+
/** Chat Completions with OpenRouter's caching, routing, web search, citations, and reasoning. */
|
|
8
|
+
export declare const openRouter: Protocol<OpenRouterOptions>;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { asRecord } from '../../kernel/engine/record.js';
|
|
3
|
+
import { jsonObjectSchema } from '../../kernel/json.js';
|
|
4
|
+
import { extendProtocol } from '../../kernel/protocols/mod.js';
|
|
5
|
+
import { CACHE_MODES, CACHE_TTLS } from '../../kernel/schema.js';
|
|
6
|
+
import { openAi } from '../open-ai/protocol.js';
|
|
7
|
+
import { collectReasoning } from './openai/reasoning-state.js';
|
|
8
|
+
// labels-exempt: builder field description, read by the studio and docs
|
|
9
|
+
const cache = z
|
|
10
|
+
.strictObject({
|
|
11
|
+
mode: z
|
|
12
|
+
.enum(CACHE_MODES)
|
|
13
|
+
.describe('What is cached: the whole request (`automatic`) or the system instruction only (`system`).'),
|
|
14
|
+
ttl: z
|
|
15
|
+
.enum(CACHE_TTLS)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('How long the cache is kept. Absent: the upstream default.'),
|
|
18
|
+
})
|
|
19
|
+
.describe('Prompt caching, for models that support it.');
|
|
20
|
+
/** What OpenRouter's reasoning comes back as, to be sent back word for word. */
|
|
21
|
+
const reasoning = z.strictObject({
|
|
22
|
+
details: z.array(jsonObjectSchema),
|
|
23
|
+
content: z.string().optional(),
|
|
24
|
+
});
|
|
25
|
+
function cacheControl(spec) {
|
|
26
|
+
return spec.ttl ? { type: 'ephemeral', ttl: spec.ttl } : { type: 'ephemeral' };
|
|
27
|
+
}
|
|
28
|
+
function callIds(message) {
|
|
29
|
+
const calls = asRecord(message)?.tool_calls;
|
|
30
|
+
return Array.isArray(calls) ? calls.map((call) => String(asRecord(call)?.id)) : [];
|
|
31
|
+
}
|
|
32
|
+
/** Puts the reasoning OpenRouter wrote back on the assistant message it came with, matched by its calls. */
|
|
33
|
+
function replay(messages, history) {
|
|
34
|
+
for (const message of messages) {
|
|
35
|
+
const ids = callIds(message);
|
|
36
|
+
if (message.role !== 'assistant' || !ids.length)
|
|
37
|
+
continue;
|
|
38
|
+
const source = history.find((item) => item.role === 'assistant' &&
|
|
39
|
+
JSON.stringify((item.tool_calls ?? []).map((call) => call.id)) === JSON.stringify(ids));
|
|
40
|
+
const data = (source?.reasoning ?? [])
|
|
41
|
+
.map((item) => reasoning.safeParse(item.data))
|
|
42
|
+
.find((parsed) => parsed.success);
|
|
43
|
+
if (!data?.success)
|
|
44
|
+
continue;
|
|
45
|
+
message.reasoning_details = data.data.details;
|
|
46
|
+
if (data.data.content)
|
|
47
|
+
message.reasoning = data.data.content;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function strings(value) {
|
|
51
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
52
|
+
}
|
|
53
|
+
/** Where OpenRouter puts plain citation lists: the row, its metadata, and each choice. */
|
|
54
|
+
function citedUris(row) {
|
|
55
|
+
const meta = (record) => [
|
|
56
|
+
record?.citations,
|
|
57
|
+
asRecord(record?.providerMetadata)?.citations,
|
|
58
|
+
asRecord(record?.provider_metadata)?.citations,
|
|
59
|
+
];
|
|
60
|
+
const openrouter = asRecord(row.openrouter);
|
|
61
|
+
const choices = Array.isArray(row.choices) ? row.choices.map(asRecord) : [];
|
|
62
|
+
return [
|
|
63
|
+
...meta(row),
|
|
64
|
+
...meta(openrouter),
|
|
65
|
+
...meta(asRecord(openrouter?.providerMetadata)),
|
|
66
|
+
...meta(asRecord(openrouter?.provider_metadata)),
|
|
67
|
+
...choices.flatMap((choice) => [
|
|
68
|
+
...meta(asRecord(choice?.message)),
|
|
69
|
+
...meta(asRecord(choice?.delta)),
|
|
70
|
+
]),
|
|
71
|
+
].flatMap(strings);
|
|
72
|
+
}
|
|
73
|
+
/** Annotations other than URL citations (which the base reads), from the row and its choices. */
|
|
74
|
+
function otherAnnotations(row) {
|
|
75
|
+
const choices = Array.isArray(row.choices) ? row.choices.map(asRecord) : [];
|
|
76
|
+
const lists = [
|
|
77
|
+
row.annotations,
|
|
78
|
+
asRecord(row.openrouter)?.annotations,
|
|
79
|
+
...choices.flatMap((choice) => [
|
|
80
|
+
asRecord(choice?.message)?.annotations,
|
|
81
|
+
asRecord(choice?.delta)?.annotations,
|
|
82
|
+
]),
|
|
83
|
+
];
|
|
84
|
+
return lists
|
|
85
|
+
.flatMap((list) => (Array.isArray(list) ? list : []))
|
|
86
|
+
.filter((item) => asRecord(item)?.type !== 'url_citation');
|
|
87
|
+
}
|
|
88
|
+
function thinking(row) {
|
|
89
|
+
const choices = Array.isArray(row.choices) ? row.choices : [];
|
|
90
|
+
return choices
|
|
91
|
+
.map((choice) => asRecord(asRecord(choice)?.delta)?.thinking)
|
|
92
|
+
.filter((text) => typeof text === 'string')
|
|
93
|
+
.join('');
|
|
94
|
+
}
|
|
95
|
+
/** Chat Completions with OpenRouter's caching, routing, web search, citations, and reasoning. */
|
|
96
|
+
export const openRouter = extendProtocol(openAi, {
|
|
97
|
+
id: 'openRouter',
|
|
98
|
+
name: 'OpenRouter Chat Completions',
|
|
99
|
+
description: "Chat Completions with OpenRouter's caching, routing, web search, citations and reasoning.", // labels-exempt: builder field description, read by the studio and docs
|
|
100
|
+
options: z.strictObject({ cache: cache.optional() }),
|
|
101
|
+
reasoning,
|
|
102
|
+
body(body, at) {
|
|
103
|
+
// why: its fields are Chat Completions ones; a speech request goes as openAi sends it.
|
|
104
|
+
if (at.profileType !== 'text')
|
|
105
|
+
return { body };
|
|
106
|
+
const out = { ...body, provider: { require_parameters: true } };
|
|
107
|
+
if (out.reasoning_effort !== undefined) {
|
|
108
|
+
out.reasoning = { effort: out.reasoning_effort };
|
|
109
|
+
delete out.reasoning_effort;
|
|
110
|
+
}
|
|
111
|
+
const messages = Array.isArray(out.messages) ? out.messages : [];
|
|
112
|
+
const spec = at.options.cache;
|
|
113
|
+
if (spec?.mode === 'automatic')
|
|
114
|
+
out.cache_control = cacheControl(spec);
|
|
115
|
+
if (spec?.mode === 'system' && messages[0]?.role === 'system')
|
|
116
|
+
messages[0] = {
|
|
117
|
+
...messages[0],
|
|
118
|
+
content: [
|
|
119
|
+
{ type: 'text', text: messages[0].content ?? '', cache_control: cacheControl(spec) },
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
replay(messages, at.request?.history ?? []);
|
|
123
|
+
if (at.request?.sessionId)
|
|
124
|
+
out.session_id = at.request.sessionId;
|
|
125
|
+
const web = at.builtInTools.includes('webSearch');
|
|
126
|
+
if (web)
|
|
127
|
+
out.web_search_options = {};
|
|
128
|
+
return { body: { ...out, messages }, wroteTools: web ? ['webSearch'] : [] };
|
|
129
|
+
},
|
|
130
|
+
read(at) {
|
|
131
|
+
const details = new Map();
|
|
132
|
+
const cited = new Set();
|
|
133
|
+
const reported = new Set();
|
|
134
|
+
let content = '';
|
|
135
|
+
return {
|
|
136
|
+
row(row) {
|
|
137
|
+
content += collectReasoning(row, details);
|
|
138
|
+
const events = [];
|
|
139
|
+
const thought = thinking(row);
|
|
140
|
+
if (thought && at.request?.summaries !== 'none')
|
|
141
|
+
events.push({ type: 'thought', text: thought });
|
|
142
|
+
const sources = citedUris(row)
|
|
143
|
+
.filter((uri) => !cited.has(uri) && cited.add(uri))
|
|
144
|
+
.map((uri) => ({ title: uri, uri, type: 'web' }));
|
|
145
|
+
if (sources.length)
|
|
146
|
+
events.push({ type: 'citation', sources });
|
|
147
|
+
const annotations = otherAnnotations(row).filter((item) => {
|
|
148
|
+
const key = JSON.stringify(item);
|
|
149
|
+
return !reported.has(key) && reported.add(key);
|
|
150
|
+
});
|
|
151
|
+
if (annotations.length)
|
|
152
|
+
events.push({
|
|
153
|
+
type: 'evidence',
|
|
154
|
+
evidence: {
|
|
155
|
+
provider: 'openrouter',
|
|
156
|
+
kind: 'provider_step',
|
|
157
|
+
step: 'annotations',
|
|
158
|
+
raw: { annotations },
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
return { events };
|
|
162
|
+
},
|
|
163
|
+
finish() {
|
|
164
|
+
if (!details.size && !content)
|
|
165
|
+
return {};
|
|
166
|
+
const data = { details: [...details.values()], ...(content ? { content } : {}) };
|
|
167
|
+
return { events: [{ type: 'reasoning', data }] };
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
},
|
|
171
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Provider } from '../../kernel/protocols/provider.js';
|
|
2
|
+
/** What registering `openRouterProvider` takes as `connection`. */
|
|
3
|
+
export interface OpenRouterConnection {
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
decisionUrl?: string;
|
|
6
|
+
siteUrl?: string;
|
|
7
|
+
siteName?: string;
|
|
8
|
+
}
|
|
9
|
+
/** OpenRouter: many labs' models behind one key. Chat, speech, images, and decisions. */
|
|
10
|
+
export declare const openRouterProvider: Provider<OpenRouterConnection, string>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { bearer, defineProvider, endpointUrlSchema, } from '../../kernel/protocols/provider.js';
|
|
3
|
+
import { systemOne } from '../system-one/protocol.js';
|
|
4
|
+
import { openRouterEmbedding } from './embedding-protocol.js';
|
|
5
|
+
import { openRouterImages } from './images-protocol.js';
|
|
6
|
+
import { openRouter } from './protocol.js';
|
|
7
|
+
const connection = z.strictObject({
|
|
8
|
+
baseUrl: endpointUrlSchema
|
|
9
|
+
.optional()
|
|
10
|
+
.describe('The API, by default https://openrouter.ai/api/v1.'), // labels-exempt: builder field description, read by the studio and docs
|
|
11
|
+
decisionUrl: endpointUrlSchema
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('The decision API, by default https://openrouter.ai/api/alpha/decisions.'), // labels-exempt: builder field description, read by the studio and docs
|
|
14
|
+
siteUrl: z
|
|
15
|
+
.string()
|
|
16
|
+
.trim()
|
|
17
|
+
.min(1)
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Sent as HTTP-Referer, for OpenRouter rankings.'), // labels-exempt: builder field description, read by the studio and docs
|
|
20
|
+
siteName: z
|
|
21
|
+
.string()
|
|
22
|
+
.trim()
|
|
23
|
+
.min(1)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Sent as X-Title, for OpenRouter rankings.'), // labels-exempt: builder field description, read by the studio and docs
|
|
26
|
+
});
|
|
27
|
+
/** OpenRouter: many labs' models behind one key. Chat, speech, images, and decisions. */
|
|
28
|
+
export const openRouterProvider = defineProvider({
|
|
29
|
+
id: 'openrouter',
|
|
30
|
+
name: 'OpenRouter',
|
|
31
|
+
description: "Many labs' models behind one key.", // labels-exempt: builder field description, read by the studio and docs
|
|
32
|
+
connection: connection.default({}),
|
|
33
|
+
key: z.string().trim().min(1),
|
|
34
|
+
authorize: bearer(),
|
|
35
|
+
serves(at) {
|
|
36
|
+
const baseUrl = at.baseUrl ?? 'https://openrouter.ai/api/v1';
|
|
37
|
+
const headers = {};
|
|
38
|
+
if (at.siteUrl)
|
|
39
|
+
headers['HTTP-Referer'] = at.siteUrl;
|
|
40
|
+
if (at.siteName)
|
|
41
|
+
headers['X-Title'] = at.siteName;
|
|
42
|
+
const decisionUrl = at.decisionUrl ?? 'https://openrouter.ai/api/alpha/decisions';
|
|
43
|
+
return [
|
|
44
|
+
{ protocol: openRouter, baseUrl, headers },
|
|
45
|
+
{ protocol: openRouterEmbedding, baseUrl, headers },
|
|
46
|
+
{ protocol: openRouterImages, baseUrl, headers },
|
|
47
|
+
{ protocol: systemOne, baseUrl: decisionUrl, url: () => decisionUrl, headers },
|
|
48
|
+
];
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { InteractionPart, TurnHistoryMessage } from '../../kernel/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* History for a wire whose tool result holds only the `holds` part types. Every
|
|
4
|
+
* other file leaves a marker in its place and follows the run of tool results in
|
|
5
|
+
* one user message, so the results of a parallel call stay together.
|
|
6
|
+
*/
|
|
7
|
+
export declare function withCarriedToolFiles(messages: readonly TurnHistoryMessage[], holds: ReadonlySet<InteractionPart['type']>): TurnHistoryMessage[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** What stands in a tool result where a file it cannot hold was. */
|
|
2
|
+
function carriedFileMarker(part) {
|
|
3
|
+
return { type: 'text', text: `[${part.type}: sent in the next message]` };
|
|
4
|
+
}
|
|
5
|
+
/** What leads the files of one tool result in the user message that carries them. */
|
|
6
|
+
function carriedFilesLead(msg) {
|
|
7
|
+
const from = msg.name ? `the ${msg.name} result` : 'a tool result';
|
|
8
|
+
return { type: 'text', text: `Files from ${from}:` };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* History for a wire whose tool result holds only the `holds` part types. Every
|
|
12
|
+
* other file leaves a marker in its place and follows the run of tool results in
|
|
13
|
+
* one user message, so the results of a parallel call stay together.
|
|
14
|
+
*/
|
|
15
|
+
export function withCarriedToolFiles(messages, holds) {
|
|
16
|
+
const out = [];
|
|
17
|
+
let carried = [];
|
|
18
|
+
const flush = () => {
|
|
19
|
+
if (carried.length === 0)
|
|
20
|
+
return;
|
|
21
|
+
out.push({ role: 'user', parts: carried });
|
|
22
|
+
carried = [];
|
|
23
|
+
};
|
|
24
|
+
for (const msg of messages) {
|
|
25
|
+
if (msg.role !== 'tool') {
|
|
26
|
+
flush();
|
|
27
|
+
out.push(msg);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const files = (msg.parts ?? []).filter((part) => !holds.has(part.type));
|
|
31
|
+
if (files.length === 0) {
|
|
32
|
+
out.push(msg);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
out.push({
|
|
36
|
+
...msg,
|
|
37
|
+
parts: (msg.parts ?? []).map((part) => holds.has(part.type) ? part : carriedFileMarker(part)),
|
|
38
|
+
});
|
|
39
|
+
carried.push(carriedFilesLead(msg), ...files);
|
|
40
|
+
}
|
|
41
|
+
flush();
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*
|
|
1
|
+
/*probed 2026-09-23:
|
|
2
2
|
* Each transport states the PCM format on the wire (probes 23/09/2026):
|
|
3
3
|
* - Gemini Live: `audio/pcm;rate=24000`
|
|
4
4
|
* - Interactions: `audio/l16; rate=24000; channels=1` (buffered), or
|
|
@@ -58,7 +58,7 @@ export function wrapPcmAsWav(pcm, format) {
|
|
|
58
58
|
writeAscii(view, 8, 'WAVE');
|
|
59
59
|
writeAscii(view, 12, 'fmt ');
|
|
60
60
|
view.setUint32(16, 16, true);
|
|
61
|
-
view.setUint16(20, 1, true);
|
|
61
|
+
view.setUint16(20, 1, true);
|
|
62
62
|
view.setUint16(22, channels, true);
|
|
63
63
|
view.setUint32(24, sampleRate, true);
|
|
64
64
|
view.setUint32(28, byteRate, true);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProtocolEvent } from '../../kernel/protocols/mod.js';
|
|
2
|
+
import type { ModelEvent } from '../../kernel/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One event from the shared Gemini and Chat Completions readers, as a protocol event: a finished
|
|
5
|
+
* call is a `tool_call`, a cancelled one a `tool_cancel`, and a broken one an error. A `done` keeps
|
|
6
|
+
* only its stop; the protocol adds its own state.
|
|
7
|
+
*/
|
|
8
|
+
export declare function asProtocolEvent<S>(event: ModelEvent): ProtocolEvent<S> | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One event from the shared Gemini and Chat Completions readers, as a protocol event: a finished
|
|
3
|
+
* call is a `tool_call`, a cancelled one a `tool_cancel`, and a broken one an error. A `done` keeps
|
|
4
|
+
* only its stop; the protocol adds its own state.
|
|
5
|
+
*/
|
|
6
|
+
export function asProtocolEvent(event) {
|
|
7
|
+
if (event.type === 'done')
|
|
8
|
+
return {
|
|
9
|
+
type: 'done',
|
|
10
|
+
stop: event.stop,
|
|
11
|
+
...(event.interrupted === undefined ? {} : { interrupted: event.interrupted }),
|
|
12
|
+
};
|
|
13
|
+
if (event.type !== 'tool')
|
|
14
|
+
return event;
|
|
15
|
+
if (event.tool.phase === undefined)
|
|
16
|
+
return { type: 'tool_call', call: event.tool };
|
|
17
|
+
if (event.tool.phase === 'cancel')
|
|
18
|
+
return { type: 'tool_cancel', callId: event.tool.callId };
|
|
19
|
+
return event.tool.phase === 'error' ? { type: 'error', errorKind: 'bad_response' } : undefined;
|
|
20
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModelEvent, TurnResponse } from '../../kernel/types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Emits as soon as the wire names the response and again whenever that changes, so a
|
|
4
4
|
* call that fails or is cut by a guardrail still records which model served it.
|
|
5
5
|
*/
|
|
6
6
|
export declare function foldResponse(known: TurnResponse | undefined, seen: TurnResponse | undefined): {
|
|
7
7
|
known: TurnResponse | undefined;
|
|
8
|
-
event?: Extract<
|
|
8
|
+
event?: Extract<ModelEvent, {
|
|
9
9
|
type: 'response';
|
|
10
10
|
}>;
|
|
11
11
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** How a retry waits; a host or test may pass its own. The signal ends the wait early. */
|
|
2
|
+
export type Wait = (ms: number, signal?: AbortSignal | null) => Promise<void>;
|
|
3
|
+
/** All the waiting one call may do between tries; a wait that would pass it sends the last answer back. */
|
|
4
|
+
export declare const WAIT_BUDGET_MS = 5000;
|
|
5
|
+
export declare const waitDefault: Wait;
|
|
6
|
+
export declare function isTransientHttp(status: number): boolean;
|
|
7
|
+
export declare function isTransientThrown(err: unknown): boolean;
|
|
8
|
+
export declare function backoffMs(attempt: number): number;
|
|
9
|
+
/** `retry-after-ms`, else `Retry-After` in seconds or as a date; undefined when absent or unreadable. */
|
|
10
|
+
export declare function retryAfterMs(headers: Headers, now?: number): number | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Retries a transient status (408, 429, 5xx gateway) or a network failure while the waits stay
|
|
13
|
+
* within five seconds in all, at most four times. Each wait is the response's `Retry-After` when it gives one, else
|
|
14
|
+
* 1s, 2s, 4s then 8s; a wait that would pass the five seconds, or the call's own time left, is not
|
|
15
|
+
* taken, and the last answer or error goes back as it came. An abort ends the wait.
|
|
16
|
+
*/
|
|
17
|
+
export declare function retryTransient(send: typeof fetch, wait?: Wait, timeLeft?: () => number): typeof fetch;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isAbortError, isTimeoutError } from '../../guardrails/error.js';
|
|
2
|
+
const BACKOFF_MS = [1000, 2000, 4000, 8000];
|
|
3
|
+
/** All the waiting one call may do between tries; a wait that would pass it sends the last answer back. */
|
|
4
|
+
export const WAIT_BUDGET_MS = 5000;
|
|
5
|
+
/** The most tries after the first: a `Retry-After: 0` costs no wait, so the budget alone never ends it. */
|
|
6
|
+
const MAX_RETRIES = BACKOFF_MS.length;
|
|
7
|
+
const MS_PER_SECOND = 1000;
|
|
8
|
+
const TRANSIENT_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
|
|
9
|
+
const TRANSIENT_THROWN_RE = /name resolution|dns|econnreset|econnrefused|etimedout|connection (?:refused|reset)|error sending request|network|fetch failed|temporarily unavailable|socket|503|502|504/i;
|
|
10
|
+
export const waitDefault = (ms, signal) => new Promise((resolve, reject) => {
|
|
11
|
+
if (signal?.aborted) {
|
|
12
|
+
reject(abortReason(signal));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const timer = setTimeout(() => {
|
|
16
|
+
signal?.removeEventListener('abort', onAbort);
|
|
17
|
+
resolve();
|
|
18
|
+
}, ms);
|
|
19
|
+
function onAbort() {
|
|
20
|
+
clearTimeout(timer);
|
|
21
|
+
reject(abortReason(signal));
|
|
22
|
+
}
|
|
23
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
24
|
+
});
|
|
25
|
+
function abortReason(signal) {
|
|
26
|
+
return signal.reason ?? new DOMException('The operation was aborted.', 'AbortError');
|
|
27
|
+
}
|
|
28
|
+
export function isTransientHttp(status) {
|
|
29
|
+
return TRANSIENT_STATUSES.has(status);
|
|
30
|
+
}
|
|
31
|
+
export function isTransientThrown(err) {
|
|
32
|
+
if (isAbortError(err) || isTimeoutError(err)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return TRANSIENT_THROWN_RE.test(String(err));
|
|
36
|
+
}
|
|
37
|
+
export function backoffMs(attempt) {
|
|
38
|
+
return BACKOFF_MS[Math.min(attempt, BACKOFF_MS.length - 1)];
|
|
39
|
+
}
|
|
40
|
+
/** `retry-after-ms`, else `Retry-After` in seconds or as a date; undefined when absent or unreadable. */
|
|
41
|
+
export function retryAfterMs(headers, now = Date.now()) {
|
|
42
|
+
const ms = headers.get('retry-after-ms');
|
|
43
|
+
const after = headers.get('retry-after');
|
|
44
|
+
let delay;
|
|
45
|
+
if (ms !== null && ms.trim() !== '' && Number.isFinite(Number(ms))) {
|
|
46
|
+
delay = Number(ms);
|
|
47
|
+
}
|
|
48
|
+
else if (after !== null && after.trim() !== '') {
|
|
49
|
+
const seconds = Number(after);
|
|
50
|
+
delay = Number.isFinite(seconds) ? seconds * MS_PER_SECOND : Date.parse(after) - now;
|
|
51
|
+
}
|
|
52
|
+
if (delay === undefined || Number.isNaN(delay) || delay < 0) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return delay;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Retries a transient status (408, 429, 5xx gateway) or a network failure while the waits stay
|
|
59
|
+
* within five seconds in all, at most four times. Each wait is the response's `Retry-After` when it gives one, else
|
|
60
|
+
* 1s, 2s, 4s then 8s; a wait that would pass the five seconds, or the call's own time left, is not
|
|
61
|
+
* taken, and the last answer or error goes back as it came. An abort ends the wait.
|
|
62
|
+
*/
|
|
63
|
+
export function retryTransient(send, wait = waitDefault, timeLeft = () => Number.POSITIVE_INFINITY) {
|
|
64
|
+
return async (url, init) => {
|
|
65
|
+
let waited = 0;
|
|
66
|
+
for (let attempt = 0;; attempt++) {
|
|
67
|
+
const left = Math.min(WAIT_BUDGET_MS - waited, timeLeft());
|
|
68
|
+
let delay;
|
|
69
|
+
try {
|
|
70
|
+
const res = await send(url, init);
|
|
71
|
+
if (!isTransientHttp(res.status)) {
|
|
72
|
+
return res;
|
|
73
|
+
}
|
|
74
|
+
delay = retryAfterMs(res.headers) ?? backoffMs(attempt);
|
|
75
|
+
if (delay > left || attempt >= MAX_RETRIES) {
|
|
76
|
+
return res;
|
|
77
|
+
}
|
|
78
|
+
await res.body?.cancel();
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
delay = backoffMs(attempt);
|
|
82
|
+
if (!isTransientThrown(err) || delay > left || attempt >= MAX_RETRIES) {
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await wait(delay, init?.signal);
|
|
87
|
+
waited += delay;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
export declare function asObject(parsed: unknown): Record<string, unknown> | undefined;
|
|
2
|
-
export declare function dataRecord(raw: string, sseEvent: string): Record<string, unknown>;
|
|
3
1
|
export declare function takeSsePayloads(buffer: string, pendingEvent?: string): {
|
|
4
2
|
rest: string;
|
|
5
3
|
payloads: Record<string, unknown>[];
|
|
6
4
|
pendingEvent: string;
|
|
7
5
|
};
|
|
8
6
|
export declare function readSseChunks(body: ReadableStream<Uint8Array>): AsyncGenerator<Record<string, unknown>>;
|
|
9
|
-
/** Silently skips malformed payloads, unlike `readSseChunks`. */
|
|
10
|
-
export declare function parseSseStream(body: ReadableStream<Uint8Array>): AsyncGenerator<Record<string, unknown>>;
|
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
const DATA_PREFIX = 'data: ';
|
|
2
|
-
const EVENT_PREFIX = 'event: ';
|
|
3
1
|
const DONE = '[DONE]';
|
|
4
|
-
|
|
2
|
+
function asObject(parsed) {
|
|
5
3
|
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
6
4
|
return parsed;
|
|
7
5
|
}
|
|
8
6
|
return undefined;
|
|
9
7
|
}
|
|
10
|
-
|
|
11
|
-
const data = raw.slice(
|
|
8
|
+
function dataRecord(raw, sseEvent) {
|
|
9
|
+
const data = raw.startsWith('data:') ? raw.slice(5).replace(/^ /, '') : raw;
|
|
12
10
|
const row = {};
|
|
13
11
|
if (sseEvent) {
|
|
14
12
|
row.sseEvent = sseEvent;
|
|
15
13
|
}
|
|
16
|
-
if (
|
|
14
|
+
if (data === DONE) {
|
|
17
15
|
row.eventType = 'sse_done';
|
|
18
16
|
return row;
|
|
19
17
|
}
|
|
@@ -35,45 +33,61 @@ export function dataRecord(raw, sseEvent) {
|
|
|
35
33
|
}
|
|
36
34
|
export function takeSsePayloads(buffer, pendingEvent = '') {
|
|
37
35
|
const payloads = [];
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
let
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
let event = pendingEvent;
|
|
37
|
+
let data = [];
|
|
38
|
+
let hasData = false;
|
|
39
|
+
let consumed = 0;
|
|
40
|
+
const lineEnds = /\r\n|\r|\n/g;
|
|
41
|
+
let start = 0;
|
|
42
|
+
for (let match = lineEnds.exec(buffer); match; match = lineEnds.exec(buffer)) {
|
|
43
|
+
if (match[0] === '\r' && match.index === buffer.length - 1)
|
|
44
|
+
break;
|
|
45
|
+
const line = buffer.slice(start, match.index);
|
|
46
|
+
start = match.index + match[0].length;
|
|
47
|
+
if (!line) {
|
|
48
|
+
if (hasData)
|
|
49
|
+
payloads.push(dataRecord(data.join('\n'), event));
|
|
50
|
+
event = '';
|
|
51
|
+
data = [];
|
|
52
|
+
hasData = false;
|
|
53
|
+
consumed = start;
|
|
44
54
|
}
|
|
45
|
-
else if (line.startsWith(
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
else if (!line.startsWith(':')) {
|
|
56
|
+
const colon = line.indexOf(':');
|
|
57
|
+
const field = colon < 0 ? line : line.slice(0, colon);
|
|
58
|
+
const value = colon < 0 ? '' : line.slice(colon + 1).replace(/^ /, '');
|
|
59
|
+
if (field === 'event')
|
|
60
|
+
event = value;
|
|
61
|
+
if (field === 'data') {
|
|
62
|
+
data.push(value);
|
|
63
|
+
hasData = true;
|
|
64
|
+
}
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
|
-
return { rest, payloads, pendingEvent:
|
|
67
|
+
return { rest: buffer.slice(consumed), payloads, pendingEvent: '' };
|
|
51
68
|
}
|
|
52
69
|
export async function* readSseChunks(body) {
|
|
53
70
|
const reader = body.getReader();
|
|
54
71
|
const decoder = new TextDecoder();
|
|
55
72
|
let buffer = '';
|
|
56
|
-
let
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
let ended = false;
|
|
74
|
+
try {
|
|
75
|
+
for (;;) {
|
|
76
|
+
const { done, value } = await reader.read();
|
|
77
|
+
if (done) {
|
|
78
|
+
ended = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
buffer += decoder.decode(value, { stream: true });
|
|
82
|
+
const result = takeSsePayloads(buffer);
|
|
83
|
+
buffer = result.rest;
|
|
84
|
+
for (const payload of result.payloads)
|
|
85
|
+
yield payload;
|
|
67
86
|
}
|
|
68
87
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (payload.eventType === 'sse_done')
|
|
74
|
-
return;
|
|
75
|
-
if (payload.eventType === 'sse_unparsed')
|
|
76
|
-
continue;
|
|
77
|
-
yield payload;
|
|
88
|
+
finally {
|
|
89
|
+
if (!ended)
|
|
90
|
+
void reader.cancel().catch(() => undefined);
|
|
91
|
+
reader.releaseLock();
|
|
78
92
|
}
|
|
79
93
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ToolCallBase } from '../../kernel/tools/events.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ToolCallRequest } from '../../kernel/tools/types.js';
|
|
3
|
+
import type { ModelEvent } from '../../kernel/types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Adapters never invent a history call id or name: a provider that needs a
|
|
5
6
|
* missing one rejects the request, and that error is the answer.
|
|
@@ -16,10 +17,8 @@ export type ParsedToolArguments = {
|
|
|
16
17
|
export declare function parseToolArgumentsObject(raw: unknown): ParsedToolArguments;
|
|
17
18
|
export declare function historyToolArguments(raw: unknown): Record<string, unknown>;
|
|
18
19
|
/** A call sent without an id gets one, so its request and failure events join. */
|
|
19
|
-
export declare function toolCallEvents(call: {
|
|
20
|
+
export declare function toolCallEvents(call: Pick<ToolCallRequest, 'name' | 'stepId' | 'stepCallCount'> & {
|
|
20
21
|
id?: string;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
/** Keeps the thought signature: the model still reads the failed call's result back. */
|
|
25
|
-
export declare function malformedToolCall(base: ToolCallBase, message: string, raw: unknown, thoughtSignature?: string): ProviderEvent[];
|
|
22
|
+
}, rawArguments: unknown): ModelEvent[];
|
|
23
|
+
/** The model still reads the failed call's result back. */
|
|
24
|
+
export declare function malformedToolCall(base: ToolCallBase, message: string, raw: unknown, request?: Pick<ToolCallRequest, 'stepId' | 'stepCallCount'>): ModelEvent[];
|