@theoremjs/agents 0.3.0 → 0.3.2
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 +277 -995
- package/esm/mod.d.ts +34 -20
- package/esm/mod.js +19 -12
- 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 +25 -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 +881 -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 +30 -22
- package/esm/src/guardrails/mod.js +19 -14
- 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 +4 -1
- package/esm/src/guardrails/quota.js +7 -2
- 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 +5 -2
- package/esm/src/guardrails/theorem-error.js +6 -3
- 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 +8 -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 +174 -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 +329 -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 +130 -88
- 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 +102 -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/api-error.d.ts +2 -0
- package/esm/src/providers/google/api-error.js +26 -18
- 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 +4 -210
- 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 +18 -0
- package/esm/src/providers/shared/retry.js +89 -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,8 +1,5 @@
|
|
|
1
1
|
import { TheoremError } from '../../guardrails/error.js';
|
|
2
|
-
import {
|
|
3
|
-
import { lexiconText, } from '../../guardrails/lexicon.js';
|
|
4
|
-
import { sensitiveSpans } from '../../guardrails/sensitive.js';
|
|
5
|
-
import { applySpans } from '../../observability/spans.js';
|
|
2
|
+
import { labelText, } from '../../guardrails/labels.js';
|
|
6
3
|
import { base64ToBytes, bytesToBase64 } from '../util/base64.js';
|
|
7
4
|
import { mimeEssence } from '../util/mime.js';
|
|
8
5
|
import { mimeAllowed, profileAccept } from './catalog.js';
|
|
@@ -12,6 +9,7 @@ const B64_TRIPLET = 3;
|
|
|
12
9
|
const CSV_FORMULA = /(^|,)(\s*)("?)(?:([=@])|([+-])(?![0-9."]))/gm;
|
|
13
10
|
const B64_BODY = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
14
11
|
const TEXT_MIMES = new Set(['text/csv', 'text/plain', 'text/markdown']);
|
|
12
|
+
/** The media limits an inputs spec sets, or `undefined` unless it sets `maxFiles`, `maxBytes`, and `maxTurnBytes`. */
|
|
15
13
|
function resolveMediaLimits(inputs) {
|
|
16
14
|
const { maxFiles, maxBytes, maxTurnBytes, limitsByMime } = inputs;
|
|
17
15
|
if (maxFiles && maxBytes && maxTurnBytes) {
|
|
@@ -37,14 +35,15 @@ function maxBytesForMime(mimeType, limits) {
|
|
|
37
35
|
function isTurnMediaRef(item) {
|
|
38
36
|
return 'uri' in item;
|
|
39
37
|
}
|
|
38
|
+
/** The profile's media limits; throws when it takes no media. */
|
|
40
39
|
function requireMediaLimits(profile) {
|
|
41
40
|
if (profile.type === 'speech') {
|
|
42
|
-
throw new TheoremError('request', `Profile ${profile.id} (speech) does not accept media input`); //
|
|
41
|
+
throw new TheoremError('request', `Profile ${profile.id} (speech) does not accept media input`); // labels-exempt: developer contract error
|
|
43
42
|
}
|
|
44
43
|
if (profile.type === 'live') {
|
|
45
44
|
throw new TheoremError('request', `Profile ${profile.id} (live) does not accept turn attachment input`);
|
|
46
45
|
}
|
|
47
|
-
if (profile.type === 'host' || profile.type === 'decision') {
|
|
46
|
+
if (profile.type === 'host' || profile.type === 'decision' || profile.type === 'embedding') {
|
|
48
47
|
throw new TheoremError('request', `Profile ${profile.id} (${profile.type}) does not accept turn input`);
|
|
49
48
|
}
|
|
50
49
|
const limits = resolveMediaLimits(profile.inputs ?? {});
|
|
@@ -78,12 +77,12 @@ function sanitizeCsvText(text) {
|
|
|
78
77
|
return `${a}${b}${c}'${d ?? ''}${e ?? ''}`;
|
|
79
78
|
});
|
|
80
79
|
}
|
|
81
|
-
function sanitizeTextBytes(mime, bytes) {
|
|
80
|
+
function sanitizeTextBytes(mime, bytes, reader) {
|
|
82
81
|
let text = decodeText(bytes);
|
|
83
82
|
if (mime === 'text/csv') {
|
|
84
83
|
text = sanitizeCsvText(text);
|
|
85
84
|
}
|
|
86
|
-
return new TextEncoder().encode(
|
|
85
|
+
return new TextEncoder().encode(reader.read(text));
|
|
87
86
|
}
|
|
88
87
|
function named(issue, name) {
|
|
89
88
|
return name ? { ...issue, fileName: name } : issue;
|
|
@@ -137,12 +136,14 @@ function attachmentIssues(rules, files, clips) {
|
|
|
137
136
|
const ISSUE_KEYS = {
|
|
138
137
|
mime_not_allowed: 'attachments.mime_not_allowed',
|
|
139
138
|
too_many_files: 'attachments.too_many_files',
|
|
139
|
+
too_many_of_kind: 'attachments.too_many_of_kind',
|
|
140
140
|
file_too_large: 'attachments.file_too_large',
|
|
141
141
|
turn_too_large: 'attachments.turn_too_large',
|
|
142
142
|
attachments_not_accepted: 'attachments.not_accepted',
|
|
143
143
|
voice_not_accepted: 'attachments.not_accepted',
|
|
144
144
|
limits_unconfigured: 'attachments.limits_unconfigured',
|
|
145
145
|
};
|
|
146
|
+
/** The user-facing wording key and params for an attachment issue. */
|
|
146
147
|
function attachmentIssueCopy(issue) {
|
|
147
148
|
const params = {};
|
|
148
149
|
for (const [key, value] of Object.entries(issue.params ?? {})) {
|
|
@@ -153,24 +154,30 @@ function attachmentIssueCopy(issue) {
|
|
|
153
154
|
params.fileName = issue.fileName;
|
|
154
155
|
return { key: ISSUE_KEYS[issue.code], params };
|
|
155
156
|
}
|
|
156
|
-
|
|
157
|
+
/** The user-facing text for an attachment issue. */
|
|
158
|
+
function attachmentIssueText(issue, labels) {
|
|
157
159
|
const copy = attachmentIssueCopy(issue);
|
|
158
|
-
return
|
|
160
|
+
return labelText(copy.key, copy.params, labels);
|
|
159
161
|
}
|
|
162
|
+
/** The error for a turn whose attachments were refused. */
|
|
160
163
|
function attachmentsRefused(issues) {
|
|
161
164
|
return new TheoremError('input',
|
|
162
|
-
//
|
|
165
|
+
// labels-exempt: internal diagnostic; the user reads the copy lines
|
|
163
166
|
`attachments refused: ${issues.map((issue) => issue.code).join(', ')}`, { copy: issues.map(attachmentIssueCopy) });
|
|
164
167
|
}
|
|
168
|
+
/** The decoded size of inline base64 data; throws when it is not base64. */
|
|
169
|
+
function base64Bytes(data) {
|
|
170
|
+
if (!B64_BODY.test(data)) {
|
|
171
|
+
// labels-exempt: developer-facing wire-format diagnostic, not product copy
|
|
172
|
+
throw new TheoremError('request', 'attachment data must be base64');
|
|
173
|
+
}
|
|
174
|
+
return b64DecodedLen(data);
|
|
175
|
+
}
|
|
165
176
|
function factsOf(item) {
|
|
166
177
|
const facts = { mimeType: item.mimeType, name: item.name };
|
|
167
178
|
if (isTurnMediaRef(item))
|
|
168
179
|
return facts;
|
|
169
|
-
|
|
170
|
-
// lexicon-exempt: developer-facing wire-format diagnostic, not product copy
|
|
171
|
-
throw new TheoremError('request', 'attachment data must be base64');
|
|
172
|
-
}
|
|
173
|
-
facts.sizeBytes = b64DecodedLen(item.data);
|
|
180
|
+
facts.sizeBytes = base64Bytes(item.data);
|
|
174
181
|
return facts;
|
|
175
182
|
}
|
|
176
183
|
/** Provider references are checked for MIME and count; byte limits apply to inline blobs only. */
|
|
@@ -186,7 +193,7 @@ function assertTurnAttachments(profile, attachments, voice) {
|
|
|
186
193
|
if (issues.length > 0)
|
|
187
194
|
throw attachmentsRefused(issues);
|
|
188
195
|
}
|
|
189
|
-
function sanitizeAttachment(blob) {
|
|
196
|
+
function sanitizeAttachment(blob, reader) {
|
|
190
197
|
if (isTurnMediaRef(blob)) {
|
|
191
198
|
return blob;
|
|
192
199
|
}
|
|
@@ -194,18 +201,20 @@ function sanitizeAttachment(blob) {
|
|
|
194
201
|
if (!TEXT_MIMES.has(mimeEssence(mimeType))) {
|
|
195
202
|
return blob;
|
|
196
203
|
}
|
|
197
|
-
const bytes = sanitizeTextBytes(mimeType, base64ToBytes(data));
|
|
204
|
+
const bytes = sanitizeTextBytes(mimeType, base64ToBytes(data), reader);
|
|
198
205
|
return { ...blob, data: bytesToBase64(bytes) };
|
|
199
206
|
}
|
|
200
207
|
function hasTurnBlobs(attachments, voice) {
|
|
201
208
|
return (attachments?.length ?? 0) > 0 || (voice?.length ?? 0) > 0;
|
|
202
209
|
}
|
|
203
210
|
/** Provider file references pass through unsanitized: the kernel has no bytes to scan. */
|
|
204
|
-
function sanitizeTurnBlobs(profile, attachments, voice) {
|
|
211
|
+
function sanitizeTurnBlobs(profile, attachments, voice, at) {
|
|
205
212
|
assertTurnAttachments(profile, attachments, voice);
|
|
206
213
|
return {
|
|
207
|
-
attachments: attachments?.length
|
|
208
|
-
|
|
214
|
+
attachments: attachments?.length
|
|
215
|
+
? attachments.map((blob) => sanitizeAttachment(blob, at.attachment))
|
|
216
|
+
: attachments,
|
|
217
|
+
voice: voice?.length ? voice.map((blob) => sanitizeAttachment(blob, at.voice)) : voice,
|
|
209
218
|
};
|
|
210
219
|
}
|
|
211
|
-
export { assertTurnAttachments, attachmentIssueCopy, attachmentIssues, attachmentIssueText, attachmentsRefused, isTurnMediaRef, maxBytesForMime, requireMediaLimits, resolveMediaLimits, sanitizeCsvText, sanitizeTurnBlobs, };
|
|
220
|
+
export { assertTurnAttachments, attachmentIssueCopy, attachmentIssues, attachmentIssueText, attachmentsRefused, base64Bytes, isTurnMediaRef, maxBytesForMime, requireMediaLimits, resolveMediaLimits, sanitizeCsvText, sanitizeTurnBlobs, };
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { MediaInputKind, ModelBinding, ModelId, ModelProfile, Profile, ProfileInputsSpec, ThinkingLevel } from '../types.js';
|
|
2
2
|
import { mimeEssence } from '../util/mime.js';
|
|
3
|
+
/** Where a media input arrives: as an attachment or as voice. */
|
|
3
4
|
type MediaInputChannel = 'attachments' | 'voice';
|
|
4
5
|
/** Rules support a subtype wildcard such as `image/*`; parameter values are ignored. */
|
|
5
6
|
declare function mimeAllowed(accept: readonly string[], mime: string): boolean;
|
|
7
|
+
/** The kind of media a MIME type is, or `undefined` when it is not accepted. */
|
|
6
8
|
declare function mediaKindForMime(mime: string): MediaInputKind | undefined;
|
|
7
9
|
declare function profileInputs(profile: Profile): ProfileInputsSpec | undefined;
|
|
8
10
|
declare function profileAccept(profile: Profile, channel: MediaInputChannel): string[] | undefined;
|
|
@@ -11,9 +13,13 @@ declare function profileAccept(profile: Profile, channel: MediaInputChannel): st
|
|
|
11
13
|
* files with this instead of their own MIME table: the profile's `accept` lists are the whole declaration.
|
|
12
14
|
*/
|
|
13
15
|
declare function mediaChannelForMime(profile: Profile, mime: string): MediaInputChannel | undefined;
|
|
16
|
+
/** The profile's binding for the model id; throws when there is none. */
|
|
14
17
|
declare function requireModelBinding(profile: ModelProfile, modelId: ModelId): ModelBinding;
|
|
18
|
+
/** The level if the binding accepts it, else the binding's default effort level, else its first listed level. */
|
|
15
19
|
declare function clampThinkingLevel(binding: ModelBinding, level: ThinkingLevel): ThinkingLevel;
|
|
20
|
+
/** The binding whose provider model id is `apiId`, or `undefined`. */
|
|
16
21
|
declare function modelEntryByApiId(bindings: Record<string, ModelBinding>, apiId: string): ModelBinding | undefined;
|
|
22
|
+
/** The level if the binding for this provider model id accepts it, else that binding's default effort level, else its first listed level. */
|
|
17
23
|
declare function clampThinkingLevelForApiId(bindings: Record<string, ModelBinding>, apiId: string, level: ThinkingLevel): ThinkingLevel;
|
|
18
24
|
export type { MediaInputChannel };
|
|
19
25
|
export { clampThinkingLevel, clampThinkingLevelForApiId, mediaChannelForMime, mediaKindForMime, mimeAllowed, mimeEssence, modelEntryByApiId, profileAccept, profileInputs, requireModelBinding, };
|
|
@@ -12,11 +12,14 @@ function mimeAllowed(accept, mime) {
|
|
|
12
12
|
return allowed === actual;
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
+
/** The kind of media a MIME type is, or `undefined` when it is not accepted. */
|
|
15
16
|
function mediaKindForMime(mime) {
|
|
16
17
|
return MEDIA_INPUT_KINDS[mimeEssence(mime)];
|
|
17
18
|
}
|
|
18
19
|
function profileInputs(profile) {
|
|
19
|
-
return profile.type === 'text' || profile.type === 'image'
|
|
20
|
+
return profile.type === 'text' || profile.type === 'image' || profile.type === 'live'
|
|
21
|
+
? profile.inputs
|
|
22
|
+
: undefined;
|
|
20
23
|
}
|
|
21
24
|
function profileAccept(profile, channel) {
|
|
22
25
|
const inputs = profileInputs(profile);
|
|
@@ -38,10 +41,11 @@ function mediaChannelForMime(profile, mime) {
|
|
|
38
41
|
}
|
|
39
42
|
return undefined;
|
|
40
43
|
}
|
|
44
|
+
/** The profile's binding for the model id; throws when there is none. */
|
|
41
45
|
function requireModelBinding(profile, modelId) {
|
|
42
46
|
const binding = profile.models[modelId];
|
|
43
47
|
if (!binding) {
|
|
44
|
-
throw new TheoremError('config', `Profile ${profile.id} has no model binding for '${modelId}'`); //
|
|
48
|
+
throw new TheoremError('config', `Profile ${profile.id} has no model binding for '${modelId}'`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
45
49
|
}
|
|
46
50
|
return binding;
|
|
47
51
|
}
|
|
@@ -66,12 +70,15 @@ function clampLevels(binding, level) {
|
|
|
66
70
|
}
|
|
67
71
|
return legal[0] ?? level;
|
|
68
72
|
}
|
|
73
|
+
/** The level if the binding accepts it, else the binding's default effort level, else its first listed level. */
|
|
69
74
|
function clampThinkingLevel(binding, level) {
|
|
70
75
|
return clampLevels(binding, level);
|
|
71
76
|
}
|
|
77
|
+
/** The binding whose provider model id is `apiId`, or `undefined`. */
|
|
72
78
|
function modelEntryByApiId(bindings, apiId) {
|
|
73
79
|
return Object.values(bindings).find((m) => m.apiId === apiId);
|
|
74
80
|
}
|
|
81
|
+
/** The level if the binding for this provider model id accepts it, else that binding's default effort level, else its first listed level. */
|
|
75
82
|
function clampThinkingLevelForApiId(bindings, apiId, level) {
|
|
76
83
|
return clampLevels(modelEntryByApiId(bindings, apiId), level);
|
|
77
84
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EmbeddingModelLimits } from '../protocols/protocol.js';
|
|
2
|
+
import type { AttachmentValidationIssue, MimeInputs } from '../types.js';
|
|
3
|
+
import { type AttachmentFacts } from './attachments.js';
|
|
4
|
+
/**
|
|
5
|
+
* What one embedding request may carry: the profile's inputs held to its model's limits. File
|
|
6
|
+
* counts are per input, sizes per file and across the request.
|
|
7
|
+
*/
|
|
8
|
+
export interface EmbeddingRules {
|
|
9
|
+
text: boolean;
|
|
10
|
+
attachments?: {
|
|
11
|
+
accept: string[];
|
|
12
|
+
};
|
|
13
|
+
maxFiles?: number;
|
|
14
|
+
maxBytes?: number;
|
|
15
|
+
maxTurnBytes?: number;
|
|
16
|
+
limitsByMime?: Record<string, number>;
|
|
17
|
+
/** Inputs one request may carry. */
|
|
18
|
+
maxInputs?: number;
|
|
19
|
+
/** The model's caps on one kind of media in one input. */
|
|
20
|
+
perInput?: {
|
|
21
|
+
accept: string[];
|
|
22
|
+
max: number;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
/** The profile's inputs held to what its model takes; without the model's limits, the profile's alone. */
|
|
26
|
+
export declare function embeddingRules(inputs: MimeInputs, model?: EmbeddingModelLimits): EmbeddingRules;
|
|
27
|
+
/** The one embedding media check, input by input: the kernel throws on it and the client runs it before a send. */
|
|
28
|
+
export declare function embeddingMediaIssues(rules: EmbeddingRules, media: readonly (readonly AttachmentFacts[])[]): AttachmentValidationIssue[];
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mimeEssence } from '../util/mime.js';
|
|
2
|
+
import { attachmentIssues, resolveMediaLimits } from './attachments.js';
|
|
3
|
+
import { mimeAllowed } from './catalog.js';
|
|
4
|
+
/** The types both lists take, each as narrow as the narrower list names it. */
|
|
5
|
+
function bothAccept(profile, model) {
|
|
6
|
+
return [
|
|
7
|
+
...new Set([
|
|
8
|
+
...model.filter((mime) => mimeAllowed(profile, mime)),
|
|
9
|
+
...profile.filter((mime) => mimeAllowed(model, mime)),
|
|
10
|
+
]),
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
/** The profile's inputs held to what its model takes; without the model's limits, the profile's alone. */
|
|
14
|
+
export function embeddingRules(inputs, model) {
|
|
15
|
+
const accept = inputs.attachments
|
|
16
|
+
? model
|
|
17
|
+
? bothAccept(inputs.attachments.accept, model.media.flatMap((kind) => kind.accept))
|
|
18
|
+
: [...inputs.attachments.accept]
|
|
19
|
+
: [];
|
|
20
|
+
const perInput = (model?.media ?? []).flatMap((kind) => kind.maxPerInput === undefined ? [] : [{ accept: [...kind.accept], max: kind.maxPerInput }]);
|
|
21
|
+
return {
|
|
22
|
+
text: inputs.text !== false,
|
|
23
|
+
...(accept.length > 0 ? { attachments: { accept } } : {}),
|
|
24
|
+
...(inputs.maxFiles === undefined ? {} : { maxFiles: inputs.maxFiles }),
|
|
25
|
+
...(inputs.maxBytes === undefined ? {} : { maxBytes: inputs.maxBytes }),
|
|
26
|
+
...(inputs.maxTurnBytes === undefined ? {} : { maxTurnBytes: inputs.maxTurnBytes }),
|
|
27
|
+
...(inputs.limitsByMime === undefined ? {} : { limitsByMime: { ...inputs.limitsByMime } }),
|
|
28
|
+
...(model?.maxInputs === undefined ? {} : { maxInputs: model.maxInputs }),
|
|
29
|
+
...(perInput.length > 0 ? { perInput } : {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** How the user reads a kind of media: PDF, or its top-level type. */
|
|
33
|
+
function kindName(accept) {
|
|
34
|
+
const first = mimeEssence(accept[0] ?? '');
|
|
35
|
+
return first === 'application/pdf' ? 'PDF' : (first.split('/')[0] ?? first);
|
|
36
|
+
}
|
|
37
|
+
/** The one embedding media check, input by input: the kernel throws on it and the client runs it before a send. */
|
|
38
|
+
export function embeddingMediaIssues(rules, media) {
|
|
39
|
+
const limits = resolveMediaLimits(rules);
|
|
40
|
+
const issues = attachmentIssues({
|
|
41
|
+
attachments: rules.attachments?.accept,
|
|
42
|
+
...(limits ? { limits: { ...limits, maxFiles: Number.MAX_SAFE_INTEGER } } : {}),
|
|
43
|
+
}, media.flat(), []);
|
|
44
|
+
if (limits) {
|
|
45
|
+
for (const files of media) {
|
|
46
|
+
if (files.length > limits.maxFiles)
|
|
47
|
+
issues.push({ code: 'too_many_files', params: { maxFiles: limits.maxFiles } });
|
|
48
|
+
for (const kind of rules.perInput ?? []) {
|
|
49
|
+
const count = files.filter((file) => mimeAllowed(kind.accept, file.mimeType)).length;
|
|
50
|
+
if (count > kind.max)
|
|
51
|
+
issues.push({
|
|
52
|
+
code: 'too_many_of_kind',
|
|
53
|
+
params: { maxFiles: kind.max, kind: kindName(kind.accept) },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
return issues.filter((issue) => {
|
|
60
|
+
const key = JSON.stringify(issue);
|
|
61
|
+
if (seen.has(key))
|
|
62
|
+
return false;
|
|
63
|
+
seen.add(key);
|
|
64
|
+
return true;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type { ImageResponseFormat, InteractionPart, Profile, TurnRequest } from '../types.js';
|
|
1
|
+
import type { ImageResponseFormat, InteractionPart, Profile, ProfileSpeechSpec, TurnRequest } from '../types.js';
|
|
2
2
|
/** Typed profiles already make mixed wire formats unrepresentable; this is a safety net. */
|
|
3
3
|
declare function assertOutputMode(profile: Profile, structuredId: string | null): void;
|
|
4
4
|
declare function assertSpeechRole(profile: Profile, req: TurnRequest): void;
|
|
5
|
+
/** The profile's speech settings with this turn's laid over them. */
|
|
6
|
+
declare function resolveSpeech(profile: Profile, req: TurnRequest): ProfileSpeechSpec | undefined;
|
|
5
7
|
declare function resolveImageFormat(profile: Profile): ImageResponseFormat | null;
|
|
6
8
|
declare function resolveInputParts(profile: Profile, req: TurnRequest): InteractionPart[];
|
|
7
9
|
declare function assertTurnSlots(profile: Profile, req: TurnRequest): void;
|
|
8
|
-
|
|
10
|
+
/** Refuses context from a sender the profile's `inputs.context` does not list, and a package over its `maxChars`. */
|
|
11
|
+
declare function assertTurnContext(profile: Profile, req: TurnRequest): void;
|
|
12
|
+
export { assertOutputMode, assertSpeechRole, assertTurnContext, assertTurnSlots, resolveImageFormat, resolveInputParts, resolveSpeech, };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { wrapUserData } from '../../guardrails/canary.js';
|
|
1
|
+
import { wrapContext, wrapUserData } from '../../guardrails/canary.js';
|
|
2
2
|
import { TheoremError } from '../../guardrails/error.js';
|
|
3
|
-
import {
|
|
3
|
+
import { labelText } from '../../guardrails/labels.js';
|
|
4
|
+
import { contextText } from '../../guardrails/sanitize.js';
|
|
4
5
|
import { synthesizeRepairPrompt } from '../engine/repair.js';
|
|
6
|
+
import { CONTEXT_SENDERS } from '../schema.js';
|
|
5
7
|
import { CONTINUE_INSTRUCTION_TYPES } from '../stop.js';
|
|
6
8
|
import { isTurnMediaRef } from './attachments.js';
|
|
7
9
|
import { mediaKindForMime, mimeEssence, profileInputs } from './catalog.js';
|
|
@@ -24,17 +26,29 @@ function assertOutputMode(profile, structuredId) {
|
|
|
24
26
|
if (active.length <= 1) {
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
27
|
-
throw new TheoremError('config', `Profile ${profile.id} declares multiple output wire formats (${active.join(', ')}). ` + //
|
|
29
|
+
throw new TheoremError('config', `Profile ${profile.id} declares multiple output wire formats (${active.join(', ')}). ` + // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
28
30
|
'Only one of a structured JSON schema (outputs.structured), image, or speech may be active.');
|
|
29
31
|
}
|
|
30
32
|
function assertSpeechRole(profile, req) {
|
|
31
33
|
if (profile.type !== 'speech') {
|
|
34
|
+
if (req.speech) {
|
|
35
|
+
throw new TheoremError('request', `Profile ${profile.id} (${profile.type}) takes no speech settings — only a speech profile speaks`);
|
|
36
|
+
}
|
|
32
37
|
return;
|
|
33
38
|
}
|
|
34
39
|
if (req.system) {
|
|
35
40
|
throw new TheoremError('config', `Profile ${profile.id} (speech) takes no system prompt — the input text is the transcript`);
|
|
36
41
|
}
|
|
37
42
|
}
|
|
43
|
+
/** The profile's speech settings with this turn's laid over them. */
|
|
44
|
+
function resolveSpeech(profile, req) {
|
|
45
|
+
return profile.type === 'speech'
|
|
46
|
+
? { ...profile.speech, ...definedFields(req.speech) }
|
|
47
|
+
: undefined;
|
|
48
|
+
}
|
|
49
|
+
function definedFields(speech) {
|
|
50
|
+
return Object.fromEntries(Object.entries(speech ?? {}).filter(([, value]) => value !== undefined));
|
|
51
|
+
}
|
|
38
52
|
function resolveImageFormat(profile) {
|
|
39
53
|
if (profile.type !== 'image') {
|
|
40
54
|
return null;
|
|
@@ -56,7 +70,7 @@ function resolveImageFormat(profile) {
|
|
|
56
70
|
function assertMediaMime(mime) {
|
|
57
71
|
const kind = mediaKindForMime(mime);
|
|
58
72
|
if (!kind) {
|
|
59
|
-
throw new TheoremError('input', `MIME '${mime}' is not a supported media input type`); //
|
|
73
|
+
throw new TheoremError('input', `MIME '${mime}' is not a supported media input type`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
60
74
|
}
|
|
61
75
|
return kind;
|
|
62
76
|
}
|
|
@@ -75,16 +89,29 @@ function mediaParts(blobs) {
|
|
|
75
89
|
function extractTextPart(profile, req) {
|
|
76
90
|
const { text, repair, history } = req.input ?? {};
|
|
77
91
|
if (profile.type === 'speech' && !text?.trim()) {
|
|
78
|
-
throw new TheoremError('request', `Profile ${profile.id} (speech) requires text input`); //
|
|
92
|
+
throw new TheoremError('request', `Profile ${profile.id} (speech) requires text input`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
79
93
|
}
|
|
80
94
|
if (profileInputs(profile)?.text === false && text) {
|
|
81
|
-
throw new TheoremError('request', `Profile ${profile.id} does not accept text input`); //
|
|
95
|
+
throw new TheoremError('request', `Profile ${profile.id} does not accept text input`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
82
96
|
}
|
|
83
|
-
// A repair is the kernel's, not the user's, so it applies even when the profile takes no user text.
|
|
97
|
+
// why: A repair is the kernel's, not the user's, so it applies even when the profile takes no user text.
|
|
84
98
|
const promptText = repair
|
|
85
99
|
? synthesizeRepairPrompt({ profile, repair, history })
|
|
86
100
|
: (continueText(profile, req) ?? text);
|
|
87
|
-
|
|
101
|
+
// why: A speech model reads its input aloud, fence and all; it follows no instruction, so none needs fencing.
|
|
102
|
+
if (profile.type === 'speech') {
|
|
103
|
+
return promptText ? { type: 'text', text: promptText } : null;
|
|
104
|
+
}
|
|
105
|
+
const blocks = [...contextBlocks(req), ...(promptText ? [wrapUserData(promptText)] : [])];
|
|
106
|
+
return blocks.length > 0 ? { type: 'text', text: blocks.join('\n\n') } : null;
|
|
107
|
+
}
|
|
108
|
+
/** Each sender's context in its own fence, the host's first: the model reads it before the user's message. */
|
|
109
|
+
function contextBlocks(req) {
|
|
110
|
+
const context = req.input?.context ?? {};
|
|
111
|
+
return [...CONTEXT_SENDERS]
|
|
112
|
+
.reverse()
|
|
113
|
+
.filter((sender) => context[sender] !== undefined)
|
|
114
|
+
.map((sender) => wrapContext(sender, contextText(context[sender])));
|
|
88
115
|
}
|
|
89
116
|
/** Image and speech get none: their continue re-sends the host's request unchanged. */
|
|
90
117
|
function continueText(profile, req) {
|
|
@@ -94,7 +121,7 @@ function continueText(profile, req) {
|
|
|
94
121
|
if (req.input?.text) {
|
|
95
122
|
throw new TheoremError('request', `Profile ${profile.id}: a continueFrom turn takes no input.text — its user message is the continue instruction`);
|
|
96
123
|
}
|
|
97
|
-
return
|
|
124
|
+
return labelText('continue.instruction', {}, profile.labels);
|
|
98
125
|
}
|
|
99
126
|
function pinnedReferenceParts(profile) {
|
|
100
127
|
return profile.type === 'image' && profile.image.references
|
|
@@ -131,4 +158,22 @@ function assertTurnSlots(profile, req) {
|
|
|
131
158
|
}
|
|
132
159
|
}
|
|
133
160
|
}
|
|
134
|
-
|
|
161
|
+
/** Refuses context from a sender the profile's `inputs.context` does not list, and a package over its `maxChars`. */
|
|
162
|
+
function assertTurnContext(profile, req) {
|
|
163
|
+
const context = req.input?.context;
|
|
164
|
+
if (!context)
|
|
165
|
+
return;
|
|
166
|
+
const spec = profileInputs(profile)?.context;
|
|
167
|
+
for (const [sender, value] of Object.entries(context)) {
|
|
168
|
+
if (value === undefined)
|
|
169
|
+
continue;
|
|
170
|
+
const allowed = CONTEXT_SENDERS.includes(sender);
|
|
171
|
+
if (!allowed || !spec?.from.some((from) => from === sender)) {
|
|
172
|
+
throw new TheoremError('request', `Profile ${profile.id} takes no context from '${sender}'`);
|
|
173
|
+
}
|
|
174
|
+
if (contextText(value).length > spec.maxChars) {
|
|
175
|
+
throw new TheoremError('request', `Profile ${profile.id}: context from '${sender}' is over inputs.context.maxChars (${String(spec.maxChars)})`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export { assertOutputMode, assertSpeechRole, assertTurnContext, assertTurnSlots, resolveImageFormat, resolveInputParts, resolveSpeech, };
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { type ProviderRegistry } from '../protocols/provider.js';
|
|
1
2
|
import { type ToolRegistry } from '../tools/registry.js';
|
|
2
3
|
import { type ProfileRegistry } from './profiles.js';
|
|
3
4
|
import { type SchemaRegistry } from './schemas.js';
|
|
4
5
|
/** Every run takes one explicitly; nothing reads a registry it was not handed. */
|
|
5
6
|
interface KernelRegistry {
|
|
7
|
+
readonly providers: ProviderRegistry;
|
|
6
8
|
readonly tools: ToolRegistry;
|
|
7
9
|
readonly profiles: ProfileRegistry;
|
|
8
10
|
readonly schemas: SchemaRegistry;
|
|
9
11
|
}
|
|
12
|
+
/** Creates an empty registry of tools, profiles, and schemas, wired so a tool that names a profile can find it. */
|
|
10
13
|
declare function createKernelRegistry(): KernelRegistry;
|
|
11
14
|
export type { KernelRegistry };
|
|
12
15
|
export { createKernelRegistry };
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
import { createProviderRegistry } from '../protocols/provider.js';
|
|
1
2
|
import { createToolRegistry } from '../tools/registry.js';
|
|
2
3
|
import { createProfileRegistry } from './profiles.js';
|
|
3
4
|
import { createSchemaRegistry } from './schemas.js';
|
|
5
|
+
/** Creates an empty registry of tools, profiles, and schemas, wired so a tool that names a profile can find it. */
|
|
4
6
|
function createKernelRegistry() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
// why: An agent tool names a profile, and a profile allows tools: each registry reads
|
|
8
|
+
// the other. Tools look profiles up only when one registers, after both exist.
|
|
9
|
+
const tools = createToolRegistry((id) => profiles.find(id));
|
|
10
|
+
const schemas = createSchemaRegistry();
|
|
11
|
+
const providers = createProviderRegistry();
|
|
12
|
+
const profiles = createProfileRegistry(tools, schemas, providers);
|
|
13
|
+
return { tools, profiles, schemas, providers };
|
|
7
14
|
}
|
|
8
15
|
export { createKernelRegistry };
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
function profileTurnOutputs(profile) {
|
|
2
|
-
if (profile.type === 'live' ||
|
|
2
|
+
if (profile.type === 'live' ||
|
|
3
|
+
profile.type === 'host' ||
|
|
4
|
+
profile.type === 'decision' ||
|
|
5
|
+
profile.type === 'embedding') {
|
|
3
6
|
return undefined;
|
|
4
7
|
}
|
|
5
8
|
return profile.outputs;
|
|
@@ -1,29 +1,38 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type
|
|
1
|
+
import { type LabelOverrides } from '../../guardrails/labels.js';
|
|
2
|
+
import { type DecisionGuardrailsSpec, type HostGuardrailsSpec, type ProfileGuardrailsSpec } from '../../guardrails/types.js';
|
|
3
3
|
import type { ProfileObservabilitySpec } from '../../observability/types.js';
|
|
4
|
+
import type { ProviderRegistry } from '../protocols/provider.js';
|
|
4
5
|
import type { ToolRegistry } from '../tools/registry.js';
|
|
5
|
-
import type { DecisionModelBinding, DecisionProfile, HostProfile, HostProfileToolsSpec, ImageInputsSpec, ImageProfile, LiveProfile, LiveProfileToolsSpec, MediaTurnBehaviourSpec, ModelBinding, ModelId, Profile, ProfileIdentity, ProfileInputsSpec,
|
|
6
|
+
import type { DecisionModelBinding, DecisionProfile, EmbeddingProfile, HostProfile, HostProfileToolsSpec, ImageInputsSpec, ImageProfile, LiveProfile, LiveProfileToolsSpec, MediaTurnBehaviourSpec, ModelBinding, ModelId, Profile, ProfileIdentity, ProfileInputsSpec, ProfileOutputsSpec, ProfileToolsSpec, ProfileTurnBehaviourSpec, SpeechProfile, TextProfile } from '../types.js';
|
|
7
|
+
import type { SchemaRegistry } from './schemas.js';
|
|
6
8
|
/** Not shared by host profiles, which invoke tools without a model turn. */
|
|
7
9
|
export type ProfileDefinitionBase = {
|
|
8
10
|
id: Profile['id'];
|
|
9
11
|
identity: ProfileIdentity;
|
|
10
12
|
models: Record<ModelId, ModelBinding>;
|
|
13
|
+
providerContinuation?: import('../checkpoint.js').ProviderContinuationPolicy;
|
|
11
14
|
defaultModel?: ModelId;
|
|
12
15
|
allowModelSelect?: boolean;
|
|
13
16
|
maxSteps?: number;
|
|
14
|
-
key?: ProfileModelFields['key'];
|
|
15
|
-
fallbackKey?: ProfileModelFields['fallbackKey'];
|
|
16
17
|
outputs?: ProfileOutputsSpec;
|
|
17
18
|
guardrails?: ProfileGuardrailsSpec;
|
|
18
19
|
observability?: ProfileObservabilitySpec;
|
|
19
|
-
|
|
20
|
+
labels?: LabelOverrides;
|
|
20
21
|
};
|
|
22
|
+
/** What a host writes to define an embedding profile. */
|
|
23
|
+
export type EmbeddingProfileDefinition = Omit<ProfileDefinitionBase, 'identity' | 'outputs' | 'maxSteps'> & {
|
|
24
|
+
type: 'embedding';
|
|
25
|
+
identity: Pick<ProfileIdentity, 'handle'>;
|
|
26
|
+
inputs: EmbeddingProfile['inputs'];
|
|
27
|
+
};
|
|
28
|
+
/** What a host writes to define a text profile. */
|
|
21
29
|
export type TextProfileDefinition = ProfileDefinitionBase & {
|
|
22
30
|
type: 'text';
|
|
23
31
|
tools: ProfileToolsSpec;
|
|
24
32
|
inputs: ProfileInputsSpec;
|
|
25
33
|
turnBehaviour?: ProfileTurnBehaviourSpec;
|
|
26
34
|
};
|
|
35
|
+
/** What a host writes to define an image profile. */
|
|
27
36
|
export type ImageProfileDefinition = ProfileDefinitionBase & {
|
|
28
37
|
type: 'image';
|
|
29
38
|
image: NonNullable<ImageProfile['image']>;
|
|
@@ -31,33 +40,36 @@ export type ImageProfileDefinition = ProfileDefinitionBase & {
|
|
|
31
40
|
inputs: ImageInputsSpec;
|
|
32
41
|
turnBehaviour?: MediaTurnBehaviourSpec;
|
|
33
42
|
};
|
|
34
|
-
|
|
43
|
+
/** What a host writes to define a speech profile. */
|
|
44
|
+
export type SpeechProfileDefinition = Omit<ProfileDefinitionBase, 'identity'> & {
|
|
35
45
|
type: 'speech';
|
|
36
46
|
identity: SpeechProfile['identity'];
|
|
37
|
-
guardrails?: SpeechGuardrailsSpec;
|
|
38
47
|
speech: NonNullable<SpeechProfile['speech']>;
|
|
39
48
|
turnBehaviour?: MediaTurnBehaviourSpec;
|
|
40
49
|
};
|
|
50
|
+
/** What a host writes to define a live profile. */
|
|
41
51
|
export type LiveProfileDefinition = ProfileDefinitionBase & {
|
|
42
52
|
type: 'live';
|
|
43
53
|
live: NonNullable<LiveProfile['live']>;
|
|
54
|
+
inputs?: LiveProfile['inputs'];
|
|
44
55
|
tools: LiveProfileToolsSpec;
|
|
45
56
|
/** Inject gate only — resumption is `live.sessionResumption`. */
|
|
46
57
|
turnBehaviour?: Pick<ProfileTurnBehaviourSpec, 'allowSteering'>;
|
|
47
58
|
};
|
|
59
|
+
/** What a host writes to define a decision profile. */
|
|
48
60
|
export type DecisionProfileDefinition = {
|
|
49
61
|
type: 'decision';
|
|
50
62
|
id: Profile['id'];
|
|
51
63
|
identity: Pick<ProfileIdentity, 'handle'>;
|
|
52
64
|
/** Exactly one model. */
|
|
53
65
|
models: Record<ModelId, DecisionModelBinding>;
|
|
54
|
-
key?: import('../types.js').KeySlot;
|
|
55
66
|
inputs: DecisionProfile['inputs'];
|
|
56
67
|
decision: DecisionProfile['decision'];
|
|
57
68
|
guardrails?: DecisionGuardrailsSpec;
|
|
58
69
|
observability?: ProfileObservabilitySpec;
|
|
59
|
-
|
|
70
|
+
labels?: LabelOverrides;
|
|
60
71
|
};
|
|
72
|
+
/** What a host writes to define a host profile, which runs tools and no model. */
|
|
61
73
|
export type HostProfileDefinition = {
|
|
62
74
|
type: 'host';
|
|
63
75
|
id: Profile['id'];
|
|
@@ -65,17 +77,29 @@ export type HostProfileDefinition = {
|
|
|
65
77
|
/** Only the guards that fire on the `invokeTool` path. */
|
|
66
78
|
guardrails?: HostGuardrailsSpec;
|
|
67
79
|
observability?: ProfileObservabilitySpec;
|
|
68
|
-
|
|
80
|
+
labels?: LabelOverrides;
|
|
69
81
|
};
|
|
70
|
-
|
|
82
|
+
/** Any profile definition, discriminated by `type`. */
|
|
83
|
+
export type ProfileDefinition = TextProfileDefinition | ImageProfileDefinition | SpeechProfileDefinition | LiveProfileDefinition | DecisionProfileDefinition | EmbeddingProfileDefinition | HostProfileDefinition;
|
|
84
|
+
/** Validate a definition and return the profile; throws on a malformed one. */
|
|
71
85
|
declare function defineProfile(input: TextProfileDefinition): TextProfile;
|
|
86
|
+
/** Validate an image definition and return the profile. */
|
|
72
87
|
declare function defineProfile(input: ImageProfileDefinition): ImageProfile;
|
|
88
|
+
/** Validate a speech definition and return the profile. */
|
|
73
89
|
declare function defineProfile(input: SpeechProfileDefinition): SpeechProfile;
|
|
90
|
+
/** Validate a live definition and return the profile. */
|
|
74
91
|
declare function defineProfile(input: LiveProfileDefinition): LiveProfile;
|
|
92
|
+
/** Validate a decision definition and return the profile. */
|
|
75
93
|
declare function defineProfile(input: DecisionProfileDefinition): DecisionProfile;
|
|
94
|
+
/** Validate a host definition and return the profile. */
|
|
76
95
|
declare function defineProfile(input: HostProfileDefinition): HostProfile;
|
|
96
|
+
/** Validate an embedding definition and return the profile. */
|
|
97
|
+
declare function defineProfile(input: EmbeddingProfileDefinition): EmbeddingProfile;
|
|
98
|
+
/** Validate a definition of any type except live and host, and return the profile. */
|
|
77
99
|
declare function defineProfile(input: Exclude<ProfileDefinition, LiveProfileDefinition | HostProfileDefinition>): Exclude<Profile, LiveProfile | HostProfile>;
|
|
100
|
+
/** Validate any definition and return the profile. */
|
|
78
101
|
declare function defineProfile(input: ProfileDefinition): Profile;
|
|
102
|
+
/** A set of registered profiles, kept by id. */
|
|
79
103
|
interface ProfileRegistry {
|
|
80
104
|
register(profileInput: Profile | ProfileDefinition): void;
|
|
81
105
|
registerMany(profilesList: Array<Profile | ProfileDefinition>): void;
|
|
@@ -86,7 +110,7 @@ interface ProfileRegistry {
|
|
|
86
110
|
list(): Profile[];
|
|
87
111
|
clear(): void;
|
|
88
112
|
}
|
|
89
|
-
/** Profiles are checked against `tools`, so register a scope's tools before its profiles. */
|
|
90
|
-
declare function createProfileRegistry(tools: ToolRegistry): ProfileRegistry;
|
|
113
|
+
/** Profiles are checked against `tools` and `schemas`, so register a scope's tools and schemas before its profiles. */
|
|
114
|
+
declare function createProfileRegistry(tools: ToolRegistry, schemas: SchemaRegistry, providers?: ProviderRegistry): ProfileRegistry;
|
|
91
115
|
export type { ProfileRegistry };
|
|
92
116
|
export { createProfileRegistry, defineProfile };
|