openai 7.14.0 → 7.16.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/CHANGELOG.md +41 -0
- package/README.md +6 -0
- package/bedrock.d.mts.map +1 -1
- package/bedrock.d.ts.map +1 -1
- package/bedrock.js +9 -6
- package/bedrock.js.map +1 -1
- package/bedrock.mjs +9 -6
- package/bedrock.mjs.map +1 -1
- package/client.d.mts +16 -4
- package/client.d.mts.map +1 -1
- package/client.d.ts +16 -4
- package/client.d.ts.map +1 -1
- package/client.js +37 -20
- package/client.js.map +1 -1
- package/client.mjs +37 -20
- package/client.mjs.map +1 -1
- package/core/pagination.d.mts +19 -1
- package/core/pagination.d.mts.map +1 -1
- package/core/pagination.d.ts +19 -1
- package/core/pagination.d.ts.map +1 -1
- package/core/pagination.js +32 -1
- package/core/pagination.js.map +1 -1
- package/core/pagination.mjs +30 -0
- package/core/pagination.mjs.map +1 -1
- package/internal/realtime-credentials.d.mts +1 -1
- package/internal/realtime-credentials.d.ts +1 -1
- package/internal/realtime-credentials.js +1 -1
- package/internal/realtime-credentials.mjs +1 -1
- package/internal/utils/abort.d.mts +11 -0
- package/internal/utils/abort.d.mts.map +1 -0
- package/internal/utils/abort.d.ts +11 -0
- package/internal/utils/abort.d.ts.map +1 -0
- package/internal/utils/abort.js +87 -0
- package/internal/utils/abort.js.map +1 -0
- package/internal/utils/abort.mjs +83 -0
- package/internal/utils/abort.mjs.map +1 -0
- package/internal/ws.d.mts +13 -0
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts +13 -0
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +10 -0
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +9 -0
- package/internal/ws.mjs.map +1 -1
- package/lib/agents/agent-session-stream.d.mts +41 -0
- package/lib/agents/agent-session-stream.d.mts.map +1 -0
- package/lib/agents/agent-session-stream.d.ts +41 -0
- package/lib/agents/agent-session-stream.d.ts.map +1 -0
- package/lib/agents/agent-session-stream.js +271 -0
- package/lib/agents/agent-session-stream.js.map +1 -0
- package/lib/agents/agent-session-stream.mjs +267 -0
- package/lib/agents/agent-session-stream.mjs.map +1 -0
- package/lib/agents/output-text.d.mts +4 -0
- package/lib/agents/output-text.d.mts.map +1 -0
- package/lib/agents/output-text.d.ts +4 -0
- package/lib/agents/output-text.d.ts.map +1 -0
- package/lib/agents/output-text.js +8 -0
- package/lib/agents/output-text.js.map +1 -0
- package/lib/agents/output-text.mjs +5 -0
- package/lib/agents/output-text.mjs.map +1 -0
- package/lib/agents/turn-state.d.mts +14 -0
- package/lib/agents/turn-state.d.mts.map +1 -0
- package/lib/agents/turn-state.d.ts +14 -0
- package/lib/agents/turn-state.d.ts.map +1 -0
- package/lib/agents/turn-state.js +62 -0
- package/lib/agents/turn-state.js.map +1 -0
- package/lib/agents/turn-state.mjs +58 -0
- package/lib/agents/turn-state.mjs.map +1 -0
- package/lib/live/transcript-grouping.d.mts +2 -2
- package/lib/live/transcript-grouping.d.mts.map +1 -1
- package/lib/live/transcript-grouping.d.ts +2 -2
- package/lib/live/transcript-grouping.d.ts.map +1 -1
- package/lib/live/transcript-grouping.js +44 -22
- package/lib/live/transcript-grouping.js.map +1 -1
- package/lib/live/transcript-grouping.mjs +44 -22
- package/lib/live/transcript-grouping.mjs.map +1 -1
- package/package.json +1 -1
- package/resources/beta/agents/agents.d.mts +3678 -0
- package/resources/beta/agents/agents.d.mts.map +1 -0
- package/resources/beta/agents/agents.d.ts +3678 -0
- package/resources/beta/agents/agents.d.ts.map +1 -0
- package/resources/beta/agents/agents.js +118 -0
- package/resources/beta/agents/agents.js.map +1 -0
- package/resources/beta/agents/agents.mjs +113 -0
- package/resources/beta/agents/agents.mjs.map +1 -0
- package/resources/beta/agents/environments/environments.d.mts +65 -0
- package/resources/beta/agents/environments/environments.d.mts.map +1 -0
- package/resources/beta/agents/environments/environments.d.ts +65 -0
- package/resources/beta/agents/environments/environments.d.ts.map +1 -0
- package/resources/beta/agents/environments/environments.js +43 -0
- package/resources/beta/agents/environments/environments.js.map +1 -0
- package/resources/beta/agents/environments/environments.mjs +38 -0
- package/resources/beta/agents/environments/environments.mjs.map +1 -0
- package/resources/beta/agents/environments/files.d.mts +111 -0
- package/resources/beta/agents/environments/files.d.mts.map +1 -0
- package/resources/beta/agents/environments/files.d.ts +111 -0
- package/resources/beta/agents/environments/files.d.ts.map +1 -0
- package/resources/beta/agents/environments/files.js +61 -0
- package/resources/beta/agents/environments/files.js.map +1 -0
- package/resources/beta/agents/environments/files.mjs +57 -0
- package/resources/beta/agents/environments/files.mjs.map +1 -0
- package/resources/beta/agents/environments/index.d.mts +4 -0
- package/resources/beta/agents/environments/index.d.mts.map +1 -0
- package/resources/beta/agents/environments/index.d.ts +4 -0
- package/resources/beta/agents/environments/index.d.ts.map +1 -0
- package/resources/beta/agents/environments/index.js +11 -0
- package/resources/beta/agents/environments/index.js.map +1 -0
- package/resources/beta/agents/environments/index.mjs +5 -0
- package/resources/beta/agents/environments/index.mjs.map +1 -0
- package/resources/beta/agents/environments/templates.d.mts +415 -0
- package/resources/beta/agents/environments/templates.d.mts.map +1 -0
- package/resources/beta/agents/environments/templates.d.ts +415 -0
- package/resources/beta/agents/environments/templates.d.ts.map +1 -0
- package/resources/beta/agents/environments/templates.js +112 -0
- package/resources/beta/agents/environments/templates.js.map +1 -0
- package/resources/beta/agents/environments/templates.mjs +108 -0
- package/resources/beta/agents/environments/templates.mjs.map +1 -0
- package/resources/beta/agents/environments.d.mts +2 -0
- package/resources/beta/agents/environments.d.mts.map +1 -0
- package/resources/beta/agents/environments.d.ts +2 -0
- package/resources/beta/agents/environments.d.ts.map +1 -0
- package/resources/beta/agents/environments.js +6 -0
- package/resources/beta/agents/environments.js.map +1 -0
- package/resources/beta/agents/environments.mjs +3 -0
- package/resources/beta/agents/environments.mjs.map +1 -0
- package/resources/beta/agents/index.d.mts +5 -0
- package/resources/beta/agents/index.d.mts.map +1 -0
- package/resources/beta/agents/index.d.ts +5 -0
- package/resources/beta/agents/index.d.ts.map +1 -0
- package/resources/beta/agents/index.js +13 -0
- package/resources/beta/agents/index.js.map +1 -0
- package/resources/beta/agents/index.mjs +6 -0
- package/resources/beta/agents/index.mjs.map +1 -0
- package/resources/beta/agents/sessions/artifacts.d.mts +158 -0
- package/resources/beta/agents/sessions/artifacts.d.mts.map +1 -0
- package/resources/beta/agents/sessions/artifacts.d.ts +158 -0
- package/resources/beta/agents/sessions/artifacts.d.ts.map +1 -0
- package/resources/beta/agents/sessions/artifacts.js +106 -0
- package/resources/beta/agents/sessions/artifacts.js.map +1 -0
- package/resources/beta/agents/sessions/artifacts.mjs +102 -0
- package/resources/beta/agents/sessions/artifacts.mjs.map +1 -0
- package/resources/beta/agents/sessions/events.d.mts +61 -0
- package/resources/beta/agents/sessions/events.d.mts.map +1 -0
- package/resources/beta/agents/sessions/events.d.ts +61 -0
- package/resources/beta/agents/sessions/events.d.ts.map +1 -0
- package/resources/beta/agents/sessions/events.js +72 -0
- package/resources/beta/agents/sessions/events.js.map +1 -0
- package/resources/beta/agents/sessions/events.mjs +68 -0
- package/resources/beta/agents/sessions/events.mjs.map +1 -0
- package/resources/beta/agents/sessions/index.d.mts +7 -0
- package/resources/beta/agents/sessions/index.d.mts.map +1 -0
- package/resources/beta/agents/sessions/index.d.ts +7 -0
- package/resources/beta/agents/sessions/index.d.ts.map +1 -0
- package/resources/beta/agents/sessions/index.js +17 -0
- package/resources/beta/agents/sessions/index.js.map +1 -0
- package/resources/beta/agents/sessions/index.mjs +8 -0
- package/resources/beta/agents/sessions/index.mjs.map +1 -0
- package/resources/beta/agents/sessions/items.d.mts +37 -0
- package/resources/beta/agents/sessions/items.d.mts.map +1 -0
- package/resources/beta/agents/sessions/items.d.ts +37 -0
- package/resources/beta/agents/sessions/items.d.ts.map +1 -0
- package/resources/beta/agents/sessions/items.js +35 -0
- package/resources/beta/agents/sessions/items.js.map +1 -0
- package/resources/beta/agents/sessions/items.mjs +31 -0
- package/resources/beta/agents/sessions/items.mjs.map +1 -0
- package/resources/beta/agents/sessions/sessions.d.mts +220 -0
- package/resources/beta/agents/sessions/sessions.d.mts.map +1 -0
- package/resources/beta/agents/sessions/sessions.d.ts +220 -0
- package/resources/beta/agents/sessions/sessions.d.ts.map +1 -0
- package/resources/beta/agents/sessions/sessions.js +124 -0
- package/resources/beta/agents/sessions/sessions.js.map +1 -0
- package/resources/beta/agents/sessions/sessions.mjs +119 -0
- package/resources/beta/agents/sessions/sessions.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/index.d.mts +4 -0
- package/resources/beta/agents/sessions/subagents/index.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/index.d.ts +4 -0
- package/resources/beta/agents/sessions/subagents/index.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/index.js +11 -0
- package/resources/beta/agents/sessions/subagents/index.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/index.mjs +5 -0
- package/resources/beta/agents/sessions/subagents/index.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/items.d.mts +41 -0
- package/resources/beta/agents/sessions/subagents/items.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/items.d.ts +41 -0
- package/resources/beta/agents/sessions/subagents/items.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/items.js +36 -0
- package/resources/beta/agents/sessions/subagents/items.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/items.mjs +32 -0
- package/resources/beta/agents/sessions/subagents/items.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/subagents.d.mts +65 -0
- package/resources/beta/agents/sessions/subagents/subagents.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/subagents.d.ts +65 -0
- package/resources/beta/agents/sessions/subagents/subagents.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/subagents.js +67 -0
- package/resources/beta/agents/sessions/subagents/subagents.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/subagents.mjs +62 -0
- package/resources/beta/agents/sessions/subagents/subagents.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/index.d.mts +3 -0
- package/resources/beta/agents/sessions/subagents/turns/index.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/index.d.ts +3 -0
- package/resources/beta/agents/sessions/subagents/turns/index.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/index.js +9 -0
- package/resources/beta/agents/sessions/subagents/turns/index.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/index.mjs +4 -0
- package/resources/beta/agents/sessions/subagents/turns/index.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/items.d.mts +45 -0
- package/resources/beta/agents/sessions/subagents/turns/items.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/items.d.ts +45 -0
- package/resources/beta/agents/sessions/subagents/turns/items.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/items.js +36 -0
- package/resources/beta/agents/sessions/subagents/turns/items.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/items.mjs +32 -0
- package/resources/beta/agents/sessions/subagents/turns/items.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.d.mts +73 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.d.ts +73 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.js +68 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.mjs +63 -0
- package/resources/beta/agents/sessions/subagents/turns/turns.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns.d.mts +2 -0
- package/resources/beta/agents/sessions/subagents/turns.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns.d.ts +2 -0
- package/resources/beta/agents/sessions/subagents/turns.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns.js +6 -0
- package/resources/beta/agents/sessions/subagents/turns.js.map +1 -0
- package/resources/beta/agents/sessions/subagents/turns.mjs +3 -0
- package/resources/beta/agents/sessions/subagents/turns.mjs.map +1 -0
- package/resources/beta/agents/sessions/subagents.d.mts +2 -0
- package/resources/beta/agents/sessions/subagents.d.mts.map +1 -0
- package/resources/beta/agents/sessions/subagents.d.ts +2 -0
- package/resources/beta/agents/sessions/subagents.d.ts.map +1 -0
- package/resources/beta/agents/sessions/subagents.js +6 -0
- package/resources/beta/agents/sessions/subagents.js.map +1 -0
- package/resources/beta/agents/sessions/subagents.mjs +3 -0
- package/resources/beta/agents/sessions/subagents.mjs.map +1 -0
- package/resources/beta/agents/sessions/turns.d.mts +116 -0
- package/resources/beta/agents/sessions/turns.d.mts.map +1 -0
- package/resources/beta/agents/sessions/turns.d.ts +116 -0
- package/resources/beta/agents/sessions/turns.d.ts.map +1 -0
- package/resources/beta/agents/sessions/turns.js +57 -0
- package/resources/beta/agents/sessions/turns.js.map +1 -0
- package/resources/beta/agents/sessions/turns.mjs +53 -0
- package/resources/beta/agents/sessions/turns.mjs.map +1 -0
- package/resources/beta/agents/sessions.d.mts +2 -0
- package/resources/beta/agents/sessions.d.mts.map +1 -0
- package/resources/beta/agents/sessions.d.ts +2 -0
- package/resources/beta/agents/sessions.d.ts.map +1 -0
- package/resources/beta/agents/sessions.js +6 -0
- package/resources/beta/agents/sessions.js.map +1 -0
- package/resources/beta/agents/sessions.mjs +3 -0
- package/resources/beta/agents/sessions.mjs.map +1 -0
- package/resources/beta/agents/vaults/credentials.d.mts +526 -0
- package/resources/beta/agents/vaults/credentials.d.mts.map +1 -0
- package/resources/beta/agents/vaults/credentials.d.ts +526 -0
- package/resources/beta/agents/vaults/credentials.d.ts.map +1 -0
- package/resources/beta/agents/vaults/credentials.js +132 -0
- package/resources/beta/agents/vaults/credentials.js.map +1 -0
- package/resources/beta/agents/vaults/credentials.mjs +128 -0
- package/resources/beta/agents/vaults/credentials.mjs.map +1 -0
- package/resources/beta/agents/vaults/index.d.mts +3 -0
- package/resources/beta/agents/vaults/index.d.mts.map +1 -0
- package/resources/beta/agents/vaults/index.d.ts +3 -0
- package/resources/beta/agents/vaults/index.d.ts.map +1 -0
- package/resources/beta/agents/vaults/index.js +9 -0
- package/resources/beta/agents/vaults/index.js.map +1 -0
- package/resources/beta/agents/vaults/index.mjs +4 -0
- package/resources/beta/agents/vaults/index.mjs.map +1 -0
- package/resources/beta/agents/vaults/vaults.d.mts +145 -0
- package/resources/beta/agents/vaults/vaults.d.mts.map +1 -0
- package/resources/beta/agents/vaults/vaults.d.ts +145 -0
- package/resources/beta/agents/vaults/vaults.d.ts.map +1 -0
- package/resources/beta/agents/vaults/vaults.js +93 -0
- package/resources/beta/agents/vaults/vaults.js.map +1 -0
- package/resources/beta/agents/vaults/vaults.mjs +88 -0
- package/resources/beta/agents/vaults/vaults.mjs.map +1 -0
- package/resources/beta/agents/vaults.d.mts +2 -0
- package/resources/beta/agents/vaults.d.mts.map +1 -0
- package/resources/beta/agents/vaults.d.ts +2 -0
- package/resources/beta/agents/vaults.d.ts.map +1 -0
- package/resources/beta/agents/vaults.js +6 -0
- package/resources/beta/agents/vaults.js.map +1 -0
- package/resources/beta/agents/vaults.mjs +3 -0
- package/resources/beta/agents/vaults.mjs.map +1 -0
- package/resources/beta/agents.d.mts +2 -0
- package/resources/beta/agents.d.mts.map +1 -0
- package/resources/beta/agents.d.ts +2 -0
- package/resources/beta/agents.d.ts.map +1 -0
- package/resources/beta/agents.js +6 -0
- package/resources/beta/agents.js.map +1 -0
- package/resources/beta/agents.mjs +3 -0
- package/resources/beta/agents.mjs.map +1 -0
- package/resources/beta/beta.d.mts +4 -1
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +4 -1
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js +4 -0
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs +4 -0
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/index.d.mts +1 -0
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +1 -0
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js +11 -9
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs +1 -0
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/responses/internal-base.d.mts.map +1 -1
- package/resources/beta/responses/internal-base.d.ts.map +1 -1
- package/resources/beta/responses/internal-base.js +6 -0
- package/resources/beta/responses/internal-base.js.map +1 -1
- package/resources/beta/responses/internal-base.mjs +6 -0
- package/resources/beta/responses/internal-base.mjs.map +1 -1
- package/resources/beta/responses/ws-base.d.mts +13 -8
- package/resources/beta/responses/ws-base.d.mts.map +1 -1
- package/resources/beta/responses/ws-base.d.ts +13 -8
- package/resources/beta/responses/ws-base.d.ts.map +1 -1
- package/resources/beta/responses/ws-base.js +85 -14
- package/resources/beta/responses/ws-base.js.map +1 -1
- package/resources/beta/responses/ws-base.mjs +87 -16
- package/resources/beta/responses/ws-base.mjs.map +1 -1
- package/resources/beta/responses/ws.d.mts +1 -0
- package/resources/beta/responses/ws.d.mts.map +1 -1
- package/resources/beta/responses/ws.d.ts +1 -0
- package/resources/beta/responses/ws.d.ts.map +1 -1
- package/resources/beta/responses/ws.js.map +1 -1
- package/resources/beta/responses/ws.mjs.map +1 -1
- package/resources/live/forks/ws-base.d.mts +13 -8
- package/resources/live/forks/ws-base.d.mts.map +1 -1
- package/resources/live/forks/ws-base.d.ts +13 -8
- package/resources/live/forks/ws-base.d.ts.map +1 -1
- package/resources/live/forks/ws-base.js +85 -14
- package/resources/live/forks/ws-base.js.map +1 -1
- package/resources/live/forks/ws-base.mjs +87 -16
- package/resources/live/forks/ws-base.mjs.map +1 -1
- package/resources/live/forks/ws.d.mts +1 -0
- package/resources/live/forks/ws.d.mts.map +1 -1
- package/resources/live/forks/ws.d.ts +1 -0
- package/resources/live/forks/ws.d.ts.map +1 -1
- package/resources/live/forks/ws.js.map +1 -1
- package/resources/live/forks/ws.mjs.map +1 -1
- package/resources/live/sessions.d.mts +10 -4
- package/resources/live/sessions.d.mts.map +1 -1
- package/resources/live/sessions.d.ts +10 -4
- package/resources/live/sessions.d.ts.map +1 -1
- package/resources/live/sessions.js +10 -4
- package/resources/live/sessions.js.map +1 -1
- package/resources/live/sessions.mjs +10 -4
- package/resources/live/sessions.mjs.map +1 -1
- package/resources/live/sideband/ws-base.d.mts +13 -8
- package/resources/live/sideband/ws-base.d.mts.map +1 -1
- package/resources/live/sideband/ws-base.d.ts +13 -8
- package/resources/live/sideband/ws-base.d.ts.map +1 -1
- package/resources/live/sideband/ws-base.js +85 -14
- package/resources/live/sideband/ws-base.js.map +1 -1
- package/resources/live/sideband/ws-base.mjs +87 -16
- package/resources/live/sideband/ws-base.mjs.map +1 -1
- package/resources/live/sideband/ws.d.mts +1 -0
- package/resources/live/sideband/ws.d.mts.map +1 -1
- package/resources/live/sideband/ws.d.ts +1 -0
- package/resources/live/sideband/ws.d.ts.map +1 -1
- package/resources/live/sideband/ws.js.map +1 -1
- package/resources/live/sideband/ws.mjs.map +1 -1
- package/resources/live/ws-base.d.mts +13 -8
- package/resources/live/ws-base.d.mts.map +1 -1
- package/resources/live/ws-base.d.ts +13 -8
- package/resources/live/ws-base.d.ts.map +1 -1
- package/resources/live/ws-base.js +85 -14
- package/resources/live/ws-base.js.map +1 -1
- package/resources/live/ws-base.mjs +87 -16
- package/resources/live/ws-base.mjs.map +1 -1
- package/resources/live/ws.d.mts +1 -0
- package/resources/live/ws.d.mts.map +1 -1
- package/resources/live/ws.d.ts +1 -0
- package/resources/live/ws.d.ts.map +1 -1
- package/resources/live/ws.js.map +1 -1
- package/resources/live/ws.mjs.map +1 -1
- package/resources/responses/internal-base.d.mts.map +1 -1
- package/resources/responses/internal-base.d.ts.map +1 -1
- package/resources/responses/internal-base.js +6 -0
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +6 -0
- package/resources/responses/internal-base.mjs.map +1 -1
- package/resources/responses/ws-base.d.mts +13 -8
- package/resources/responses/ws-base.d.mts.map +1 -1
- package/resources/responses/ws-base.d.ts +13 -8
- package/resources/responses/ws-base.d.ts.map +1 -1
- package/resources/responses/ws-base.js +85 -14
- package/resources/responses/ws-base.js.map +1 -1
- package/resources/responses/ws-base.mjs +87 -16
- package/resources/responses/ws-base.mjs.map +1 -1
- package/resources/responses/ws.d.mts +1 -0
- package/resources/responses/ws.d.mts.map +1 -1
- package/resources/responses/ws.d.ts +1 -0
- package/resources/responses/ws.d.ts.map +1 -1
- package/resources/responses/ws.js.map +1 -1
- package/resources/responses/ws.mjs.map +1 -1
- package/src/bedrock.ts +18 -7
- package/src/client.ts +48 -19
- package/src/core/pagination.ts +63 -1
- package/src/internal/realtime-credentials.ts +1 -1
- package/src/internal/utils/abort.ts +111 -0
- package/src/internal/ws.ts +22 -0
- package/src/lib/agents/agent-session-stream.ts +326 -0
- package/src/lib/agents/output-text.ts +6 -0
- package/src/lib/agents/turn-state.ts +61 -0
- package/src/lib/live/transcript-grouping.ts +59 -27
- package/src/resources/beta/agents/agents.ts +4621 -0
- package/src/resources/beta/agents/environments/environments.ts +111 -0
- package/src/resources/beta/agents/environments/files.ts +164 -0
- package/src/resources/beta/agents/environments/index.ts +19 -0
- package/src/resources/beta/agents/environments/templates.ts +537 -0
- package/src/resources/beta/agents/environments.ts +3 -0
- package/src/resources/beta/agents/index.ts +127 -0
- package/src/resources/beta/agents/sessions/artifacts.ts +239 -0
- package/src/resources/beta/agents/sessions/events.ts +91 -0
- package/src/resources/beta/agents/sessions/index.ts +24 -0
- package/src/resources/beta/agents/sessions/items.ts +59 -0
- package/src/resources/beta/agents/sessions/sessions.ts +350 -0
- package/src/resources/beta/agents/sessions/subagents/index.ts +5 -0
- package/src/resources/beta/agents/sessions/subagents/items.ts +65 -0
- package/src/resources/beta/agents/sessions/subagents/subagents.ts +113 -0
- package/src/resources/beta/agents/sessions/subagents/turns/index.ts +4 -0
- package/src/resources/beta/agents/sessions/subagents/turns/items.ts +70 -0
- package/src/resources/beta/agents/sessions/subagents/turns/turns.ts +111 -0
- package/src/resources/beta/agents/sessions/subagents/turns.ts +3 -0
- package/src/resources/beta/agents/sessions/subagents.ts +3 -0
- package/src/resources/beta/agents/sessions/turns.ts +159 -0
- package/src/resources/beta/agents/sessions.ts +3 -0
- package/src/resources/beta/agents/vaults/credentials.ts +687 -0
- package/src/resources/beta/agents/vaults/index.ts +29 -0
- package/src/resources/beta/agents/vaults/vaults.ts +237 -0
- package/src/resources/beta/agents/vaults.ts +3 -0
- package/src/resources/beta/agents.ts +3 -0
- package/src/resources/beta/beta.ts +207 -0
- package/src/resources/beta/index.ts +106 -0
- package/src/resources/beta/responses/internal-base.ts +5 -0
- package/src/resources/beta/responses/ws-base.ts +110 -21
- package/src/resources/beta/responses/ws.ts +2 -0
- package/src/resources/live/forks/ws-base.ts +110 -21
- package/src/resources/live/forks/ws.ts +2 -0
- package/src/resources/live/sessions.ts +10 -4
- package/src/resources/live/sideband/ws-base.ts +110 -21
- package/src/resources/live/sideband/ws.ts +2 -0
- package/src/resources/live/ws-base.ts +110 -21
- package/src/resources/live/ws.ts +2 -0
- package/src/resources/responses/internal-base.ts +5 -0
- package/src/resources/responses/ws-base.ts +110 -21
- package/src/resources/responses/ws.ts +2 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
type AbortCallback = () => void;
|
|
2
|
+
interface WeakReference<T> {
|
|
3
|
+
deref: () => T | undefined;
|
|
4
|
+
}
|
|
5
|
+
type WeakAbortCallback = WeakReference<AbortCallback>;
|
|
6
|
+
interface AbortFinalizer {
|
|
7
|
+
register: (target: AbortCallback, cleanup: AbortCallback, token: object) => void;
|
|
8
|
+
unregister: (token: object) => boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Keep these optional runtime features out of the SDK's ES2020 type requirements.
|
|
12
|
+
const weakGlobals = globalThis as typeof globalThis & {
|
|
13
|
+
WeakRef?: new <T extends object>(target: T) => WeakReference<T>;
|
|
14
|
+
FinalizationRegistry?: new (cleanup: (value: AbortCallback) => void) => AbortFinalizer;
|
|
15
|
+
};
|
|
16
|
+
const finalizer =
|
|
17
|
+
typeof weakGlobals.FinalizationRegistry === 'function'
|
|
18
|
+
? new weakGlobals.FinalizationRegistry((cleanup) => {
|
|
19
|
+
try {
|
|
20
|
+
cleanup();
|
|
21
|
+
} catch {
|
|
22
|
+
// Caller-provided signal methods must not throw out of a GC callback.
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
: undefined;
|
|
26
|
+
const callbackOwners = new WeakMap<object, Set<AbortCallback>>();
|
|
27
|
+
const subscriptions = new WeakMap<AbortSignal, { callbacks: Set<WeakAbortCallback>; abort: AbortCallback }>();
|
|
28
|
+
|
|
29
|
+
// This scope receives only a weak reference, so its closures cannot retain the callback.
|
|
30
|
+
function subscribeWeakly(signal: AbortSignal, reference: WeakAbortCallback, registry: AbortFinalizer) {
|
|
31
|
+
let subscription = subscriptions.get(signal);
|
|
32
|
+
if (!subscription) {
|
|
33
|
+
const callbacks = new Set<WeakAbortCallback>();
|
|
34
|
+
const abort = () => {
|
|
35
|
+
subscriptions.delete(signal);
|
|
36
|
+
for (const callback of callbacks) {
|
|
37
|
+
registry.unregister(callback);
|
|
38
|
+
callback.deref()?.();
|
|
39
|
+
}
|
|
40
|
+
callbacks.clear();
|
|
41
|
+
};
|
|
42
|
+
subscription = { callbacks, abort };
|
|
43
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
44
|
+
subscriptions.set(signal, subscription);
|
|
45
|
+
}
|
|
46
|
+
const owner = subscription;
|
|
47
|
+
owner.callbacks.add(reference);
|
|
48
|
+
return () => {
|
|
49
|
+
owner.callbacks.delete(reference);
|
|
50
|
+
registry.unregister(reference);
|
|
51
|
+
if (owner.callbacks.size === 0) {
|
|
52
|
+
if (subscriptions.get(signal) === owner) {
|
|
53
|
+
subscriptions.delete(signal);
|
|
54
|
+
}
|
|
55
|
+
signal.removeEventListener('abort', owner.abort);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The listener must not retain the shared owner or its other request callbacks.
|
|
61
|
+
function releaseOnAbort(
|
|
62
|
+
signal: AbortSignal,
|
|
63
|
+
callbacks: WeakReference<Set<AbortCallback>>,
|
|
64
|
+
abort: AbortCallback,
|
|
65
|
+
) {
|
|
66
|
+
signal.addEventListener('abort', () => callbacks.deref()?.delete(abort), { once: true });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Keep cancellation alive until abort or collection of the response body or bodyless custom response. */
|
|
70
|
+
export function retainRequestAbortCallback(
|
|
71
|
+
owner: object,
|
|
72
|
+
abort: AbortCallback,
|
|
73
|
+
requestSignal: AbortSignal,
|
|
74
|
+
): void {
|
|
75
|
+
if (typeof weakGlobals.WeakRef === 'function' && finalizer && !requestSignal.aborted) {
|
|
76
|
+
let callbacks = callbackOwners.get(owner);
|
|
77
|
+
if (!callbacks) {
|
|
78
|
+
callbacks = new Set();
|
|
79
|
+
callbackOwners.set(owner, callbacks);
|
|
80
|
+
}
|
|
81
|
+
callbacks.add(abort);
|
|
82
|
+
releaseOnAbort(requestSignal, new weakGlobals.WeakRef(callbacks), abort);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Share one caller listener without it retaining completed requests. Collection removes
|
|
88
|
+
* weak subscriptions eventually; a live response body or custom response retains its callback.
|
|
89
|
+
* Runtimes without weak references keep the existing listener-based behavior.
|
|
90
|
+
*/
|
|
91
|
+
export function addRequestAbortListener(
|
|
92
|
+
signal: AbortSignal,
|
|
93
|
+
abort: AbortCallback,
|
|
94
|
+
requestSignal: AbortSignal,
|
|
95
|
+
): AbortCallback {
|
|
96
|
+
if (signal.aborted) {
|
|
97
|
+
abort();
|
|
98
|
+
return () => {
|
|
99
|
+
// No listener was installed for an already aborted signal.
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (typeof weakGlobals.WeakRef !== 'function' || !finalizer) {
|
|
103
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
104
|
+
return () => signal.removeEventListener('abort', abort);
|
|
105
|
+
}
|
|
106
|
+
const reference = new weakGlobals.WeakRef(abort);
|
|
107
|
+
const cleanup = subscribeWeakly(signal, reference, finalizer);
|
|
108
|
+
finalizer.register(abort, cleanup, reference);
|
|
109
|
+
retainRequestAbortCallback(requestSignal, abort, requestSignal);
|
|
110
|
+
return cleanup;
|
|
111
|
+
}
|
package/src/internal/ws.ts
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
import { concatBytes, encodeUTF8 } from './utils/bytes';
|
|
2
|
+
import { OpenAIError } from '../core/error';
|
|
3
|
+
|
|
4
|
+
/** Options for an independently buffered WebSocket stream iterator. */
|
|
5
|
+
export interface WebSocketStreamOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Maximum queued records, including raw data, errors and lifecycle events.
|
|
8
|
+
* Must be a positive safe integer. Omitted means unlimited. Overflow discards
|
|
9
|
+
* this iterator's backlog and rejects its next() calls with a WebSocketError,
|
|
10
|
+
* without closing the shared socket or affecting other iterators.
|
|
11
|
+
* This bounds event count, not payload bytes or total memory.
|
|
12
|
+
*/
|
|
13
|
+
maxBufferedEvents?: number | undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Snapshots and validates the iterator's limit before listeners are attached. */
|
|
17
|
+
export function getMaxBufferedEvents(options?: WebSocketStreamOptions): number | undefined {
|
|
18
|
+
const limit = options?.maxBufferedEvents;
|
|
19
|
+
if (limit !== undefined && (!Number.isSafeInteger(limit) || limit <= 0)) {
|
|
20
|
+
throw new OpenAIError('maxBufferedEvents must be a positive safe integer');
|
|
21
|
+
}
|
|
22
|
+
return limit;
|
|
23
|
+
}
|
|
2
24
|
|
|
3
25
|
/** Reconnection event passed to the `onReconnecting` handler and event listeners. */
|
|
4
26
|
export interface ReconnectingEvent<Parameters = Record<string, unknown>> {
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { TurnState } from './turn-state';
|
|
2
|
+
import { APIUserAbortError, BadRequestError, OpenAIError } from '../../core/error';
|
|
3
|
+
import type { Stream } from '../../core/streaming';
|
|
4
|
+
import { buildHeaders } from '../../internal/headers';
|
|
5
|
+
import type { RequestOptions } from '../../internal/request-options';
|
|
6
|
+
import { uuid4 } from '../../internal/utils/uuid';
|
|
7
|
+
import { hasOwn, isObj } from '../../internal/utils/values';
|
|
8
|
+
import type {
|
|
9
|
+
AgentFunctionCallItem,
|
|
10
|
+
AgentFunctionCallOutputParam,
|
|
11
|
+
AgentSessionEvent,
|
|
12
|
+
AgentSessionInputMessageParam,
|
|
13
|
+
AgentSessionInputParam,
|
|
14
|
+
InputContentParam,
|
|
15
|
+
} from '../../resources/beta/agents/agents';
|
|
16
|
+
import type { Sessions } from '../../resources/beta/agents/sessions/sessions';
|
|
17
|
+
|
|
18
|
+
/** A function result; object results are serialized as JSON text. */
|
|
19
|
+
export type AgentToolOutput = AgentFunctionCallOutputParam | object | null;
|
|
20
|
+
/** Receives a detached JSON object and may return a result asynchronously. */
|
|
21
|
+
export type AgentToolHandler = (
|
|
22
|
+
arguments_: Record<string, unknown>,
|
|
23
|
+
) => AgentToolOutput | PromiseLike<AgentToolOutput>;
|
|
24
|
+
|
|
25
|
+
/** Input and optional sequential tool handlers for one turn on an idle session. */
|
|
26
|
+
export interface AgentSessionStreamParams {
|
|
27
|
+
/** User messages, or text normalized to a single user message. Must not be empty. */
|
|
28
|
+
input: string | AgentSessionInputMessageParam[];
|
|
29
|
+
/** Registered functions run after their call event is yielded; unknown functions remain manual. */
|
|
30
|
+
toolHandlers?: Record<string, AgentToolHandler>;
|
|
31
|
+
/** Key for the input submission only; request headers take precedence, case-insensitively. */
|
|
32
|
+
idempotencyKey?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type ToolResult = AgentSessionInputParam.SessionInputParamAgentSessionInputToolResult;
|
|
36
|
+
|
|
37
|
+
function isInputContent(value: unknown): value is InputContentParam {
|
|
38
|
+
if (!isObj(value)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const content = value;
|
|
42
|
+
let field: string;
|
|
43
|
+
if (content['type'] === 'input_text') {
|
|
44
|
+
field = 'text';
|
|
45
|
+
} else if (content['type'] === 'input_image') {
|
|
46
|
+
field = 'image_url';
|
|
47
|
+
} else {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return hasOwn(content, 'type') && hasOwn(content, field) && typeof content[field] === 'string';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function normalizedOutput(value: unknown): AgentFunctionCallOutputParam | null {
|
|
54
|
+
if (value === null) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
if (typeof value === 'string' || (Array.isArray(value) && value.every(isInputContent))) {
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
throw new OpenAIError('Tool output must be text, content, a JSON object, or null');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function toolResult(call: AgentFunctionCallItem, value: AgentToolOutput): ToolResult {
|
|
64
|
+
const output =
|
|
65
|
+
value !== null && typeof value === 'object' && !Array.isArray(value) ? JSON.stringify(value) : value;
|
|
66
|
+
// Detect unserializable callback results inside the redacted failure boundary.
|
|
67
|
+
const serialized = JSON.stringify(output);
|
|
68
|
+
if (serialized === undefined) {
|
|
69
|
+
throw new OpenAIError('Tool output must be JSON serializable');
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: 'agent.session.input.tool_result',
|
|
73
|
+
turn_id: call.turn_id,
|
|
74
|
+
call_id: call.call_id,
|
|
75
|
+
success: true,
|
|
76
|
+
output: normalizedOutput(typeof output === 'string' ? output : JSON.parse(serialized)),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function cancelBody(response: Response | undefined): Promise<void> {
|
|
81
|
+
try {
|
|
82
|
+
await response?.body?.cancel();
|
|
83
|
+
} catch {
|
|
84
|
+
// The response may already be cancelled or owned by its stream reader.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A single-use, lazy async iterable of original session events for one turn.
|
|
90
|
+
* Requires an idle session and a single input writer: the input endpoint does not
|
|
91
|
+
* return a turn ID. Subscribe-before-input avoids losing events; the first
|
|
92
|
+
* coordinator turn selects the turn to follow. Initial idle events and subagent
|
|
93
|
+
* completion do not end iteration. A selected turn's terminal event followed by
|
|
94
|
+
* session.idle, or session.failed, ends iteration. Unexpected EOF throws.
|
|
95
|
+
*
|
|
96
|
+
* Tool handlers run sequentially during iteration. Handler failures submit a
|
|
97
|
+
* generic error without exception text. Each submission has a distinct retry-safe
|
|
98
|
+
* idempotency key. Breaking iteration or calling abort closes local requests;
|
|
99
|
+
* neither cancels the backend turn. No work starts until iteration begins.
|
|
100
|
+
*/
|
|
101
|
+
export class AgentSessionStream implements AsyncIterable<AgentSessionEvent> {
|
|
102
|
+
/** Aborts local requests and iteration without cancelling the backend turn. */
|
|
103
|
+
readonly controller = new AbortController();
|
|
104
|
+
#consumed = false;
|
|
105
|
+
#stream: Stream<AgentSessionEvent> | undefined;
|
|
106
|
+
#response: Response | undefined;
|
|
107
|
+
#reading = false;
|
|
108
|
+
#sessions: Sessions;
|
|
109
|
+
#sessionID: string;
|
|
110
|
+
#input: AgentSessionInputParam.SessionInputParamAgentSessionInputMessage;
|
|
111
|
+
#handlers: Map<string, AgentToolHandler>;
|
|
112
|
+
#inputKey: string | undefined;
|
|
113
|
+
#options: RequestOptions;
|
|
114
|
+
|
|
115
|
+
/** Creates an unstarted helper. Prefer client.beta.agents.sessions.stream(). */
|
|
116
|
+
constructor(
|
|
117
|
+
sessions: Sessions,
|
|
118
|
+
sessionID: string,
|
|
119
|
+
params: AgentSessionStreamParams,
|
|
120
|
+
options?: RequestOptions,
|
|
121
|
+
) {
|
|
122
|
+
const input: AgentSessionInputMessageParam[] =
|
|
123
|
+
typeof params.input === 'string'
|
|
124
|
+
? [{ role: 'user', content: [{ type: 'input_text', text: params.input }] }]
|
|
125
|
+
: params.input;
|
|
126
|
+
if (params.input.length === 0) {
|
|
127
|
+
throw new OpenAIError('input must not be empty');
|
|
128
|
+
}
|
|
129
|
+
this.#sessions = sessions;
|
|
130
|
+
this.#sessionID = sessionID;
|
|
131
|
+
this.#input = { type: 'agent.session.input.message', input };
|
|
132
|
+
this.#handlers = new Map(Object.entries(params.toolHandlers ?? {}));
|
|
133
|
+
const headers = buildHeaders([options?.headers]);
|
|
134
|
+
this.#inputKey = headers.nulls.has('idempotency-key')
|
|
135
|
+
? undefined
|
|
136
|
+
: (headers.values.get('idempotency-key') ??
|
|
137
|
+
params.idempotencyKey ??
|
|
138
|
+
options?.idempotencyKey ??
|
|
139
|
+
uuid4());
|
|
140
|
+
headers.values.delete('idempotency-key');
|
|
141
|
+
headers.nulls.delete('idempotency-key');
|
|
142
|
+
const { idempotencyKey: _key, ...rest } = options ?? {};
|
|
143
|
+
this.#options = { ...rest, headers };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Closes local requests without cancelling the turn; an optional reason becomes the abort error's cause. */
|
|
147
|
+
abort(reason?: unknown): void {
|
|
148
|
+
this.controller.abort(reason);
|
|
149
|
+
this.#stream?.controller.abort(this.controller.signal.reason);
|
|
150
|
+
if (!this.#reading) {
|
|
151
|
+
void cancelBody(this.#response);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Starts iteration once; use for await to ensure early exits close the connection. */
|
|
156
|
+
[Symbol.asyncIterator](): AsyncIterator<AgentSessionEvent> {
|
|
157
|
+
if (this.#consumed) {
|
|
158
|
+
throw new OpenAIError('An AgentSessionStream can only be consumed once');
|
|
159
|
+
}
|
|
160
|
+
this.#consumed = true;
|
|
161
|
+
return this.#iterate();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async *#iterate(): AsyncGenerator<AgentSessionEvent> {
|
|
165
|
+
const externalSignal = this.#options.signal;
|
|
166
|
+
const abort = () =>
|
|
167
|
+
this.abort(externalSignal?.aborted ? externalSignal.reason : this.controller.signal.reason);
|
|
168
|
+
externalSignal?.addEventListener('abort', abort, { once: true });
|
|
169
|
+
this.controller.signal.addEventListener('abort', abort, { once: true });
|
|
170
|
+
const options = { ...this.#options, signal: this.controller.signal };
|
|
171
|
+
const state = new TurnState();
|
|
172
|
+
try {
|
|
173
|
+
if (externalSignal?.aborted) {
|
|
174
|
+
this.abort(externalSignal.reason);
|
|
175
|
+
}
|
|
176
|
+
this.#checkAbort();
|
|
177
|
+
const session = await this.#sessions.retrieve(this.#sessionID, options);
|
|
178
|
+
if (session.status !== 'idle') {
|
|
179
|
+
throw new OpenAIError(
|
|
180
|
+
'sessions.stream requires an idle session; use sessions.events.stream for active sessions',
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
const subscription = await this.#sessions.events.stream(this.#sessionID, options).withResponse();
|
|
184
|
+
this.#stream = subscription.data;
|
|
185
|
+
this.#response = subscription.response;
|
|
186
|
+
this.#checkAbort();
|
|
187
|
+
await this.#sessions.events.create(
|
|
188
|
+
this.#sessionID,
|
|
189
|
+
{
|
|
190
|
+
events: [this.#input],
|
|
191
|
+
...(this.#inputKey === undefined ? {} : { 'Idempotency-Key': this.#inputKey }),
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
...options,
|
|
195
|
+
headers: buildHeaders([options.headers, { 'Idempotency-Key': this.#inputKey ?? null }]),
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
this.#checkAbort();
|
|
199
|
+
this.#reading = true;
|
|
200
|
+
for await (const event of this.#stream) {
|
|
201
|
+
this.#checkAbort();
|
|
202
|
+
if (!state.accept(event)) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const terminal = state.terminal(event);
|
|
206
|
+
const pendingCall = state.call(event);
|
|
207
|
+
const handler = pendingCall && this.#handlers.get(pendingCall.name);
|
|
208
|
+
// Freeze dispatch identity and arguments before exposing the original event.
|
|
209
|
+
const call = pendingCall && handler ? structuredClone(pendingCall) : undefined;
|
|
210
|
+
if (terminal) {
|
|
211
|
+
this.#stream.controller.abort();
|
|
212
|
+
}
|
|
213
|
+
yield event;
|
|
214
|
+
if (terminal) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.#checkAbort();
|
|
218
|
+
if (!call || !handler) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const result = await this.#result(call, handler);
|
|
222
|
+
this.#checkAbort();
|
|
223
|
+
await this.#submit(result, options);
|
|
224
|
+
}
|
|
225
|
+
this.#checkAbort();
|
|
226
|
+
throw new OpenAIError('Session event stream ended before the turn reached idle or failed');
|
|
227
|
+
} finally {
|
|
228
|
+
externalSignal?.removeEventListener('abort', abort);
|
|
229
|
+
this.controller.signal.removeEventListener('abort', abort);
|
|
230
|
+
this.abort();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async #result(call: AgentFunctionCallItem, handler: AgentToolHandler): Promise<ToolResult> {
|
|
235
|
+
try {
|
|
236
|
+
const args: unknown = typeof call.arguments === 'string' ? JSON.parse(call.arguments) : call.arguments;
|
|
237
|
+
if (args === null || typeof args !== 'object' || Array.isArray(args)) {
|
|
238
|
+
throw new OpenAIError('Function arguments must be a JSON object');
|
|
239
|
+
}
|
|
240
|
+
return toolResult(call, await this.#wait(() => handler(args as Record<string, unknown>)));
|
|
241
|
+
} catch {
|
|
242
|
+
this.#checkAbort();
|
|
243
|
+
return {
|
|
244
|
+
type: 'agent.session.input.tool_result',
|
|
245
|
+
turn_id: call.turn_id,
|
|
246
|
+
call_id: call.call_id,
|
|
247
|
+
success: false,
|
|
248
|
+
error: 'Tool handler failed.',
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#checkAbort(): void {
|
|
254
|
+
if (this.controller.signal.aborted) {
|
|
255
|
+
throw this.#abortError();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
#abortError(): APIUserAbortError {
|
|
260
|
+
const error = new APIUserAbortError();
|
|
261
|
+
Object.defineProperty(error, 'cause', {
|
|
262
|
+
value: this.controller.signal.reason,
|
|
263
|
+
writable: true,
|
|
264
|
+
configurable: true,
|
|
265
|
+
});
|
|
266
|
+
return error;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
async #wait<T>(action: () => T | PromiseLike<T>): Promise<T> {
|
|
270
|
+
let onAbort: (() => void) | undefined;
|
|
271
|
+
// oxlint-disable-next-line promise/avoid-new -- Bridge the caller's AbortSignal while a handler or registration delay is pending.
|
|
272
|
+
const aborted = new Promise<never>((_resolve, reject) => {
|
|
273
|
+
onAbort = () => reject(this.#abortError());
|
|
274
|
+
this.controller.signal.addEventListener('abort', onAbort, { once: true });
|
|
275
|
+
});
|
|
276
|
+
try {
|
|
277
|
+
this.#checkAbort();
|
|
278
|
+
// Capture synchronous throws before racing cancellation, so both promises
|
|
279
|
+
// always have rejection handlers even if the callback aborts and throws.
|
|
280
|
+
const invoke = async () => await action();
|
|
281
|
+
return await Promise.race([invoke(), aborted]);
|
|
282
|
+
} finally {
|
|
283
|
+
if (onAbort) {
|
|
284
|
+
this.controller.signal.removeEventListener('abort', onAbort);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
async #submit(result: ToolResult, options: RequestOptions, key = uuid4(), attempt = 0): Promise<void> {
|
|
290
|
+
this.#checkAbort();
|
|
291
|
+
try {
|
|
292
|
+
await this.#sessions.events.create(
|
|
293
|
+
this.#sessionID,
|
|
294
|
+
{ events: [result], 'Idempotency-Key': key },
|
|
295
|
+
options,
|
|
296
|
+
);
|
|
297
|
+
} catch (error) {
|
|
298
|
+
const delay = [100, 300, 600][attempt];
|
|
299
|
+
if (
|
|
300
|
+
delay === undefined ||
|
|
301
|
+
!(error instanceof BadRequestError) ||
|
|
302
|
+
error.code !== 'invalid_request_error' ||
|
|
303
|
+
!error.error ||
|
|
304
|
+
!('message' in error.error) ||
|
|
305
|
+
error.error.message !== `Unknown pending tool call: ${result.call_id}`
|
|
306
|
+
) {
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
310
|
+
try {
|
|
311
|
+
await this.#wait(
|
|
312
|
+
() =>
|
|
313
|
+
// oxlint-disable-next-line promise/avoid-new -- Own the registration timer so cancellation clears it promptly.
|
|
314
|
+
new Promise<void>((resolve) => {
|
|
315
|
+
timer = setTimeout(resolve, delay);
|
|
316
|
+
}),
|
|
317
|
+
);
|
|
318
|
+
} finally {
|
|
319
|
+
if (timer !== undefined) {
|
|
320
|
+
clearTimeout(timer);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
await this.#submit(result, options, key, attempt + 1);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentSessionMessage } from '../../resources/beta/agents/agents';
|
|
2
|
+
|
|
3
|
+
/** Joins output_text blocks in content order, without filtering phase, fetching, or mutating the message. */
|
|
4
|
+
export function outputText(message: AgentSessionMessage): string {
|
|
5
|
+
return message.content.map((block) => (block.type === 'output_text' ? block.text : '')).join('');
|
|
6
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AgentSessionEvent, AgentFunctionCallItem } from '../../resources/beta/agents/agents';
|
|
2
|
+
|
|
3
|
+
/** Tracks one helper invocation's coordinator turn and duplicate deliveries.
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class TurnState {
|
|
7
|
+
#turnID: string | undefined;
|
|
8
|
+
#turnEnded = false;
|
|
9
|
+
#eventIDs = new Set<string>();
|
|
10
|
+
#calls = new Set<string>();
|
|
11
|
+
|
|
12
|
+
/** Records a delivery unless its event ID is in the bounded recent window. */
|
|
13
|
+
accept(event: AgentSessionEvent): boolean {
|
|
14
|
+
if (this.#eventIDs.has(event.event_id)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (this.#eventIDs.size === 1024) {
|
|
18
|
+
const oldest = this.#eventIDs.values().next();
|
|
19
|
+
if (!oldest.done) {
|
|
20
|
+
this.#eventIDs.delete(oldest.value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
this.#eventIDs.add(event.event_id);
|
|
24
|
+
if (
|
|
25
|
+
event.type === 'agent.session.turn.created' &&
|
|
26
|
+
event.turn.subagent_id === null &&
|
|
27
|
+
this.#turnID === undefined
|
|
28
|
+
) {
|
|
29
|
+
this.#turnID = event.turn_id;
|
|
30
|
+
}
|
|
31
|
+
if (
|
|
32
|
+
(event.type === 'agent.session.turn.completed' ||
|
|
33
|
+
event.type === 'agent.session.turn.failed' ||
|
|
34
|
+
event.type === 'agent.session.turn.cancelled') &&
|
|
35
|
+
this.#turnID !== undefined &&
|
|
36
|
+
event.turn_id === this.#turnID
|
|
37
|
+
) {
|
|
38
|
+
this.#turnEnded = true;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Checks session termination after updating the selected turn state. */
|
|
44
|
+
terminal(event: AgentSessionEvent): boolean {
|
|
45
|
+
return event.type === 'agent.session.failed' || (event.type === 'agent.session.idle' && this.#turnEnded);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Returns each tool call once for the full invocation, including subagent turns. */
|
|
49
|
+
call(event: AgentSessionEvent): AgentFunctionCallItem | undefined {
|
|
50
|
+
if (event.type !== 'agent.session.turn.item.added' || event.item.type !== 'function_call') {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const call = event.item;
|
|
54
|
+
const key = JSON.stringify([call.turn_id, call.call_id]);
|
|
55
|
+
if (this.#calls.has(key)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.#calls.add(key);
|
|
59
|
+
return call;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -15,11 +15,17 @@ export type GroupingUpdate =
|
|
|
15
15
|
| { type: 'updated'; segment: TranscriptSegment }
|
|
16
16
|
| { type: 'closed'; segment: TranscriptSegment; reason: TranscriptSegmentCloseReason };
|
|
17
17
|
|
|
18
|
+
interface Acknowledgment {
|
|
19
|
+
characters: number;
|
|
20
|
+
text: string | undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
18
23
|
type Turn = TranscriptFragment & {
|
|
19
24
|
id: string;
|
|
20
25
|
previousId: string | null;
|
|
21
26
|
emitted: boolean;
|
|
22
27
|
canDropAsBackchannel: boolean;
|
|
28
|
+
acknowledgment?: Acknowledgment | undefined;
|
|
23
29
|
};
|
|
24
30
|
|
|
25
31
|
const ACKNOWLEDGMENTS = [
|
|
@@ -42,14 +48,16 @@ const ACKNOWLEDGMENTS = [
|
|
|
42
48
|
];
|
|
43
49
|
|
|
44
50
|
function normalizeAcknowledgment(text: string): string {
|
|
45
|
-
|
|
51
|
+
const normalized = text
|
|
46
52
|
.toLowerCase()
|
|
47
53
|
.split('-')
|
|
48
54
|
.join(' ')
|
|
49
|
-
.replace(/^[\s.,!?;:"'()[\]{}]+/u, '')
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
.replace(/^[\s.,!?;:"'()[\]{}]+/u, '');
|
|
56
|
+
let end = normalized.length;
|
|
57
|
+
while (end > 0 && /[\s.,!?;:"'()[\]{}]/u.test(normalized.charAt(end - 1))) {
|
|
58
|
+
end -= 1;
|
|
59
|
+
}
|
|
60
|
+
return normalized.slice(0, end).split(/\s+/u).join(' ');
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
/** The v2 grouping policy, driven by timed public text rather than engine frames. */
|
|
@@ -63,6 +71,7 @@ export class TranscriptGrouping {
|
|
|
63
71
|
private readonly options: Required<TranscriptGrouperOptions>;
|
|
64
72
|
private readonly idPrefix: string;
|
|
65
73
|
private readonly acknowledgments: readonly string[];
|
|
74
|
+
private readonly maxAcknowledgmentLength: number;
|
|
66
75
|
|
|
67
76
|
constructor(options: Required<TranscriptGrouperOptions>, idPrefix: string) {
|
|
68
77
|
this.options = options;
|
|
@@ -71,6 +80,11 @@ export class TranscriptGrouping {
|
|
|
71
80
|
...ACKNOWLEDGMENTS,
|
|
72
81
|
...options.additionalAcknowledgments.map(normalizeAcknowledgment).filter(Boolean),
|
|
73
82
|
];
|
|
83
|
+
let maxLength = 0;
|
|
84
|
+
for (const acknowledgment of this.acknowledgments) {
|
|
85
|
+
maxLength = Math.max(maxLength, acknowledgment.length);
|
|
86
|
+
}
|
|
87
|
+
this.maxAcknowledgmentLength = maxLength;
|
|
74
88
|
}
|
|
75
89
|
|
|
76
90
|
get speaker(): TranscriptFragment['speaker'] | undefined {
|
|
@@ -183,16 +197,22 @@ export class TranscriptGrouping {
|
|
|
183
197
|
this.buffer(fragment);
|
|
184
198
|
return this.promote();
|
|
185
199
|
}
|
|
200
|
+
const withinDuration =
|
|
201
|
+
fragment.endMs - (this.buffered?.startMs ?? fragment.startMs) < this.options.backchannelMaxDurationMs;
|
|
202
|
+
const acknowledgment = this.acknowledgment(fragment, withinDuration);
|
|
203
|
+
const normalized = withinDuration ? acknowledgment.text : undefined;
|
|
186
204
|
if (separation < this.options.minTurnSeparationMs) {
|
|
187
|
-
this.buffer(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
205
|
+
this.buffer(
|
|
206
|
+
fragment,
|
|
207
|
+
normalized !== undefined &&
|
|
208
|
+
normalized.length > 0 &&
|
|
209
|
+
this.acknowledgments.some((phrase) => phrase.startsWith(normalized)),
|
|
210
|
+
acknowledgment,
|
|
211
|
+
);
|
|
192
212
|
return [];
|
|
193
213
|
}
|
|
194
|
-
if (
|
|
195
|
-
this.buffer(fragment,
|
|
214
|
+
if (normalized !== undefined && this.acknowledgments.includes(normalized)) {
|
|
215
|
+
this.buffer(fragment, this.buffered !== undefined, acknowledgment);
|
|
196
216
|
return [];
|
|
197
217
|
}
|
|
198
218
|
this.buffered = this.maybeDropBackchannel(undefined, fragment);
|
|
@@ -227,7 +247,7 @@ export class TranscriptGrouping {
|
|
|
227
247
|
turn.endMs = Math.max(turn.endMs, fragment.endMs);
|
|
228
248
|
}
|
|
229
249
|
|
|
230
|
-
private buffer(fragment: TranscriptFragment, canDrop?: boolean): void {
|
|
250
|
+
private buffer(fragment: TranscriptFragment, canDrop?: boolean, acknowledgment?: Acknowledgment): void {
|
|
231
251
|
if (this.buffered) {
|
|
232
252
|
TranscriptGrouping.append(this.buffered, fragment);
|
|
233
253
|
} else {
|
|
@@ -236,6 +256,7 @@ export class TranscriptGrouping {
|
|
|
236
256
|
if (canDrop !== undefined) {
|
|
237
257
|
this.buffered.canDropAsBackchannel = canDrop;
|
|
238
258
|
}
|
|
259
|
+
this.buffered.acknowledgment = acknowledgment;
|
|
239
260
|
}
|
|
240
261
|
|
|
241
262
|
private promote(): GroupingUpdate[] {
|
|
@@ -344,19 +365,30 @@ export class TranscriptGrouping {
|
|
|
344
365
|
return this.buffered.canDropAsBackchannel ? undefined : this.buffered;
|
|
345
366
|
}
|
|
346
367
|
|
|
347
|
-
private
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
);
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
368
|
+
private acknowledgment(fragment: TranscriptFragment, withinDuration: boolean): Acknowledgment {
|
|
369
|
+
const previous = this.buffered?.acknowledgment;
|
|
370
|
+
const previousCharacters = previous?.characters ?? 0;
|
|
371
|
+
let characters = previousCharacters;
|
|
372
|
+
const separator = /[\s.,!?;:"'()[\]{}-]/u;
|
|
373
|
+
for (
|
|
374
|
+
let index = 0;
|
|
375
|
+
index < fragment.text.length && characters <= this.maxAcknowledgmentLength;
|
|
376
|
+
index += 1
|
|
377
|
+
) {
|
|
378
|
+
if (!separator.test(fragment.text.charAt(index))) {
|
|
379
|
+
characters += 1;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Significant characters cannot disappear during normalization. Once they
|
|
383
|
+
// outgrow the configured phrases, stop counting without allocating tokens.
|
|
384
|
+
let text: string | undefined;
|
|
385
|
+
if (characters === previousCharacters && previous?.text !== undefined) {
|
|
386
|
+
// Keep the raw suffix in the turn: later text can make punctuation internal.
|
|
387
|
+
({ text } = previous);
|
|
388
|
+
} else if (withinDuration && characters <= this.maxAcknowledgmentLength) {
|
|
389
|
+
// Retain whole-string Unicode casing (including context-sensitive sigma).
|
|
390
|
+
text = normalizeAcknowledgment((this.buffered?.text ?? '') + fragment.text);
|
|
391
|
+
}
|
|
392
|
+
return { characters, text };
|
|
361
393
|
}
|
|
362
394
|
}
|