@fractaal/pi-ai 0.86.9 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +105 -45
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +180 -141
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +8 -10
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +130 -96
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/classifier-shared.d.ts +21 -0
  12. package/dist/api/classifier-shared.d.ts.map +1 -0
  13. package/dist/api/classifier-shared.js +99 -0
  14. package/dist/api/classifier-shared.js.map +1 -0
  15. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -1
  16. package/dist/api/cloudflare-workers-ai-system-one.js +10 -1
  17. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -1
  18. package/dist/api/constrained-sampling.d.ts +11 -1
  19. package/dist/api/constrained-sampling.d.ts.map +1 -1
  20. package/dist/api/constrained-sampling.js +33 -18
  21. package/dist/api/constrained-sampling.js.map +1 -1
  22. package/dist/api/google-generative-ai.d.ts.map +1 -1
  23. package/dist/api/google-generative-ai.js +4 -10
  24. package/dist/api/google-generative-ai.js.map +1 -1
  25. package/dist/api/google-shared.d.ts +2 -1
  26. package/dist/api/google-shared.d.ts.map +1 -1
  27. package/dist/api/google-shared.js +60 -3
  28. package/dist/api/google-shared.js.map +1 -1
  29. package/dist/api/google-vertex.d.ts.map +1 -1
  30. package/dist/api/google-vertex.js +9 -15
  31. package/dist/api/google-vertex.js.map +1 -1
  32. package/dist/api/lazy.d.ts +7 -2
  33. package/dist/api/lazy.d.ts.map +1 -1
  34. package/dist/api/lazy.js +28 -8
  35. package/dist/api/lazy.js.map +1 -1
  36. package/dist/api/llama-cpp-classify.d.ts.map +1 -1
  37. package/dist/api/llama-cpp-classify.js +4 -1
  38. package/dist/api/llama-cpp-classify.js.map +1 -1
  39. package/dist/api/mistral-conversations.d.ts.map +1 -1
  40. package/dist/api/mistral-conversations.js +50 -60
  41. package/dist/api/mistral-conversations.js.map +1 -1
  42. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  43. package/dist/api/openai-codex-responses.js +23 -14
  44. package/dist/api/openai-codex-responses.js.map +1 -1
  45. package/dist/api/openai-completions.d.ts.map +1 -1
  46. package/dist/api/openai-completions.js +83 -87
  47. package/dist/api/openai-completions.js.map +1 -1
  48. package/dist/api/openai-decisions.d.ts +4 -0
  49. package/dist/api/openai-decisions.d.ts.map +1 -0
  50. package/dist/api/openai-decisions.js +162 -0
  51. package/dist/api/openai-decisions.js.map +1 -0
  52. package/dist/api/openai-decisions.lazy.d.ts +3 -0
  53. package/dist/api/openai-decisions.lazy.d.ts.map +1 -0
  54. package/dist/api/openai-decisions.lazy.js +4 -0
  55. package/dist/api/openai-decisions.lazy.js.map +1 -0
  56. package/dist/api/openai-responses-shared.d.ts +26 -0
  57. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  58. package/dist/api/openai-responses-shared.js +132 -66
  59. package/dist/api/openai-responses-shared.js.map +1 -1
  60. package/dist/api/openai-responses.d.ts.map +1 -1
  61. package/dist/api/openai-responses.js +38 -19
  62. package/dist/api/openai-responses.js.map +1 -1
  63. package/dist/api/openrouter-images.d.ts.map +1 -1
  64. package/dist/api/openrouter-images.js +5 -3
  65. package/dist/api/openrouter-images.js.map +1 -1
  66. package/dist/api/pi-messages.d.ts +2 -0
  67. package/dist/api/pi-messages.d.ts.map +1 -1
  68. package/dist/api/pi-messages.js +18 -12
  69. package/dist/api/pi-messages.js.map +1 -1
  70. package/dist/api/simple-options.d.ts.map +1 -1
  71. package/dist/api/simple-options.js +2 -1
  72. package/dist/api/simple-options.js.map +1 -1
  73. package/dist/api/system-one-shared.d.ts +29 -3
  74. package/dist/api/system-one-shared.d.ts.map +1 -1
  75. package/dist/api/system-one-shared.js +54 -86
  76. package/dist/api/system-one-shared.js.map +1 -1
  77. package/dist/api/transform-messages.d.ts +16 -1
  78. package/dist/api/transform-messages.d.ts.map +1 -1
  79. package/dist/api/transform-messages.js +28 -15
  80. package/dist/api/transform-messages.js.map +1 -1
  81. package/dist/api/typesafe-system-one.d.ts.map +1 -1
  82. package/dist/api/typesafe-system-one.js +12 -1
  83. package/dist/api/typesafe-system-one.js.map +1 -1
  84. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  85. package/dist/auth/oauth/anthropic.js +14 -6
  86. package/dist/auth/oauth/anthropic.js.map +1 -1
  87. package/dist/auth/oauth/openai-chatgpt.js +1 -1
  88. package/dist/auth/oauth/openai-chatgpt.js.map +1 -1
  89. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  90. package/dist/auth/oauth/openai-codex.js +4 -4
  91. package/dist/auth/oauth/openai-codex.js.map +1 -1
  92. package/dist/auth/types.d.ts +9 -0
  93. package/dist/auth/types.d.ts.map +1 -1
  94. package/dist/auth/types.js.map +1 -1
  95. package/dist/compat/extension-oauth-types.d.ts +4 -0
  96. package/dist/compat/extension-oauth-types.d.ts.map +1 -1
  97. package/dist/compat/extension-oauth-types.js.map +1 -1
  98. package/dist/index.d.ts +3 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +3 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/models.d.ts +9 -0
  103. package/dist/models.d.ts.map +1 -1
  104. package/dist/models.js +23 -7
  105. package/dist/models.js.map +1 -1
  106. package/dist/providers/compat-schema.d.ts +509 -0
  107. package/dist/providers/compat-schema.d.ts.map +1 -0
  108. package/dist/providers/compat-schema.js +396 -0
  109. package/dist/providers/compat-schema.js.map +1 -0
  110. package/dist/providers/data/.manifest.json +1 -1
  111. package/dist/providers/data/amazon-bedrock.json +1 -1
  112. package/dist/providers/data/anthropic.json +1 -1
  113. package/dist/providers/data/azure.json +1 -1
  114. package/dist/providers/data/baseten.json +1 -1
  115. package/dist/providers/data/cerebras.json +1 -1
  116. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  117. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  118. package/dist/providers/data/fireworks.json +1 -1
  119. package/dist/providers/data/github-copilot.json +1 -1
  120. package/dist/providers/data/google-vertex.json +1 -1
  121. package/dist/providers/data/google.json +1 -1
  122. package/dist/providers/data/groq.json +1 -1
  123. package/dist/providers/data/huggingface.json +1 -1
  124. package/dist/providers/data/kimi-coding.json +1 -1
  125. package/dist/providers/data/meta.json +1 -1
  126. package/dist/providers/data/minimax-cn.json +1 -1
  127. package/dist/providers/data/minimax.json +1 -1
  128. package/dist/providers/data/mistral.json +1 -1
  129. package/dist/providers/data/moonshotai-cn.json +1 -1
  130. package/dist/providers/data/moonshotai.json +1 -1
  131. package/dist/providers/data/nvidia.json +1 -1
  132. package/dist/providers/data/openai-codex.json +1 -1
  133. package/dist/providers/data/openai.json +1 -1
  134. package/dist/providers/data/opencode-go.json +1 -1
  135. package/dist/providers/data/opencode.json +1 -1
  136. package/dist/providers/data/openrouter.json +1 -1
  137. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  138. package/dist/providers/data/qwen-token-plan.json +1 -1
  139. package/dist/providers/data/radius.json +1 -1
  140. package/dist/providers/data/together.json +1 -1
  141. package/dist/providers/data/typesafe.json +1 -1
  142. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  143. package/dist/providers/data/xai.json +1 -1
  144. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  145. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  146. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  147. package/dist/providers/data/xiaomi.json +1 -1
  148. package/dist/providers/data/zai-coding-cn.json +1 -1
  149. package/dist/providers/faux.d.ts.map +1 -1
  150. package/dist/providers/faux.js +31 -9
  151. package/dist/providers/faux.js.map +1 -1
  152. package/dist/providers/kimi-coding.d.ts +1 -1
  153. package/dist/providers/kimi-coding.js +3 -3
  154. package/dist/providers/kimi-coding.js.map +1 -1
  155. package/dist/providers/model-schema.d.ts +91 -0
  156. package/dist/providers/model-schema.d.ts.map +1 -0
  157. package/dist/providers/model-schema.js +57 -0
  158. package/dist/providers/model-schema.js.map +1 -0
  159. package/dist/providers/openai.d.ts.map +1 -1
  160. package/dist/providers/openai.js +12 -3
  161. package/dist/providers/openai.js.map +1 -1
  162. package/dist/providers/opencode-go.d.ts +3 -1
  163. package/dist/providers/opencode-go.d.ts.map +1 -1
  164. package/dist/providers/opencode-go.js +2 -0
  165. package/dist/providers/opencode-go.js.map +1 -1
  166. package/dist/providers/openrouter-api.d.ts +40 -0
  167. package/dist/providers/openrouter-api.d.ts.map +1 -0
  168. package/dist/providers/openrouter-api.js +41 -0
  169. package/dist/providers/openrouter-api.js.map +1 -0
  170. package/dist/providers/openrouter.d.ts +11 -1
  171. package/dist/providers/openrouter.d.ts.map +1 -1
  172. package/dist/providers/openrouter.js +52 -1
  173. package/dist/providers/openrouter.js.map +1 -1
  174. package/dist/providers/radius-config.d.ts.map +1 -1
  175. package/dist/providers/radius-config.js +2 -1
  176. package/dist/providers/radius-config.js.map +1 -1
  177. package/dist/providers/radius.d.ts.map +1 -1
  178. package/dist/providers/radius.js +4 -12
  179. package/dist/providers/radius.js.map +1 -1
  180. package/dist/telemetry.d.ts +288 -0
  181. package/dist/telemetry.d.ts.map +1 -0
  182. package/dist/telemetry.js +192 -0
  183. package/dist/telemetry.js.map +1 -0
  184. package/dist/types.d.ts +44 -307
  185. package/dist/types.d.ts.map +1 -1
  186. package/dist/types.js.map +1 -1
  187. package/dist/utils/error-body.d.ts.map +1 -1
  188. package/dist/utils/error-body.js +2 -1
  189. package/dist/utils/error-body.js.map +1 -1
  190. package/dist/utils/estimate.js +1 -1
  191. package/dist/utils/estimate.js.map +1 -1
  192. package/dist/utils/event-stream.d.ts +10 -1
  193. package/dist/utils/event-stream.d.ts.map +1 -1
  194. package/dist/utils/event-stream.js +25 -0
  195. package/dist/utils/event-stream.js.map +1 -1
  196. package/dist/utils/identity.d.ts +65 -0
  197. package/dist/utils/identity.d.ts.map +1 -0
  198. package/dist/utils/identity.js +141 -0
  199. package/dist/utils/identity.js.map +1 -0
  200. package/dist/utils/json-parse.d.ts +10 -0
  201. package/dist/utils/json-parse.d.ts.map +1 -1
  202. package/dist/utils/json-parse.js +26 -1
  203. package/dist/utils/json-parse.js.map +1 -1
  204. package/dist/utils/model-operations.d.ts +3 -1
  205. package/dist/utils/model-operations.d.ts.map +1 -1
  206. package/dist/utils/model-operations.js +6 -0
  207. package/dist/utils/model-operations.js.map +1 -1
  208. package/dist/utils/openrouter-cost.d.ts +24 -0
  209. package/dist/utils/openrouter-cost.d.ts.map +1 -0
  210. package/dist/utils/openrouter-cost.js +34 -0
  211. package/dist/utils/openrouter-cost.js.map +1 -0
  212. package/dist/utils/overflow.d.ts +1 -0
  213. package/dist/utils/overflow.d.ts.map +1 -1
  214. package/dist/utils/overflow.js +6 -1
  215. package/dist/utils/overflow.js.map +1 -1
  216. package/dist/utils/provider-retry.d.ts +2 -0
  217. package/dist/utils/provider-retry.d.ts.map +1 -1
  218. package/dist/utils/provider-retry.js +2 -0
  219. package/dist/utils/provider-retry.js.map +1 -1
  220. package/dist/utils/retry.d.ts.map +1 -1
  221. package/dist/utils/retry.js +26 -10
  222. package/dist/utils/retry.js.map +1 -1
  223. package/dist/utils/streaming-json.d.ts +84 -0
  224. package/dist/utils/streaming-json.d.ts.map +1 -0
  225. package/dist/utils/streaming-json.js +513 -0
  226. package/dist/utils/streaming-json.js.map +1 -0
  227. package/dist/utils/text.d.ts +7 -0
  228. package/dist/utils/text.d.ts.map +1 -1
  229. package/dist/utils/text.js +9 -0
  230. package/dist/utils/text.js.map +1 -1
  231. package/dist/utils/transcript.d.ts +22 -8
  232. package/dist/utils/transcript.d.ts.map +1 -1
  233. package/dist/utils/transcript.js +29 -18
  234. package/dist/utils/transcript.js.map +1 -1
  235. package/dist/utils/validation.d.ts.map +1 -1
  236. package/dist/utils/validation.js +3 -0
  237. package/dist/utils/validation.js.map +1 -1
  238. package/dist/utils/version.d.ts +2 -0
  239. package/dist/utils/version.d.ts.map +1 -0
  240. package/dist/utils/version.js +3 -0
  241. package/dist/utils/version.js.map +1 -0
  242. package/package.json +3 -3
  243. package/dist/utils/assistant-message-frame.d.ts +0 -77
  244. package/dist/utils/assistant-message-frame.d.ts.map +0 -1
  245. package/dist/utils/assistant-message-frame.js +0 -425
  246. package/dist/utils/assistant-message-frame.js.map +0 -1
  247. package/dist/utils/pi-user-agent.d.ts +0 -2
  248. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  249. package/dist/utils/pi-user-agent.js +0 -12
  250. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"azure-openai-responses.js","sourceRoot":"","sources":["../../src/api/azure-openai-responses.ts"],"names":[],"mappings":"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","sourcesContent":["import { AzureOpenAI } from \"openai\";\nimport type { ResponseCreateParamsStreaming } from \"openai/resources/responses/responses.js\";\nimport { clampThinkingLevel } from \"../models.ts\";\nimport type { Api, AssistantMessage, Model, SimpleStreamOptions, StreamFunction, TranscriptContext } from \"../types.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { getDeclaredTools, resolveTranscript, resolveTranscriptTools } from \"../utils/transcript.ts\";\nimport { type AzureEndpointOptions, resolveAzureConfig, resolveDeploymentName } from \"./azure-openai-config.ts\";\nimport { createGrammarToolInputProperties } from \"./constrained-sampling.ts\";\nimport { clampOpenAIPromptCacheKey } from \"./openai-prompt-cache.ts\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.ts\";\nimport { buildBaseOptions, resolveSamplingParams } from \"./simple-options.ts\";\n\nconst AZURE_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\", \"azure\"]);\n// OpenAI Responses rejects max_output_tokens below 16: https://github.com/earendil-works/pi/issues/6265\nconst OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;\n\nfunction formatAzureOpenAIError(error: unknown): string {\n\treturn formatProviderError(normalizeProviderError(error), \"Azure OpenAI API error\");\n}\n\n// Azure OpenAI Responses-specific options\nexport interface AzureOpenAIResponsesOptions extends AzureEndpointOptions {\n\treasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ttoolChoice?: ResponseCreateParamsStreaming[\"tool_choice\"];\n\treasoningSummary?: \"auto\" | \"detailed\" | \"concise\" | null;\n}\n\n/**\n * Generate function for Azure OpenAI Responses API\n */\nexport const stream: StreamFunction<\"azure-openai-responses\", AzureOpenAIResponsesOptions> = (\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions?: AzureOpenAIResponsesOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\tconst normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);\n\n\t// Start async processing\n\t(async () => {\n\t\tconst deploymentName = resolveDeploymentName(model, options);\n\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: \"azure-openai-responses\" as Api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"pending\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\ttry {\n\t\t\t// Create Azure OpenAI client\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t\t\t}\n\t\t\tconst client = createClient(model, apiKey, options);\n\t\t\tconst grammarToolInputProperties = createGrammarToolInputProperties(\n\t\t\t\tgetDeclaredTools(normalizedContext.messages),\n\t\t\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t\t);\n\t\t\tlet params = buildParams(model, normalizedContext, options, deploymentName, grammarToolInputProperties);\n\t\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\t\tif (nextParams !== undefined) {\n\t\t\t\tparams = nextParams as ResponseCreateParamsStreaming;\n\t\t\t}\n\t\t\tconst requestOptions = {\n\t\t\t\t...(options?.signal ? { signal: options.signal } : {}),\n\t\t\t\t...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t\t\t\tmaxRetries: 0,\n\t\t\t};\n\t\t\tconst { data: openaiStream, response } = await retryProviderRequest(\n\t\t\t\t() => client.responses.create(params, requestOptions).withResponse(),\n\t\t\t\t{\n\t\t\t\t\tmaxRetries: options?.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\t\t\tsignal: options?.signal,\n\t\t\t\t},\n\t\t\t);\n\t\t\tawait options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tawait processResponsesStream(openaiStream, output, stream, model, {\n\t\t\t\tonProviderStreamEvent: options?.onProviderStreamEvent,\n\t\t\t\tgrammarToolInputProperties,\n\t\t\t});\n\n\t\t\tif (options?.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\n\t\t\tif (output.stopReason === \"pending\") {\n\t\t\t\tthrow new Error(\"Azure OpenAI Responses stream ended without a stop reason\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n\t\t\t\tthrow new Error(output.errorMessage || \"An unknown error occurred\");\n\t\t\t}\n\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason, message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\tfor (const block of output.content) {\n\t\t\t\tdelete (block as { index?: number }).index;\n\t\t\t\t// Streaming scratch buffers are only used during parsing; never persist them.\n\t\t\t\tdelete (block as { partialJson?: string }).partialJson;\n\t\t\t\tdelete (block as { customInput?: unknown }).customInput;\n\t\t\t}\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = formatAzureOpenAIError(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimple: StreamFunction<\"azure-openai-responses\", SimpleStreamOptions> = (\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey;\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t}\n\n\tconst base = {\n\t\t...buildBaseOptions(model, context, options, apiKey),\n\t\ttoolChoice: options?.toolChoice,\n\t} satisfies AzureOpenAIResponsesOptions;\n\tconst clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;\n\tconst reasoningEffort = clampedReasoning === \"off\" ? undefined : clampedReasoning;\n\n\treturn stream(model, context, {\n\t\t...base,\n\t\treasoningEffort,\n\t} satisfies AzureOpenAIResponsesOptions);\n};\n\nfunction createClient(model: Model<\"azure-openai-responses\">, apiKey: string, options?: AzureOpenAIResponsesOptions) {\n\tconst headers = { \"User-Agent\": getPiUserAgent(), ...model.headers };\n\n\tif (options?.headers) {\n\t\tObject.assign(headers, options.headers);\n\t}\n\n\tconst { baseUrl, apiVersion } = resolveAzureConfig(model, options);\n\n\treturn new AzureOpenAI({\n\t\tapiKey,\n\t\tapiVersion,\n\t\tdangerouslyAllowBrowser: true,\n\t\tfetch: options?.fetch,\n\t\tdefaultHeaders: headers,\n\t\tbaseURL: baseUrl,\n\t});\n}\n\nfunction buildParams(\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions: AzureOpenAIResponsesOptions | undefined,\n\tdeploymentName: string,\n\tgrammarToolInputProperties: ReadonlyMap<string, string> = createGrammarToolInputProperties(\n\t\tgetDeclaredTools(context.messages),\n\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t),\n) {\n\tconst supportsAdditionalTools = model.compat?.supportsAdditionalTools ?? false;\n\tconst supportsToolSearch = model.compat?.supportsToolSearch ?? false;\n\tconst transcriptTools = resolveTranscriptTools(context.messages, supportsAdditionalTools || supportsToolSearch);\n\tconst messages = convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS, {\n\t\tgrammarToolInputProperties,\n\t\tsupportsMidConvoSystemMessages: model.compat?.supportsMidConvoSystemMessages ?? false,\n\t\tsupportsAdditionalTools,\n\t\tsupportsToolSearch,\n\t\ttoolOptions: {\n\t\t\tsupportsStrictMode: model.compat?.supportsStrictMode ?? true,\n\t\t\tsupportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t},\n\t});\n\n\tconst params: ResponseCreateParamsStreaming = {\n\t\tmodel: deploymentName,\n\t\tinput: messages,\n\t\tstream: true,\n\t\tprompt_cache_key: clampOpenAIPromptCacheKey(options?.sessionId),\n\t\tstore: false,\n\t};\n\n\tif (options?.maxTokens) {\n\t\tparams.max_output_tokens = Math.max(options.maxTokens, OPENAI_RESPONSES_MIN_OUTPUT_TOKENS);\n\t}\n\n\tif (options?.temperature !== undefined) {\n\t\tparams.temperature = options?.temperature;\n\t}\n\n\tif (transcriptTools.requestTools.length > 0) {\n\t\tparams.tools = convertResponsesTools(transcriptTools.requestTools, {\n\t\t\tsupportsStrictMode: model.compat?.supportsStrictMode ?? true,\n\t\t\tsupportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t});\n\t}\n\tif (options?.toolChoice !== undefined) {\n\t\tparams.tool_choice = options.toolChoice;\n\t}\n\n\tconst reasoningEffort = options?.reasoningEffort ?? (options?.reasoningSummary ? \"medium\" : undefined);\n\tif (model.reasoning) {\n\t\tif (reasoningEffort) {\n\t\t\tconst effort = options?.reasoningEffort\n\t\t\t\t? (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort)\n\t\t\t\t: reasoningEffort;\n\t\t\tparams.reasoning = {\n\t\t\t\teffort: effort as NonNullable<typeof params.reasoning>[\"effort\"],\n\t\t\t\tsummary: options?.reasoningSummary || \"auto\",\n\t\t\t};\n\t\t\tparams.include = [\"reasoning.encrypted_content\"];\n\t\t} else if (model.thinkingLevelMap?.off !== null) {\n\t\t\tparams.reasoning = {\n\t\t\t\teffort: (model.thinkingLevelMap?.off ?? \"none\") as NonNullable<typeof params.reasoning>[\"effort\"],\n\t\t\t};\n\t\t}\n\t}\n\n\t// Last so model and request sampling parameters override named request fields.\n\tconst samplingParams = resolveSamplingParams(model, reasoningEffort ?? \"off\", options?.samplingParams);\n\tif (samplingParams) {\n\t\tObject.assign(params, samplingParams);\n\t}\n\n\treturn params;\n}\n"]}
1
+ {"version":3,"file":"azure-openai-responses.js","sourceRoot":"","sources":["../../src/api/azure-openai-responses.ts"],"names":[],"mappings":"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","sourcesContent":["import { AzureOpenAI } from \"openai\";\nimport type { ResponseCreateParamsStreaming } from \"openai/resources/responses/responses.js\";\nimport { clampThinkingLevel } from \"../models.ts\";\nimport type { Api, AssistantMessage, Model, SimpleStreamOptions, StreamFunction, TranscriptContext } from \"../types.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { getIdentityHeaders } from \"../utils/identity.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { getDeclaredTools, resolveTranscript, resolveTranscriptTools } from \"../utils/transcript.ts\";\nimport { type AzureEndpointOptions, resolveAzureConfig, resolveDeploymentName } from \"./azure-openai-config.ts\";\nimport { createGrammarToolInputProperties } from \"./constrained-sampling.ts\";\nimport { clampOpenAIPromptCacheKey } from \"./openai-prompt-cache.ts\";\nimport {\n\tconvertResponsesMessages,\n\tconvertResponsesTools,\n\tgetResponsesToolSupport,\n\tprocessResponsesStream,\n} from \"./openai-responses-shared.ts\";\nimport { buildBaseOptions, resolveSamplingParams } from \"./simple-options.ts\";\n\nconst AZURE_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\", \"azure\"]);\n// OpenAI Responses rejects max_output_tokens below 16: https://github.com/earendil-works/pi/issues/6265\nconst OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;\n\nfunction formatAzureOpenAIError(error: unknown): string {\n\treturn formatProviderError(normalizeProviderError(error), \"Azure OpenAI API error\");\n}\n\n// Azure OpenAI Responses-specific options\nexport interface AzureOpenAIResponsesOptions extends AzureEndpointOptions {\n\treasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ttoolChoice?: ResponseCreateParamsStreaming[\"tool_choice\"];\n\treasoningSummary?: \"auto\" | \"detailed\" | \"concise\" | null;\n}\n\n/**\n * Generate function for Azure OpenAI Responses API\n */\nexport const stream: StreamFunction<\"azure-openai-responses\", AzureOpenAIResponsesOptions> = (\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions?: AzureOpenAIResponsesOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\tconst normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);\n\n\t// Start async processing\n\t(async () => {\n\t\tconst deploymentName = resolveDeploymentName(model, options);\n\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: \"azure-openai-responses\" as Api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"pending\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\ttry {\n\t\t\t// Create Azure OpenAI client\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t\t\t}\n\t\t\tconst client = createClient(model, apiKey, options);\n\t\t\tconst grammarToolInputProperties = createGrammarToolInputProperties(\n\t\t\t\tgetDeclaredTools(normalizedContext.messages),\n\t\t\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t\t);\n\t\t\tlet params = buildParams(model, normalizedContext, options, deploymentName, grammarToolInputProperties);\n\t\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\t\tif (nextParams !== undefined) {\n\t\t\t\tparams = nextParams as ResponseCreateParamsStreaming;\n\t\t\t}\n\t\t\tconst requestOptions = {\n\t\t\t\t...(options?.signal ? { signal: options.signal } : {}),\n\t\t\t\t...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t\t\t\tmaxRetries: 0,\n\t\t\t};\n\t\t\tconst { data: openaiStream, response } = await retryProviderRequest(\n\t\t\t\t() => client.responses.create(params, requestOptions).withResponse(),\n\t\t\t\t{\n\t\t\t\t\tmaxRetries: options?.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\t\t\tsignal: options?.signal,\n\t\t\t\t},\n\t\t\t);\n\t\t\tawait options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tawait processResponsesStream(openaiStream, output, stream, model, {\n\t\t\t\tonProviderStreamEvent: options?.onProviderStreamEvent,\n\t\t\t\tgrammarToolInputProperties,\n\t\t\t});\n\n\t\t\tif (options?.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\n\t\t\tif (output.stopReason === \"pending\") {\n\t\t\t\tthrow new Error(\"Azure OpenAI Responses stream ended without a stop reason\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n\t\t\t\tthrow new Error(output.errorMessage || \"An unknown error occurred\");\n\t\t\t}\n\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason, message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = formatAzureOpenAIError(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimple: StreamFunction<\"azure-openai-responses\", SimpleStreamOptions> = (\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey;\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t}\n\n\tconst base = {\n\t\t...buildBaseOptions(model, context, options, apiKey),\n\t\ttoolChoice: options?.toolChoice,\n\t} satisfies AzureOpenAIResponsesOptions;\n\tconst clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;\n\tconst reasoningEffort = clampedReasoning === \"off\" ? undefined : clampedReasoning;\n\n\treturn stream(model, context, {\n\t\t...base,\n\t\treasoningEffort,\n\t} satisfies AzureOpenAIResponsesOptions);\n};\n\nfunction createClient(model: Model<\"azure-openai-responses\">, apiKey: string, options?: AzureOpenAIResponsesOptions) {\n\tconst headers = { ...getIdentityHeaders(model, options?.identity), ...model.headers };\n\n\tif (options?.headers) {\n\t\tObject.assign(headers, options.headers);\n\t}\n\n\tconst { baseUrl, apiVersion } = resolveAzureConfig(model, options);\n\n\treturn new AzureOpenAI({\n\t\tapiKey,\n\t\tapiVersion,\n\t\tdangerouslyAllowBrowser: true,\n\t\tfetch: options?.fetch,\n\t\tdefaultHeaders: headers,\n\t\tbaseURL: baseUrl,\n\t});\n}\n\nfunction buildParams(\n\tmodel: Model<\"azure-openai-responses\">,\n\tcontext: TranscriptContext,\n\toptions: AzureOpenAIResponsesOptions | undefined,\n\tdeploymentName: string,\n\tgrammarToolInputProperties: ReadonlyMap<string, string> = createGrammarToolInputProperties(\n\t\tgetDeclaredTools(context.messages),\n\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t),\n) {\n\tconst supportsAdditionalTools = model.compat?.supportsAdditionalTools ?? false;\n\tconst supportsToolSearch = model.compat?.supportsToolSearch ?? false;\n\tconst transcriptTools = resolveTranscriptTools(\n\t\tcontext.messages,\n\t\tgetResponsesToolSupport({\n\t\t\tsupportsMidConvoSystemMessages: model.compat?.supportsMidConvoSystemMessages ?? false,\n\t\t\tsupportsAdditionalTools,\n\t\t\tsupportsToolSearch,\n\t\t}),\n\t);\n\tconst messages = convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS, {\n\t\tgrammarToolInputProperties,\n\t\tsupportsMidConvoSystemMessages: model.compat?.supportsMidConvoSystemMessages ?? false,\n\t\tsupportsAdditionalTools,\n\t\tsupportsToolSearch,\n\t\ttoolOptions: {\n\t\t\tsupportsStrictMode: model.compat?.supportsStrictMode ?? true,\n\t\t\tsupportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t},\n\t});\n\n\tconst params: ResponseCreateParamsStreaming = {\n\t\tmodel: deploymentName,\n\t\tinput: messages,\n\t\tstream: true,\n\t\tprompt_cache_key: clampOpenAIPromptCacheKey(options?.sessionId),\n\t\tstore: false,\n\t};\n\n\tif (options?.maxTokens) {\n\t\tparams.max_output_tokens = Math.max(options.maxTokens, OPENAI_RESPONSES_MIN_OUTPUT_TOKENS);\n\t}\n\n\tif (options?.temperature !== undefined) {\n\t\tparams.temperature = options?.temperature;\n\t}\n\n\tif (transcriptTools.requestTools.length > 0) {\n\t\tparams.tools = convertResponsesTools(transcriptTools.requestTools, {\n\t\t\tsupportsStrictMode: model.compat?.supportsStrictMode ?? true,\n\t\t\tsupportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t});\n\t}\n\tif (options?.toolChoice !== undefined) {\n\t\tparams.tool_choice = options.toolChoice;\n\t}\n\n\tconst reasoningEffort = options?.reasoningEffort ?? (options?.reasoningSummary ? \"medium\" : undefined);\n\tif (model.reasoning) {\n\t\tif (reasoningEffort) {\n\t\t\tconst effort = options?.reasoningEffort\n\t\t\t\t? (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort)\n\t\t\t\t: reasoningEffort;\n\t\t\tparams.reasoning = {\n\t\t\t\teffort: effort as NonNullable<typeof params.reasoning>[\"effort\"],\n\t\t\t\tsummary: options?.reasoningSummary || \"auto\",\n\t\t\t};\n\t\t\tparams.include = [\"reasoning.encrypted_content\"];\n\t\t} else if (model.thinkingLevelMap?.off !== null) {\n\t\t\tparams.reasoning = {\n\t\t\t\teffort: (model.thinkingLevelMap?.off ?? \"none\") as NonNullable<typeof params.reasoning>[\"effort\"],\n\t\t\t};\n\t\t}\n\t}\n\n\t// Last so model and request sampling parameters override named request fields.\n\tconst samplingParams = resolveSamplingParams(model, reasoningEffort ?? \"off\", options?.samplingParams);\n\tif (samplingParams) {\n\t\tObject.assign(params, samplingParams);\n\t}\n\n\treturn params;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock-converse-stream.d.ts","sourceRoot":"","sources":["../../src/api/bedrock-converse-stream.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAUX,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAEb,eAAe,EAEf,aAAa,EAIb,MAAM,aAAa,CAAC;AA0BrB,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,cAAe,SAAQ,aAAa;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtE,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC;;;sGAGkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;yGAIqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAgBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,yBAAyB,EAAE,cAAc,CA4O5E,CAAC;AAwKF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,yBAAyB,EAAE,mBAAmB,CAiDvF,CAAC"}
1
+ {"version":3,"file":"bedrock-converse-stream.d.ts","sourceRoot":"","sources":["../../src/api/bedrock-converse-stream.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAUX,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAEb,eAAe,EACf,aAAa,EAGb,MAAM,aAAa,CAAC;AA2BrB,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,cAAe,SAAQ,aAAa;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtE,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC;;;sGAGkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;yGAIqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,yBAAyB,EAAE,cAAc,CA2O5E,CAAC;AAkLF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,yBAAyB,EAAE,mBAAmB,CAiDvF,CAAC"}
@@ -7,15 +7,16 @@ import { appendAssistantMessageDiagnostic } from "../utils/diagnostics.js";
7
7
  import { normalizeProviderError } from "../utils/error-body.js";
8
8
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
9
9
  import { providerHeadersToRecord } from "../utils/headers.js";
10
- import { parseStreamingJson } from "../utils/json-parse.js";
10
+ import { getClientVersion } from "../utils/identity.js";
11
11
  import { resolveHttpProxyUrlForTarget } from "../utils/node-http-proxy.js";
12
12
  import { getProviderEnvValue } from "../utils/provider-env.js";
13
13
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
14
+ import { ToolCallArgumentsStream } from "../utils/streaming-json.js";
14
15
  import { getSystemMessageText } from "../utils/text.js";
15
16
  import { collapseSystemMessages, getCurrentTools, getInitialSystemMessage, withoutInitialSystemMessage, } from "../utils/transcript.js";
16
17
  import { getJsonSchemaToolParameters, resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
17
18
  import { adjustMaxTokensForThinking, buildBaseOptions, clampMaxTokensToContext, clampReasoning, } from "./simple-options.js";
18
- import { transformMessages } from "./transform-messages.js";
19
+ import { splitErrorToolResultImages, transformMessages } from "./transform-messages.js";
19
20
  const EMPTY_TEXT_PLACEHOLDER = "<empty>";
20
21
  const THINKING_BINDING_CONTROLS_BETA = "thinking-binding-controls-2026-08-01";
21
22
  /** Matches the placeholder the Anthropic API path uses for redacted thinking. */
@@ -42,7 +43,7 @@ export const stream = (model, context, options = {}) => {
42
43
  stopReason: "pending",
43
44
  timestamp: Date.now(),
44
45
  };
45
- const blocks = output.content;
46
+ const openBlocks = new Map();
46
47
  // A profile explicitly configured through pi's auth flow (the `profile`
47
48
  // option or scoped `AWS_PROFILE` on the stored credential's env) must win
48
49
  // over ambient AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY. The SDK default
@@ -51,6 +52,7 @@ export const stream = (model, context, options = {}) => {
51
52
  const optionsProfile = options.profile || options.env?.AWS_PROFILE;
52
53
  const config = {
53
54
  profile: optionsProfile || getProviderEnvValue("AWS_PROFILE", options.env),
55
+ customUserAgent: bedrockUserAgent(options.identity),
54
56
  };
55
57
  const configuredRegion = getConfiguredBedrockRegion(options);
56
58
  const hasAmbientConfiguredProfile = Boolean(getProviderEnvValue("AWS_PROFILE"));
@@ -178,13 +180,13 @@ export const stream = (model, context, options = {}) => {
178
180
  stream.push({ type: "start", partial: output });
179
181
  }
180
182
  else if (item.contentBlockStart) {
181
- handleContentBlockStart(item.contentBlockStart, blocks, output, stream);
183
+ handleContentBlockStart(item.contentBlockStart, openBlocks, output, stream);
182
184
  }
183
185
  else if (item.contentBlockDelta) {
184
- handleContentBlockDelta(item.contentBlockDelta, blocks, output, stream);
186
+ handleContentBlockDelta(item.contentBlockDelta, openBlocks, output, stream);
185
187
  }
186
188
  else if (item.contentBlockStop) {
187
- handleContentBlockStop(item.contentBlockStop, blocks, output, stream);
189
+ handleContentBlockStop(item.contentBlockStop, openBlocks, output, stream);
188
190
  }
189
191
  else if (item.messageStop) {
190
192
  output.rawStopReason = item.messageStop.stopReason;
@@ -223,15 +225,12 @@ export const stream = (model, context, options = {}) => {
223
225
  throw new Error(output.errorMessage || "An unknown error occurred");
224
226
  }
225
227
  // A stream can settle without stopping every block, so finalize here too.
226
- for (const block of output.content)
227
- finalizeStreamingBlock(block);
228
+ flushOpenBlocks(openBlocks, output);
228
229
  stream.push({ type: "done", reason: output.stopReason, message: output });
229
230
  stream.end();
230
231
  }
231
232
  catch (error) {
232
- for (const block of output.content) {
233
- finalizeStreamingBlock(block);
234
- }
233
+ flushOpenBlocks(openBlocks, output);
235
234
  output.stopReason = options.signal?.aborted ? "aborted" : "error";
236
235
  output.errorMessage = formatBedrockError(error);
237
236
  if (output.stopReason === "error") {
@@ -337,6 +336,16 @@ function isReservedHeader(key) {
337
336
  const lower = key.toLowerCase();
338
337
  return lower.startsWith("x-amz-") || RESERVED_HEADER_EXACT.has(lower);
339
338
  }
339
+ /**
340
+ * The client identity as AWS SDK user agent pairs. The SDK appends them to its own `User-Agent` and escapes characters
341
+ * that are not valid in a user agent token, so the detailed form is reduced to name and version.
342
+ */
343
+ function bedrockUserAgent(identity) {
344
+ const mode = identity?.userAgent ?? "detailed";
345
+ if (typeof mode === "object")
346
+ return mode.custom;
347
+ return mode === "short" ? [["pi"]] : [["pi", getClientVersion(identity)]];
348
+ }
340
349
  /**
341
350
  * Attach caller-supplied headers to the outgoing Bedrock request via a Smithy
342
351
  * `build`-step middleware. The `build` step runs after request serialisation but
@@ -424,59 +433,60 @@ export const streamSimple = (model, context, options) => {
424
433
  thinkingBudgets: options.thinkingBudgets,
425
434
  });
426
435
  };
427
- function handleContentBlockStart(event, blocks, output, stream) {
428
- const index = event.contentBlockIndex;
436
+ function handleContentBlockStart(event, openBlocks, output, stream) {
429
437
  const start = event.start;
430
438
  if (start?.toolUse) {
431
- const block = {
439
+ output.content.push({
432
440
  type: "toolCall",
433
441
  id: start.toolUse.toolUseId || "",
434
442
  name: start.toolUse.name || "",
435
443
  arguments: {},
436
- partialJson: "",
437
- index,
438
- };
439
- output.content.push(block);
440
- stream.push({ type: "toolcall_start", contentIndex: blocks.length - 1, partial: output });
444
+ });
445
+ const contentIndex = output.content.length - 1;
446
+ openBlocks.set(event.contentBlockIndex, { contentIndex, arguments: new ToolCallArgumentsStream() });
447
+ stream.push({ type: "toolcall_start", contentIndex, partial: output });
441
448
  }
442
449
  }
443
- function handleContentBlockDelta(event, blocks, output, stream) {
450
+ function handleContentBlockDelta(event, openBlocks, output, stream) {
444
451
  const contentBlockIndex = event.contentBlockIndex;
445
452
  const delta = event.delta;
446
- let index = blocks.findIndex((b) => b.index === contentBlockIndex);
447
- let block = blocks[index];
453
+ let open = openBlocks.get(contentBlockIndex);
454
+ let block = open === undefined ? undefined : output.content[open.contentIndex];
448
455
  if (delta?.text !== undefined) {
449
456
  // If no text block exists yet, create one, as `handleContentBlockStart` is not sent for text blocks
450
- if (!block) {
451
- const newBlock = { type: "text", text: "", index: contentBlockIndex };
452
- output.content.push(newBlock);
453
- index = blocks.length - 1;
454
- block = blocks[index];
455
- stream.push({ type: "text_start", contentIndex: index, partial: output });
457
+ if (!open) {
458
+ output.content.push({ type: "text", text: "" });
459
+ open = { contentIndex: output.content.length - 1 };
460
+ openBlocks.set(contentBlockIndex, open);
461
+ block = output.content[open.contentIndex];
462
+ stream.push({ type: "text_start", contentIndex: open.contentIndex, partial: output });
456
463
  }
457
- if (block.type === "text") {
464
+ if (block?.type === "text") {
458
465
  block.text += delta.text;
459
- stream.push({ type: "text_delta", contentIndex: index, delta: delta.text, partial: output });
466
+ stream.push({ type: "text_delta", contentIndex: open.contentIndex, delta: delta.text, partial: output });
460
467
  }
461
468
  }
462
- else if (delta?.toolUse && block?.type === "toolCall") {
463
- block.partialJson = (block.partialJson || "") + (delta.toolUse.input || "");
464
- block.arguments = parseStreamingJson(block.partialJson);
465
- stream.push({ type: "toolcall_delta", contentIndex: index, delta: delta.toolUse.input || "", partial: output });
469
+ else if (delta?.toolUse && block?.type === "toolCall" && open?.arguments !== undefined) {
470
+ block.arguments = open.arguments.append(delta.toolUse.input || "");
471
+ stream.push({
472
+ type: "toolcall_delta",
473
+ contentIndex: open.contentIndex,
474
+ delta: delta.toolUse.input || "",
475
+ partial: output,
476
+ });
466
477
  }
467
478
  else if (delta?.reasoningContent) {
468
- let thinkingBlock = block;
469
- let thinkingIndex = index;
470
- if (!thinkingBlock) {
471
- const newBlock = { type: "thinking", thinking: "", thinkingSignature: "", index: contentBlockIndex };
472
- output.content.push(newBlock);
473
- thinkingIndex = blocks.length - 1;
474
- thinkingBlock = blocks[thinkingIndex];
475
- stream.push({ type: "thinking_start", contentIndex: thinkingIndex, partial: output });
479
+ if (!open) {
480
+ output.content.push({ type: "thinking", thinking: "", thinkingSignature: "" });
481
+ open = { contentIndex: output.content.length - 1 };
482
+ openBlocks.set(contentBlockIndex, open);
483
+ block = output.content[open.contentIndex];
484
+ stream.push({ type: "thinking_start", contentIndex: open.contentIndex, partial: output });
476
485
  }
477
- if (thinkingBlock?.type === "thinking") {
486
+ if (block?.type === "thinking") {
487
+ const thinkingIndex = open.contentIndex;
478
488
  if (delta.reasoningContent.text) {
479
- thinkingBlock.thinking += delta.reasoningContent.text;
489
+ block.thinking += delta.reasoningContent.text;
480
490
  stream.push({
481
491
  type: "thinking_delta",
482
492
  contentIndex: thinkingIndex,
@@ -486,18 +496,17 @@ function handleContentBlockDelta(event, blocks, output, stream) {
486
496
  }
487
497
  // `thinkingSignature` holds either an Anthropic signature or an opaque redacted
488
498
  // payload, never both: mixing them would corrupt whichever arrived first.
489
- if (delta.reasoningContent.signature && !thinkingBlock.redacted) {
490
- thinkingBlock.thinkingSignature =
491
- (thinkingBlock.thinkingSignature || "") + delta.reasoningContent.signature;
499
+ if (delta.reasoningContent.signature && !block.redacted) {
500
+ block.thinkingSignature = (block.thinkingSignature || "") + delta.reasoningContent.signature;
492
501
  }
493
502
  if (delta.reasoningContent.redactedContent?.length) {
494
503
  // Encrypted reasoning from non-Anthropic models on Bedrock (e.g. OpenAI GPT-5.6).
495
504
  // The payload is opaque, so keep it verbatim in `thinkingSignature` the way the
496
505
  // Anthropic path stores redacted thinking, and replay it on the next turn.
497
- if (!thinkingBlock.redacted) {
498
- thinkingBlock.redacted = true;
499
- thinkingBlock.thinkingSignature = "";
500
- thinkingBlock.thinking += REDACTED_THINKING_PLACEHOLDER;
506
+ if (!block.redacted) {
507
+ block.redacted = true;
508
+ block.thinkingSignature = "";
509
+ block.thinking += REDACTED_THINKING_PLACEHOLDER;
501
510
  stream.push({
502
511
  type: "thinking_delta",
503
512
  contentIndex: thinkingIndex,
@@ -505,32 +514,29 @@ function handleContentBlockDelta(event, blocks, output, stream) {
505
514
  partial: output,
506
515
  });
507
516
  }
508
- thinkingBlock.redactedChunks ??= [];
509
- thinkingBlock.redactedChunks.push(delta.reasoningContent.redactedContent);
517
+ open.redactedChunks ??= [];
518
+ open.redactedChunks.push(delta.reasoningContent.redactedContent);
510
519
  }
511
520
  }
512
521
  }
513
522
  }
514
523
  /**
515
- * Encodes buffered encrypted reasoning into `thinkingSignature` and drops the scratch
516
- * buffer, which must never reach a persisted message: `Uint8Array` serializes to an
517
- * index-keyed object roughly ten times the size of the base64 payload.
524
+ * Encodes buffered encrypted reasoning into `thinkingSignature`. The chunks stay in the stream state, never on the
525
+ * block: `Uint8Array` is not JSON and serializes to an index-keyed object roughly ten times the size of the base64
526
+ * payload.
518
527
  */
519
- function flushRedactedContent(block) {
520
- if (block.type !== "thinking" || !block.redactedChunks)
528
+ function flushRedactedContent(open, output) {
529
+ const block = output.content[open.contentIndex];
530
+ if (block?.type !== "thinking" || !open.redactedChunks)
521
531
  return;
522
- block.thinkingSignature = bytesToBase64(block.redactedChunks);
523
- delete block.redactedChunks;
532
+ block.thinkingSignature = bytesToBase64(open.redactedChunks);
533
+ open.redactedChunks = undefined;
524
534
  }
525
- /**
526
- * Strips every streaming scratch field. Runs from the terminal paths as well as
527
- * `contentBlockStop`, because a stream can settle without stopping each block.
528
- */
529
- function finalizeStreamingBlock(block) {
530
- delete block.index;
531
- // partialJson is only a streaming scratch buffer; never persist it.
532
- delete block.partialJson;
533
- flushRedactedContent(block);
535
+ /** Ends the stream state of blocks a stream settled without stopping. */
536
+ function flushOpenBlocks(openBlocks, output) {
537
+ for (const open of openBlocks.values())
538
+ flushRedactedContent(open, output);
539
+ openBlocks.clear();
534
540
  }
535
541
  function handleMetadata(event, model, output) {
536
542
  if (event.usage) {
@@ -543,25 +549,24 @@ function handleMetadata(event, model, output) {
543
549
  calculateCost(model, output.usage);
544
550
  }
545
551
  }
546
- function handleContentBlockStop(event, blocks, output, stream) {
547
- const index = blocks.findIndex((b) => b.index === event.contentBlockIndex);
548
- const block = blocks[index];
549
- if (!block)
552
+ function handleContentBlockStop(event, openBlocks, output, stream) {
553
+ const open = openBlocks.get(event.contentBlockIndex);
554
+ if (!open)
550
555
  return;
551
- delete block.index;
556
+ openBlocks.delete(event.contentBlockIndex);
557
+ const index = open.contentIndex;
558
+ const block = output.content[index];
552
559
  switch (block.type) {
553
560
  case "text":
554
561
  stream.push({ type: "text_end", contentIndex: index, content: block.text, partial: output });
555
562
  break;
556
563
  case "thinking":
557
- flushRedactedContent(block);
564
+ flushRedactedContent(open, output);
558
565
  stream.push({ type: "thinking_end", contentIndex: index, content: block.thinking, partial: output });
559
566
  break;
560
567
  case "toolCall":
561
- block.arguments = parseStreamingJson(block.partialJson);
562
- // Finalize in-place and strip the scratch buffer so replay only
563
- // carries parsed arguments.
564
- delete block.partialJson;
568
+ if (open.arguments !== undefined)
569
+ Object.assign(block, open.arguments.finish());
565
570
  stream.push({ type: "toolcall_end", contentIndex: index, toolCall: block, partial: output });
566
571
  break;
567
572
  }
@@ -586,6 +591,7 @@ function supportsAdaptiveThinking(modelId, modelName) {
586
591
  s.includes("opus-5") ||
587
592
  s.includes("sonnet-4-6") ||
588
593
  s.includes("sonnet-5") ||
594
+ s.includes("haiku-5") ||
589
595
  s.includes("fable-5"));
590
596
  }
591
597
  function supportsNativeXhighEffort(model) {
@@ -594,6 +600,7 @@ function supportsNativeXhighEffort(model) {
594
600
  s.includes("opus-4-8") ||
595
601
  s.includes("opus-5") ||
596
602
  s.includes("sonnet-5") ||
603
+ s.includes("haiku-5") ||
597
604
  s.includes("fable-5"));
598
605
  }
599
606
  /**
@@ -606,6 +613,7 @@ function supportsThinkingBlockBinding(model) {
606
613
  s.includes("opus-4-8") ||
607
614
  s.includes("opus-5") ||
608
615
  s.includes("sonnet-5") ||
616
+ s.includes("haiku-5") ||
609
617
  s.includes("fable-5"));
610
618
  }
611
619
  function mapThinkingLevelToEffort(model, level) {
@@ -675,8 +683,8 @@ function supportsPromptCaching(model, env) {
675
683
  return true;
676
684
  return false;
677
685
  }
678
- // Claude 5 models (fable-5, opus-5, sonnet-5)
679
- if (candidates.some((s) => s.includes("fable-5") || s.includes("opus-5") || s.includes("sonnet-5")))
686
+ // Claude 5 models (fable-5, opus-5, sonnet-5, haiku-5)
687
+ if (candidates.some((s) => s.includes("fable-5") || s.includes("opus-5") || s.includes("sonnet-5") || s.includes("haiku-5")))
680
688
  return true;
681
689
  // Claude 4.x models (opus-4, sonnet-4, haiku-4)
682
690
  if (candidates.some((s) => s.includes("-4-")))
@@ -867,30 +875,28 @@ function convertMessages(context, model, cacheRetention, env) {
867
875
  // Collect all consecutive toolResult messages into a single user message
868
876
  // Bedrock requires all tool results to be in one message
869
877
  const toolResults = [];
870
- // Add current tool result with all content blocks combined
871
- toolResults.push({
872
- toolResult: {
873
- toolUseId: m.toolCallId,
874
- content: convertToolResultContent(m.content),
875
- status: m.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
876
- },
877
- });
878
- // Look ahead for consecutive toolResult messages
879
- let j = i + 1;
878
+ // Claude rejects error tool results that contain anything but text, so for Claude their
879
+ // images follow all tool results of the turn (#10794). Other models keep them in place.
880
+ const errorImages = [];
881
+ let j = i;
880
882
  while (j < transformedMessages.length && transformedMessages[j].role === "toolResult") {
881
- const nextMsg = transformedMessages[j];
883
+ const toolMsg = transformedMessages[j];
884
+ const split = isAnthropicClaudeModel(model) ? splitErrorToolResultImages(toolMsg) : undefined;
882
885
  toolResults.push({
883
886
  toolResult: {
884
- toolUseId: nextMsg.toolCallId,
885
- content: convertToolResultContent(nextMsg.content),
886
- status: nextMsg.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
887
+ toolUseId: toolMsg.toolCallId,
888
+ content: convertToolResultContent(split?.content ?? toolMsg.content),
889
+ status: toolMsg.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
887
890
  },
888
891
  });
892
+ if (split) {
893
+ errorImages.push({ text: split.caption }, ...split.images.map((image) => ({ image: createImageBlock(image.mimeType, image.data) })));
894
+ }
889
895
  j++;
890
896
  }
891
897
  // Skip the messages we've already processed
892
898
  i = j - 1;
893
- result.push({ role: ConversationRole.USER, content: toolResults });
899
+ result.push({ role: ConversationRole.USER, content: [...toolResults, ...errorImages] });
894
900
  break;
895
901
  }
896
902
  default:
@@ -1053,8 +1059,36 @@ function buildAdditionalModelRequestFields(model, options) {
1053
1059
  }
1054
1060
  return result;
1055
1061
  }
1062
+ const candidates = getModelMatchCandidates(model.id, model.name);
1063
+ if (candidates.some((s) => s.includes("gpt-oss"))) {
1064
+ return { reasoning_effort: OPENAI_GPT_OSS_EFFORT[options.reasoning] };
1065
+ }
1066
+ if (candidates.some((s) => s.includes("gpt-"))) {
1067
+ const mapped = model.thinkingLevelMap?.[options.reasoning];
1068
+ return {
1069
+ reasoning: { effort: typeof mapped === "string" ? mapped : OPENAI_GPT_EFFORT[options.reasoning] },
1070
+ };
1071
+ }
1056
1072
  return undefined;
1057
1073
  }
1074
+ /** OpenAI GPT models (GPT-5.x, GPT-6) take a nested `reasoning.effort` and reject `minimal`. */
1075
+ const OPENAI_GPT_EFFORT = {
1076
+ minimal: "low",
1077
+ low: "low",
1078
+ medium: "medium",
1079
+ high: "high",
1080
+ xhigh: "xhigh",
1081
+ max: "max",
1082
+ };
1083
+ /** gpt-oss takes a flat `reasoning_effort` and only accepts low, medium and high. */
1084
+ const OPENAI_GPT_OSS_EFFORT = {
1085
+ minimal: "low",
1086
+ low: "low",
1087
+ medium: "medium",
1088
+ high: "high",
1089
+ xhigh: "high",
1090
+ max: "high",
1091
+ };
1058
1092
  function createImageBlock(mimeType, data) {
1059
1093
  let format;
1060
1094
  switch (mimeType) {