@alvin0/ai-agent-sdk-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/agent/accounting/common.js +2 -0
- package/dist/agent/accounting/common.js.map +1 -0
- package/dist/agent/accounting/config.js +2 -0
- package/dist/agent/accounting/config.js.map +1 -0
- package/dist/agent/accounting/contracts.d.ts +36 -0
- package/dist/agent/accounting/contracts.d.ts.map +1 -0
- package/dist/agent/accounting/delivery/accounting-data.js +2 -0
- package/dist/agent/accounting/delivery/accounting-data.js.map +1 -0
- package/dist/agent/accounting/delivery/config.js +2 -0
- package/dist/agent/accounting/delivery/config.js.map +1 -0
- package/dist/agent/accounting/delivery/data.js +2 -0
- package/dist/agent/accounting/delivery/data.js.map +1 -0
- package/dist/agent/accounting/delivery/support-errors.js +2 -0
- package/dist/agent/accounting/delivery/support-errors.js.map +1 -0
- package/dist/agent/accounting/delivery/terminal.js +2 -0
- package/dist/agent/accounting/delivery/terminal.js.map +1 -0
- package/dist/agent/accounting/delivery-types.d.ts +43 -0
- package/dist/agent/accounting/delivery-types.d.ts.map +1 -0
- package/dist/agent/accounting/error.d.ts +18 -0
- package/dist/agent/accounting/error.d.ts.map +1 -0
- package/dist/agent/accounting/error.js +2 -0
- package/dist/agent/accounting/error.js.map +1 -0
- package/dist/agent/accounting/estimate.js +2 -0
- package/dist/agent/accounting/estimate.js.map +1 -0
- package/dist/agent/accounting/event-buffer.js +2 -0
- package/dist/agent/accounting/event-buffer.js.map +1 -0
- package/dist/agent/accounting/ledger.js +2 -0
- package/dist/agent/accounting/ledger.js.map +1 -0
- package/dist/agent/accounting/report.d.ts +70 -0
- package/dist/agent/accounting/report.d.ts.map +1 -0
- package/dist/agent/accounting/usage.d.ts +13 -0
- package/dist/agent/accounting/usage.d.ts.map +1 -0
- package/dist/agent/accounting/usage.js +2 -0
- package/dist/agent/accounting/usage.js.map +1 -0
- package/dist/agent/context/section.d.ts +15 -0
- package/dist/agent/context/section.d.ts.map +1 -0
- package/dist/agent/context/section.js +2 -0
- package/dist/agent/context/section.js.map +1 -0
- package/dist/agent/context/types.d.ts +98 -0
- package/dist/agent/context/types.d.ts.map +1 -0
- package/dist/agent/define/definition.d.ts +110 -0
- package/dist/agent/define/definition.d.ts.map +1 -0
- package/dist/agent/define/definition.js +2 -0
- package/dist/agent/define/definition.js.map +1 -0
- package/dist/agent/define/instructions.js +2 -0
- package/dist/agent/define/instructions.js.map +1 -0
- package/dist/agent/define/output-format.js +2 -0
- package/dist/agent/define/output-format.js.map +1 -0
- package/dist/agent/define/session/accounting.js +2 -0
- package/dist/agent/define/session/accounting.js.map +1 -0
- package/dist/agent/define/session/common.js +2 -0
- package/dist/agent/define/session/common.js.map +1 -0
- package/dist/agent/define/session/config.js +2 -0
- package/dist/agent/define/session/config.js.map +1 -0
- package/dist/agent/define/session/model-config.js +2 -0
- package/dist/agent/define/session/model-config.js.map +1 -0
- package/dist/agent/define/session/observer.js +2 -0
- package/dist/agent/define/session/observer.js.map +1 -0
- package/dist/agent/define/session/run-seal.js +2 -0
- package/dist/agent/define/session/run-seal.js.map +1 -0
- package/dist/agent/define/session/runtime-binding.js +2 -0
- package/dist/agent/define/session/runtime-binding.js.map +1 -0
- package/dist/agent/define/session/runtime-compaction.js +2 -0
- package/dist/agent/define/session/runtime-compaction.js.map +1 -0
- package/dist/agent/define/session/runtime-memory.js +2 -0
- package/dist/agent/define/session/runtime-memory.js.map +1 -0
- package/dist/agent/define/session/skills.js +2 -0
- package/dist/agent/define/session/skills.js.map +1 -0
- package/dist/agent/define/session/trace-accounting.js +2 -0
- package/dist/agent/define/session/trace-accounting.js.map +1 -0
- package/dist/agent/define/session/types.d.ts +217 -0
- package/dist/agent/define/session/types.d.ts.map +1 -0
- package/dist/agent/define/session/validation.js +2 -0
- package/dist/agent/define/session/validation.js.map +1 -0
- package/dist/agent/define/session.d.ts +77 -0
- package/dist/agent/define/session.d.ts.map +1 -0
- package/dist/agent/define/session.js +2 -0
- package/dist/agent/define/session.js.map +1 -0
- package/dist/agent/history/config.js +2 -0
- package/dist/agent/history/config.js.map +1 -0
- package/dist/agent/history/history.d.ts +33 -0
- package/dist/agent/history/history.d.ts.map +1 -0
- package/dist/agent/history/history.js +2 -0
- package/dist/agent/history/history.js.map +1 -0
- package/dist/agent/history/normalize.d.ts +7 -0
- package/dist/agent/history/normalize.d.ts.map +1 -0
- package/dist/agent/history/normalize.js +2 -0
- package/dist/agent/history/normalize.js.map +1 -0
- package/dist/agent/history/project.d.ts +14 -0
- package/dist/agent/history/project.d.ts.map +1 -0
- package/dist/agent/history/project.js +2 -0
- package/dist/agent/history/project.js.map +1 -0
- package/dist/agent/history/types.d.ts +85 -0
- package/dist/agent/history/types.d.ts.map +1 -0
- package/dist/agent/history/validation.js +2 -0
- package/dist/agent/history/validation.js.map +1 -0
- package/dist/agent/loop/events.d.ts +213 -0
- package/dist/agent/loop/events.d.ts.map +1 -0
- package/dist/agent/loop/queue.js +2 -0
- package/dist/agent/loop/queue.js.map +1 -0
- package/dist/agent/loop/run-turn.d.ts +8 -0
- package/dist/agent/loop/run-turn.d.ts.map +1 -0
- package/dist/agent/loop/run-turn.js +2 -0
- package/dist/agent/loop/run-turn.js.map +1 -0
- package/dist/agent/loop/schedule.d.ts +62 -0
- package/dist/agent/loop/schedule.d.ts.map +1 -0
- package/dist/agent/loop/schedule.js +3 -0
- package/dist/agent/loop/schedule.js.map +1 -0
- package/dist/agent/loop/turn/cancellation.js +2 -0
- package/dist/agent/loop/turn/cancellation.js.map +1 -0
- package/dist/agent/loop/turn/common.js +2 -0
- package/dist/agent/loop/turn/common.js.map +1 -0
- package/dist/agent/loop/turn/config.js +2 -0
- package/dist/agent/loop/turn/config.js.map +1 -0
- package/dist/agent/loop/turn/content.js +4 -0
- package/dist/agent/loop/turn/content.js.map +1 -0
- package/dist/agent/loop/turn/hooks.js +2 -0
- package/dist/agent/loop/turn/hooks.js.map +1 -0
- package/dist/agent/loop/turn/model-round.js +2 -0
- package/dist/agent/loop/turn/model-round.js.map +1 -0
- package/dist/agent/loop/turn/repetition.js +2 -0
- package/dist/agent/loop/turn/repetition.js.map +1 -0
- package/dist/agent/loop/turn/types.d.ts +82 -0
- package/dist/agent/loop/turn/types.d.ts.map +1 -0
- package/dist/agent/loop/turn/usage-stop.js +2 -0
- package/dist/agent/loop/turn/usage-stop.js.map +1 -0
- package/dist/agent/loop/turn/validation.js +2 -0
- package/dist/agent/loop/turn/validation.js.map +1 -0
- package/dist/agent/loop/types.d.ts +82 -0
- package/dist/agent/loop/types.d.ts.map +1 -0
- package/dist/agent/memory/accounting-binding.js +2 -0
- package/dist/agent/memory/accounting-binding.js.map +1 -0
- package/dist/agent/memory/compaction-config.d.ts +63 -0
- package/dist/agent/memory/compaction-config.d.ts.map +1 -0
- package/dist/agent/memory/compaction-config.js +2 -0
- package/dist/agent/memory/compaction-config.js.map +1 -0
- package/dist/agent/memory/compaction.d.ts +62 -0
- package/dist/agent/memory/compaction.d.ts.map +1 -0
- package/dist/agent/memory/compaction.js +6 -0
- package/dist/agent/memory/compaction.js.map +1 -0
- package/dist/agent/memory/memory.d.ts +61 -0
- package/dist/agent/memory/memory.d.ts.map +1 -0
- package/dist/agent/memory/memory.js +5 -0
- package/dist/agent/memory/memory.js.map +1 -0
- package/dist/agent/memory/persistence-types.d.ts +44 -0
- package/dist/agent/memory/persistence-types.d.ts.map +1 -0
- package/dist/agent/memory/surface-compaction.d.ts +6 -0
- package/dist/agent/memory/surface-compaction.d.ts.map +1 -0
- package/dist/agent/memory/surface-compaction.js +4 -0
- package/dist/agent/memory/surface-compaction.js.map +1 -0
- package/dist/agent/memory/token-estimator.d.ts +12 -0
- package/dist/agent/memory/token-estimator.d.ts.map +1 -0
- package/dist/agent/memory/token-estimator.js +2 -0
- package/dist/agent/memory/token-estimator.js.map +1 -0
- package/dist/agent/mode/run-agent.d.ts +79 -0
- package/dist/agent/mode/run-agent.d.ts.map +1 -0
- package/dist/agent/mode/run-agent.js +4 -0
- package/dist/agent/mode/run-agent.js.map +1 -0
- package/dist/agent/mode/user-input.d.ts +61 -0
- package/dist/agent/mode/user-input.d.ts.map +1 -0
- package/dist/agent/mode/user-input.js +2 -0
- package/dist/agent/mode/user-input.js.map +1 -0
- package/dist/agent/skill/catalog.d.ts +53 -0
- package/dist/agent/skill/catalog.d.ts.map +1 -0
- package/dist/agent/skill/catalog.js +2 -0
- package/dist/agent/skill/catalog.js.map +1 -0
- package/dist/agent/skill/definition.d.ts +106 -0
- package/dist/agent/skill/definition.d.ts.map +1 -0
- package/dist/agent/skill/definition.js +2 -0
- package/dist/agent/skill/definition.js.map +1 -0
- package/dist/agent/skill/provider/config.d.ts +11 -0
- package/dist/agent/skill/provider/config.d.ts.map +1 -0
- package/dist/agent/skill/provider/config.js +2 -0
- package/dist/agent/skill/provider/config.js.map +1 -0
- package/dist/agent/skill/provider/context.js +2 -0
- package/dist/agent/skill/provider/context.js.map +1 -0
- package/dist/agent/skill/provider/definition.d.ts +6 -0
- package/dist/agent/skill/provider/definition.d.ts.map +1 -0
- package/dist/agent/skill/provider/definition.js +2 -0
- package/dist/agent/skill/provider/definition.js.map +1 -0
- package/dist/agent/skill/provider/snapshot.js +2 -0
- package/dist/agent/skill/provider/snapshot.js.map +1 -0
- package/dist/agent/skill/provider/types.d.ts +49 -0
- package/dist/agent/skill/provider/types.d.ts.map +1 -0
- package/dist/agent/skill/tools.d.ts +45 -0
- package/dist/agent/skill/tools.d.ts.map +1 -0
- package/dist/agent/skill/tools.js +14 -0
- package/dist/agent/skill/tools.js.map +1 -0
- package/dist/agent/team/common.d.ts +26 -0
- package/dist/agent/team/common.d.ts.map +1 -0
- package/dist/agent/team/common.js +2 -0
- package/dist/agent/team/common.js.map +1 -0
- package/dist/agent/team/composed.d.ts +45 -0
- package/dist/agent/team/composed.d.ts.map +1 -0
- package/dist/agent/team/composed.js +2 -0
- package/dist/agent/team/composed.js.map +1 -0
- package/dist/agent/team/contracts.d.ts +54 -0
- package/dist/agent/team/contracts.d.ts.map +1 -0
- package/dist/agent/team/managed.d.ts +527 -0
- package/dist/agent/team/managed.d.ts.map +1 -0
- package/dist/agent/team/managed.js +4 -0
- package/dist/agent/team/managed.js.map +1 -0
- package/dist/agent/team/team.d.ts +142 -0
- package/dist/agent/team/team.d.ts.map +1 -0
- package/dist/agent/team/team.js +2 -0
- package/dist/agent/team/team.js.map +1 -0
- package/dist/agent/team/types.d.ts +170 -0
- package/dist/agent/team/types.d.ts.map +1 -0
- package/dist/agent/tool/approval.d.ts +106 -0
- package/dist/agent/tool/approval.d.ts.map +1 -0
- package/dist/agent/tool/approval.js +2 -0
- package/dist/agent/tool/approval.js.map +1 -0
- package/dist/agent/tool/capture.js +2 -0
- package/dist/agent/tool/capture.js.map +1 -0
- package/dist/agent/tool/config.js +2 -0
- package/dist/agent/tool/config.js.map +1 -0
- package/dist/agent/tool/definition.d.ts +227 -0
- package/dist/agent/tool/definition.d.ts.map +1 -0
- package/dist/agent/tool/definition.js +2 -0
- package/dist/agent/tool/definition.js.map +1 -0
- package/dist/agent/tool/errors.d.ts +82 -0
- package/dist/agent/tool/errors.d.ts.map +1 -0
- package/dist/agent/tool/errors.js +2 -0
- package/dist/agent/tool/errors.js.map +1 -0
- package/dist/agent/tool/execution.d.ts +60 -0
- package/dist/agent/tool/execution.d.ts.map +1 -0
- package/dist/agent/tool/execution.js +2 -0
- package/dist/agent/tool/execution.js.map +1 -0
- package/dist/agent/tool/output-budget.d.ts +159 -0
- package/dist/agent/tool/output-budget.d.ts.map +1 -0
- package/dist/agent/tool/output-budget.js +3 -0
- package/dist/agent/tool/output-budget.js.map +1 -0
- package/dist/agent/tool/pipeline.d.ts +98 -0
- package/dist/agent/tool/pipeline.d.ts.map +1 -0
- package/dist/agent/tool/pipeline.js +4 -0
- package/dist/agent/tool/pipeline.js.map +1 -0
- package/dist/agent/tool/registry.d.ts +70 -0
- package/dist/agent/tool/registry.d.ts.map +1 -0
- package/dist/agent/tool/registry.js +2 -0
- package/dist/agent/tool/registry.js.map +1 -0
- package/dist/agent/tool/schema.d.ts +12 -0
- package/dist/agent/tool/schema.d.ts.map +1 -0
- package/dist/agent/tool/schema.js +2 -0
- package/dist/agent/tool/schema.js.map +1 -0
- package/dist/agent/tool/source-types.d.ts +25 -0
- package/dist/agent/tool/source-types.d.ts.map +1 -0
- package/dist/agent/trace/trace.d.ts +63 -0
- package/dist/agent/trace/trace.d.ts.map +1 -0
- package/dist/agent/trace/trace.js +2 -0
- package/dist/agent/trace/trace.js.map +1 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.js +1 -0
- package/dist/async/settlement.d.ts +6 -0
- package/dist/async/settlement.d.ts.map +1 -0
- package/dist/async/settlement.js +2 -0
- package/dist/async/settlement.js.map +1 -0
- package/dist/capability/common/config.js +2 -0
- package/dist/capability/common/config.js.map +1 -0
- package/dist/capability/common/data.js +2 -0
- package/dist/capability/common/data.js.map +1 -0
- package/dist/composition/agent/author.d.ts +12 -0
- package/dist/composition/agent/author.d.ts.map +1 -0
- package/dist/composition/agent/author.js +2 -0
- package/dist/composition/agent/author.js.map +1 -0
- package/dist/composition/agent/definition.js +2 -0
- package/dist/composition/agent/definition.js.map +1 -0
- package/dist/composition/agent/native-event.js +2 -0
- package/dist/composition/agent/native-event.js.map +1 -0
- package/dist/composition/agent/native-tools.js +2 -0
- package/dist/composition/agent/native-tools.js.map +1 -0
- package/dist/composition/agent/options.js +2 -0
- package/dist/composition/agent/options.js.map +1 -0
- package/dist/composition/agent/policy.js +2 -0
- package/dist/composition/agent/policy.js.map +1 -0
- package/dist/composition/agent/public-message.js +2 -0
- package/dist/composition/agent/public-message.js.map +1 -0
- package/dist/composition/agent/session.js +2 -0
- package/dist/composition/agent/session.js.map +1 -0
- package/dist/composition/agent/types.d.ts +218 -0
- package/dist/composition/agent/types.d.ts.map +1 -0
- package/dist/composition/common/counter.js +2 -0
- package/dist/composition/common/counter.js.map +1 -0
- package/dist/composition/common/errors.d.ts +15 -0
- package/dist/composition/common/errors.d.ts.map +1 -0
- package/dist/composition/common/errors.js +2 -0
- package/dist/composition/common/errors.js.map +1 -0
- package/dist/composition/common/json-data.js +2 -0
- package/dist/composition/common/json-data.js.map +1 -0
- package/dist/composition/credential/config.d.ts +5 -0
- package/dist/composition/credential/config.d.ts.map +1 -0
- package/dist/composition/credential/config.js +2 -0
- package/dist/composition/credential/config.js.map +1 -0
- package/dist/composition/credential/definition.d.ts +9 -0
- package/dist/composition/credential/definition.d.ts.map +1 -0
- package/dist/composition/credential/definition.js +2 -0
- package/dist/composition/credential/definition.js.map +1 -0
- package/dist/composition/credential/types.d.ts +38 -0
- package/dist/composition/credential/types.d.ts.map +1 -0
- package/dist/composition/delivery/ack.js +2 -0
- package/dist/composition/delivery/ack.js.map +1 -0
- package/dist/composition/delivery/attempt.js +2 -0
- package/dist/composition/delivery/attempt.js.map +1 -0
- package/dist/composition/delivery/batch.js +2 -0
- package/dist/composition/delivery/batch.js.map +1 -0
- package/dist/composition/delivery/checkpoint.js +2 -0
- package/dist/composition/delivery/checkpoint.js.map +1 -0
- package/dist/composition/delivery/event.js +2 -0
- package/dist/composition/delivery/event.js.map +1 -0
- package/dist/composition/delivery/resource.d.ts +11 -0
- package/dist/composition/delivery/resource.d.ts.map +1 -0
- package/dist/composition/delivery/resource.js +2 -0
- package/dist/composition/delivery/resource.js.map +1 -0
- package/dist/composition/delivery/staging.js +2 -0
- package/dist/composition/delivery/staging.js.map +1 -0
- package/dist/composition/diagnostics/config.js +2 -0
- package/dist/composition/diagnostics/config.js.map +1 -0
- package/dist/composition/diagnostics/ring.d.ts +12 -0
- package/dist/composition/diagnostics/ring.d.ts.map +1 -0
- package/dist/composition/diagnostics/ring.js +2 -0
- package/dist/composition/diagnostics/ring.js.map +1 -0
- package/dist/composition/exporter/definition.d.ts +7 -0
- package/dist/composition/exporter/definition.d.ts.map +1 -0
- package/dist/composition/exporter/definition.js +2 -0
- package/dist/composition/exporter/definition.js.map +1 -0
- package/dist/composition/exporter/lifecycle.js +2 -0
- package/dist/composition/exporter/lifecycle.js.map +1 -0
- package/dist/composition/exporter/preflight.js +2 -0
- package/dist/composition/exporter/preflight.js.map +1 -0
- package/dist/composition/exporter/types.d.ts +25 -0
- package/dist/composition/exporter/types.d.ts.map +1 -0
- package/dist/composition/exporter/types.js +2 -0
- package/dist/composition/exporter/types.js.map +1 -0
- package/dist/composition/identity/agent.js +2 -0
- package/dist/composition/identity/agent.js.map +1 -0
- package/dist/composition/lifecycle/bounded.js +2 -0
- package/dist/composition/lifecycle/bounded.js.map +1 -0
- package/dist/composition/lifecycle/operations.js +2 -0
- package/dist/composition/lifecycle/operations.js.map +1 -0
- package/dist/composition/lifecycle/types.d.ts +13 -0
- package/dist/composition/lifecycle/types.d.ts.map +1 -0
- package/dist/composition/lifecycle/types.js +2 -0
- package/dist/composition/lifecycle/types.js.map +1 -0
- package/dist/composition/logging/config.js +2 -0
- package/dist/composition/logging/config.js.map +1 -0
- package/dist/composition/logging/integration.js +2 -0
- package/dist/composition/logging/integration.js.map +1 -0
- package/dist/composition/logging/logger.d.ts +9 -0
- package/dist/composition/logging/logger.d.ts.map +1 -0
- package/dist/composition/logging/logger.js +2 -0
- package/dist/composition/logging/logger.js.map +1 -0
- package/dist/composition/memory/config.d.ts +10 -0
- package/dist/composition/memory/config.d.ts.map +1 -0
- package/dist/composition/memory/config.js +2 -0
- package/dist/composition/memory/config.js.map +1 -0
- package/dist/composition/memory/definition.d.ts +7 -0
- package/dist/composition/memory/definition.d.ts.map +1 -0
- package/dist/composition/memory/definition.js +2 -0
- package/dist/composition/memory/definition.js.map +1 -0
- package/dist/composition/memory/key.js +2 -0
- package/dist/composition/memory/key.js.map +1 -0
- package/dist/composition/memory/resume.js +2 -0
- package/dist/composition/memory/resume.js.map +1 -0
- package/dist/composition/memory/run.js +2 -0
- package/dist/composition/memory/run.js.map +1 -0
- package/dist/composition/model-catalog/config.js +2 -0
- package/dist/composition/model-catalog/config.js.map +1 -0
- package/dist/composition/model-catalog/manager.js +2 -0
- package/dist/composition/model-catalog/manager.js.map +1 -0
- package/dist/composition/model-catalog/options.js +2 -0
- package/dist/composition/model-catalog/options.js.map +1 -0
- package/dist/composition/model-catalog/types.d.ts +9 -0
- package/dist/composition/model-catalog/types.d.ts.map +1 -0
- package/dist/composition/observation/config.js +2 -0
- package/dist/composition/observation/config.js.map +1 -0
- package/dist/composition/observation/extensions.js +2 -0
- package/dist/composition/observation/extensions.js.map +1 -0
- package/dist/composition/observation/final-report.d.ts +6 -0
- package/dist/composition/observation/final-report.d.ts.map +1 -0
- package/dist/composition/observation/final-report.js +2 -0
- package/dist/composition/observation/final-report.js.map +1 -0
- package/dist/composition/observation/health.d.ts +13 -0
- package/dist/composition/observation/health.d.ts.map +1 -0
- package/dist/composition/observation/port.d.ts +11 -0
- package/dist/composition/observation/port.d.ts.map +1 -0
- package/dist/composition/observation/port.js +2 -0
- package/dist/composition/observation/port.js.map +1 -0
- package/dist/composition/preflight.js +2 -0
- package/dist/composition/preflight.js.map +1 -0
- package/dist/composition/provider/activation.js +2 -0
- package/dist/composition/provider/activation.js.map +1 -0
- package/dist/composition/provider/definition.d.ts +7 -0
- package/dist/composition/provider/definition.d.ts.map +1 -0
- package/dist/composition/provider/definition.js +2 -0
- package/dist/composition/provider/definition.js.map +1 -0
- package/dist/composition/provider/model-selection.js +2 -0
- package/dist/composition/provider/model-selection.js.map +1 -0
- package/dist/composition/provider/preflight.js +2 -0
- package/dist/composition/provider/preflight.js.map +1 -0
- package/dist/composition/provider/types.d.ts +38 -0
- package/dist/composition/provider/types.d.ts.map +1 -0
- package/dist/composition/provider/types.js +2 -0
- package/dist/composition/provider/types.js.map +1 -0
- package/dist/composition/queue/config.js +2 -0
- package/dist/composition/queue/config.js.map +1 -0
- package/dist/composition/queue/scheduler.js +2 -0
- package/dist/composition/queue/scheduler.js.map +1 -0
- package/dist/composition/queue/store.js +2 -0
- package/dist/composition/queue/store.js.map +1 -0
- package/dist/composition/runtime/config.js +2 -0
- package/dist/composition/runtime/config.js.map +1 -0
- package/dist/composition/runtime/owner.js +2 -0
- package/dist/composition/runtime/owner.js.map +1 -0
- package/dist/composition/runtime/public.d.ts +7 -0
- package/dist/composition/runtime/public.d.ts.map +1 -0
- package/dist/composition/runtime/public.js +2 -0
- package/dist/composition/runtime/public.js.map +1 -0
- package/dist/composition/runtime/types.d.ts +76 -0
- package/dist/composition/runtime/types.d.ts.map +1 -0
- package/dist/composition/startup.js +2 -0
- package/dist/composition/startup.js.map +1 -0
- package/dist/composition/team/config.js +2 -0
- package/dist/composition/team/config.js.map +1 -0
- package/dist/composition/team/options.js +2 -0
- package/dist/composition/team/options.js.map +1 -0
- package/dist/composition/team/runtime.js +2 -0
- package/dist/composition/team/runtime.js.map +1 -0
- package/dist/composition/team/types.d.ts +63 -0
- package/dist/composition/team/types.d.ts.map +1 -0
- package/dist/composition/tool-source/config.d.ts +5 -0
- package/dist/composition/tool-source/config.d.ts.map +1 -0
- package/dist/composition/tool-source/config.js +2 -0
- package/dist/composition/tool-source/config.js.map +1 -0
- package/dist/composition/tool-source/definition.d.ts +7 -0
- package/dist/composition/tool-source/definition.d.ts.map +1 -0
- package/dist/composition/tool-source/definition.js +2 -0
- package/dist/composition/tool-source/definition.js.map +1 -0
- package/dist/composition/tool-source/snapshot.js +2 -0
- package/dist/composition/tool-source/snapshot.js.map +1 -0
- package/dist/contract/adapter.d.ts +91 -0
- package/dist/contract/adapter.d.ts.map +1 -0
- package/dist/contract/adapter.js +2 -0
- package/dist/contract/adapter.js.map +1 -0
- package/dist/contract/call-config.d.ts +36 -0
- package/dist/contract/call-config.d.ts.map +1 -0
- package/dist/contract/call-config.js +2 -0
- package/dist/contract/call-config.js.map +1 -0
- package/dist/contract/generate-options.d.ts +41 -0
- package/dist/contract/generate-options.d.ts.map +1 -0
- package/dist/contract/model-info.d.ts +99 -0
- package/dist/contract/model-info.d.ts.map +1 -0
- package/dist/contract/output-format.d.ts +18 -0
- package/dist/contract/output-format.d.ts.map +1 -0
- package/dist/contract/retry-policy.d.ts +104 -0
- package/dist/contract/retry-policy.d.ts.map +1 -0
- package/dist/contract/retry-policy.js +2 -0
- package/dist/contract/retry-policy.js.map +1 -0
- package/dist/contract/tool.d.ts +65 -0
- package/dist/contract/tool.d.ts.map +1 -0
- package/dist/contract/tool.js +2 -0
- package/dist/contract/tool.js.map +1 -0
- package/dist/errors/agent-sdk-error.d.ts +88 -0
- package/dist/errors/agent-sdk-error.d.ts.map +1 -0
- package/dist/errors/agent-sdk-error.js +2 -0
- package/dist/errors/agent-sdk-error.js.map +1 -0
- package/dist/errors/capability-identity.d.ts +10 -0
- package/dist/errors/capability-identity.d.ts.map +1 -0
- package/dist/errors/capability-identity.js +2 -0
- package/dist/errors/capability-identity.js.map +1 -0
- package/dist/errors/failure.d.ts +33 -0
- package/dist/errors/failure.d.ts.map +1 -0
- package/dist/errors/failure.js +2 -0
- package/dist/errors/failure.js.map +1 -0
- package/dist/errors/model-error.d.ts +83 -0
- package/dist/errors/model-error.d.ts.map +1 -0
- package/dist/errors/model-error.js +2 -0
- package/dist/errors/model-error.js.map +1 -0
- package/dist/http/api-key.d.ts +47 -0
- package/dist/http/api-key.d.ts.map +1 -0
- package/dist/http/api-key.js +2 -0
- package/dist/http/api-key.js.map +1 -0
- package/dist/http/attribution.d.ts +51 -0
- package/dist/http/attribution.d.ts.map +1 -0
- package/dist/http/attribution.js +2 -0
- package/dist/http/attribution.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +1 -0
- package/dist/logging/types.d.ts +53 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/memory.d.ts +10 -0
- package/dist/memory.js +1 -0
- package/dist/message/content.d.ts +125 -0
- package/dist/message/content.d.ts.map +1 -0
- package/dist/message/message.d.ts +154 -0
- package/dist/message/message.d.ts.map +1 -0
- package/dist/message/message.js +2 -0
- package/dist/message/message.js.map +1 -0
- package/dist/message/projection.d.ts +34 -0
- package/dist/message/projection.d.ts.map +1 -0
- package/dist/message/projection.js +2 -0
- package/dist/message/projection.js.map +1 -0
- package/dist/observability/bus.d.ts +7 -0
- package/dist/observability/bus.d.ts.map +1 -0
- package/dist/observability/bus.js +2 -0
- package/dist/observability/bus.js.map +1 -0
- package/dist/observability/exporters.d.ts +39 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +2 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/logger.js +2 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/projections.d.ts +12 -0
- package/dist/observability/projections.d.ts.map +1 -0
- package/dist/observability/projections.js +2 -0
- package/dist/observability/projections.js.map +1 -0
- package/dist/observability/types.d.ts +103 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability.d.ts +20 -0
- package/dist/observability.js +1 -0
- package/dist/observation/boundaries.js +2 -0
- package/dist/observation/boundaries.js.map +1 -0
- package/dist/observation/context.d.ts +39 -0
- package/dist/observation/context.d.ts.map +1 -0
- package/dist/observation/context.js +2 -0
- package/dist/observation/context.js.map +1 -0
- package/dist/observation/event.d.ts +50 -0
- package/dist/observation/event.d.ts.map +1 -0
- package/dist/observation/event.js +2 -0
- package/dist/observation/event.js.map +1 -0
- package/dist/observation/port.d.ts +56 -0
- package/dist/observation/port.d.ts.map +1 -0
- package/dist/observation/port.js +2 -0
- package/dist/observation/port.js.map +1 -0
- package/dist/observation/privacy.js +2 -0
- package/dist/observation/privacy.js.map +1 -0
- package/dist/observation/report.d.ts +117 -0
- package/dist/observation/report.d.ts.map +1 -0
- package/dist/observation/report.js +2 -0
- package/dist/observation/report.js.map +1 -0
- package/dist/observation/telemetry-types.d.ts +29 -0
- package/dist/observation/telemetry-types.d.ts.map +1 -0
- package/dist/observation/usage.d.ts +52 -0
- package/dist/observation/usage.d.ts.map +1 -0
- package/dist/observation/usage.js +2 -0
- package/dist/observation/usage.js.map +1 -0
- package/dist/platform/adapter.js +2 -0
- package/dist/platform/adapter.js.map +1 -0
- package/dist/platform/capability-operation.js +2 -0
- package/dist/platform/capability-operation.js.map +1 -0
- package/dist/platform/config.js +2 -0
- package/dist/platform/config.js.map +1 -0
- package/dist/platform/logger-platform.js +2 -0
- package/dist/platform/logger-platform.js.map +1 -0
- package/dist/platform/resources.js +2 -0
- package/dist/platform/resources.js.map +1 -0
- package/dist/plugin/provider-plugin.d.ts +37 -0
- package/dist/plugin/provider-plugin.d.ts.map +1 -0
- package/dist/plugin/provider-plugin.js +2 -0
- package/dist/plugin/provider-plugin.js.map +1 -0
- package/dist/primitives/brand.d.ts +61 -0
- package/dist/primitives/brand.d.ts.map +1 -0
- package/dist/primitives/brand.js +2 -0
- package/dist/primitives/brand.js.map +1 -0
- package/dist/primitives/freeze.d.ts +20 -0
- package/dist/primitives/freeze.d.ts.map +1 -0
- package/dist/primitives/freeze.js +2 -0
- package/dist/primitives/freeze.js.map +1 -0
- package/dist/primitives/json-snapshot.js +2 -0
- package/dist/primitives/json-snapshot.js.map +1 -0
- package/dist/primitives/json.d.ts +32 -0
- package/dist/primitives/json.d.ts.map +1 -0
- package/dist/primitives/json.js +2 -0
- package/dist/primitives/json.js.map +1 -0
- package/dist/primitives/never.d.ts +22 -0
- package/dist/primitives/never.d.ts.map +1 -0
- package/dist/primitives/never.js +2 -0
- package/dist/primitives/never.js.map +1 -0
- package/dist/primitives/snapshot.d.ts +10 -0
- package/dist/primitives/snapshot.d.ts.map +1 -0
- package/dist/primitives/snapshot.js +2 -0
- package/dist/primitives/snapshot.js.map +1 -0
- package/dist/primitives/version.d.ts +6 -0
- package/dist/primitives/version.d.ts.map +1 -0
- package/dist/primitives/version.js +2 -0
- package/dist/primitives/version.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.js +1 -0
- package/dist/runtime/model-call-handle.js +2 -0
- package/dist/runtime/model-call-handle.js.map +1 -0
- package/dist/runtime/model-metadata.js +2 -0
- package/dist/runtime/model-metadata.js.map +1 -0
- package/dist/runtime/model-stream.js +2 -0
- package/dist/runtime/model-stream.js.map +1 -0
- package/dist/runtime/registry.d.ts +171 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +2 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/with-retry.d.ts +45 -0
- package/dist/runtime/with-retry.d.ts.map +1 -0
- package/dist/runtime/with-retry.js +2 -0
- package/dist/runtime/with-retry.js.map +1 -0
- package/dist/skills.d.ts +8 -0
- package/dist/skills.js +1 -0
- package/dist/stream/assembler.d.ts +86 -0
- package/dist/stream/assembler.d.ts.map +1 -0
- package/dist/stream/assembler.js +2 -0
- package/dist/stream/assembler.js.map +1 -0
- package/dist/stream/chunk.d.ts +135 -0
- package/dist/stream/chunk.d.ts.map +1 -0
- package/dist/stream/idle-timeout.d.ts +30 -0
- package/dist/stream/idle-timeout.d.ts.map +1 -0
- package/dist/stream/idle-timeout.js +2 -0
- package/dist/stream/idle-timeout.js.map +1 -0
- package/dist/support-safe/error.d.ts +29 -0
- package/dist/support-safe/error.d.ts.map +1 -0
- package/dist/support-safe/error.js +2 -0
- package/dist/support-safe/error.js.map +1 -0
- package/dist/tools.d.ts +15 -0
- package/dist/tools.js +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return t(e,new WeakSet)}function t(e,n){if(e===null)return!0;switch(typeof e){case`string`:case`boolean`:return!0;case`number`:return Number.isFinite(e);case`object`:break;default:return!1}let r=e;if(n.has(r))return!1;n.add(r);try{if(Array.isArray(r))return r.every(e=>t(e,n));let e=Object.getPrototypeOf(r);return e!==Object.prototype&&e!==null?!1:Object.values(r).every(e=>t(e,n))}finally{n.delete(r)}}export{e as isJsonValue};
|
|
2
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","names":[],"sources":["../../src/primitives/json.ts"],"sourcesContent":["/**\n * Lossless-JSON values.\n *\n * Used wherever a value has to survive being logged, persisted, replayed, or sent\n * across a process boundary. Typing it explicitly rather than using `unknown`\n * makes the constraint checkable: a tool that returns a `Map`, a `Date`, or a\n * class instance cannot silently produce a log entry that fails to round-trip.\n *\n * @module ai-agent-sdk/core/primitives/json\n */\n\n/** A value that survives `JSON.parse(JSON.stringify(x))` unchanged. */\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue }\n\n/** A JSON object, when the top level must not be a primitive or array. */\nexport type JsonObject = { readonly [key: string]: JsonValue }\n\n/**\n * Whether a value round-trips through JSON unchanged.\n *\n * Rejects `undefined`, functions, symbols, and any non-plain object — including\n * `Date` and `Map`, which `JSON.stringify` accepts but corrupts (a `Date` becomes\n * a string, a `Map` becomes `{}`). Cycles are rejected rather than throwing.\n * @param value - the value to check.\n * @returns true when the value is losslessly JSON.\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n return check(value, new WeakSet())\n}\n\nfunction check(value: unknown, seen: WeakSet<object>): boolean {\n if (value === null) return true\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return true\n // NaN and Infinity serialize to `null`, so they do not round-trip.\n case 'number':\n return Number.isFinite(value)\n case 'object':\n break\n default:\n return false\n }\n const object = value as object\n if (seen.has(object)) return false\n seen.add(object)\n try {\n if (Array.isArray(object)) return object.every(entry => check(entry, seen))\n // A plain object only. `Object.create(null)` is accepted because it also\n // serializes faithfully.\n const prototype = Object.getPrototypeOf(object) as unknown\n if (prototype !== Object.prototype && prototype !== null) return false\n return Object.values(object).every(entry => check(entry, seen))\n } finally {\n seen.delete(object)\n }\n}\n"],"mappings":"AAgCA,SAAgB,EAAY,EAAoC,CAC9D,OAAO,EAAM,EAAO,IAAI,OAAS,CACnC,CAEA,SAAS,EAAM,EAAgB,EAAgC,CAC7D,GAAI,IAAU,KAAM,MAAO,GAC3B,OAAQ,OAAO,EAAf,CACE,IAAK,SACL,IAAK,UACH,MAAO,GAET,IAAK,SACH,OAAO,OAAO,SAAS,CAAK,EAC9B,IAAK,SACH,MACF,QACE,MAAO,EACX,CACA,IAAM,EAAS,EACf,GAAI,EAAK,IAAI,CAAM,EAAG,MAAO,GAC7B,EAAK,IAAI,CAAM,EACf,GAAI,CACF,GAAI,MAAM,QAAQ,CAAM,EAAG,OAAO,EAAO,MAAM,GAAS,EAAM,EAAO,CAAI,CAAC,EAG1E,IAAM,EAAY,OAAO,eAAe,CAAM,EAE9C,OADI,IAAc,OAAO,WAAa,IAAc,KAAa,GAC1D,OAAO,OAAO,CAAM,CAAC,CAAC,MAAM,GAAS,EAAM,EAAO,CAAI,CAAC,CAChE,QAAU,CACR,EAAK,OAAO,CAAM,CACpB,CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/primitives/never.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Exhaustiveness helper for CLOSED unions.
|
|
4
|
+
*
|
|
5
|
+
* Use {@link assertNever} in the default branch of a switch over a closed union
|
|
6
|
+
* so that adding a variant fails compilation at every site that must handle it.
|
|
7
|
+
* Do NOT use it for the merge-extensible unions (`ContentBlock`, `FinishReason`,
|
|
8
|
+
* `MessageSource`): a consumer may legitimately receive a variant it does not
|
|
9
|
+
* know, so those switches must fall through instead of throwing.
|
|
10
|
+
*
|
|
11
|
+
* @module ai-agent-sdk/core/primitives/never
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Mark an unreachable closed-union branch.
|
|
15
|
+
* @param value - the impossible value; typed `never` so an unhandled variant fails at the call site.
|
|
16
|
+
* @param context - optional label (usually the switch site) prefixed into the message.
|
|
17
|
+
* @returns never Ealways throws, rendering the offending value.
|
|
18
|
+
*/
|
|
19
|
+
declare function assertNever(value: never, context?: string): never;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { assertNever };
|
|
22
|
+
//# sourceMappingURL=never.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.d.ts","names":[],"sources":["../../src/primitives/never.ts"],"mappings":";;;;;;;;;;;;;;;;;;iBAkBgB,YAAY,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.js","names":[],"sources":["../../src/primitives/never.ts"],"sourcesContent":["/**\n * Exhaustiveness helper for CLOSED unions.\n *\n * Use {@link assertNever} in the default branch of a switch over a closed union\n * so that adding a variant fails compilation at every site that must handle it.\n * Do NOT use it for the merge-extensible unions (`ContentBlock`, `FinishReason`,\n * `MessageSource`): a consumer may legitimately receive a variant it does not\n * know, so those switches must fall through instead of throwing.\n *\n * @module ai-agent-sdk/core/primitives/never\n */\n\n/**\n * Mark an unreachable closed-union branch.\n * @param value - the impossible value; typed `never` so an unhandled variant fails at the call site.\n * @param context - optional label (usually the switch site) prefixed into the message.\n * @returns never Ealways throws, rendering the offending value.\n */\nexport function assertNever(value: never, context?: string): never {\n // JSON.stringify is typed `string` but returns undefined for `undefined`;\n // String() covers that and other non-serializable escapes.\n const rendered = (JSON.stringify(value) as string | undefined) ?? String(value)\n throw new Error(`unreachable variant${context === undefined ? '' : ` in ${context}`}: ${rendered}`)\n}\n"],"mappings":"AAkBA,SAAgB,EAAY,EAAc,EAAyB,CAGjE,IAAM,EAAY,KAAK,UAAU,CAAK,GAA4B,OAAO,CAAK,EAC9E,MAAU,MAAM,sBAAsB,IAAY,IAAA,GAAY,GAAK,OAAO,IAAU,IAAI,GAAU,CACpG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/primitives/snapshot.d.ts
|
|
2
|
+
/** Detach and recursively freeze a value before crossing an observer boundary. */
|
|
3
|
+
/**
|
|
4
|
+
* Prevent observers from mutating live runtime state through an event payload.
|
|
5
|
+
* Values crossing this boundary are required to be structured-cloneable.
|
|
6
|
+
*/
|
|
7
|
+
declare function detachedFrozen<T>(value: T): T;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { detachedFrozen };
|
|
10
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","names":[],"sources":["../../src/primitives/snapshot.ts"],"mappings":";;;;;;iBAQgB,eAAe,GAAG,OAAO,IAAI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","names":[],"sources":["../../src/primitives/snapshot.ts"],"sourcesContent":["/** Detach and recursively freeze a value before crossing an observer boundary. */\n\nimport { deepFreeze } from './freeze.ts'\n\n/**\n * Prevent observers from mutating live runtime state through an event payload.\n * Values crossing this boundary are required to be structured-cloneable.\n */\nexport function detachedFrozen<T>(value: T): T {\n return deepFreeze(structuredClone(value))\n}\n"],"mappings":"yCAQA,SAAgB,EAAkB,EAAa,CAC7C,OAAO,EAAW,gBAAgB,CAAK,CAAC,CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","names":[],"sources":["../../src/primitives/version.ts"],"mappings":";;cACa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../src/primitives/version.ts"],"sourcesContent":["/** Package version injected as a Web-standard literal; release tooling updates this file. */\nexport const SDK_VERSION = '0.1.0'\n"],"mappings":"AACA,MAAa,EAAc"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ProviderRequestId } from "./primitives/brand.js";
|
|
2
|
+
import { StreamChunk } from "./stream/chunk.js";
|
|
3
|
+
import { AgentSdkError } from "./errors/agent-sdk-error.js";
|
|
4
|
+
import { UsageCounters } from "./observation/usage.js";
|
|
5
|
+
import { SdkLogger } from "./logging/types.js";
|
|
6
|
+
import { EndProviderAttemptInput, ModelInvocationContext, ProviderAttemptHandle, StartProviderAttemptInput } from "./observation/report.js";
|
|
7
|
+
import { ModelToolSchema, NativeImageGenerationTool, NativeToolName, NativeToolSchema, NativeToolSchemaMap, NativeWebSearchTool, ToolChoice, WebSearchLocation } from "./contract/tool.js";
|
|
8
|
+
import { GenerateOptions } from "./contract/generate-options.js";
|
|
9
|
+
import { ModelInfo, ModelModality, ModelReasoningInfo, ProviderInfo, ResolvedModelInfo } from "./contract/model-info.js";
|
|
10
|
+
import { ResolvedRetryPolicy, RetryPolicyConfig } from "./contract/retry-policy.js";
|
|
11
|
+
import { ModelAdapter, PreparedAdapterCall } from "./contract/adapter.js";
|
|
12
|
+
import { AdapterRegistrationHandle, ModelProviderPlugin, ModelProviderRegistrar, StreamMiddleware } from "./plugin/provider-plugin.js";
|
|
13
|
+
import { ModelRegistry } from "./runtime/registry.js";
|
|
14
|
+
import { ComposableModelProviderPlugin, ComposableModelProviderRegistrar, ModelProviderPluginDefinition, ModelTarget, PROVIDER_PLUGIN_API_VERSION } from "./composition/provider/types.js";
|
|
15
|
+
import { CREDENTIAL_CAPABILITY_API_VERSION } from "./composition/credential/config.js";
|
|
16
|
+
import { CredentialCommitInput, CredentialCommitResult, CredentialInput, CredentialOperationOptions, CredentialRecord, CredentialSource, CredentialStore, CredentialStoreDefinition } from "./composition/credential/types.js";
|
|
17
|
+
import { defineCredentialSource, defineCredentialStore } from "./composition/credential/definition.js";
|
|
18
|
+
import { defineModelProviderPlugin } from "./composition/provider/definition.js";
|
|
19
|
+
export { type AdapterRegistrationHandle, AgentSdkError, CREDENTIAL_CAPABILITY_API_VERSION, type ComposableModelProviderPlugin, type ComposableModelProviderRegistrar, type CredentialCommitInput, type CredentialCommitResult, type CredentialInput, type CredentialOperationOptions, type CredentialRecord, type CredentialSource, type CredentialStore, type CredentialStoreDefinition, type EndProviderAttemptInput, type GenerateOptions, ModelAdapter, type ModelInfo, type ModelInvocationContext, type ModelModality, type ModelProviderPlugin, type ModelProviderPluginDefinition, type ModelProviderRegistrar, type ModelReasoningInfo, ModelRegistry, type ModelTarget, type ModelToolSchema, type NativeImageGenerationTool, type NativeToolName, type NativeToolSchema, type NativeToolSchemaMap, type NativeWebSearchTool, PROVIDER_PLUGIN_API_VERSION, type PreparedAdapterCall, type ProviderAttemptHandle, type ProviderInfo, type ProviderRequestId, type ResolvedModelInfo, type ResolvedRetryPolicy, type RetryPolicyConfig, type SdkLogger, type StartProviderAttemptInput, type StreamChunk, type StreamMiddleware, type ToolChoice, type UsageCounters, type WebSearchLocation, defineCredentialSource, defineCredentialStore, defineModelProviderPlugin };
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AgentSdkError as e}from"./errors/agent-sdk-error.js";import{ModelAdapter as t}from"./contract/adapter.js";import{ModelRegistry as n}from"./runtime/registry.js";import{PROVIDER_PLUGIN_API_VERSION as r}from"./composition/provider/types.js";import{CREDENTIAL_CAPABILITY_API_VERSION as i}from"./composition/credential/config.js";import{defineCredentialSource as a,defineCredentialStore as o}from"./composition/credential/definition.js";import{defineModelProviderPlugin as s}from"./composition/provider/definition.js";export{e as AgentSdkError,i as CREDENTIAL_CAPABILITY_API_VERSION,t as ModelAdapter,n as ModelRegistry,r as PROVIDER_PLUGIN_API_VERSION,a as defineCredentialSource,o as defineCredentialStore,s as defineModelProviderPlugin};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{deepFreeze as e}from"../primitives/freeze.js";import{createObservationRunScope as t,createOperationId as n,isSpanId as r,isTraceId as i}from"../observation/context.js";import{safeErrorRecord as a}from"../observation/event.js";import{NOOP_OBSERVATION_PORT as o,createCoreSpan as s,disabledDeliverySummary as c,snapshotObservationSpan as l,validateCaptureReceipt as u}from"../observation/port.js";import{AgentSdkError as d}from"../errors/agent-sdk-error.js";import{ModelCallObservationError as f,OBSERVATION_ERROR_CODES as p}from"../observation/report.js";import{addUsageCounters as m,classifyUsageCoverage as h,possiblyBilledAttemptsWithoutUsage as g,validateUsageCounters as _}from"../observation/usage.js";const v=new WeakMap;function y(){return globalThis.performance?.now()??Date.now()}function b(e,n,r){if(r!==void 0)return r;let i=v.get(e);i||(i=new Map,v.set(e,i));let a=i.get(n);return a||(a=t(),i.set(n,a)),a}function x(e,t){if(e.reason.kind!==`error`&&e.reason.kind!==`aborted`)return;let n=e.reason.failure;return Object.freeze({type:`ModelError`,message:e.reason.kind===`aborted`?`model call was aborted; inspect the stable code for classification`:`model call failed; inspect the stable code and provider request ID`,code:n.code,...t===void 0?{}:{retryable:t(n.code)},...n.status===void 0?{}:{status:n.status}})}function S(e){return e===`remote-acknowledged`?2:+(e===`local-durable`)}function C(e,t,n){n&&(t.status===`accepted`?e.accepted+=1:e.rejected+=1,t.status===`accepted`&&S(t.boundary)>S(e.reached)&&(e.reached=t.boundary))}function w(t,n,r){if(t===o)return c();let i=n===`operational`?`none`:S(r.reached)>0?r.reached:`local-durable`;return e({mode:n,requiredBoundary:i,reachedBoundary:r.reached,complete:r.rejected===0&&r.pending===0&&S(r.reached)>=S(i),acceptedCritical:r.accepted,rejectedCritical:r.rejected,pendingCritical:r.pending,...r.lastFailure===void 0?{}:{lastFailure:r.lastFailure}})}function T(e){if(!(!e||!i(e.traceId)||!r(e.spanId)||typeof e.runId!=`string`||e.runId.length===0))return{traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId===null||r(e.parentSpanId)?e.parentSpanId:null,runId:e.runId,...e.conversationId===void 0?{}:{conversationId:e.conversationId},...e.turnId===void 0?{}:{turnId:e.turnId},...e.modelCallId===void 0?{}:{modelCallId:e.modelCallId},...e.attemptId===void 0?{}:{attemptId:e.attemptId},...e.toolCallId===void 0?{}:{toolCallId:e.toolCallId},...e.providerRequestId===void 0?{}:{providerRequestId:e.providerRequestId},...e.sessionId===void 0?{}:{sessionId:e.sessionId}}}function E(e,t,n){try{let r=l(e.openSpan(t));if(r&&r.correlation.runId===t.runId&&r.correlation.modelCallId===t.correlation?.modelCallId){let e=!1;return Object.freeze({correlation:r.correlation,traceparent:r.traceparent,end(t,i,o){if(!e){e=!0;try{r.end(t,i,o)}catch(e){n.lastFailure=a(e)}}}})}n.lastFailure=Object.freeze({type:`ObservationSpanError`,message:`observation backend returned an invalid or mismatched span identity`,code:p.OTEL_PROVIDER_UNCONFIGURED})}catch(e){n.lastFailure=a(e)}return s(t)}function D(t){let r=t.context??{},i=t.context?.correlation,s=typeof i?.runId==`string`&&i.runId.length>0?i.runId:n(),c=typeof i?.modelCallId==`string`&&i.modelCallId.length>0?i.modelCallId:n(),l=b(r,s,t.context?.scope),v=new Date().toISOString(),S=y(),D=t.context?.observation??t.defaultObservation??o,O={accepted:0,rejected:0,pending:0,reached:`none`},k=`operational`;try{let e=D.mode;if(e!==`operational`&&e!==`reliable`&&e!==`audit`)throw TypeError(`observation delivery mode is invalid`);k=e}catch(e){O.lastFailure=a(e)}let A=T(i),j=E(D,{name:`sdk.model.call`,runId:s,...A===void 0?{}:{parent:A},correlation:{modelCallId:c,...i?.conversationId===void 0?{}:{conversationId:i.conversationId},...i?.turnId===void 0?{}:{turnId:i.turnId},...i?.sessionId===void 0?{}:{sessionId:i.sessionId}},startedAt:v,monotonicMs:l.monotonicMs()},O),M=(r,i)=>e({schemaVersion:1,eventId:n(),sequence:l.nextSequence(),name:`sdk.model.call`,phase:r,occurredAt:new Date().toISOString(),monotonicMs:l.monotonicMs(),priority:`critical`,resource:t.resource,correlation:j.correlation,data:i}),N=e=>{try{let t=u(D.capture(e),e.eventId);C(O,t,e.priority===`critical`)}catch(t){O.rejected+=+(e.priority===`critical`),O.lastFailure=a(t)}},P=[],F=new Set,I=1,L=!1;function R(r){N(e({schemaVersion:1,eventId:n(),sequence:l.nextSequence(),name:`sdk.provider.retry.scheduled`,phase:`point`,occurredAt:new Date().toISOString(),monotonicMs:l.monotonicMs(),priority:`critical`,resource:t.resource,correlation:j.correlation,data:{nextAttemptNumber:r.nextAttemptNumber,delayMs:r.delayMs,failureCode:r.failureCode}}))}async function z(r,i){let o=I++,f=n(),m=new Date().toISOString(),h=y(),g=E(D,{name:`sdk.provider.attempt`,runId:s,parent:j.correlation,correlation:{modelCallId:c,attemptId:f},startedAt:m,monotonicMs:l.monotonicMs()},O),v=e({schemaVersion:1,eventId:n(),sequence:l.nextSequence(),name:`sdk.provider.attempt`,phase:`start`,occurredAt:m,monotonicMs:l.monotonicMs(),priority:`critical`,resource:t.resource,correlation:g.correlation,data:{provider:r.provider,model:r.model,attemptNumber:o,method:r.method,origin:r.origin,dispatchState:`not-sent`}});if(k===`audit`){O.pending+=1;try{let e=D.checkpoint?await D.checkpoint(v,i):Object.freeze({eventId:v.eventId,status:`rejected`,durable:!1,boundary:`none`,reason:`exporter-unavailable`}),t=u(e,v.eventId);if(--O.pending,C(O,t,!0),t.status!==`accepted`||!t.durable)throw t.status===`accepted`&&(O.rejected+=1),O.lastFailure=Object.freeze({type:`ObservationCheckpointError`,message:`provider-attempt audit checkpoint was ${t.status}`,code:p.CAPTURE_REJECTED}),g.end(`rejected`,new Date().toISOString(),l.monotonicMs()),new d(`audit observation is unavailable before provider dispatch`,p.AUDIT_UNAVAILABLE)}catch(e){throw O.pending>0&&--O.pending,e instanceof d&&e.code===p.AUDIT_UNAVAILABLE||(O.rejected+=1,O.lastFailure=a(e),g.end(`rejected`,new Date().toISOString(),l.monotonicMs())),e instanceof d&&e.code===p.AUDIT_UNAVAILABLE?e:new d(`audit observation is unavailable before provider dispatch`,p.AUDIT_UNAVAILABLE,{cause:e})}}else N(v);let b,x=i=>{if(b!==void 0)return b;let a=new Date().toISOString(),s=y(),c=_(i.reported,!0),u=i.dispatchState===`not-sent`?`not-applicable`:c.complete?`complete`:Object.keys(c.reported).length>0?`partial`:`missing`,d=c.invalidFields.length>0||c.overflow?Object.freeze({type:`UsageValidationError`,message:c.overflow?`provider attempt usage counters overflowed safe integer validation`:`provider attempt usage contained invalid fields: ${c.invalidFields.join(`, `)}`,code:c.overflow?p.USAGE_COUNTER_OVERFLOW:p.USAGE_INVALID}):void 0,v=i.error??d,S=Math.max(0,s-h);g.end(i.status,a,l.monotonicMs());let C=i.providerRequestId===void 0?g.correlation:e({...g.correlation,providerRequestId:i.providerRequestId});return N(e({schemaVersion:1,eventId:n(),sequence:l.nextSequence(),name:`sdk.provider.attempt`,phase:`end`,occurredAt:a,monotonicMs:l.monotonicMs(),priority:`critical`,resource:t.resource,correlation:C,data:{status:i.status,durationMs:S,origin:r.origin,dispatchState:i.dispatchState,coverage:u,reported:{...c.reported},...i.httpStatus===void 0?{}:{httpStatus:i.httpStatus},...i.providerRequestId===void 0?{}:{providerRequestId:i.providerRequestId},...v===void 0?{}:{error:{...v}}}})),b=e({attemptId:f,spanId:g.correlation.spanId,attemptNumber:o,status:i.status,startedAt:m,endedAt:a,durationMs:S,dispatchState:i.dispatchState,coverage:u,reported:c.reported,origin:r.origin,...i.httpStatus===void 0?{}:{httpStatus:i.httpStatus},...i.providerRequestId===void 0?{}:{providerRequestId:i.providerRequestId},...v===void 0?{}:{error:v}}),P.push(b),F.delete(x),b};return F.add(x),Object.freeze({attemptId:f,attemptNumber:o,traceparent:g.traceparent,end:x})}let B=Object.freeze({observation:D,resource:t.resource,correlation:j.correlation,terminalCheckpointOwner:t.context?.terminalCheckpointOwner??`model-call`,scope:l,...t.context?.logger===void 0?{}:{logger:t.context.logger},declareProviderAttemptAccounting:()=>{L=!0},startProviderAttempt:z,recordProviderRetry:R});N(M(`start`,{provider:t.options.provider,model:t.options.model,operation:`stream`}));let V=()=>{},H=new Promise(e=>{V=e}),U=!1,W=!1,G=`unknown`,K,q,J,Y=async()=>{if(U)return{report:await H,auditFailure:!1};U=!0;let n=new Date().toISOString(),r=y();G===`unknown`&&(q??=Object.freeze({type:`OperationTerminalError`,message:`model call closed without a terminal finish reason`,code:p.OPERATION_TERMINAL_MISSING}));for(let e of[...F])e({status:G===`aborted`?`aborted`:`unknown`,dispatchState:t.dispatchState()===`not-sent`?`not-sent`:`unknown`,...q===void 0?{}:{error:q}});try{j.end(G,n,l.monotonicMs())}catch(e){O.lastFailure=a(e)}let i=J===void 0?void 0:_(J,!0),o=!t.routePresent||t.dispatchState()===`not-sent`,d=P.length>0||L?h(P):i===void 0?o?`not-applicable`:`missing`:i.complete?`complete`:`partial`;i&&(i.invalidFields.length>0||i.overflow)?q??=Object.freeze({type:`UsageValidationError`,message:i.overflow?`provider usage counters overflowed safe integer aggregation`:`provider usage contained invalid fields: ${i.invalidFields.join(`, `)}`,code:i.overflow?p.USAGE_COUNTER_OVERFLOW:p.USAGE_INVALID}):d===`missing`&&q===void 0&&(q=Object.freeze({type:`UsageMissingError`,message:`model call may have been dispatched but no provider usage was reported`,code:p.USAGE_MISSING}));let f=Math.max(0,r-S),b=P.length===0?void 0:m(P.map(e=>e.reported)),x=b?.overflow===!0||i?.overflow===!0;x&&(q??=Object.freeze({type:`UsageValidationError`,message:`provider usage counters overflowed safe integer aggregation`,code:p.USAGE_COUNTER_OVERFLOW}));let T=b?.counters??i?.reported??{},E=M(`end`,{status:G,durationMs:f,...K===void 0?{}:{finishReason:K},dispatchState:P.at(-1)?.dispatchState??(t.dispatchState()===`not-sent`?`not-sent`:`unknown`),coverage:d,reported:{...T},attemptCount:P.length}),A=!1;if((B.terminalCheckpointOwner??`model-call`)===`model-call`&&k!==`operational`){O.pending+=1;try{let e=D.checkpoint?await D.checkpoint(E):Object.freeze({eventId:E.eventId,status:`rejected`,durable:!1,boundary:`none`,reason:`exporter-unavailable`}),t=u(e,E.eventId);--O.pending,C(O,t,!0),(t.status!==`accepted`||!t.durable)&&(A=k===`audit`,O.lastFailure=Object.freeze({type:`ObservationCheckpointError`,message:`terminal observation checkpoint was ${t.status}`,code:p.CAPTURE_REJECTED}))}catch(e){--O.pending,O.rejected+=1,O.lastFailure=a(e),A=k===`audit`}}else N(E);let I=e({runId:s,traceId:j.correlation.traceId,modelCallId:c,spanId:j.correlation.spanId,provider:t.options.provider,...t.providerFamily===void 0?{}:{providerFamily:t.providerFamily},...t.providerPluginId===void 0?{}:{providerPluginId:t.providerPluginId},model:t.options.model,status:G,startedAt:v,endedAt:n,durationMs:f,...K===void 0?{}:{finishReason:K},dispatchState:P.at(-1)?.dispatchState??(t.dispatchState()===`not-sent`?`not-sent`:`unknown`),coverage:d,reported:T,attempts:[...P].sort((e,t)=>e.attemptNumber-t.attemptNumber),possiblyBilledAttemptsWithoutUsage:P.length>0?g(P):+(d===`missing`||d===`partial`),authoritative:(d===`complete`||d===`not-applicable`)&&!x,delivery:w(D,k,O),...q===void 0?{}:{error:q}});return V(I),{report:I,auditFailure:A}},X=async function*(){let e,n=!1,r;try{for(e=t.stream(B)[Symbol.asyncIterator]();;){let r=await e.next();if(r.done){n=!0;break}let i=r.value;i.type===`usage`&&(J=i.usage),i.type===`finish`&&(K=i.reason.kind,G=i.reason.kind===`aborted`?`aborted`:i.reason.kind===`error`?`error`:`success`,q=x(i,t.isRetryable)),yield i}}catch(e){throw r=e,G=t.options.signal?.aborted===!0?`aborted`:`error`,q=a(e),e}finally{if(!n){r===void 0&&(G=`aborted`);let t=e?.return?.bind(e);if(t)try{await t()}catch(e){q??=a(e)}}let t=await Y();if(t.auditFailure)throw new f(`audit observation checkpoint failed after model-call finalization`,t.report)}};return Object.freeze({runId:s,modelCallId:c,report:H,[Symbol.asyncIterator](){return W?(async function*(){throw Error(`a model call handle can only be iterated once`)})():(W=!0,X())}})}export{D as createModelCallHandle};
|
|
2
|
+
//# sourceMappingURL=model-call-handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-call-handle.js","names":[],"sources":["../../src/runtime/model-call-handle.ts"],"sourcesContent":["import type { GenerateOptions } from '../contract/generate-options.ts'\nimport { deepFreeze } from '../primitives/freeze.ts'\nimport type { JsonObject } from '../primitives/json.ts'\nimport type { StreamChunk, TokenUsage } from '../stream/chunk.ts'\nimport { createObservationRunScope, createOperationId, isSpanId, isTraceId, type CorrelationContext, type ObservationRunScope } from '../observation/context.ts'\nimport { safeErrorRecord, type ObservationEvent, type ObservationResource, type OperationStatus, type SafeErrorRecord } from '../observation/event.ts'\nimport { createCoreSpan, disabledDeliverySummary, NOOP_OBSERVATION_PORT, snapshotObservationSpan, validateCaptureReceipt, type CaptureReceipt, type DeliveryMode, type ObservationBoundary, type ObservationDeliverySummary, type ObservationPort, type ObservationSpan } from '../observation/port.ts'\nimport { AgentSdkError } from '../errors/agent-sdk-error.ts'\nimport { ModelCallObservationError, OBSERVATION_ERROR_CODES, type EndProviderAttemptInput, type ModelCallHandle, type ModelCallReport, type ModelInvocationContext, type ProviderAttemptHandle, type ProviderRetryScheduledInput, type StartProviderAttemptInput } from '../observation/report.ts'\nimport { addUsageCounters, classifyUsageCoverage, possiblyBilledAttemptsWithoutUsage, validateUsageCounters, type AttemptUsageReport, type UsageCoverage } from '../observation/usage.ts'\n\nconst scopes = new WeakMap<object, Map<string, ObservationRunScope>>()\n\nfunction nowMonotonic(): number {\n return globalThis.performance?.now() ?? Date.now()\n}\n\nfunction scopeFor(key: object, runId: string, supplied?: ObservationRunScope): ObservationRunScope {\n if (supplied !== undefined) return supplied\n let runs = scopes.get(key)\n if (!runs) {\n runs = new Map()\n scopes.set(key, runs)\n }\n let scope = runs.get(runId)\n if (!scope) {\n scope = createObservationRunScope()\n runs.set(runId, scope)\n }\n return scope\n}\n\nfunction safeFailureFromFinish(\n chunk: Extract<StreamChunk, { type: 'finish' }>,\n isRetryable?: (code: string) => boolean,\n): SafeErrorRecord | undefined {\n if (chunk.reason.kind !== 'error' && chunk.reason.kind !== 'aborted') return undefined\n const failure = chunk.reason.failure\n return Object.freeze({\n type: 'ModelError',\n message: chunk.reason.kind === 'aborted'\n ? 'model call was aborted; inspect the stable code for classification'\n : 'model call failed; inspect the stable code and provider request ID',\n code: failure.code,\n ...isRetryable === undefined ? {} : { retryable: isRetryable(failure.code) },\n ...failure.status === undefined ? {} : { status: failure.status },\n })\n}\n\nfunction boundaryRank(boundary: ObservationBoundary): number {\n if (boundary === 'remote-acknowledged') return 2\n if (boundary === 'local-durable') return 1\n return 0\n}\n\ninterface DeliveryTracker {\n accepted: number\n rejected: number\n pending: number\n reached: ObservationBoundary\n lastFailure?: SafeErrorRecord\n}\n\nfunction applyReceipt(tracker: DeliveryTracker, receipt: CaptureReceipt, critical: boolean): void {\n if (!critical) return\n if (receipt.status === 'accepted') tracker.accepted += 1\n else tracker.rejected += 1\n if (receipt.status === 'accepted' && boundaryRank(receipt.boundary) > boundaryRank(tracker.reached)) tracker.reached = receipt.boundary\n}\n\nfunction deliverySummary(port: ObservationPort, mode: DeliveryMode, tracker: DeliveryTracker): ObservationDeliverySummary {\n if (port === NOOP_OBSERVATION_PORT) return disabledDeliverySummary()\n const requiredBoundary: ObservationBoundary = mode === 'operational'\n ? 'none'\n : boundaryRank(tracker.reached) > 0 ? tracker.reached : 'local-durable'\n return deepFreeze({\n mode,\n requiredBoundary,\n reachedBoundary: tracker.reached,\n complete: tracker.rejected === 0 && tracker.pending === 0\n && boundaryRank(tracker.reached) >= boundaryRank(requiredBoundary),\n acceptedCritical: tracker.accepted,\n rejectedCritical: tracker.rejected,\n pendingCritical: tracker.pending,\n ...tracker.lastFailure === undefined ? {} : { lastFailure: tracker.lastFailure },\n })\n}\n\nfunction validParent(value: Partial<CorrelationContext> | undefined): CorrelationContext | undefined {\n if (!value || !isTraceId(value.traceId) || !isSpanId(value.spanId)\n || typeof value.runId !== 'string' || value.runId.length === 0) return undefined\n return {\n traceId: value.traceId,\n spanId: value.spanId,\n parentSpanId: value.parentSpanId === null || isSpanId(value.parentSpanId) ? value.parentSpanId : null,\n runId: value.runId,\n ...value.conversationId === undefined ? {} : { conversationId: value.conversationId },\n ...value.turnId === undefined ? {} : { turnId: value.turnId },\n ...value.modelCallId === undefined ? {} : { modelCallId: value.modelCallId },\n ...value.attemptId === undefined ? {} : { attemptId: value.attemptId },\n ...value.toolCallId === undefined ? {} : { toolCallId: value.toolCallId },\n ...value.providerRequestId === undefined ? {} : { providerRequestId: value.providerRequestId },\n ...value.sessionId === undefined ? {} : { sessionId: value.sessionId },\n }\n}\n\nfunction openContainedSpan(port: ObservationPort, input: Parameters<ObservationPort['openSpan']>[0], tracker: DeliveryTracker): ObservationSpan {\n try {\n const span = snapshotObservationSpan(port.openSpan(input))\n if (span && span.correlation.runId === input.runId\n && span.correlation.modelCallId === input.correlation?.modelCallId) {\n let ended = false\n return Object.freeze({\n correlation: span.correlation,\n traceparent: span.traceparent,\n end(status: OperationStatus, endedAt: string, monotonicMs: number): void {\n if (ended) return\n ended = true\n try { span.end(status, endedAt, monotonicMs) } catch (error) { tracker.lastFailure = safeErrorRecord(error) }\n },\n })\n }\n tracker.lastFailure = Object.freeze({\n type: 'ObservationSpanError',\n message: 'observation backend returned an invalid or mismatched span identity',\n code: OBSERVATION_ERROR_CODES.OTEL_PROVIDER_UNCONFIGURED,\n })\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n }\n return createCoreSpan(input)\n}\n\nexport interface CreateModelCallHandleOptions {\n readonly options: GenerateOptions\n readonly providerFamily?: string\n readonly providerPluginId?: string\n readonly isRetryable?: (code: string) => boolean\n readonly context?: ModelInvocationContext\n readonly defaultObservation?: ObservationPort\n readonly resource: ObservationResource\n readonly routePresent: boolean\n readonly dispatchState: () => 'not-sent' | 'unknown'\n readonly stream: (context: ModelInvocationContext) => AsyncIterable<StreamChunk>\n}\n\nexport function createModelCallHandle(input: CreateModelCallHandleOptions): ModelCallHandle {\n const contextKey = input.context ?? {}\n const supplied = input.context?.correlation\n const runId = typeof supplied?.runId === 'string' && supplied.runId.length > 0 ? supplied.runId : createOperationId()\n const modelCallId = typeof supplied?.modelCallId === 'string' && supplied.modelCallId.length > 0 ? supplied.modelCallId : createOperationId()\n const scope = scopeFor(contextKey, runId, input.context?.scope)\n const startedAt = new Date().toISOString()\n const startedMonotonic = nowMonotonic()\n const port = input.context?.observation ?? input.defaultObservation ?? NOOP_OBSERVATION_PORT\n const tracker: DeliveryTracker = { accepted: 0, rejected: 0, pending: 0, reached: 'none' }\n let mode: DeliveryMode = 'operational'\n try {\n const configuredMode = port.mode\n if (configuredMode !== 'operational' && configuredMode !== 'reliable' && configuredMode !== 'audit') {\n throw new TypeError('observation delivery mode is invalid')\n }\n mode = configuredMode\n } catch (modeError) {\n tracker.lastFailure = safeErrorRecord(modeError)\n }\n const parent = validParent(supplied)\n const span = openContainedSpan(port, {\n name: 'sdk.model.call',\n runId,\n ...(parent === undefined ? {} : { parent }),\n correlation: {\n modelCallId,\n ...supplied?.conversationId === undefined ? {} : { conversationId: supplied.conversationId },\n ...supplied?.turnId === undefined ? {} : { turnId: supplied.turnId },\n ...supplied?.sessionId === undefined ? {} : { sessionId: supplied.sessionId },\n },\n startedAt,\n monotonicMs: scope.monotonicMs(),\n }, tracker)\n const makeEvent = (phase: 'start' | 'end', data: JsonObject): ObservationEvent<'sdk.model.call'> => deepFreeze({\n schemaVersion: 1,\n eventId: createOperationId(),\n sequence: scope.nextSequence(),\n name: 'sdk.model.call',\n phase,\n occurredAt: new Date().toISOString(),\n monotonicMs: scope.monotonicMs(),\n priority: 'critical',\n resource: input.resource,\n correlation: span.correlation,\n data,\n })\n\n const capture = (event: ObservationEvent): void => {\n try {\n const receipt = validateCaptureReceipt(port.capture(event), event.eventId)\n applyReceipt(tracker, receipt, event.priority === 'critical')\n } catch (error) {\n tracker.rejected += event.priority === 'critical' ? 1 : 0\n tracker.lastFailure = safeErrorRecord(error)\n }\n }\n\n const attempts: AttemptUsageReport[] = []\n const openAttempts = new Set<(input: EndProviderAttemptInput) => AttemptUsageReport>()\n let nextAttemptNumber = 1\n let providerAttemptAccountingDeclared = false\n\n function recordProviderRetry(retry: ProviderRetryScheduledInput): void {\n capture(deepFreeze({\n schemaVersion: 1,\n eventId: createOperationId(),\n sequence: scope.nextSequence(),\n name: 'sdk.provider.retry.scheduled',\n phase: 'point',\n occurredAt: new Date().toISOString(),\n monotonicMs: scope.monotonicMs(),\n priority: 'critical',\n resource: input.resource,\n correlation: span.correlation,\n data: {\n nextAttemptNumber: retry.nextAttemptNumber,\n delayMs: retry.delayMs,\n failureCode: retry.failureCode,\n },\n }))\n }\n\n async function startProviderAttempt(\n attemptInput: StartProviderAttemptInput,\n signal?: AbortSignal,\n ): Promise<ProviderAttemptHandle> {\n const attemptNumber = nextAttemptNumber++\n const attemptId = createOperationId()\n const attemptStartedAt = new Date().toISOString()\n const attemptStartedMonotonic = nowMonotonic()\n const attemptSpan = openContainedSpan(port, {\n name: 'sdk.provider.attempt',\n runId,\n parent: span.correlation,\n correlation: { modelCallId, attemptId },\n startedAt: attemptStartedAt,\n monotonicMs: scope.monotonicMs(),\n }, tracker)\n const startEvent: ObservationEvent<'sdk.provider.attempt'> = deepFreeze({\n schemaVersion: 1,\n eventId: createOperationId(),\n sequence: scope.nextSequence(),\n name: 'sdk.provider.attempt',\n phase: 'start',\n occurredAt: attemptStartedAt,\n monotonicMs: scope.monotonicMs(),\n priority: 'critical',\n resource: input.resource,\n correlation: attemptSpan.correlation,\n data: {\n provider: attemptInput.provider,\n model: attemptInput.model,\n attemptNumber,\n method: attemptInput.method,\n origin: attemptInput.origin,\n dispatchState: 'not-sent',\n },\n })\n\n if (mode === 'audit') {\n tracker.pending += 1\n try {\n const rawReceipt = port.checkpoint\n ? await port.checkpoint(startEvent, signal)\n : Object.freeze({\n eventId: startEvent.eventId,\n status: 'rejected' as const,\n durable: false,\n boundary: 'none' as const,\n reason: 'exporter-unavailable' as const,\n })\n const receipt = validateCaptureReceipt(rawReceipt, startEvent.eventId)\n tracker.pending -= 1\n applyReceipt(tracker, receipt, true)\n if (receipt.status !== 'accepted' || !receipt.durable) {\n if (receipt.status === 'accepted') tracker.rejected += 1\n tracker.lastFailure = Object.freeze({\n type: 'ObservationCheckpointError',\n message: `provider-attempt audit checkpoint was ${receipt.status}`,\n code: OBSERVATION_ERROR_CODES.CAPTURE_REJECTED,\n })\n attemptSpan.end('rejected', new Date().toISOString(), scope.monotonicMs())\n throw new AgentSdkError(\n 'audit observation is unavailable before provider dispatch',\n OBSERVATION_ERROR_CODES.AUDIT_UNAVAILABLE,\n )\n }\n } catch (checkpointError) {\n if (tracker.pending > 0) tracker.pending -= 1\n if (!(checkpointError instanceof AgentSdkError\n && checkpointError.code === OBSERVATION_ERROR_CODES.AUDIT_UNAVAILABLE)) {\n tracker.rejected += 1\n tracker.lastFailure = safeErrorRecord(checkpointError)\n attemptSpan.end('rejected', new Date().toISOString(), scope.monotonicMs())\n }\n throw checkpointError instanceof AgentSdkError\n && checkpointError.code === OBSERVATION_ERROR_CODES.AUDIT_UNAVAILABLE\n ? checkpointError\n : new AgentSdkError(\n 'audit observation is unavailable before provider dispatch',\n OBSERVATION_ERROR_CODES.AUDIT_UNAVAILABLE,\n { cause: checkpointError },\n )\n }\n } else capture(startEvent)\n\n let finalReport: AttemptUsageReport | undefined\n const end = (endInput: EndProviderAttemptInput): AttemptUsageReport => {\n if (finalReport !== undefined) return finalReport\n const endedAt = new Date().toISOString()\n const endedMonotonic = nowMonotonic()\n const validated = validateUsageCounters(endInput.reported, true)\n const coverage: UsageCoverage = endInput.dispatchState === 'not-sent'\n ? 'not-applicable'\n : validated.complete ? 'complete'\n : Object.keys(validated.reported).length > 0 ? 'partial' : 'missing'\n const invalidError = validated.invalidFields.length > 0 || validated.overflow\n ? Object.freeze({\n type: 'UsageValidationError',\n message: validated.overflow\n ? 'provider attempt usage counters overflowed safe integer validation'\n : `provider attempt usage contained invalid fields: ${validated.invalidFields.join(', ')}`,\n code: validated.overflow\n ? OBSERVATION_ERROR_CODES.USAGE_COUNTER_OVERFLOW\n : OBSERVATION_ERROR_CODES.USAGE_INVALID,\n })\n : undefined\n const terminalError = endInput.error ?? invalidError\n const durationMs = Math.max(0, endedMonotonic - attemptStartedMonotonic)\n attemptSpan.end(endInput.status, endedAt, scope.monotonicMs())\n const terminalCorrelation = endInput.providerRequestId === undefined\n ? attemptSpan.correlation\n : deepFreeze({ ...attemptSpan.correlation, providerRequestId: endInput.providerRequestId })\n capture(deepFreeze({\n schemaVersion: 1,\n eventId: createOperationId(),\n sequence: scope.nextSequence(),\n name: 'sdk.provider.attempt',\n phase: 'end',\n occurredAt: endedAt,\n monotonicMs: scope.monotonicMs(),\n priority: 'critical',\n resource: input.resource,\n correlation: terminalCorrelation,\n data: {\n status: endInput.status,\n durationMs,\n origin: attemptInput.origin,\n dispatchState: endInput.dispatchState,\n coverage,\n reported: { ...validated.reported },\n ...endInput.httpStatus === undefined ? {} : { httpStatus: endInput.httpStatus },\n ...endInput.providerRequestId === undefined ? {} : { providerRequestId: endInput.providerRequestId },\n ...terminalError === undefined ? {} : { error: { ...terminalError } },\n },\n }))\n finalReport = deepFreeze({\n attemptId,\n spanId: attemptSpan.correlation.spanId,\n attemptNumber,\n status: endInput.status,\n startedAt: attemptStartedAt,\n endedAt,\n durationMs,\n dispatchState: endInput.dispatchState,\n coverage,\n reported: validated.reported,\n origin: attemptInput.origin,\n ...endInput.httpStatus === undefined ? {} : { httpStatus: endInput.httpStatus },\n ...endInput.providerRequestId === undefined ? {} : { providerRequestId: endInput.providerRequestId },\n ...terminalError === undefined ? {} : { error: terminalError },\n })\n attempts.push(finalReport)\n openAttempts.delete(end)\n return finalReport\n }\n openAttempts.add(end)\n return Object.freeze({ attemptId, attemptNumber, traceparent: attemptSpan.traceparent, end })\n }\n const effectiveContext: ModelInvocationContext = Object.freeze({\n observation: port,\n resource: input.resource,\n correlation: span.correlation,\n terminalCheckpointOwner: input.context?.terminalCheckpointOwner ?? 'model-call',\n scope,\n ...(input.context?.logger === undefined ? {} : { logger: input.context.logger }),\n declareProviderAttemptAccounting: () => { providerAttemptAccountingDeclared = true },\n startProviderAttempt,\n recordProviderRetry,\n })\n capture(makeEvent('start', {\n provider: input.options.provider,\n model: input.options.model,\n operation: 'stream',\n }))\n\n let resolveReport: (report: ModelCallReport) => void = () => {}\n const report = new Promise<ModelCallReport>((resolvePromise) => { resolveReport = resolvePromise })\n let finalized = false\n let iterated = false\n let status: OperationStatus = 'unknown'\n let finishReason: string | undefined\n let error: SafeErrorRecord | undefined\n let usage: TokenUsage | undefined\n\n const finalize = async (): Promise<{ report: ModelCallReport; auditFailure: boolean }> => {\n if (finalized) return { report: await report, auditFailure: false }\n finalized = true\n const endedAt = new Date().toISOString()\n const endedMonotonic = nowMonotonic()\n if (status === 'unknown') {\n error ??= Object.freeze({\n type: 'OperationTerminalError',\n message: 'model call closed without a terminal finish reason',\n code: OBSERVATION_ERROR_CODES.OPERATION_TERMINAL_MISSING,\n })\n }\n for (const closeAttempt of [...openAttempts]) {\n closeAttempt({\n status: status === 'aborted' ? 'aborted' : 'unknown',\n dispatchState: input.dispatchState() === 'not-sent' ? 'not-sent' : 'unknown',\n ...(error === undefined ? {} : { error }),\n })\n }\n try { span.end(status, endedAt, scope.monotonicMs()) } catch (spanError) { tracker.lastFailure = safeErrorRecord(spanError) }\n\n const validated = usage === undefined ? undefined : validateUsageCounters(usage, true)\n const preDispatch = !input.routePresent || input.dispatchState() === 'not-sent'\n const coverage: UsageCoverage = attempts.length > 0 || providerAttemptAccountingDeclared\n ? classifyUsageCoverage(attempts)\n : validated === undefined\n ? preDispatch ? 'not-applicable' : 'missing'\n : validated.complete ? 'complete' : 'partial'\n if (validated && (validated.invalidFields.length > 0 || validated.overflow)) {\n error ??= Object.freeze({\n type: 'UsageValidationError',\n message: validated.overflow\n ? 'provider usage counters overflowed safe integer aggregation'\n : `provider usage contained invalid fields: ${validated.invalidFields.join(', ')}`,\n code: validated.overflow ? OBSERVATION_ERROR_CODES.USAGE_COUNTER_OVERFLOW : OBSERVATION_ERROR_CODES.USAGE_INVALID,\n })\n } else if (coverage === 'missing' && error === undefined) {\n error = Object.freeze({\n type: 'UsageMissingError',\n message: 'model call may have been dispatched but no provider usage was reported',\n code: OBSERVATION_ERROR_CODES.USAGE_MISSING,\n })\n }\n const durationMs = Math.max(0, endedMonotonic - startedMonotonic)\n const attemptUsage = attempts.length === 0\n ? undefined\n : addUsageCounters(attempts.map(attempt => attempt.reported))\n const accountingOverflow = attemptUsage?.overflow === true || validated?.overflow === true\n if (accountingOverflow) error ??= Object.freeze({\n type: 'UsageValidationError', message: 'provider usage counters overflowed safe integer aggregation',\n code: OBSERVATION_ERROR_CODES.USAGE_COUNTER_OVERFLOW,\n })\n const reported = attemptUsage?.counters ?? validated?.reported ?? {}\n const endEvent = makeEvent('end', {\n status,\n durationMs,\n ...finishReason === undefined ? {} : { finishReason },\n dispatchState: attempts.at(-1)?.dispatchState\n ?? (input.dispatchState() === 'not-sent' ? 'not-sent' : 'unknown'),\n coverage,\n reported: { ...reported },\n attemptCount: attempts.length,\n })\n let auditFailure = false\n const checkpointOwner = effectiveContext.terminalCheckpointOwner ?? 'model-call'\n if (checkpointOwner === 'model-call' && mode !== 'operational') {\n tracker.pending += 1\n try {\n const rawReceipt = port.checkpoint\n ? await port.checkpoint(endEvent)\n : Object.freeze({ eventId: endEvent.eventId, status: 'rejected' as const, durable: false, boundary: 'none' as const, reason: 'exporter-unavailable' as const })\n const receipt = validateCaptureReceipt(rawReceipt, endEvent.eventId)\n tracker.pending -= 1\n applyReceipt(tracker, receipt, true)\n if (receipt.status !== 'accepted' || !receipt.durable) {\n auditFailure = mode === 'audit'\n tracker.lastFailure = Object.freeze({\n type: 'ObservationCheckpointError',\n message: `terminal observation checkpoint was ${receipt.status}`,\n code: OBSERVATION_ERROR_CODES.CAPTURE_REJECTED,\n })\n }\n } catch (checkpointError) {\n tracker.pending -= 1\n tracker.rejected += 1\n tracker.lastFailure = safeErrorRecord(checkpointError)\n auditFailure = mode === 'audit'\n }\n } else capture(endEvent)\n\n const finalReport = deepFreeze<ModelCallReport>({\n runId,\n traceId: span.correlation.traceId,\n modelCallId,\n spanId: span.correlation.spanId,\n provider: input.options.provider,\n ...input.providerFamily === undefined ? {} : { providerFamily: input.providerFamily },\n ...input.providerPluginId === undefined ? {} : { providerPluginId: input.providerPluginId },\n model: input.options.model,\n status,\n startedAt,\n endedAt,\n durationMs,\n ...finishReason === undefined ? {} : { finishReason },\n dispatchState: attempts.at(-1)?.dispatchState\n ?? (input.dispatchState() === 'not-sent' ? 'not-sent' : 'unknown'),\n coverage,\n reported,\n attempts: [...attempts].sort((left, right) => left.attemptNumber - right.attemptNumber),\n possiblyBilledAttemptsWithoutUsage: attempts.length > 0\n ? possiblyBilledAttemptsWithoutUsage(attempts)\n : coverage === 'missing' || coverage === 'partial' ? 1 : 0,\n authoritative: (coverage === 'complete' || coverage === 'not-applicable') && !accountingOverflow,\n delivery: deliverySummary(port, mode, tracker),\n ...error === undefined ? {} : { error },\n })\n resolveReport(finalReport)\n return { report: finalReport, auditFailure }\n }\n\n const iterate = async function* (): AsyncGenerator<StreamChunk> {\n let iterator: AsyncIterator<StreamChunk> | undefined\n let sourceDone = false\n let thrown: unknown\n try {\n iterator = input.stream(effectiveContext)[Symbol.asyncIterator]()\n while (true) {\n const item = await iterator.next()\n if (item.done) {\n sourceDone = true\n break\n }\n const chunk = item.value\n if (chunk.type === 'usage') usage = chunk.usage\n if (chunk.type === 'finish') {\n finishReason = chunk.reason.kind\n status = chunk.reason.kind === 'aborted' ? 'aborted'\n : chunk.reason.kind === 'error' ? 'error' : 'success'\n error = safeFailureFromFinish(chunk, input.isRetryable)\n }\n yield chunk\n }\n } catch (streamError) {\n thrown = streamError\n status = input.options.signal?.aborted === true ? 'aborted' : 'error'\n error = safeErrorRecord(streamError)\n throw streamError\n } finally {\n if (!sourceDone) {\n if (thrown === undefined) status = 'aborted'\n const close = iterator?.return?.bind(iterator)\n if (close) try { await close() } catch (closeError) { error ??= safeErrorRecord(closeError) }\n }\n const terminal = await finalize()\n if (terminal.auditFailure) {\n throw new ModelCallObservationError('audit observation checkpoint failed after model-call finalization', terminal.report)\n }\n }\n }\n\n return Object.freeze({\n runId,\n modelCallId,\n report,\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n if (iterated) {\n return (async function* () { throw new Error('a model call handle can only be iterated once') })()\n }\n iterated = true\n return iterate()\n },\n })\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{deepFreeze as e}from"../primitives/freeze.js";import{ModelError as t,REGISTRY_ERROR_CODES as n}from"../errors/model-error.js";import{freezeMessage as r}from"../message/message.js";function i(e,r,i,a){if(!Array.isArray(r))throw new t(`route "${e}" returned a catalog that is not an array`,n.INVALID_CATALOG);if(r.length>i||f(r,n.INVALID_CATALOG)>a)throw new t(`route "${e}" catalog exceeds the configured registry limit`,n.INVALID_CATALOG);let o=new Set;return r.map(r=>{if(r.provider!==e||typeof r.id!=`string`||r.id.length===0||typeof r.name!=`string`||r.name.length===0)throw new t(`route "${e}" advertised a model entry with invalid identity`,n.INVALID_CATALOG);if(o.has(r.id))throw new t(`route "${e}" advertised model "${r.id}" more than once`,n.INVALID_CATALOG);return o.add(r.id),structuredClone(r)})}function a(r,a,o,s){if(typeof a!=`object`||!a||a.provider?.id!==r||typeof a.provider.name!=`string`||a.provider.name.length===0||![`static`,`fresh`,`empty`,`stale`,`unavailable`].includes(a.state)||typeof a.revision!=`string`||a.revision.length===0||typeof a.observedAt!=`string`||!Number.isFinite(Date.parse(a.observedAt)))throw new t(`route "${r}" returned an invalid catalog snapshot`,n.INVALID_CATALOG);let c=i(r,a.models,o,s);return e({...structuredClone(a),provider:{...a.provider},models:c})}function o(r,i,a,o){if(a.provider!==r||a.id!==i||typeof a.name!=`string`||a.name.length===0)throw l(r,i,`mismatched identity`);if(a.context!==void 0&&(!Number.isSafeInteger(a.context.contextWindow)||a.context.contextWindow<=0))throw l(r,i,`a non-positive context window`);if(a.defaultMaxTokens!==void 0&&(!Number.isSafeInteger(a.defaultMaxTokens)||a.defaultMaxTokens<=0))throw l(r,i,`a non-positive defaultMaxTokens`);if(a.maxOutputTokens!==void 0&&(!Number.isSafeInteger(a.maxOutputTokens)||a.maxOutputTokens<=0))throw l(r,i,`a non-positive maxOutputTokens`);if(a.defaultMaxTokens!==void 0&&a.maxOutputTokens!==void 0&&a.defaultMaxTokens>a.maxOutputTokens)throw l(r,i,`defaultMaxTokens above maxOutputTokens`);if(a.context!==void 0&&a.defaultMaxTokens!==void 0&&a.defaultMaxTokens>=a.context.contextWindow||a.context!==void 0&&a.maxOutputTokens!==void 0&&a.maxOutputTokens>=a.context.contextWindow)throw l(r,i,`no input headroom`);s(r,i,a),c(r,i,a);let u=e(structuredClone({...a,...a.inputModalities===void 0?{}:{inputModalities:[...a.inputModalities]},...a.outputModalities===void 0?{}:{outputModalities:[...a.outputModalities]},...a.nativeTools===void 0?{}:{nativeTools:[...a.nativeTools]}}));if(f(u,n.INVALID_MODEL_INFO)>o)throw new t(`route "${r}" model metadata exceeds the configured registry limit`,n.INVALID_MODEL_INFO);return u}function s(e,t,n){if(n.reasoning===void 0)return;let r=n.reasoning.efforts.map(e=>e.id);if(r.length===0||new Set(r).size!==r.length||n.reasoning.efforts.some(e=>typeof e.id!=`string`||e.id.length===0||typeof e.name!=`string`||e.name.length===0))throw l(e,t,`empty or duplicated reasoning efforts`);if(n.reasoning.defaultEffort!==void 0&&!r.includes(n.reasoning.defaultEffort))throw l(e,t,`a default reasoning effort it does not offer`)}function c(e,t,n){for(let[r,i]of[[`input modalities`,n.inputModalities],[`output modalities`,n.outputModalities],[`native tools`,n.nativeTools]])if(i!==void 0&&(new Set(i).size!==i.length||i.some(e=>typeof e!=`string`||e.length===0)))throw l(e,t,`invalid ${r}`)}function l(e,r,i){return new t(`route "${e}" resolved model "${r}" with ${i}`,n.INVALID_MODEL_INFO)}function u(e,r){let i=e.reasoningEffort??r.reasoning?.defaultEffort;if(e.reasoningEffort!==void 0&&r.reasoning?.efforts.some(t=>t.id===e.reasoningEffort)!==!0)throw new t(`model "${r.id}" on route "${r.provider}" does not offer reasoning effort "${e.reasoningEffort}"`,n.UNSUPPORTED_REASONING_EFFORT);let a=e.maxTokens??r.defaultMaxTokens;if(a!==void 0&&r.maxOutputTokens!==void 0&&a>r.maxOutputTokens)throw new t(`model "${r.id}" on route "${r.provider}" supports at most ${r.maxOutputTokens} output tokens, received ${a}`,n.OUTPUT_TOKEN_LIMIT_EXCEEDED);if(a!==void 0&&r.context!==void 0&&a>=r.context.contextWindow)throw new t(`model "${r.id}" on route "${r.provider}" cannot reserve ${a} output tokens inside its ${r.context.contextWindow}-token combined context window`,n.OUTPUT_TOKEN_LIMIT_EXCEEDED);return{config:{provider:e.provider,model:e.model,...i===void 0?{}:{reasoningEffort:i},...e.temperature===void 0?{}:{temperature:e.temperature},...e.topP===void 0?{}:{topP:e.topP},...a===void 0?{}:{maxTokens:a},...e.stop===void 0?{}:{stop:[...e.stop]}},context:r.context}}function d(e,t,n){let i=e.messages.map(e=>{let i=e.source;return e.role!==`assistant`||i.kind!==`model`||i.replayState===void 0||n(i.provider)===t?e:r({...e,source:{kind:`model`,provider:i.provider,model:i.model}})});return i.every((t,n)=>t===e.messages[n])?e:{...e,messages:i}}function f(e,n){let r;try{r=JSON.stringify(e)}catch(e){throw new t(`adapter model metadata must be JSON-serializable`,n,{cause:e})}if(r===void 0)throw new t(`adapter model metadata must be JSON-serializable`,n);return new TextEncoder().encode(r).byteLength}export{o as normalizeResolvedModelInfo,d as projectReplayForAdapter,u as resolveCallWithModelInfo,i as validateCatalogModels,a as validateModelCatalogSnapshot};
|
|
2
|
+
//# sourceMappingURL=model-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-metadata.js","names":[],"sources":["../../src/runtime/model-metadata.ts"],"sourcesContent":["import type { ModelAdapter } from '../contract/adapter.ts'\nimport type { CallConfig } from '../contract/call-config.ts'\nimport type { GenerateOptions } from '../contract/generate-options.ts'\nimport type {\n ModelCatalogSnapshot,\n ModelContext,\n ModelInfo,\n ResolvedModelInfo,\n} from '../contract/model-info.ts'\nimport { ModelError, REGISTRY_ERROR_CODES } from '../errors/model-error.ts'\nimport { freezeMessage, type Message } from '../message/message.ts'\nimport { deepFreeze } from '../primitives/freeze.ts'\n\nexport function validateCatalogModels(\n provider: string,\n models: readonly ModelInfo[],\n maxModels: number,\n maxBytes: number,\n): ModelInfo[] {\n if (!Array.isArray(models)) {\n throw new ModelError(\n `route \"${provider}\" returned a catalog that is not an array`,\n REGISTRY_ERROR_CODES.INVALID_CATALOG,\n )\n }\n if (models.length > maxModels\n || serializedBytes(models, REGISTRY_ERROR_CODES.INVALID_CATALOG) > maxBytes) {\n throw new ModelError(\n `route \"${provider}\" catalog exceeds the configured registry limit`,\n REGISTRY_ERROR_CODES.INVALID_CATALOG,\n )\n }\n const seen = new Set<string>()\n return models.map((model) => {\n if (model.provider !== provider || typeof model.id !== 'string' || model.id.length === 0\n || typeof model.name !== 'string' || model.name.length === 0) {\n throw new ModelError(\n `route \"${provider}\" advertised a model entry with invalid identity`,\n REGISTRY_ERROR_CODES.INVALID_CATALOG,\n )\n }\n if (seen.has(model.id)) {\n throw new ModelError(\n `route \"${provider}\" advertised model \"${model.id}\" more than once`,\n REGISTRY_ERROR_CODES.INVALID_CATALOG,\n )\n }\n seen.add(model.id)\n return structuredClone(model)\n })\n}\n\nexport function validateModelCatalogSnapshot(\n provider: string,\n snapshot: ModelCatalogSnapshot,\n maxModels: number,\n maxBytes: number,\n): ModelCatalogSnapshot {\n if (typeof snapshot !== 'object' || snapshot === null\n || snapshot.provider?.id !== provider || typeof snapshot.provider.name !== 'string'\n || snapshot.provider.name.length === 0\n || !['static', 'fresh', 'empty', 'stale', 'unavailable'].includes(snapshot.state)\n || typeof snapshot.revision !== 'string' || snapshot.revision.length === 0\n || typeof snapshot.observedAt !== 'string' || !Number.isFinite(Date.parse(snapshot.observedAt))) {\n throw new ModelError(\n `route \"${provider}\" returned an invalid catalog snapshot`,\n REGISTRY_ERROR_CODES.INVALID_CATALOG,\n )\n }\n const models = validateCatalogModels(provider, snapshot.models, maxModels, maxBytes)\n return deepFreeze({ ...structuredClone(snapshot), provider: { ...snapshot.provider }, models })\n}\n\nexport function normalizeResolvedModelInfo(\n provider: string,\n model: string,\n info: ResolvedModelInfo,\n maxBytes: number,\n): ResolvedModelInfo {\n if (info.provider !== provider || info.id !== model\n || typeof info.name !== 'string' || info.name.length === 0) {\n throw invalidModel(provider, model, 'mismatched identity')\n }\n if (info.context !== undefined\n && (!Number.isSafeInteger(info.context.contextWindow) || info.context.contextWindow <= 0)) {\n throw invalidModel(provider, model, 'a non-positive context window')\n }\n if (info.defaultMaxTokens !== undefined\n && (!Number.isSafeInteger(info.defaultMaxTokens) || info.defaultMaxTokens <= 0)) {\n throw invalidModel(provider, model, 'a non-positive defaultMaxTokens')\n }\n if (info.maxOutputTokens !== undefined\n && (!Number.isSafeInteger(info.maxOutputTokens) || info.maxOutputTokens <= 0)) {\n throw invalidModel(provider, model, 'a non-positive maxOutputTokens')\n }\n if (info.defaultMaxTokens !== undefined && info.maxOutputTokens !== undefined\n && info.defaultMaxTokens > info.maxOutputTokens) {\n throw invalidModel(provider, model, 'defaultMaxTokens above maxOutputTokens')\n }\n if (info.context !== undefined && info.defaultMaxTokens !== undefined\n && info.defaultMaxTokens >= info.context.contextWindow) {\n throw invalidModel(provider, model, 'no input headroom')\n }\n if (info.context !== undefined && info.maxOutputTokens !== undefined\n && info.maxOutputTokens >= info.context.contextWindow) {\n throw invalidModel(provider, model, 'no input headroom')\n }\n validateReasoning(provider, model, info)\n validateCapabilities(provider, model, info)\n const normalized = deepFreeze(structuredClone({\n ...info,\n ...(info.inputModalities === undefined ? {} : { inputModalities: [...info.inputModalities] }),\n ...(info.outputModalities === undefined ? {} : { outputModalities: [...info.outputModalities] }),\n ...(info.nativeTools === undefined ? {} : { nativeTools: [...info.nativeTools] }),\n }))\n if (serializedBytes(normalized, REGISTRY_ERROR_CODES.INVALID_MODEL_INFO) > maxBytes) {\n throw new ModelError(\n `route \"${provider}\" model metadata exceeds the configured registry limit`,\n REGISTRY_ERROR_CODES.INVALID_MODEL_INFO,\n )\n }\n return normalized\n}\n\nfunction validateReasoning(provider: string, model: string, info: ResolvedModelInfo): void {\n if (info.reasoning === undefined) return\n const ids = info.reasoning.efforts.map(effort => effort.id)\n if (ids.length === 0 || new Set(ids).size !== ids.length\n || info.reasoning.efforts.some(effort =>\n typeof effort.id !== 'string' || effort.id.length === 0\n || typeof effort.name !== 'string' || effort.name.length === 0)) {\n throw invalidModel(provider, model, 'empty or duplicated reasoning efforts')\n }\n if (info.reasoning.defaultEffort !== undefined\n && !ids.includes(info.reasoning.defaultEffort)) {\n throw invalidModel(provider, model, 'a default reasoning effort it does not offer')\n }\n}\n\nfunction validateCapabilities(provider: string, model: string, info: ResolvedModelInfo): void {\n for (const [label, values] of [\n ['input modalities', info.inputModalities],\n ['output modalities', info.outputModalities],\n ['native tools', info.nativeTools],\n ] as const) {\n if (values !== undefined\n && (new Set(values).size !== values.length\n || values.some(value => typeof value !== 'string' || value.length === 0))) {\n throw invalidModel(provider, model, `invalid ${label}`)\n }\n }\n}\n\nfunction invalidModel(provider: string, model: string, reason: string): ModelError {\n return new ModelError(\n `route \"${provider}\" resolved model \"${model}\" with ${reason}`,\n REGISTRY_ERROR_CODES.INVALID_MODEL_INFO,\n )\n}\n\nexport function resolveCallWithModelInfo(\n config: CallConfig,\n info: ResolvedModelInfo,\n): { readonly config: CallConfig; readonly context: ModelContext | undefined } {\n const reasoningEffort = config.reasoningEffort ?? info.reasoning?.defaultEffort\n if (config.reasoningEffort !== undefined\n && info.reasoning?.efforts.some(effort => effort.id === config.reasoningEffort) !== true) {\n throw new ModelError(\n `model \"${info.id}\" on route \"${info.provider}\" does not offer reasoning effort `\n + `\"${config.reasoningEffort}\"`,\n REGISTRY_ERROR_CODES.UNSUPPORTED_REASONING_EFFORT,\n )\n }\n const maxTokens = config.maxTokens ?? info.defaultMaxTokens\n if (maxTokens !== undefined && info.maxOutputTokens !== undefined\n && maxTokens > info.maxOutputTokens) {\n throw new ModelError(\n `model \"${info.id}\" on route \"${info.provider}\" supports at most `\n + `${info.maxOutputTokens} output tokens, received ${maxTokens}`,\n REGISTRY_ERROR_CODES.OUTPUT_TOKEN_LIMIT_EXCEEDED,\n )\n }\n if (maxTokens !== undefined && info.context !== undefined\n && maxTokens >= info.context.contextWindow) {\n throw new ModelError(\n `model \"${info.id}\" on route \"${info.provider}\" cannot reserve ${maxTokens} output tokens `\n + `inside its ${info.context.contextWindow}-token combined context window`,\n REGISTRY_ERROR_CODES.OUTPUT_TOKEN_LIMIT_EXCEEDED,\n )\n }\n return {\n config: {\n provider: config.provider,\n model: config.model,\n ...(reasoningEffort === undefined ? {} : { reasoningEffort }),\n ...(config.temperature === undefined ? {} : { temperature: config.temperature }),\n ...(config.topP === undefined ? {} : { topP: config.topP }),\n ...(maxTokens === undefined ? {} : { maxTokens }),\n ...(config.stop === undefined ? {} : { stop: [...config.stop] }),\n },\n context: info.context,\n }\n}\n\nexport function projectReplayForAdapter(\n options: GenerateOptions,\n adapter: ModelAdapter,\n registeredAdapter: (provider: string) => ModelAdapter | undefined,\n): GenerateOptions {\n const messages: Message[] = options.messages.map((message) => {\n const source = message.source\n if (message.role !== 'assistant' || source.kind !== 'model'\n || source.replayState === undefined || registeredAdapter(source.provider) === adapter) {\n return message\n }\n return freezeMessage({\n ...message,\n source: { kind: 'model', provider: source.provider, model: source.model },\n })\n })\n if (messages.every((message, index) => message === options.messages[index])) return options\n return { ...options, messages }\n}\n\nfunction serializedBytes(value: unknown, code: string): number {\n let encoded: string | undefined\n try { encoded = JSON.stringify(value) }\n catch (error) {\n throw new ModelError('adapter model metadata must be JSON-serializable', code, { cause: error })\n }\n if (encoded === undefined) {\n throw new ModelError('adapter model metadata must be JSON-serializable', code)\n }\n return new TextEncoder().encode(encoded).byteLength\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{waitForSettlement as e}from"../async/settlement.js";import{MODEL_ERROR_CODES as t,ModelError as n,REGISTRY_ERROR_CODES as r}from"../errors/model-error.js";import{normalizeModelFailure as i}from"../errors/failure.js";import{contentHasImage as a,projectImagesForTextModel as o}from"../message/projection.js";import{callConfigEquals as s}from"../contract/call-config.js";import{isNativeToolSchema as c}from"../contract/tool.js";import{normalizeResolvedModelInfo as l,projectReplayForAdapter as u,resolveCallWithModelInfo as d}from"./model-metadata.js";async function*f(e){let{options:t,context:r}=e,i;try{let c=e.prepared?.registration??e.registration(t.provider),l=c.adapter,d=await p(e,c,l),f=s(t,d.config)?t:{...t,...d.config},h=d.modelInfo.inputModalities!==void 0&&!d.modelInfo.inputModalities.includes(`image`)&&f.messages.some(e=>a(e.content));if(f.imagePolicy!==void 0&&f.imagePolicy!==`strict`&&f.imagePolicy!==`project`)throw new n(`invalid image policy`,`INVALID_IMAGE_POLICY`);if(h&&f.imagePolicy===`strict`)throw new n(`model ${d.modelInfo.id} does not support required image input`,`UNSUPPORTED_IMAGE_INPUT`);let g=h?{...f,messages:o(f.messages)}:f;m(g,d.modelInfo),e.onDispatch(),i=d.dispatch(u(g,l,e.registeredAdapter),r)[Symbol.asyncIterator]()}catch(e){yield _(e,t.signal);return}yield*h(i,t.signal)}async function p(e,t,i){let{options:a,context:o,prepared:c}=e;if(c!==void 0){if(!s(a,c.config))throw new n(`prepared call config changed before adapter dispatch`,r.INVALID_PREPARED_CALL);return{modelInfo:c.modelInfo,config:c.config,dispatch:c.dispatch}}let u=await i.prepareCall(a.provider,a.model,a.signal,o),f=l(t.provider.id,a.model,u.model,e.maxCatalogBytes);return{modelInfo:f,config:d(a,f).config,dispatch:(e,t)=>u.stream(e,t)}}function m(e,t){if(t.nativeTools!==void 0){for(let i of e.tools??[])if(c(i)&&!t.nativeTools.includes(i.name))throw new n(`model "${t.id}" on route "${t.provider}" does not support native tool "${i.name}"`,r.UNSUPPORTED_NATIVE_TOOL)}}async function*h(e,t){let n=!1;try{for(;;){let r;try{let t=await e.next();r=t.done===!0?{done:!0}:{done:!1,value:t.value}}catch(e){n=!0,yield _(e,t);return}if(r.done){n=!0;return}yield r.value}}finally{n||await g(e)}}async function g(r){let i=r.return?.bind(r);if(i===void 0)return;let a=Promise.resolve().then(async()=>{await i()});if(!await e(a,3e4))throw new n(`model adapter ignored cancellation for more than 30000ms`,t.TEARDOWN_TIMEOUT)}function _(e,t){let n=i(e);return{type:`finish`,reason:t?.aborted===!0||n.code===`ABORTED`?{kind:`aborted`,failure:n}:{kind:`error`,failure:n}}}export{f as streamAdapter};
|
|
2
|
+
//# sourceMappingURL=model-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-stream.js","names":[],"sources":["../../src/runtime/model-stream.ts"],"sourcesContent":["import type { ModelAdapter, PreparedAdapterCall } from '../contract/adapter.ts'\nimport { callConfigEquals, type CallConfig } from '../contract/call-config.ts'\nimport type { GenerateOptions } from '../contract/generate-options.ts'\nimport { isNativeToolSchema } from '../contract/tool.ts'\nimport type { ProviderInfo, ResolvedModelInfo } from '../contract/model-info.ts'\nimport type { ResolvedRetryPolicy } from '../contract/retry-policy.ts'\nimport { normalizeModelFailure } from '../errors/failure.ts'\nimport { MODEL_ERROR_CODES, ModelError, REGISTRY_ERROR_CODES } from '../errors/model-error.ts'\nimport { contentHasImage, projectImagesForTextModel } from '../message/projection.ts'\nimport type { ModelInvocationContext } from '../observation/report.ts'\nimport type { StreamChunk } from '../stream/chunk.ts'\nimport { waitForSettlement } from '../async/settlement.ts'\nimport {\n normalizeResolvedModelInfo,\n projectReplayForAdapter,\n resolveCallWithModelInfo,\n} from './model-metadata.ts'\n\nexport interface RuntimeAdapterRegistration {\n readonly adapter: ModelAdapter\n readonly provider: ProviderInfo\n readonly retryPolicy: ResolvedRetryPolicy\n readonly pluginId?: string\n readonly family?: string\n}\n\nexport interface PreparedDispatch {\n readonly registration: RuntimeAdapterRegistration\n readonly config: CallConfig\n readonly modelInfo: ResolvedModelInfo\n readonly dispatch: (options: GenerateOptions, context: ModelInvocationContext) => AsyncIterable<StreamChunk>\n}\n\nexport interface AdapterStreamInput {\n readonly options: GenerateOptions\n readonly context: ModelInvocationContext\n readonly onDispatch: () => void\n readonly prepared?: PreparedDispatch\n readonly maxCatalogBytes: number\n readonly registration: (provider: string) => RuntimeAdapterRegistration\n readonly registeredAdapter: (provider: string) => ModelAdapter | undefined\n}\n\n/** Run one adapter generation through the registry's single failure/cancellation funnel. */\nexport async function* streamAdapter(input: AdapterStreamInput): AsyncGenerator<StreamChunk> {\n const { options, context } = input\n let iterator: AsyncIterator<StreamChunk>\n try {\n const registration = input.prepared?.registration ?? input.registration(options.provider)\n const adapter = registration.adapter\n const prepared = await prepareDispatch(input, registration, adapter)\n const withConfig = callConfigEquals(options, prepared.config)\n ? options\n : { ...options, ...prepared.config }\n const hasUnsupportedImages = prepared.modelInfo.inputModalities !== undefined\n && !prepared.modelInfo.inputModalities.includes('image')\n && withConfig.messages.some(message => contentHasImage(message.content))\n if (withConfig.imagePolicy !== undefined && withConfig.imagePolicy !== 'strict' && withConfig.imagePolicy !== 'project') throw new ModelError('invalid image policy', 'INVALID_IMAGE_POLICY')\n if (hasUnsupportedImages && withConfig.imagePolicy === 'strict') throw new ModelError(\n `model ${prepared.modelInfo.id} does not support required image input`, 'UNSUPPORTED_IMAGE_INPUT',\n )\n const projected = hasUnsupportedImages\n ? { ...withConfig, messages: projectImagesForTextModel(withConfig.messages) }\n : withConfig\n validateNativeTools(projected, prepared.modelInfo)\n input.onDispatch()\n iterator = prepared.dispatch(projectReplayForAdapter(\n projected, adapter, input.registeredAdapter,\n ), context)[Symbol.asyncIterator]()\n } catch (error: unknown) {\n yield adapterFailureChunk(error, options.signal)\n return\n }\n yield* consumeIterator(iterator, options.signal)\n}\n\nasync function prepareDispatch(\n input: AdapterStreamInput,\n registration: RuntimeAdapterRegistration,\n adapter: ModelAdapter,\n): Promise<{ readonly modelInfo: ResolvedModelInfo; readonly config: CallConfig;\n readonly dispatch: PreparedDispatch['dispatch'] }> {\n const { options, context, prepared } = input\n if (prepared !== undefined) {\n if (!callConfigEquals(options, prepared.config)) {\n throw new ModelError(\n 'prepared call config changed before adapter dispatch',\n REGISTRY_ERROR_CODES.INVALID_PREPARED_CALL,\n )\n }\n return { modelInfo: prepared.modelInfo, config: prepared.config, dispatch: prepared.dispatch }\n }\n const adapterCall: PreparedAdapterCall = await adapter.prepareCall(\n options.provider, options.model, options.signal, context,\n )\n const modelInfo = normalizeResolvedModelInfo(\n registration.provider.id, options.model, adapterCall.model, input.maxCatalogBytes,\n )\n return {\n modelInfo,\n config: resolveCallWithModelInfo(options, modelInfo).config,\n dispatch: (request, activeContext) => adapterCall.stream(request, activeContext),\n }\n}\n\nfunction validateNativeTools(options: GenerateOptions, model: ResolvedModelInfo): void {\n if (model.nativeTools === undefined) return\n for (const tool of options.tools ?? []) {\n if (isNativeToolSchema(tool) && !model.nativeTools.includes(tool.name)) {\n throw new ModelError(\n `model \"${model.id}\" on route \"${model.provider}\" does not support native tool \"${tool.name}\"`,\n REGISTRY_ERROR_CODES.UNSUPPORTED_NATIVE_TOOL,\n )\n }\n }\n}\n\nasync function* consumeIterator(\n iterator: AsyncIterator<StreamChunk>,\n signal?: AbortSignal,\n): AsyncGenerator<StreamChunk> {\n let completed = false\n try {\n while (true) {\n let item: { done: true } | { done: false; value: StreamChunk }\n try {\n const next = await iterator.next()\n item = next.done === true ? { done: true } : { done: false, value: next.value }\n } catch (error: unknown) {\n completed = true\n yield adapterFailureChunk(error, signal)\n return\n }\n if (item.done) { completed = true; return }\n yield item.value\n }\n } finally {\n if (!completed) await closeIterator(iterator)\n }\n}\n\nasync function closeIterator(iterator: AsyncIterator<StreamChunk>): Promise<void> {\n const close = iterator.return?.bind(iterator)\n if (close === undefined) return\n const closing = Promise.resolve().then(async () => { await close() })\n if (!await waitForSettlement(closing, 30_000)) {\n throw new ModelError(\n 'model adapter ignored cancellation for more than 30000ms',\n MODEL_ERROR_CODES.TEARDOWN_TIMEOUT,\n )\n }\n}\n\nfunction adapterFailureChunk(error: unknown, signal?: AbortSignal): StreamChunk {\n const failure = normalizeModelFailure(error)\n return {\n type: 'finish',\n reason: signal?.aborted === true || failure.code === 'ABORTED'\n ? { kind: 'aborted', failure }\n : { kind: 'error', failure },\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { ObservationResource } from "../observation/event.js";
|
|
2
|
+
import { ObservationPort } from "../observation/port.js";
|
|
3
|
+
import { ModelCallHandle, ModelInvocationContext } from "../observation/report.js";
|
|
4
|
+
import { GenerateOptions } from "../contract/generate-options.js";
|
|
5
|
+
import { ModelCatalogOptions, ModelCatalogSnapshot, ModelContext, ModelInfo, ModelModality, ProviderInfo, ResolvedModelInfo } from "../contract/model-info.js";
|
|
6
|
+
import { ResolvedRetryPolicy } from "../contract/retry-policy.js";
|
|
7
|
+
import { ModelAdapter } from "../contract/adapter.js";
|
|
8
|
+
import { CallConfig, CallConfigAdapterDefaults } from "../contract/call-config.js";
|
|
9
|
+
import { AdapterRegistrationHandle, ModelProviderPlugin, PluginRegistrationHandle, StreamMiddleware } from "../plugin/provider-plugin.js";
|
|
10
|
+
//#region src/runtime/registry.d.ts
|
|
11
|
+
/**
|
|
12
|
+
* Wraps every streaming model call. Call `next()` to reach the adapter, or yield
|
|
13
|
+
* your own chunks to short-circuit it entirely.
|
|
14
|
+
*
|
|
15
|
+
* This is the extension point for retry, caching, request logging, replay, and
|
|
16
|
+
* test doubles. Middleware registered EARLIER sits further out.
|
|
17
|
+
*/
|
|
18
|
+
/** One call whose configuration and adapter registration were resolved together. */
|
|
19
|
+
interface PreparedCall {
|
|
20
|
+
/** Detached, deep-frozen config with any adapter-owned default materialized. */
|
|
21
|
+
readonly config: CallConfig;
|
|
22
|
+
/** Immutable retry policy captured with the adapter registration. */
|
|
23
|
+
readonly retryPolicy: ResolvedRetryPolicy;
|
|
24
|
+
/** Context capacity resolved with the registration-bound call. */
|
|
25
|
+
readonly context?: ModelContext;
|
|
26
|
+
/** Exact model modalities captured with the dispatch generation. */
|
|
27
|
+
readonly inputModalities?: readonly ModelModality[];
|
|
28
|
+
/** Complete validated capability snapshot bound to this adapter generation. */
|
|
29
|
+
readonly model: ResolvedModelInfo;
|
|
30
|
+
/** Which config fields the adapter supplied rather than the caller. */
|
|
31
|
+
readonly adapterDefaults: CallConfigAdapterDefaults;
|
|
32
|
+
/**
|
|
33
|
+
* Dispatch this call ONCE, through the registration captured at preparation.
|
|
34
|
+
* @param options - the assembled request, carrying the prepared config.
|
|
35
|
+
* @returns the chunk stream, including middleware.
|
|
36
|
+
*/
|
|
37
|
+
stream(options: GenerateOptions, context?: ModelInvocationContext): ModelCallHandle;
|
|
38
|
+
}
|
|
39
|
+
interface ModelRegistryOptions {
|
|
40
|
+
/** Maximum model rows accepted from one adapter catalog. Defaults to 2,048. */
|
|
41
|
+
readonly maxCatalogModels?: number;
|
|
42
|
+
/** Maximum serialized bytes accepted from a catalog or model-info record. Defaults to 4 MiB. */
|
|
43
|
+
readonly maxCatalogBytes?: number;
|
|
44
|
+
/** Default observation port; a per-call invocation context may override it. */
|
|
45
|
+
readonly observation?: ObservationPort;
|
|
46
|
+
/** Safe SDK/service/runtime identity copied onto observation events. */
|
|
47
|
+
readonly observationResource?: ObservationResource;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Routes model calls to registered adapters.
|
|
51
|
+
*
|
|
52
|
+
* Construct one per application or isolated runtime scope, register the adapters
|
|
53
|
+
* you use, then call {@link stream} or {@link prepareCall}.
|
|
54
|
+
*/
|
|
55
|
+
declare class ModelRegistry {
|
|
56
|
+
private adapters;
|
|
57
|
+
private middleware;
|
|
58
|
+
private listeners;
|
|
59
|
+
private plugins;
|
|
60
|
+
private readonly maxCatalogModels;
|
|
61
|
+
private readonly maxCatalogBytes;
|
|
62
|
+
private readonly observation;
|
|
63
|
+
private readonly observationResource;
|
|
64
|
+
constructor(options?: ModelRegistryOptions);
|
|
65
|
+
/** Install one provider plugin as a single synchronous topology transaction. */
|
|
66
|
+
install(plugin: ModelProviderPlugin): PluginRegistrationHandle;
|
|
67
|
+
/**
|
|
68
|
+
* Register an adapter for the given routes.
|
|
69
|
+
*
|
|
70
|
+
* All-or-nothing: if ANY route conflicts, nothing is registered. A partial
|
|
71
|
+
* registration would leave the caller believing a route exists when it does not.
|
|
72
|
+
* @param providers - every route this adapter should serve; must be non-empty.
|
|
73
|
+
* @param adapter - the adapter that streams calls for those routes.
|
|
74
|
+
* @returns the disposer, carrying {@link AdapterRegistrationHandle.replace}.
|
|
75
|
+
*/
|
|
76
|
+
registerAdapter(providers: readonly string[], adapter: ModelAdapter): AdapterRegistrationHandle;
|
|
77
|
+
/**
|
|
78
|
+
* Validate one candidate route set, treating routes this registration already
|
|
79
|
+
* holds as available. Mutates nothing Ea rejected candidate leaves the registry
|
|
80
|
+
* exactly as it was.
|
|
81
|
+
*/
|
|
82
|
+
private prepareRoutes;
|
|
83
|
+
/**
|
|
84
|
+
* Swap this registration's routes in ONE synchronous section, so no caller can
|
|
85
|
+
* observe the registry between the release and the re-registration.
|
|
86
|
+
*/
|
|
87
|
+
private commitRoutes;
|
|
88
|
+
/**
|
|
89
|
+
* Install streaming middleware.
|
|
90
|
+
* @param middleware - wrapper invoked around every call; earlier registrations sit further out.
|
|
91
|
+
* @returns a disposer that removes exactly this middleware.
|
|
92
|
+
*/
|
|
93
|
+
use(middleware: StreamMiddleware): () => void;
|
|
94
|
+
/**
|
|
95
|
+
* Observe route-topology changes (registration, replacement, disposal).
|
|
96
|
+
* @param listener - payload-free notification; re-read `listProviders()` for new state.
|
|
97
|
+
* @returns a disposer that removes the listener.
|
|
98
|
+
*/
|
|
99
|
+
onAdaptersUpdated(listener: () => void): () => void;
|
|
100
|
+
/**
|
|
101
|
+
* Notify topology observers.
|
|
102
|
+
*
|
|
103
|
+
* Each listener is contained independently: a topology notification is not a
|
|
104
|
+
* veto, so one broken observer must not starve the others or roll back a
|
|
105
|
+
* registration that already happened.
|
|
106
|
+
*/
|
|
107
|
+
private emitAdaptersUpdated;
|
|
108
|
+
/**
|
|
109
|
+
* Describe every route with a registered adapter.
|
|
110
|
+
* @returns detached provider metadata, in registration order.
|
|
111
|
+
*/
|
|
112
|
+
listProviders(): ProviderInfo[];
|
|
113
|
+
/**
|
|
114
|
+
* List the models one route advertises.
|
|
115
|
+
*
|
|
116
|
+
* Re-validated here rather than trusted, because a malformed catalog entry
|
|
117
|
+
* surfaces in a caller's model picker where its origin is far from obvious.
|
|
118
|
+
* @param provider - a registered route.
|
|
119
|
+
* @returns detached, validated model metadata.
|
|
120
|
+
*/
|
|
121
|
+
listModels(provider: string, signal?: AbortSignal): Promise<ModelInfo[]>;
|
|
122
|
+
/** Resolve and validate one uncached adapter-level catalog generation. */
|
|
123
|
+
modelCatalog(provider: string, options?: ModelCatalogOptions): Promise<ModelCatalogSnapshot>;
|
|
124
|
+
/**
|
|
125
|
+
* Resolve metadata for one exact model.
|
|
126
|
+
* @param provider - a registered route.
|
|
127
|
+
* @param model - exact model id.
|
|
128
|
+
* @param signal - cancellation for adapter-side resolution.
|
|
129
|
+
* @returns validated, detached metadata.
|
|
130
|
+
*/
|
|
131
|
+
resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise<ResolvedModelInfo>;
|
|
132
|
+
/** The retry policy captured for one route. */
|
|
133
|
+
retryPolicy(provider: string): ResolvedRetryPolicy;
|
|
134
|
+
/**
|
|
135
|
+
* Resolve one call under its CURRENT adapter registration, returning a one-shot
|
|
136
|
+
* handle that keeps that registration through to dispatch.
|
|
137
|
+
* @param config - route, model, and optional request controls.
|
|
138
|
+
* @param signal - cancellation for adapter-side capability lookup.
|
|
139
|
+
* @returns the prepared config and its registration-bound stream entry point.
|
|
140
|
+
*/
|
|
141
|
+
prepareCall(config: CallConfig, signal?: AbortSignal, invocationContext?: ModelInvocationContext): Promise<PreparedCall>;
|
|
142
|
+
/**
|
|
143
|
+
* Stream one model call as raw chunks.
|
|
144
|
+
*
|
|
145
|
+
* Adapter selection, dispatch, and iteration failures become terminal `error` or
|
|
146
|
+
* `aborted` finish chunks. Middleware and consumer failures stay THROWN Ethose
|
|
147
|
+
* are bugs in code the caller controls, and converting them to a finish reason
|
|
148
|
+
* would hide them.
|
|
149
|
+
* @param options - the full request; `options.provider` selects the adapter.
|
|
150
|
+
* @returns the chunk stream, wrapped by any installed middleware.
|
|
151
|
+
*/
|
|
152
|
+
stream(options: GenerateOptions, context?: ModelInvocationContext): ModelCallHandle;
|
|
153
|
+
private dispatch;
|
|
154
|
+
/**
|
|
155
|
+
* Compose installed middleware around the adapter boundary.
|
|
156
|
+
*
|
|
157
|
+
* Composition is deferred to the first iteration rather than done eagerly, so
|
|
158
|
+
* that `stream()` ALWAYS returns an iterable and every failure — including a
|
|
159
|
+
* middleware that throws synchronously — surfaces on the same path. Composing
|
|
160
|
+
* eagerly would give callers two different error channels for the same class of
|
|
161
|
+
* fault, and they would inevitably handle only one.
|
|
162
|
+
*
|
|
163
|
+
* The middleware list is snapshotted here so that installing or removing
|
|
164
|
+
* middleware mid-stream cannot change the chain of a call already in flight.
|
|
165
|
+
*/
|
|
166
|
+
private dispatchRaw;
|
|
167
|
+
private registration;
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
export { ModelRegistry, ModelRegistryOptions, PreparedCall };
|
|
171
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/runtime/registry.ts"],"mappings":";;;;;;;;;;;;;;;;;;UA6DiB;;WAEN,QAAQ;;WAER,aAAa;;WAEb,UAAU;;WAEV,2BAA2B;;WAE3B,OAAO;;WAEP,iBAAiB;;;;;;EAM1B,OAAO,SAAS,iBAAiB,UAAU,yBAAyB;;UAGrD;;WAEN;;WAEA;;WAEA,cAAc;;WAEd,sBAAsB;;;;;;;;cA0CpB;UACH;UACA;UACA;UACA;mBACS;mBACA;mBACA;mBACA;EAEjB,YAAY,UAAS;;EAYrB,QAAQ,QAAQ,sBAAsB;;;;;;;;;;EAoJtC,gBACE,8BACA,SAAS,eACR;;;;;;UA0CK;;;;;UA+CA;;;;;;EAkBR,IAAI,YAAY;;;;;;EAahB,kBAAkB;;;;;;;;UAYV;;;;;EAcR,iBAAiB;;;;;;;;;EAYX,WAAW,kBAAkB,SAAS,cAAc,QAAQ;;EAO5D,aAAa,kBAAkB,UAAS,sBAA2B,QAAQ;;;;;;;;EAa3E,iBACJ,kBACA,eACA,SAAS,cACR,QAAQ;;EAOX,YAAY,mBAAmB;;;;;;;;EAWzB,YACJ,QAAQ,YACR,SAAS,aACT,oBAAoB,yBACnB,QAAQ;;;;;;;;;;;EAmEX,OAAO,SAAS,iBAAiB,UAAU,yBAAyB;UAI5D;;;;;;;;;;;;;UAyCA;UA6BA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{deepFreeze as e}from"../primitives/freeze.js";import"../primitives/version.js";import{PLUGIN_ERROR_CODES as t,PluginError as n}from"../plugin/provider-plugin.js";import{ModelError as r,REGISTRY_ERROR_CODES as i}from"../errors/model-error.js";import{callConfigEquals as a}from"../contract/call-config.js";import{resolveRetryPolicy as o}from"../contract/retry-policy.js";import{createModelCallHandle as s}from"./model-call-handle.js";import{normalizeResolvedModelInfo as c,resolveCallWithModelInfo as l,validateCatalogModels as u,validateModelCatalogSnapshot as d}from"./model-metadata.js";import{streamAdapter as f}from"./model-stream.js";function p(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return!1;let t;try{t=Reflect.get(e,`then`)}catch{return!0}if(typeof t!=`function`)return!1;try{Promise.resolve(e).catch(()=>{})}catch{}return!0}function m(e){try{return p(e())?TypeError(`plugin cleanup must be synchronous`):void 0}catch(e){return e}}var h=class{adapters=new Map;middleware=[];listeners=new Set;plugins=new Map;maxCatalogModels;maxCatalogBytes;observation;observationResource;constructor(t={}){this.maxCatalogModels=g(t.maxCatalogModels??2048,`maxCatalogModels`),this.maxCatalogBytes=g(t.maxCatalogBytes??4194304,`maxCatalogBytes`),this.observation=t.observation,this.observationResource=e(t.observationResource??{sdkName:`ai-agent-sdk`,sdkVersion:`0.1.0`,runtime:`unknown`})}install(e){let a=typeof e?.id==`string`?e.id:``,o=(e,r,i=[])=>{let o=[...r===void 0?[]:[r],...i],s=o.length<=1?o[0]:AggregateError(o,`plugin ${a} install cleanup failed`);throw new n(e,t.INSTALL_FAILED,a,s===void 0?void 0:{cause:s})};(a.trim().length===0||a!==a.trim())&&o(`plugin id must be a non-empty trimmed string`),this.plugins.has(a)&&o(`plugin "${a}" is already installed`),(typeof e.displayName!=`string`||e.displayName.trim().length===0)&&o(`plugin "${a}" displayName must be non-empty`),typeof e.setup!=`function`&&o(`plugin "${a}" setup must be a function`);let s=e.family??a;(typeof s!=`string`||s.trim().length===0||s!==s.trim())&&o(`plugin "${a}" family must be a non-empty trimmed string`);let c=Object.freeze({pluginId:a,family:s}),l=[],u=[],d=!0,f={registerAdapter:(e,t)=>{if(d||o(`plugin "${a}" staging registrar is closed`),e.length===0)throw new r(`an adapter must register at least one provider route`,i.INVALID_ADAPTER);let n={active:!0,routes:[...e],adapter:t},s=new Set(l.filter(e=>e.active).flatMap(e=>e.routes));for(let t of e)if(s.has(t))throw new r(`an adapter for provider route "${t}" is already staged`,i.DUPLICATE_ADAPTER);this.prepareRoutes(e,t,new Set,c),l.push(n);let u=(()=>{d&&(n.active=!1)});return u.replace=e=>{if(!d||!n.active)throw new r(`a disposed staged registration cannot replace routes`,i.REGISTRATION_DISPOSED);let a=new Set(l.filter(e=>e.active&&e!==n).flatMap(e=>e.routes));for(let t of e)if(a.has(t))throw new r(`an adapter for provider route "${t}" is already staged`,i.DUPLICATE_ADAPTER);this.prepareRoutes(e,t,new Set,c),n.routes=[...e]},u},use:e=>{if(d||o(`plugin "${a}" staging registrar is closed`),typeof e!=`function`)throw TypeError(`plugin middleware must be a function`);let t={active:!0,middleware:e};return u.push(t),()=>{d&&(t.active=!1)}}},h;try{let t=e.setup(f);p(t)&&o(`plugin "${a}" setup must be synchronous`),t!==void 0&&typeof t!=`function`&&o(`plugin "${a}" setup must be synchronous and return void or cleanup`),h=typeof t==`function`?t:void 0}catch(e){if(e instanceof n&&e.code===t.INSTALL_FAILED)throw e;o(`plugin "${a}" setup failed`,e)}finally{d=!1}let g=[],_=new Set;try{for(let e of l)if(e.active){for(let t of e.routes){if(_.has(t))throw new r(`an adapter for provider route "${t}" is already staged`,i.DUPLICATE_ADAPTER);_.add(t)}g.push(...this.prepareRoutes(e.routes,e.adapter,new Set,c))}}catch(e){let t=[];if(h){let e=m(h);e!==void 0&&t.push(e)}o(`plugin "${a}" commit validation failed`,e,t)}let v=u.filter(e=>e.active).map(e=>e.middleware);for(let e of g)this.adapters.set(e.provider.id,e);this.middleware.push(...v);let y={routes:_,registrations:g,middleware:v,...h===void 0?{}:{cleanup:h}};this.plugins.set(a,y),this.emitAdaptersUpdated();let b=!1,x=(()=>{if(b)return;b=!0,this.plugins.delete(a);for(let e of y.registrations)this.adapters.get(e.provider.id)===e&&this.adapters.delete(e.provider.id);for(let e=y.middleware.length-1;e>=0;e--){let t=y.middleware[e],n=t===void 0?-1:this.middleware.lastIndexOf(t);n>=0&&this.middleware.splice(n,1)}this.emitAdaptersUpdated();let e=[];if(y.cleanup){let t=m(y.cleanup);t!==void 0&&e.push(t)}if(e.length>0)throw new n(`plugin "${a}" cleanup failed`,t.CLEANUP_FAILED,a,{cause:AggregateError(e,`plugin "${a}" cleanup failed`)})});return Object.defineProperty(x,"pluginId",{value:a,enumerable:!0}),x}registerAdapter(e,t){if(e.length===0)throw new r(`an adapter must register at least one provider route`,i.INVALID_ADAPTER);let n=new Set,a=!1;this.commitRoutes(n,this.prepareRoutes(e,t,n));let o=(()=>{if(!a){a=!0;for(let e of n)this.adapters.delete(e);n.clear(),this.emitAdaptersUpdated()}});return o.replace=e=>{if(a)throw new r(`a disposed adapter registration cannot replace its routes`,i.REGISTRATION_DISPOSED);this.commitRoutes(n,this.prepareRoutes(e,t,n))},o}prepareRoutes(e,t,n,a){let s=new Set,c=[];for(let l of e){if(typeof l!=`string`||l.length===0)throw new r(`adapter provider route names must be non-empty strings`,i.INVALID_ADAPTER);if(s.has(l)||this.adapters.has(l)&&!n.has(l))throw new r(`an adapter for provider route "${l}" is already registered`,i.DUPLICATE_ADAPTER);let e=t.providerInfo(l);if(typeof e.id!=`string`||e.id!==l||typeof e.name!=`string`||e.name.length===0)throw new r(`adapter metadata for route "${l}" must preserve its id and carry a non-empty name`,i.INVALID_ADAPTER);s.add(l),c.push({adapter:t,provider:{id:e.id,name:e.name},...a===void 0?{}:a,retryPolicy:t.providerRetryPolicy(l)??o(void 0,`provider "${l}" retryPolicy`)})}return c}commitRoutes(e,t){for(let t of e)this.adapters.delete(t);e.clear();for(let n of t)this.adapters.set(n.provider.id,n),e.add(n.provider.id);this.emitAdaptersUpdated()}use(e){return this.middleware.push(e),()=>{let t=this.middleware.indexOf(e);t>=0&&this.middleware.splice(t,1)}}onAdaptersUpdated(e){return this.listeners.add(e),()=>void this.listeners.delete(e)}emitAdaptersUpdated(){for(let e of[...this.listeners])try{e()}catch{}}listProviders(){return[...this.adapters.values()].map(({provider:e})=>({...e}))}async listModels(e,t){let n=await this.registration(e).adapter.listModels(e,t);return u(e,n,this.maxCatalogModels,this.maxCatalogBytes)}async modelCatalog(e,t={}){let n=await this.registration(e).adapter.modelCatalog(e,t);return d(e,n,this.maxCatalogModels,this.maxCatalogBytes)}async resolveModelInfo(e,t,n){let r=this.registration(e),i=await r.adapter.resolveModel(e,t,n);return c(r.provider.id,t,i,this.maxCatalogBytes)}retryPolicy(e){return this.registration(e).retryPolicy}async prepareCall(t,n,o){let s=this.registration(t.provider),u=await s.adapter.prepareCall(t.provider,t.model,n,o),d=c(s.provider.id,t.model,u.model,this.maxCatalogBytes),f=l(t,d),p=e(structuredClone(f.config)),m=f.context===void 0?void 0:e(structuredClone(f.context)),h=e({...t.reasoningEffort===void 0&&p.reasoningEffort!==void 0?{reasoningEffort:!0}:{},...t.maxTokens===void 0&&p.maxTokens!==void 0?{maxTokens:!0}:{}}),g=!1,_=e(structuredClone(d));return Object.freeze({config:p,model:_,retryPolicy:s.retryPolicy,adapterDefaults:h,...m===void 0?{}:{context:m},...d.inputModalities===void 0?{}:{inputModalities:Object.freeze([...d.inputModalities])},stream:(e,t=o)=>{if(g)throw new r(`a prepared call can only be dispatched once`,i.INVALID_PREPARED_CALL);if(!a(e,p))throw new r(`prepared call config changed before adapter dispatch`,i.INVALID_PREPARED_CALL);return g=!0,this.dispatch(e,t,{registration:s,config:p,modelInfo:d,dispatch:(e,t)=>u.stream(e,t)})}})}stream(e,t){return this.dispatch(e,t)}dispatch(e,t,n){let r=`not-sent`,i=n?.registration??this.adapters.get(e.provider);return s({options:e,...i?.family===void 0?{}:{providerFamily:i.family},...i?.pluginId===void 0?{}:{providerPluginId:i.pluginId},...i===void 0?{}:{isRetryable:e=>i.retryPolicy.mode===`always`||i.retryPolicy.retryableCodes.includes(e)},...t===void 0?{}:{context:t},...this.observation===void 0?{}:{defaultObservation:this.observation},resource:this.observationResource,routePresent:n!==void 0||this.adapters.has(e.provider),dispatchState:()=>r,stream:t=>this.dispatchRaw(e,t,()=>{r=`unknown`},n)})}dispatchRaw(e,t,n,r){let i=[...this.middleware],a=()=>{let a=()=>f({options:e,context:t,onDispatch:n,maxCatalogBytes:this.maxCatalogBytes,registration:e=>this.registration(e),registeredAdapter:e=>this.adapters.get(e)?.adapter,...r===void 0?{}:{prepared:r}});for(let n=i.length-1;n>=0;n--){let r=i[n];if(r===void 0)continue;let o=a;a=()=>r(e,o,t)}return a()};return{async*[Symbol.asyncIterator](){yield*a()}}}registration(e){let t=this.adapters.get(e);if(t===void 0)throw new r(`no adapter registered for provider route "${e}"`,i.NO_ADAPTER);return t}};function g(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`ModelRegistry ${t} must be a positive safe integer`);return e}export{h as ModelRegistry};
|
|
2
|
+
//# sourceMappingURL=registry.js.map
|