@draht/ai 2026.9.5-1 → 2026.10.4-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +392 -137
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/azure-openai-responses.d.ts +2 -0
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +34 -11
  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 +194 -22
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/cloudflare-ai-binding.d.ts +77 -0
  12. package/dist/api/cloudflare-ai-binding.d.ts.map +1 -0
  13. package/dist/api/cloudflare-ai-binding.js +72 -0
  14. package/dist/api/cloudflare-ai-binding.js.map +1 -0
  15. package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
  16. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
  17. package/dist/api/cloudflare-workers-ai-system-one.js +43 -0
  18. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
  19. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
  20. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
  21. package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
  22. package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
  23. package/dist/api/cloudflare.d.ts +2 -0
  24. package/dist/api/cloudflare.d.ts.map +1 -1
  25. package/dist/api/cloudflare.js +2 -0
  26. package/dist/api/cloudflare.js.map +1 -1
  27. package/dist/api/constrained-sampling.d.ts +10 -1
  28. package/dist/api/constrained-sampling.d.ts.map +1 -1
  29. package/dist/api/constrained-sampling.js +137 -4
  30. package/dist/api/constrained-sampling.js.map +1 -1
  31. package/dist/api/google-generative-ai.d.ts.map +1 -1
  32. package/dist/api/google-generative-ai.js +26 -73
  33. package/dist/api/google-generative-ai.js.map +1 -1
  34. package/dist/api/google-shared.d.ts +14 -5
  35. package/dist/api/google-shared.d.ts.map +1 -1
  36. package/dist/api/google-shared.js +68 -13
  37. package/dist/api/google-shared.js.map +1 -1
  38. package/dist/api/google-vertex.d.ts.map +1 -1
  39. package/dist/api/google-vertex.js +30 -65
  40. package/dist/api/google-vertex.js.map +1 -1
  41. package/dist/api/lazy.d.ts +5 -1
  42. package/dist/api/lazy.d.ts.map +1 -1
  43. package/dist/api/lazy.js +19 -7
  44. package/dist/api/lazy.js.map +1 -1
  45. package/dist/api/llama-cpp-classify.d.ts +33 -0
  46. package/dist/api/llama-cpp-classify.d.ts.map +1 -0
  47. package/dist/api/llama-cpp-classify.js +365 -0
  48. package/dist/api/llama-cpp-classify.js.map +1 -0
  49. package/dist/api/llama-cpp-classify.lazy.d.ts +3 -0
  50. package/dist/api/llama-cpp-classify.lazy.d.ts.map +1 -0
  51. package/dist/api/llama-cpp-classify.lazy.js +4 -0
  52. package/dist/api/llama-cpp-classify.lazy.js.map +1 -0
  53. package/dist/api/mistral-conversations.d.ts +2 -2
  54. package/dist/api/mistral-conversations.d.ts.map +1 -1
  55. package/dist/api/mistral-conversations.js +246 -69
  56. package/dist/api/mistral-conversations.js.map +1 -1
  57. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  58. package/dist/api/openai-codex-responses.js +58 -24
  59. package/dist/api/openai-codex-responses.js.map +1 -1
  60. package/dist/api/openai-completions.d.ts +11 -4
  61. package/dist/api/openai-completions.d.ts.map +1 -1
  62. package/dist/api/openai-completions.js +232 -126
  63. package/dist/api/openai-completions.js.map +1 -1
  64. package/dist/api/openai-responses-shared.d.ts +8 -4
  65. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  66. package/dist/api/openai-responses-shared.js +109 -58
  67. package/dist/api/openai-responses-shared.js.map +1 -1
  68. package/dist/api/openai-responses.d.ts.map +1 -1
  69. package/dist/api/openai-responses.js +58 -24
  70. package/dist/api/openai-responses.js.map +1 -1
  71. package/dist/api/openrouter-images.d.ts +2 -1
  72. package/dist/api/openrouter-images.d.ts.map +1 -1
  73. package/dist/api/openrouter-images.js +1 -0
  74. package/dist/api/openrouter-images.js.map +1 -1
  75. package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
  76. package/dist/api/openrouter-images.lazy.js.map +1 -1
  77. package/dist/api/pi-messages.d.ts +5 -3
  78. package/dist/api/pi-messages.d.ts.map +1 -1
  79. package/dist/api/pi-messages.js +12 -3
  80. package/dist/api/pi-messages.js.map +1 -1
  81. package/dist/api/simple-options.d.ts +9 -3
  82. package/dist/api/simple-options.d.ts.map +1 -1
  83. package/dist/api/simple-options.js +22 -11
  84. package/dist/api/simple-options.js.map +1 -1
  85. package/dist/api/system-one-shared.d.ts +23 -0
  86. package/dist/api/system-one-shared.d.ts.map +1 -0
  87. package/dist/api/system-one-shared.js +183 -0
  88. package/dist/api/system-one-shared.js.map +1 -0
  89. package/dist/api/transform-messages.d.ts.map +1 -1
  90. package/dist/api/transform-messages.js +21 -7
  91. package/dist/api/transform-messages.js.map +1 -1
  92. package/dist/api/typesafe-system-one.d.ts +4 -0
  93. package/dist/api/typesafe-system-one.d.ts.map +1 -0
  94. package/dist/api/typesafe-system-one.js +19 -0
  95. package/dist/api/typesafe-system-one.js.map +1 -0
  96. package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
  97. package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
  98. package/dist/api/typesafe-system-one.lazy.js +4 -0
  99. package/dist/api/typesafe-system-one.lazy.js.map +1 -0
  100. package/dist/auth/credential-store.d.ts +6 -6
  101. package/dist/auth/credential-store.d.ts.map +1 -1
  102. package/dist/auth/credential-store.js +24 -15
  103. package/dist/auth/credential-store.js.map +1 -1
  104. package/dist/auth/helpers.d.ts +1 -0
  105. package/dist/auth/helpers.d.ts.map +1 -1
  106. package/dist/auth/helpers.js +8 -3
  107. package/dist/auth/helpers.js.map +1 -1
  108. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  109. package/dist/auth/oauth/anthropic.js +28 -131
  110. package/dist/auth/oauth/anthropic.js.map +1 -1
  111. package/dist/auth/oauth/callback-server.d.ts +55 -0
  112. package/dist/auth/oauth/callback-server.d.ts.map +1 -0
  113. package/dist/auth/oauth/callback-server.js +146 -0
  114. package/dist/auth/oauth/callback-server.js.map +1 -0
  115. package/dist/auth/oauth/device-code.d.ts +2 -1
  116. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  117. package/dist/auth/oauth/device-code.js +5 -5
  118. package/dist/auth/oauth/device-code.js.map +1 -1
  119. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  120. package/dist/auth/oauth/github-copilot.js +13 -9
  121. package/dist/auth/oauth/github-copilot.js.map +1 -1
  122. package/dist/auth/oauth/google-antigravity.d.ts +3 -3
  123. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -1
  124. package/dist/auth/oauth/google-antigravity.js +17 -9
  125. package/dist/auth/oauth/google-antigravity.js.map +1 -1
  126. package/dist/auth/oauth/google-gemini-cli.d.ts +3 -3
  127. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -1
  128. package/dist/auth/oauth/google-gemini-cli.js +18 -10
  129. package/dist/auth/oauth/google-gemini-cli.js.map +1 -1
  130. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  131. package/dist/auth/oauth/kimi-coding.js +5 -6
  132. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  133. package/dist/auth/oauth/load.d.ts +4 -0
  134. package/dist/auth/oauth/load.d.ts.map +1 -1
  135. package/dist/auth/oauth/load.js +10 -0
  136. package/dist/auth/oauth/load.js.map +1 -1
  137. package/dist/auth/oauth/meta.d.ts +17 -0
  138. package/dist/auth/oauth/meta.d.ts.map +1 -0
  139. package/dist/auth/oauth/meta.js +190 -0
  140. package/dist/auth/oauth/meta.js.map +1 -0
  141. package/dist/auth/oauth/openai-chatgpt.d.ts +9 -0
  142. package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -0
  143. package/dist/auth/oauth/openai-chatgpt.js +266 -0
  144. package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
  145. package/dist/auth/oauth/openai-codex.d.ts +1 -1
  146. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  147. package/dist/auth/oauth/openai-codex.js +33 -130
  148. package/dist/auth/oauth/openai-codex.js.map +1 -1
  149. package/dist/auth/oauth/openrouter.d.ts +1 -1
  150. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  151. package/dist/auth/oauth/openrouter.js +26 -145
  152. package/dist/auth/oauth/openrouter.js.map +1 -1
  153. package/dist/auth/oauth/radius.d.ts +1 -1
  154. package/dist/auth/oauth/radius.d.ts.map +1 -1
  155. package/dist/auth/oauth/radius.js +28 -93
  156. package/dist/auth/oauth/radius.js.map +1 -1
  157. package/dist/auth/oauth/xai.d.ts.map +1 -1
  158. package/dist/auth/oauth/xai.js +13 -12
  159. package/dist/auth/oauth/xai.js.map +1 -1
  160. package/dist/auth/resolve.d.ts +3 -8
  161. package/dist/auth/resolve.d.ts.map +1 -1
  162. package/dist/auth/resolve.js +26 -31
  163. package/dist/auth/resolve.js.map +1 -1
  164. package/dist/auth/types.d.ts +29 -8
  165. package/dist/auth/types.d.ts.map +1 -1
  166. package/dist/auth/types.js.map +1 -1
  167. package/dist/bun-oauth.d.ts.map +1 -1
  168. package/dist/bun-oauth.js +4 -0
  169. package/dist/bun-oauth.js.map +1 -1
  170. package/dist/cli.js +4 -1
  171. package/dist/cli.js.map +1 -1
  172. package/dist/compat.d.ts +3 -3
  173. package/dist/compat.d.ts.map +1 -1
  174. package/dist/compat.js +9 -6
  175. package/dist/compat.js.map +1 -1
  176. package/dist/env-api-keys.d.ts +5 -0
  177. package/dist/env-api-keys.d.ts.map +1 -1
  178. package/dist/env-api-keys.js +9 -1
  179. package/dist/env-api-keys.js.map +1 -1
  180. package/dist/image-models.d.ts +19 -8
  181. package/dist/image-models.d.ts.map +1 -1
  182. package/dist/image-models.js +14 -13
  183. package/dist/image-models.js.map +1 -1
  184. package/dist/images-api-registry.d.ts +7 -7
  185. package/dist/images-api-registry.d.ts.map +1 -1
  186. package/dist/images-api-registry.js.map +1 -1
  187. package/dist/images.d.ts +7 -2
  188. package/dist/images.d.ts.map +1 -1
  189. package/dist/images.js +5 -0
  190. package/dist/images.js.map +1 -1
  191. package/dist/index.d.ts +3 -2
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +3 -2
  194. package/dist/index.js.map +1 -1
  195. package/dist/model-catalog.d.ts +25 -9
  196. package/dist/model-catalog.d.ts.map +1 -1
  197. package/dist/model-catalog.js +14 -2
  198. package/dist/model-catalog.js.map +1 -1
  199. package/dist/models-store.d.ts +12 -14
  200. package/dist/models-store.d.ts.map +1 -1
  201. package/dist/models-store.js +7 -6
  202. package/dist/models-store.js.map +1 -1
  203. package/dist/models.d.ts +138 -47
  204. package/dist/models.d.ts.map +1 -1
  205. package/dist/models.generated.d.ts +135 -37
  206. package/dist/models.generated.d.ts.map +1 -1
  207. package/dist/models.generated.js +135 -37
  208. package/dist/models.generated.js.map +1 -1
  209. package/dist/models.js +391 -99
  210. package/dist/models.js.map +1 -1
  211. package/dist/providers/all.d.ts +19 -13
  212. package/dist/providers/all.d.ts.map +1 -1
  213. package/dist/providers/all.js +31 -21
  214. package/dist/providers/all.js.map +1 -1
  215. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  216. package/dist/providers/amazon-bedrock.js +15 -7
  217. package/dist/providers/amazon-bedrock.js.map +1 -1
  218. package/dist/providers/amazon-bedrock.models.d.ts +4 -2
  219. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  220. package/dist/providers/amazon-bedrock.models.js +4 -2
  221. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  222. package/dist/providers/ant-ling.models.d.ts +4 -2
  223. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  224. package/dist/providers/ant-ling.models.js +4 -2
  225. package/dist/providers/ant-ling.models.js.map +1 -1
  226. package/dist/providers/anthropic.d.ts.map +1 -1
  227. package/dist/providers/anthropic.js +39 -8
  228. package/dist/providers/anthropic.js.map +1 -1
  229. package/dist/providers/anthropic.models.d.ts +4 -2
  230. package/dist/providers/anthropic.models.d.ts.map +1 -1
  231. package/dist/providers/anthropic.models.js +4 -2
  232. package/dist/providers/anthropic.models.js.map +1 -1
  233. package/dist/providers/azure-openai-responses.models.d.ts +4 -2
  234. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  235. package/dist/providers/azure-openai-responses.models.js +4 -2
  236. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  237. package/dist/providers/baseten.d.ts +3 -0
  238. package/dist/providers/baseten.d.ts.map +1 -0
  239. package/dist/providers/baseten.js +15 -0
  240. package/dist/providers/baseten.js.map +1 -0
  241. package/dist/providers/baseten.models.d.ts +6 -0
  242. package/dist/providers/baseten.models.d.ts.map +1 -0
  243. package/dist/providers/baseten.models.js +8 -0
  244. package/dist/providers/baseten.models.js.map +1 -0
  245. package/dist/providers/cerebras.models.d.ts +4 -2
  246. package/dist/providers/cerebras.models.d.ts.map +1 -1
  247. package/dist/providers/cerebras.models.js +4 -2
  248. package/dist/providers/cerebras.models.js.map +1 -1
  249. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
  250. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  251. package/dist/providers/cloudflare-ai-gateway.js +4 -0
  252. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  253. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
  254. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  255. package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
  256. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  257. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  258. package/dist/providers/cloudflare-auth.js +15 -10
  259. package/dist/providers/cloudflare-auth.js.map +1 -1
  260. package/dist/providers/cloudflare-stream.d.ts +6 -2
  261. package/dist/providers/cloudflare-stream.d.ts.map +1 -1
  262. package/dist/providers/cloudflare-stream.js +6 -0
  263. package/dist/providers/cloudflare-stream.js.map +1 -1
  264. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  265. package/dist/providers/cloudflare-workers-ai.js +10 -3
  266. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  267. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
  268. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  269. package/dist/providers/cloudflare-workers-ai.models.js +4 -2
  270. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  271. package/dist/providers/data/.manifest.json +1 -1
  272. package/dist/providers/data/amazon-bedrock.json +1 -1
  273. package/dist/providers/data/ant-ling.json +1 -1
  274. package/dist/providers/data/anthropic.json +1 -1
  275. package/dist/providers/data/azure-openai-responses.json +1 -1
  276. package/dist/providers/data/baseten.json +1 -0
  277. package/dist/providers/data/cerebras.json +1 -1
  278. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  279. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  280. package/dist/providers/data/deepseek.json +1 -1
  281. package/dist/providers/data/fireworks.json +1 -1
  282. package/dist/providers/data/github-copilot.json +1 -1
  283. package/dist/providers/data/google-vertex.json +1 -1
  284. package/dist/providers/data/google.json +1 -1
  285. package/dist/providers/data/groq.json +1 -1
  286. package/dist/providers/data/huggingface.json +1 -1
  287. package/dist/providers/data/kimi-coding.json +1 -1
  288. package/dist/providers/data/meta.json +1 -0
  289. package/dist/providers/data/minimax-cn.json +1 -1
  290. package/dist/providers/data/minimax.json +1 -1
  291. package/dist/providers/data/mistral.json +1 -1
  292. package/dist/providers/data/moonshotai-cn.json +1 -1
  293. package/dist/providers/data/moonshotai.json +1 -1
  294. package/dist/providers/data/nvidia.json +1 -1
  295. package/dist/providers/data/openai-codex.json +1 -1
  296. package/dist/providers/data/openai.json +1 -1
  297. package/dist/providers/data/opencode-go.json +1 -1
  298. package/dist/providers/data/opencode.json +1 -1
  299. package/dist/providers/data/openrouter.json +1 -1
  300. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  301. package/dist/providers/data/qwen-token-plan-individual.json +1 -0
  302. package/dist/providers/data/qwen-token-plan.json +1 -1
  303. package/dist/providers/data/radius.json +1 -0
  304. package/dist/providers/data/together.json +1 -1
  305. package/dist/providers/data/typesafe.json +1 -0
  306. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  307. package/dist/providers/data/xai.json +1 -1
  308. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  309. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  310. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  311. package/dist/providers/data/xiaomi.json +1 -1
  312. package/dist/providers/data/zai-coding-cn.json +1 -1
  313. package/dist/providers/data/zai.json +1 -1
  314. package/dist/providers/deepseek.models.d.ts +4 -2
  315. package/dist/providers/deepseek.models.d.ts.map +1 -1
  316. package/dist/providers/deepseek.models.js +4 -2
  317. package/dist/providers/deepseek.models.js.map +1 -1
  318. package/dist/providers/faux.d.ts +19 -13
  319. package/dist/providers/faux.d.ts.map +1 -1
  320. package/dist/providers/faux.js +109 -18
  321. package/dist/providers/faux.js.map +1 -1
  322. package/dist/providers/fireworks.models.d.ts +4 -2
  323. package/dist/providers/fireworks.models.d.ts.map +1 -1
  324. package/dist/providers/fireworks.models.js +4 -2
  325. package/dist/providers/fireworks.models.js.map +1 -1
  326. package/dist/providers/github-copilot.js +1 -1
  327. package/dist/providers/github-copilot.js.map +1 -1
  328. package/dist/providers/github-copilot.models.d.ts +4 -2
  329. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  330. package/dist/providers/github-copilot.models.js +4 -2
  331. package/dist/providers/github-copilot.models.js.map +1 -1
  332. package/dist/providers/google-vertex.d.ts.map +1 -1
  333. package/dist/providers/google-vertex.js +15 -7
  334. package/dist/providers/google-vertex.js.map +1 -1
  335. package/dist/providers/google-vertex.models.d.ts +4 -2
  336. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  337. package/dist/providers/google-vertex.models.js +4 -2
  338. package/dist/providers/google-vertex.models.js.map +1 -1
  339. package/dist/providers/google.models.d.ts +4 -2
  340. package/dist/providers/google.models.d.ts.map +1 -1
  341. package/dist/providers/google.models.js +4 -2
  342. package/dist/providers/google.models.js.map +1 -1
  343. package/dist/providers/groq.models.d.ts +4 -2
  344. package/dist/providers/groq.models.d.ts.map +1 -1
  345. package/dist/providers/groq.models.js +4 -2
  346. package/dist/providers/groq.models.js.map +1 -1
  347. package/dist/providers/huggingface.models.d.ts +4 -2
  348. package/dist/providers/huggingface.models.d.ts.map +1 -1
  349. package/dist/providers/huggingface.models.js +4 -2
  350. package/dist/providers/huggingface.models.js.map +1 -1
  351. package/dist/providers/images/register-builtins.d.ts +1 -1
  352. package/dist/providers/images/register-builtins.d.ts.map +1 -1
  353. package/dist/providers/images/register-builtins.js.map +1 -1
  354. package/dist/providers/kimi-coding.d.ts.map +1 -1
  355. package/dist/providers/kimi-coding.js +1 -0
  356. package/dist/providers/kimi-coding.js.map +1 -1
  357. package/dist/providers/kimi-coding.models.d.ts +4 -2
  358. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  359. package/dist/providers/kimi-coding.models.js +4 -2
  360. package/dist/providers/kimi-coding.models.js.map +1 -1
  361. package/dist/providers/meta.d.ts +3 -0
  362. package/dist/providers/meta.d.ts.map +1 -0
  363. package/dist/providers/meta.js +24 -0
  364. package/dist/providers/meta.js.map +1 -0
  365. package/dist/providers/meta.models.d.ts +6 -0
  366. package/dist/providers/meta.models.d.ts.map +1 -0
  367. package/dist/providers/meta.models.js +8 -0
  368. package/dist/providers/meta.models.js.map +1 -0
  369. package/dist/providers/minimax-cn.models.d.ts +4 -2
  370. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  371. package/dist/providers/minimax-cn.models.js +4 -2
  372. package/dist/providers/minimax-cn.models.js.map +1 -1
  373. package/dist/providers/minimax.models.d.ts +4 -2
  374. package/dist/providers/minimax.models.d.ts.map +1 -1
  375. package/dist/providers/minimax.models.js +4 -2
  376. package/dist/providers/minimax.models.js.map +1 -1
  377. package/dist/providers/mistral.models.d.ts +4 -2
  378. package/dist/providers/mistral.models.d.ts.map +1 -1
  379. package/dist/providers/mistral.models.js +4 -2
  380. package/dist/providers/mistral.models.js.map +1 -1
  381. package/dist/providers/moonshotai-cn.models.d.ts +4 -2
  382. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  383. package/dist/providers/moonshotai-cn.models.js +4 -2
  384. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  385. package/dist/providers/moonshotai.models.d.ts +4 -2
  386. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  387. package/dist/providers/moonshotai.models.js +4 -2
  388. package/dist/providers/moonshotai.models.js.map +1 -1
  389. package/dist/providers/nvidia.models.d.ts +4 -2
  390. package/dist/providers/nvidia.models.d.ts.map +1 -1
  391. package/dist/providers/nvidia.models.js +4 -2
  392. package/dist/providers/nvidia.models.js.map +1 -1
  393. package/dist/providers/openai-codex.d.ts.map +1 -1
  394. package/dist/providers/openai-codex.js +6 -2
  395. package/dist/providers/openai-codex.js.map +1 -1
  396. package/dist/providers/openai-codex.models.d.ts +4 -2
  397. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  398. package/dist/providers/openai-codex.models.js +4 -2
  399. package/dist/providers/openai-codex.models.js.map +1 -1
  400. package/dist/providers/openai.d.ts.map +1 -1
  401. package/dist/providers/openai.js +11 -2
  402. package/dist/providers/openai.js.map +1 -1
  403. package/dist/providers/openai.models.d.ts +4 -2
  404. package/dist/providers/openai.models.d.ts.map +1 -1
  405. package/dist/providers/openai.models.js +4 -2
  406. package/dist/providers/openai.models.js.map +1 -1
  407. package/dist/providers/opencode-go.d.ts.map +1 -1
  408. package/dist/providers/opencode-go.js +4 -3
  409. package/dist/providers/opencode-go.js.map +1 -1
  410. package/dist/providers/opencode-go.models.d.ts +4 -2
  411. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  412. package/dist/providers/opencode-go.models.js +4 -2
  413. package/dist/providers/opencode-go.models.js.map +1 -1
  414. package/dist/providers/opencode-headers.d.ts +4 -0
  415. package/dist/providers/opencode-headers.d.ts.map +1 -0
  416. package/dist/providers/opencode-headers.js +22 -0
  417. package/dist/providers/opencode-headers.js.map +1 -0
  418. package/dist/providers/opencode.d.ts +3 -1
  419. package/dist/providers/opencode.d.ts.map +1 -1
  420. package/dist/providers/opencode.js +10 -6
  421. package/dist/providers/opencode.js.map +1 -1
  422. package/dist/providers/opencode.models.d.ts +4 -2
  423. package/dist/providers/opencode.models.d.ts.map +1 -1
  424. package/dist/providers/opencode.models.js +4 -2
  425. package/dist/providers/opencode.models.js.map +1 -1
  426. package/dist/providers/openrouter.d.ts +1 -1
  427. package/dist/providers/openrouter.d.ts.map +1 -1
  428. package/dist/providers/openrouter.js +16 -3
  429. package/dist/providers/openrouter.js.map +1 -1
  430. package/dist/providers/openrouter.models.d.ts +4 -2
  431. package/dist/providers/openrouter.models.d.ts.map +1 -1
  432. package/dist/providers/openrouter.models.js +4 -2
  433. package/dist/providers/openrouter.models.js.map +1 -1
  434. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
  435. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
  436. package/dist/providers/qwen-token-plan-cn.models.js +4 -2
  437. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
  438. package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
  439. package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
  440. package/dist/providers/qwen-token-plan-individual.js +15 -0
  441. package/dist/providers/qwen-token-plan-individual.js.map +1 -0
  442. package/dist/providers/qwen-token-plan-individual.models.d.ts +6 -0
  443. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
  444. package/dist/providers/qwen-token-plan-individual.models.js +8 -0
  445. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
  446. package/dist/providers/qwen-token-plan.models.d.ts +4 -2
  447. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
  448. package/dist/providers/qwen-token-plan.models.js +4 -2
  449. package/dist/providers/qwen-token-plan.models.js.map +1 -1
  450. package/dist/providers/radius.d.ts.map +1 -1
  451. package/dist/providers/radius.js +53 -29
  452. package/dist/providers/radius.js.map +1 -1
  453. package/dist/providers/radius.models.d.ts +6 -0
  454. package/dist/providers/radius.models.d.ts.map +1 -0
  455. package/dist/providers/radius.models.js +8 -0
  456. package/dist/providers/radius.models.js.map +1 -0
  457. package/dist/providers/together.models.d.ts +4 -2
  458. package/dist/providers/together.models.d.ts.map +1 -1
  459. package/dist/providers/together.models.js +4 -2
  460. package/dist/providers/together.models.js.map +1 -1
  461. package/dist/providers/typesafe.d.ts +3 -0
  462. package/dist/providers/typesafe.d.ts.map +1 -0
  463. package/dist/providers/typesafe.js +18 -0
  464. package/dist/providers/typesafe.js.map +1 -0
  465. package/dist/providers/typesafe.models.d.ts +6 -0
  466. package/dist/providers/typesafe.models.d.ts.map +1 -0
  467. package/dist/providers/typesafe.models.js +8 -0
  468. package/dist/providers/typesafe.models.js.map +1 -0
  469. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -1
  470. package/dist/providers/vercel-ai-gateway.js +5 -2
  471. package/dist/providers/vercel-ai-gateway.js.map +1 -1
  472. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
  473. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  474. package/dist/providers/vercel-ai-gateway.models.js +4 -2
  475. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  476. package/dist/providers/xai.d.ts.map +1 -1
  477. package/dist/providers/xai.js +1 -0
  478. package/dist/providers/xai.js.map +1 -1
  479. package/dist/providers/xai.models.d.ts +4 -2
  480. package/dist/providers/xai.models.d.ts.map +1 -1
  481. package/dist/providers/xai.models.js +4 -2
  482. package/dist/providers/xai.models.js.map +1 -1
  483. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
  484. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  485. package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
  486. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  487. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
  488. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  489. package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
  490. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  491. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
  492. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  493. package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
  494. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  495. package/dist/providers/xiaomi.models.d.ts +4 -2
  496. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  497. package/dist/providers/xiaomi.models.js +4 -2
  498. package/dist/providers/xiaomi.models.js.map +1 -1
  499. package/dist/providers/zai-coding-cn.models.d.ts +4 -2
  500. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  501. package/dist/providers/zai-coding-cn.models.js +4 -2
  502. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  503. package/dist/providers/zai.models.d.ts +4 -2
  504. package/dist/providers/zai.models.d.ts.map +1 -1
  505. package/dist/providers/zai.models.js +4 -2
  506. package/dist/providers/zai.models.js.map +1 -1
  507. package/dist/types.d.ts +409 -128
  508. package/dist/types.d.ts.map +1 -1
  509. package/dist/types.js.map +1 -1
  510. package/dist/utils/abort.d.ts +8 -0
  511. package/dist/utils/abort.d.ts.map +1 -0
  512. package/dist/utils/abort.js +49 -0
  513. package/dist/utils/abort.js.map +1 -0
  514. package/dist/utils/assistant-message-frame.d.ts +77 -0
  515. package/dist/utils/assistant-message-frame.d.ts.map +1 -0
  516. package/dist/utils/assistant-message-frame.js +425 -0
  517. package/dist/utils/assistant-message-frame.js.map +1 -0
  518. package/dist/utils/diagnostics.d.ts +3 -2
  519. package/dist/utils/diagnostics.d.ts.map +1 -1
  520. package/dist/utils/diagnostics.js.map +1 -1
  521. package/dist/utils/draht-user-agent.d.ts +2 -0
  522. package/dist/utils/draht-user-agent.d.ts.map +1 -0
  523. package/dist/utils/{pi-user-agent.js → draht-user-agent.js} +3 -3
  524. package/dist/utils/draht-user-agent.js.map +1 -0
  525. package/dist/utils/estimate.d.ts +2 -2
  526. package/dist/utils/estimate.d.ts.map +1 -1
  527. package/dist/utils/estimate.js +8 -29
  528. package/dist/utils/estimate.js.map +1 -1
  529. package/dist/utils/event-stream.d.ts.map +1 -1
  530. package/dist/utils/event-stream.js +30 -8
  531. package/dist/utils/event-stream.js.map +1 -1
  532. package/dist/utils/headers.d.ts +1 -1
  533. package/dist/utils/headers.d.ts.map +1 -1
  534. package/dist/utils/headers.js +10 -8
  535. package/dist/utils/headers.js.map +1 -1
  536. package/dist/utils/model-operations.d.ts +11 -0
  537. package/dist/utils/model-operations.d.ts.map +1 -0
  538. package/dist/utils/model-operations.js +47 -0
  539. package/dist/utils/model-operations.js.map +1 -0
  540. package/dist/utils/models-error.d.ts +8 -0
  541. package/dist/utils/models-error.d.ts.map +1 -0
  542. package/dist/utils/models-error.js +19 -0
  543. package/dist/utils/models-error.js.map +1 -0
  544. package/dist/utils/oauth-page.d.ts.map +1 -0
  545. package/dist/utils/oauth-page.js.map +1 -0
  546. package/dist/utils/overflow.d.ts +11 -1
  547. package/dist/utils/overflow.d.ts.map +1 -1
  548. package/dist/utils/overflow.js +24 -6
  549. package/dist/utils/overflow.js.map +1 -1
  550. package/dist/utils/provider-retry.js +3 -2
  551. package/dist/utils/provider-retry.js.map +1 -1
  552. package/dist/utils/retry.d.ts +6 -1
  553. package/dist/utils/retry.d.ts.map +1 -1
  554. package/dist/utils/retry.js +18 -2
  555. package/dist/utils/retry.js.map +1 -1
  556. package/dist/utils/sleep.d.ts +1 -1
  557. package/dist/utils/sleep.d.ts.map +1 -1
  558. package/dist/utils/sleep.js +4 -4
  559. package/dist/utils/sleep.js.map +1 -1
  560. package/dist/utils/text.d.ts +9 -1
  561. package/dist/utils/text.d.ts.map +1 -1
  562. package/dist/utils/text.js +26 -0
  563. package/dist/utils/text.js.map +1 -1
  564. package/dist/utils/transcript.d.ts +84 -0
  565. package/dist/utils/transcript.d.ts.map +1 -0
  566. package/dist/utils/transcript.js +204 -0
  567. package/dist/utils/transcript.js.map +1 -0
  568. package/dist/utils/uuid.d.ts +2 -2
  569. package/dist/utils/uuid.d.ts.map +1 -1
  570. package/dist/utils/uuid.js +35 -40
  571. package/dist/utils/uuid.js.map +1 -1
  572. package/dist/utils/validation.d.ts.map +1 -1
  573. package/dist/utils/validation.js +34 -0
  574. package/dist/utils/validation.js.map +1 -1
  575. package/package.json +19 -13
  576. package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
  577. package/dist/auth/oauth/oauth-page.js.map +0 -1
  578. package/dist/image-models.generated.d.ts +0 -605
  579. package/dist/image-models.generated.d.ts.map +0 -1
  580. package/dist/image-models.generated.js +0 -607
  581. package/dist/image-models.generated.js.map +0 -1
  582. package/dist/images-models.d.ts +0 -95
  583. package/dist/images-models.d.ts.map +0 -1
  584. package/dist/images-models.js +0 -140
  585. package/dist/images-models.js.map +0 -1
  586. package/dist/providers/openrouter-images.d.ts +0 -3
  587. package/dist/providers/openrouter-images.d.ts.map +0 -1
  588. package/dist/providers/openrouter-images.js +0 -22
  589. package/dist/providers/openrouter-images.js.map +0 -1
  590. package/dist/utils/deferred-tools.d.ts +0 -9
  591. package/dist/utils/deferred-tools.d.ts.map +0 -1
  592. package/dist/utils/deferred-tools.js +0 -36
  593. package/dist/utils/deferred-tools.js.map +0 -1
  594. package/dist/utils/pi-user-agent.d.ts +0 -2
  595. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  596. package/dist/utils/pi-user-agent.js.map +0 -1
  597. /package/dist/{auth/oauth → utils}/oauth-page.d.ts +0 -0
  598. /package/dist/{auth/oauth → utils}/oauth-page.js +0 -0
@@ -1,18 +1,19 @@
1
1
  import { AzureOpenAI } from "openai";
2
2
  import { clampThinkingLevel } from "../models.js";
3
+ import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
3
4
  import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
4
5
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
6
  import { headersToRecord } from "../utils/headers.js";
6
- import { getPiUserAgent } from "../utils/pi-user-agent.js";
7
7
  import { getProviderEnvValue } from "../utils/provider-env.js";
8
8
  import { retryProviderRequest } from "../utils/provider-retry.js";
9
+ import { getDeclaredTools, resolveTranscript, resolveTranscriptTools } from "../utils/transcript.js";
9
10
  import { createGrammarToolInputProperties } from "./constrained-sampling.js";
10
11
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
11
12
  import { convertResponsesMessages, convertResponsesTools, processResponsesStream } from "./openai-responses-shared.js";
12
13
  import { buildBaseOptions } from "./simple-options.js";
13
14
  const DEFAULT_AZURE_API_VERSION = "v1";
14
15
  const AZURE_TOOL_CALL_PROVIDERS = new Set(["openai", "openai-codex", "opencode", "azure-openai-responses"]);
15
- // OpenAI Responses rejects max_output_tokens below 16: https://github.com/earendil-works/pi/issues/6265
16
+ // OpenAI Responses rejects max_output_tokens below 16: https://github.com/badlogic/pi-mono/issues/6265
16
17
  const OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;
17
18
  function parseDeploymentNameMap(value) {
18
19
  const map = new Map();
@@ -44,6 +45,7 @@ function formatAzureOpenAIError(error) {
44
45
  */
45
46
  export const stream = (model, context, options) => {
46
47
  const stream = new AssistantMessageEventStream();
48
+ const normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);
47
49
  // Start async processing
48
50
  (async () => {
49
51
  const deploymentName = resolveDeploymentName(model, options);
@@ -71,8 +73,8 @@ export const stream = (model, context, options) => {
71
73
  throw new Error(`No API key for provider: ${model.provider}`);
72
74
  }
73
75
  const client = createClient(model, apiKey, options);
74
- const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false);
75
- let params = buildParams(model, context, options, deploymentName, grammarToolInputProperties);
76
+ const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), model.compat?.supportsOpenAIGrammarTools ?? false);
77
+ let params = buildParams(model, normalizedContext, options, deploymentName, grammarToolInputProperties);
76
78
  const nextParams = await options?.onPayload?.(params, model);
77
79
  if (nextParams !== undefined) {
78
80
  params = nextParams;
@@ -89,7 +91,10 @@ export const stream = (model, context, options) => {
89
91
  });
90
92
  await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
91
93
  stream.push({ type: "start", partial: output });
92
- await processResponsesStream(openaiStream, output, stream, model, { grammarToolInputProperties });
94
+ await processResponsesStream(openaiStream, output, stream, model, {
95
+ onProviderStreamEvent: options?.onProviderStreamEvent,
96
+ grammarToolInputProperties,
97
+ });
93
98
  if (options?.signal?.aborted) {
94
99
  throw new Error("Request was aborted");
95
100
  }
@@ -97,7 +102,7 @@ export const stream = (model, context, options) => {
97
102
  throw new Error("Azure OpenAI Responses stream ended without a stop reason");
98
103
  }
99
104
  if (output.stopReason === "aborted" || output.stopReason === "error") {
100
- throw new Error("An unknown error occurred");
105
+ throw new Error(output.errorMessage || "An unknown error occurred");
101
106
  }
102
107
  stream.push({ type: "done", reason: output.stopReason, message: output });
103
108
  stream.end();
@@ -122,7 +127,10 @@ export const streamSimple = (model, context, options) => {
122
127
  if (!apiKey) {
123
128
  throw new Error(`No API key for provider: ${model.provider}`);
124
129
  }
125
- const base = buildBaseOptions(model, context, options, apiKey);
130
+ const base = {
131
+ ...buildBaseOptions(model, context, options, apiKey),
132
+ toolChoice: options?.toolChoice,
133
+ };
126
134
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
127
135
  const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
128
136
  return stream(model, context, {
@@ -180,7 +188,7 @@ function resolveAzureConfig(model, options) {
180
188
  };
181
189
  }
182
190
  function createClient(model, apiKey, options) {
183
- const headers = { "User-Agent": getPiUserAgent(), ...model.headers };
191
+ const headers = { "User-Agent": getDrahtUserAgent(), ...model.headers };
184
192
  if (options?.headers) {
185
193
  Object.assign(headers, options.headers);
186
194
  }
@@ -194,9 +202,19 @@ function createClient(model, apiKey, options) {
194
202
  baseURL: baseUrl,
195
203
  });
196
204
  }
197
- function buildParams(model, context, options, deploymentName, grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false)) {
205
+ function buildParams(model, context, options, deploymentName, grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), model.compat?.supportsOpenAIGrammarTools ?? false)) {
206
+ const supportsAdditionalTools = model.compat?.supportsAdditionalTools ?? false;
207
+ const supportsToolSearch = model.compat?.supportsToolSearch ?? false;
208
+ const transcriptTools = resolveTranscriptTools(context.messages, supportsAdditionalTools || supportsToolSearch);
198
209
  const messages = convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS, {
199
210
  grammarToolInputProperties,
211
+ supportsMidConvoSystemMessages: model.compat?.supportsMidConvoSystemMessages ?? false,
212
+ supportsAdditionalTools,
213
+ supportsToolSearch,
214
+ toolOptions: {
215
+ supportsStrictMode: model.compat?.supportsStrictMode ?? true,
216
+ supportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,
217
+ },
200
218
  });
201
219
  const params = {
202
220
  model: deploymentName,
@@ -211,12 +229,15 @@ function buildParams(model, context, options, deploymentName, grammarToolInputPr
211
229
  if (options?.temperature !== undefined) {
212
230
  params.temperature = options?.temperature;
213
231
  }
214
- if (context.tools && context.tools.length > 0) {
215
- params.tools = convertResponsesTools(context.tools, {
232
+ if (transcriptTools.requestTools.length > 0) {
233
+ params.tools = convertResponsesTools(transcriptTools.requestTools, {
216
234
  supportsStrictMode: model.compat?.supportsStrictMode ?? true,
217
235
  supportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,
218
236
  });
219
237
  }
238
+ if (options?.toolChoice !== undefined) {
239
+ params.tool_choice = options.toolChoice;
240
+ }
220
241
  if (model.reasoning) {
221
242
  if (options?.reasoningEffort || options?.reasoningSummary) {
222
243
  const effort = options?.reasoningEffort
@@ -234,6 +255,8 @@ function buildParams(model, context, options, deploymentName, grammarToolInputPr
234
255
  };
235
256
  }
236
257
  }
258
+ // Last so custom keys override the named request fields. Per-request keys override model defaults.
259
+ Object.assign(params, model.samplingParams, options?.samplingParams);
237
260
  return params;
238
261
  }
239
262
  //# sourceMappingURL=azure-openai-responses.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"azure-openai-responses.js","sourceRoot":"","sources":["../../src/api/azure-openai-responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUlD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAC5G,wGAAwG;AACxG,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAE9C,SAAS,sBAAsB,CAAC,KAAyB;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc;YAAE,SAAS;QAC1C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAsC,EAAE,OAAqC;IAC3G,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,mBAAmB,CAAC;IACpC,CAAC;IACD,MAAM,gBAAgB,GAAG,sBAAsB,CAC9C,mBAAmB,CAAC,kCAAkC,EAAE,OAAO,EAAE,GAAG,CAAC,CACrE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,gBAAgB,IAAI,KAAK,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC7C,OAAO,mBAAmB,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC;AACrF,CAAC;AAYD;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAA0E,CAC5F,KAAsC,EACtC,OAAgB,EAChB,OAAqC,EACP,EAAE;IAChC,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;IAEjD,yBAAyB;IACzB,CAAC,KAAK,IAAI,EAAE;QACX,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAqB;YAChC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,wBAA+B;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE;gBACN,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACpE;YACD,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QAEF,IAAI,CAAC;YACJ,6BAA6B;YAC7B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;YAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,0BAA0B,GAAG,gCAAgC,CAClE,OAAO,CAAC,KAAK,EACb,KAAK,CAAC,MAAM,EAAE,0BAA0B,IAAI,KAAK,CACjD,CAAC;YACF,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC9F,MAAM,UAAU,GAAG,MAAM,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,GAAG,UAA2C,CAAC;YACtD,CAAC;YACD,MAAM,cAAc,GAAG;gBACtB,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3E,UAAU,EAAE,CAAC;aACb,CAAC;YACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAClE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,YAAY,EAAE,EACpE;gBACC,UAAU,EAAE,OAAO,EAAE,UAAU;gBAC/B,eAAe,EAAE,OAAO,EAAE,eAAe;gBACzC,MAAM,EAAE,OAAO,EAAE,MAAM;aACvB,CACD,CAAC;YACF,MAAM,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhD,MAAM,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAElG,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1E,MAAM,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAQ,KAA4B,CAAC,KAAK,CAAC;gBAC3C,8EAA8E;gBAC9E,OAAQ,KAAkC,CAAC,WAAW,CAAC;gBACvD,OAAQ,KAAmC,CAAC,WAAW,CAAC;YACzD,CAAC;YACD,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,MAAM,CAAC,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzE,MAAM,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;IACF,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAkE,CAC1F,KAAsC,EACtC,OAAgB,EAChB,OAA6B,EACC,EAAE;IAChC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,MAAM,eAAe,GAAG,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAElF,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE;QAC7B,GAAG,IAAI;QACP,eAAe;KACuB,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,SAAS,qBAAqB,CAAC,OAAe;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,WAAW,GAChB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1C,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACrD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAExD,yEAAyE;IACzE,qEAAqE;IACrE,IACC,WAAW;QACX,CAAC,cAAc,KAAK,EAAE;YACrB,cAAc,KAAK,GAAG;YACtB,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,sBAAsB,CAAC,EAC1C,CAAC;QACF,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC5B,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB;IAChD,OAAO,WAAW,YAAY,6BAA6B,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAsC,EACtC,OAAqC;IAErC,MAAM,UAAU,GACf,OAAO,EAAE,eAAe;QACxB,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,EAAE,GAAG,CAAC;QAC7D,yBAAyB,CAAC;IAE3B,MAAM,OAAO,GACZ,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC,uBAAuB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAClH,MAAM,YAAY,GAAG,OAAO,EAAE,iBAAiB,IAAI,mBAAmB,CAAC,4BAA4B,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAEnH,IAAI,eAAe,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,eAAe,IAAI,YAAY,EAAE,CAAC;QACtC,eAAe,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACvC,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACd,wJAAwJ,CACxJ,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO,EAAE,qBAAqB,CAAC,eAAe,CAAC;QAC/C,UAAU;KACV,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAsC,EAAE,MAAc,EAAE,OAAqC;IAClH,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAErE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEnE,OAAO,IAAI,WAAW,CAAC;QACtB,MAAM;QACN,UAAU;QACV,uBAAuB,EAAE,IAAI;QAC7B,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,OAAO;KAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CACnB,KAAsC,EACtC,OAAgB,EAChB,OAAgD,EAChD,cAAsB,EACtB,0BAA0B,GAAgC,gCAAgC,CACzF,OAAO,CAAC,KAAK,EACb,KAAK,CAAC,MAAM,EAAE,0BAA0B,IAAI,KAAK,CACjD;IAED,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE;QACpF,0BAA0B;KAC1B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAkC;QAC7C,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI;QACZ,gBAAgB,EAAE,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC;QAC/D,KAAK,EAAE,KAAK;KACZ,CAAC;IAEF,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE;YACnD,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,IAAI,IAAI;YAC5D,0BAA0B,EAAE,KAAK,CAAC,MAAM,EAAE,0BAA0B,IAAI,KAAK;SAC7E,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,OAAO,EAAE,eAAe;gBACtC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC;gBAChF,CAAC,CAAC,QAAQ,CAAC;YACZ,MAAM,CAAC,SAAS,GAAG;gBAClB,MAAM,EAAE,MAAwD;gBAChE,OAAO,EAAE,OAAO,EAAE,gBAAgB,IAAI,MAAM;aAC5C,CAAC;YACF,MAAM,CAAC,OAAO,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,CAAC,SAAS,GAAG;gBAClB,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,MAAM,CAAmD;aACjG,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["import { AzureOpenAI } from \"openai\";\nimport type { ResponseCreateParamsStreaming } from \"openai/resources/responses/responses.js\";\nimport { clampThinkingLevel } from \"../models.ts\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n} 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 { getProviderEnvValue } from \"../utils/provider-env.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.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 } from \"./simple-options.ts\";\n\nconst DEFAULT_AZURE_API_VERSION = \"v1\";\nconst AZURE_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\", \"azure-openai-responses\"]);\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 parseDeploymentNameMap(value: string | undefined): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tif (!value) return map;\n\tfor (const entry of value.split(\",\")) {\n\t\tconst trimmed = entry.trim();\n\t\tif (!trimmed) continue;\n\t\tconst [modelId, deploymentName] = trimmed.split(\"=\", 2);\n\t\tif (!modelId || !deploymentName) continue;\n\t\tmap.set(modelId.trim(), deploymentName.trim());\n\t}\n\treturn map;\n}\n\nfunction resolveDeploymentName(model: Model<\"azure-openai-responses\">, options?: AzureOpenAIResponsesOptions): string {\n\tif (options?.azureDeploymentName) {\n\t\treturn options.azureDeploymentName;\n\t}\n\tconst mappedDeployment = parseDeploymentNameMap(\n\t\tgetProviderEnvValue(\"AZURE_OPENAI_DEPLOYMENT_NAME_MAP\", options?.env),\n\t).get(model.id);\n\treturn mappedDeployment || model.id;\n}\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 StreamOptions {\n\treasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\treasoningSummary?: \"auto\" | \"detailed\" | \"concise\" | null;\n\tazureApiVersion?: string;\n\tazureResourceName?: string;\n\tazureBaseUrl?: string;\n\tazureDeploymentName?: string;\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: Context,\n\toptions?: AzureOpenAIResponsesOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\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\tcontext.tools,\n\t\t\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t\t);\n\t\t\tlet params = buildParams(model, context, 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, { grammarToolInputProperties });\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(\"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: Context,\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 = buildBaseOptions(model, context, options, apiKey);\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 normalizeAzureBaseUrl(baseUrl: string): string {\n\tconst trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`Invalid Azure OpenAI base URL: ${baseUrl}`);\n\t}\n\n\tconst isAzureHost =\n\t\turl.hostname.endsWith(\".openai.azure.com\") ||\n\t\turl.hostname.endsWith(\".cognitiveservices.azure.com\") ||\n\t\turl.hostname.endsWith(\".ai.azure.com\");\n\tconst normalizedPath = url.pathname.replace(/\\/+$/, \"\");\n\n\t// Ensure Azure hosts have /openai/v1 as base path so the AzureOpenAI SDK\n\t// can append /deployments/<model>/... and ?api-version=v1 correctly.\n\tif (\n\t\tisAzureHost &&\n\t\t(normalizedPath === \"\" ||\n\t\t\tnormalizedPath === \"/\" ||\n\t\t\tnormalizedPath === \"/openai\" ||\n\t\t\tnormalizedPath === \"/openai/v1/responses\")\n\t) {\n\t\turl.pathname = \"/openai/v1\";\n\t\turl.search = \"\";\n\t}\n\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nfunction buildDefaultBaseUrl(resourceName: string): string {\n\treturn `https://${resourceName}.openai.azure.com/openai/v1`;\n}\n\nfunction resolveAzureConfig(\n\tmodel: Model<\"azure-openai-responses\">,\n\toptions?: AzureOpenAIResponsesOptions,\n): { baseUrl: string; apiVersion: string } {\n\tconst apiVersion =\n\t\toptions?.azureApiVersion ||\n\t\tgetProviderEnvValue(\"AZURE_OPENAI_API_VERSION\", options?.env) ||\n\t\tDEFAULT_AZURE_API_VERSION;\n\n\tconst baseUrl =\n\t\toptions?.azureBaseUrl?.trim() || getProviderEnvValue(\"AZURE_OPENAI_BASE_URL\", options?.env)?.trim() || undefined;\n\tconst resourceName = options?.azureResourceName || getProviderEnvValue(\"AZURE_OPENAI_RESOURCE_NAME\", options?.env);\n\n\tlet resolvedBaseUrl = baseUrl;\n\n\tif (!resolvedBaseUrl && resourceName) {\n\t\tresolvedBaseUrl = buildDefaultBaseUrl(resourceName);\n\t}\n\n\tif (!resolvedBaseUrl && model.baseUrl) {\n\t\tresolvedBaseUrl = model.baseUrl;\n\t}\n\n\tif (!resolvedBaseUrl) {\n\t\tthrow new Error(\n\t\t\t\"Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.\",\n\t\t);\n\t}\n\n\treturn {\n\t\tbaseUrl: normalizeAzureBaseUrl(resolvedBaseUrl),\n\t\tapiVersion,\n\t};\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: Context,\n\toptions: AzureOpenAIResponsesOptions | undefined,\n\tdeploymentName: string,\n\tgrammarToolInputProperties: ReadonlyMap<string, string> = createGrammarToolInputProperties(\n\t\tcontext.tools,\n\t\tmodel.compat?.supportsOpenAIGrammarTools ?? false,\n\t),\n) {\n\tconst messages = convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS, {\n\t\tgrammarToolInputProperties,\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 (context.tools && context.tools.length > 0) {\n\t\tparams.tools = convertResponsesTools(context.tools, {\n\t\t\tsupportsStrictMode: model.compat?.supportsStrictMode ?? true,\n\t\t\tsupportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n\t\t});\n\t}\n\n\tif (model.reasoning) {\n\t\tif (options?.reasoningEffort || options?.reasoningSummary) {\n\t\t\tconst effort = options?.reasoningEffort\n\t\t\t\t? (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort)\n\t\t\t\t: \"medium\";\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\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 {\n\tApi,\n\tAssistantMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n\tTranscriptContext,\n} from \"../types.ts\";\nimport { getDrahtUserAgent } from \"../utils/draht-user-agent.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { getProviderEnvValue } from \"../utils/provider-env.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { getDeclaredTools, resolveTranscript, resolveTranscriptTools } from \"../utils/transcript.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 } from \"./simple-options.ts\";\n\nconst DEFAULT_AZURE_API_VERSION = \"v1\";\nconst AZURE_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\", \"azure-openai-responses\"]);\n// OpenAI Responses rejects max_output_tokens below 16: https://github.com/badlogic/pi-mono/issues/6265\nconst OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;\n\nfunction parseDeploymentNameMap(value: string | undefined): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tif (!value) return map;\n\tfor (const entry of value.split(\",\")) {\n\t\tconst trimmed = entry.trim();\n\t\tif (!trimmed) continue;\n\t\tconst [modelId, deploymentName] = trimmed.split(\"=\", 2);\n\t\tif (!modelId || !deploymentName) continue;\n\t\tmap.set(modelId.trim(), deploymentName.trim());\n\t}\n\treturn map;\n}\n\nfunction resolveDeploymentName(model: Model<\"azure-openai-responses\">, options?: AzureOpenAIResponsesOptions): string {\n\tif (options?.azureDeploymentName) {\n\t\treturn options.azureDeploymentName;\n\t}\n\tconst mappedDeployment = parseDeploymentNameMap(\n\t\tgetProviderEnvValue(\"AZURE_OPENAI_DEPLOYMENT_NAME_MAP\", options?.env),\n\t).get(model.id);\n\treturn mappedDeployment || model.id;\n}\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 StreamOptions {\n\treasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ttoolChoice?: ResponseCreateParamsStreaming[\"tool_choice\"];\n\treasoningSummary?: \"auto\" | \"detailed\" | \"concise\" | null;\n\tazureApiVersion?: string;\n\tazureResourceName?: string;\n\tazureBaseUrl?: string;\n\tazureDeploymentName?: string;\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 normalizeAzureBaseUrl(baseUrl: string): string {\n\tconst trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`Invalid Azure OpenAI base URL: ${baseUrl}`);\n\t}\n\n\tconst isAzureHost =\n\t\turl.hostname.endsWith(\".openai.azure.com\") ||\n\t\turl.hostname.endsWith(\".cognitiveservices.azure.com\") ||\n\t\turl.hostname.endsWith(\".ai.azure.com\");\n\tconst normalizedPath = url.pathname.replace(/\\/+$/, \"\");\n\n\t// Ensure Azure hosts have /openai/v1 as base path so the AzureOpenAI SDK\n\t// can append /deployments/<model>/... and ?api-version=v1 correctly.\n\tif (\n\t\tisAzureHost &&\n\t\t(normalizedPath === \"\" ||\n\t\t\tnormalizedPath === \"/\" ||\n\t\t\tnormalizedPath === \"/openai\" ||\n\t\t\tnormalizedPath === \"/openai/v1/responses\")\n\t) {\n\t\turl.pathname = \"/openai/v1\";\n\t\turl.search = \"\";\n\t}\n\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nfunction buildDefaultBaseUrl(resourceName: string): string {\n\treturn `https://${resourceName}.openai.azure.com/openai/v1`;\n}\n\nfunction resolveAzureConfig(\n\tmodel: Model<\"azure-openai-responses\">,\n\toptions?: AzureOpenAIResponsesOptions,\n): { baseUrl: string; apiVersion: string } {\n\tconst apiVersion =\n\t\toptions?.azureApiVersion ||\n\t\tgetProviderEnvValue(\"AZURE_OPENAI_API_VERSION\", options?.env) ||\n\t\tDEFAULT_AZURE_API_VERSION;\n\n\tconst baseUrl =\n\t\toptions?.azureBaseUrl?.trim() || getProviderEnvValue(\"AZURE_OPENAI_BASE_URL\", options?.env)?.trim() || undefined;\n\tconst resourceName = options?.azureResourceName || getProviderEnvValue(\"AZURE_OPENAI_RESOURCE_NAME\", options?.env);\n\n\tlet resolvedBaseUrl = baseUrl;\n\n\tif (!resolvedBaseUrl && resourceName) {\n\t\tresolvedBaseUrl = buildDefaultBaseUrl(resourceName);\n\t}\n\n\tif (!resolvedBaseUrl && model.baseUrl) {\n\t\tresolvedBaseUrl = model.baseUrl;\n\t}\n\n\tif (!resolvedBaseUrl) {\n\t\tthrow new Error(\n\t\t\t\"Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.\",\n\t\t);\n\t}\n\n\treturn {\n\t\tbaseUrl: normalizeAzureBaseUrl(resolvedBaseUrl),\n\t\tapiVersion,\n\t};\n}\n\nfunction createClient(model: Model<\"azure-openai-responses\">, apiKey: string, options?: AzureOpenAIResponsesOptions) {\n\tconst headers = { \"User-Agent\": getDrahtUserAgent(), ...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\tif (model.reasoning) {\n\t\tif (options?.reasoningEffort || options?.reasoningSummary) {\n\t\t\tconst effort = options?.reasoningEffort\n\t\t\t\t? (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort)\n\t\t\t\t: \"medium\";\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 custom keys override the named request fields. Per-request keys override model defaults.\n\tObject.assign(params, model.samplingParams, options?.samplingParams);\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,EAQX,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAEb,eAAe,EAEf,aAAa,EAIb,MAAM,aAAa,CAAC;AAiBrB,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;AAMD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,yBAAyB,EAAE,cAAc,CAoN5E,CAAC;AAqFF,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,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;AAcD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,yBAAyB,EAAE,cAAc,CA4O5E,CAAC;AAwKF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,yBAAyB,EAAE,mBAAmB,CAiDvF,CAAC"}
@@ -3,6 +3,7 @@ import { NodeHttpHandler } from "@smithy/node-http-handler";
3
3
  import { HttpProxyAgent } from "http-proxy-agent";
4
4
  import { HttpsProxyAgent } from "https-proxy-agent";
5
5
  import { calculateCost } from "../models.js";
6
+ import { appendAssistantMessageDiagnostic } from "../utils/diagnostics.js";
6
7
  import { normalizeProviderError } from "../utils/error-body.js";
7
8
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
8
9
  import { providerHeadersToRecord } from "../utils/headers.js";
@@ -10,12 +11,18 @@ import { parseStreamingJson } from "../utils/json-parse.js";
10
11
  import { resolveHttpProxyUrlForTarget } from "../utils/node-http-proxy.js";
11
12
  import { getProviderEnvValue } from "../utils/provider-env.js";
12
13
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
13
- import { resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
14
+ import { getSystemMessageText } from "../utils/text.js";
15
+ import { collapseSystemMessages, getCurrentTools, getInitialSystemMessage, withoutInitialSystemMessage, } from "../utils/transcript.js";
16
+ import { getJsonSchemaToolParameters, resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
14
17
  import { adjustMaxTokensForThinking, buildBaseOptions, clampMaxTokensToContext, clampReasoning, } from "./simple-options.js";
15
18
  import { transformMessages } from "./transform-messages.js";
16
19
  const EMPTY_TEXT_PLACEHOLDER = "<empty>";
20
+ /** Matches the placeholder the Anthropic API path uses for redacted thinking. */
21
+ const REDACTED_THINKING_PLACEHOLDER = "[Reasoning redacted]";
17
22
  export const stream = (model, context, options = {}) => {
18
23
  const stream = new AssistantMessageEventStream();
24
+ // Bedrock has no mid-conversation system messages; fold them into the leading prompt.
25
+ const normalizedContext = collapseSystemMessages(context);
19
26
  (async () => {
20
27
  const output = {
21
28
  role: "assistant",
@@ -115,23 +122,35 @@ export const stream = (model, context, options = {}) => {
115
122
  config.token = { token: bearerToken };
116
123
  config.authSchemePreference = ["httpBearerAuth"];
117
124
  }
125
+ // Kept outside the try so the catch can still correlate a mid-stream failure:
126
+ // exceptions delivered as stream events carry no HTTP metadata of their own.
127
+ let responseRequestId;
118
128
  try {
129
+ const supportsStrictMode = model.compat?.supportsStrictMode ?? false;
119
130
  const client = new BedrockRuntimeClient(config);
131
+ let observedRawResponse = false;
132
+ if (options.onResponse) {
133
+ addResponseHeadersMiddleware(client, options.onResponse, model, () => {
134
+ observedRawResponse = true;
135
+ });
136
+ }
120
137
  const customHeaders = providerHeadersToRecord(options.headers);
121
138
  if (customHeaders) {
122
139
  addCustomHeadersMiddleware(client, customHeaders);
123
140
  }
124
141
  const cacheRetention = resolveCacheRetention(options.cacheRetention, options.env);
125
142
  const inferenceMaxTokens = options.maxTokens ?? (isAnthropicClaudeModel(model) ? model.maxTokens : undefined);
143
+ const initialSystemMessage = getInitialSystemMessage(normalizedContext.messages);
144
+ const initialSystemPrompt = initialSystemMessage ? getSystemMessageText(initialSystemMessage) : undefined;
126
145
  let commandInput = {
127
146
  modelId: model.id,
128
- messages: convertMessages(context, model, cacheRetention, options.env),
129
- system: buildSystemPrompt(context.systemPrompt, model, cacheRetention, options.env),
147
+ messages: convertMessages(normalizedContext, model, cacheRetention, options.env),
148
+ system: buildSystemPrompt(initialSystemPrompt, model, cacheRetention, options.env),
130
149
  inferenceConfig: {
131
150
  ...(inferenceMaxTokens !== undefined && { maxTokens: inferenceMaxTokens }),
132
151
  ...(options.temperature !== undefined && { temperature: options.temperature }),
133
152
  },
134
- toolConfig: convertToolConfig(context.tools, options.toolChoice, model.compat?.supportsStrictMode ?? false),
153
+ toolConfig: convertToolConfig(getCurrentTools(normalizedContext.messages), options.toolChoice, supportsStrictMode),
135
154
  additionalModelRequestFields: buildAdditionalModelRequestFields(model, options),
136
155
  ...(options.requestMetadata !== undefined && { requestMetadata: options.requestMetadata }),
137
156
  };
@@ -141,7 +160,8 @@ export const stream = (model, context, options = {}) => {
141
160
  }
142
161
  const command = new ConverseStreamCommand(commandInput);
143
162
  const response = await client.send(command, { abortSignal: options.signal });
144
- if (response.$metadata.httpStatusCode !== undefined) {
163
+ responseRequestId = normalizeDiagnosticValue(response.$metadata.requestId);
164
+ if (!observedRawResponse && response.$metadata.httpStatusCode !== undefined) {
145
165
  const responseHeaders = {};
146
166
  if (response.$metadata.requestId) {
147
167
  responseHeaders["x-amzn-requestid"] = response.$metadata.requestId;
@@ -149,6 +169,7 @@ export const stream = (model, context, options = {}) => {
149
169
  await options?.onResponse?.({ status: response.$metadata.httpStatusCode, headers: responseHeaders }, model);
150
170
  }
151
171
  for await (const item of response.stream) {
172
+ await options.onProviderStreamEvent?.(item, model);
152
173
  if (item.messageStart) {
153
174
  if (item.messageStart.role !== ConversationRole.ASSISTANT) {
154
175
  throw new Error("Unexpected assistant message start but got user message start instead");
@@ -200,17 +221,21 @@ export const stream = (model, context, options = {}) => {
200
221
  if (output.stopReason === "error" || output.stopReason === "aborted") {
201
222
  throw new Error(output.errorMessage || "An unknown error occurred");
202
223
  }
224
+ // A stream can settle without stopping every block, so finalize here too.
225
+ for (const block of output.content)
226
+ finalizeStreamingBlock(block);
203
227
  stream.push({ type: "done", reason: output.stopReason, message: output });
204
228
  stream.end();
205
229
  }
206
230
  catch (error) {
207
231
  for (const block of output.content) {
208
- delete block.index;
209
- // partialJson is only a streaming scratch buffer; never persist it.
210
- delete block.partialJson;
232
+ finalizeStreamingBlock(block);
211
233
  }
212
234
  output.stopReason = options.signal?.aborted ? "aborted" : "error";
213
235
  output.errorMessage = formatBedrockError(error);
236
+ if (output.stopReason === "error") {
237
+ appendBedrockFailureDiagnostic(output, error, responseRequestId);
238
+ }
214
239
  stream.push({ type: "error", reason: output.stopReason, error: output });
215
240
  stream.end();
216
241
  }
@@ -260,6 +285,46 @@ function formatBedrockError(error) {
260
285
  }
261
286
  return `${core}${dataRetentionHint}`;
262
287
  }
288
+ /** Over-long header values are dropped rather than truncated: a truncated request id is not a request id. */
289
+ const MAX_BEDROCK_DIAGNOSTIC_VALUE_CHARS = 200;
290
+ function normalizeDiagnosticValue(value) {
291
+ if (typeof value !== "string")
292
+ return undefined;
293
+ const trimmed = value.trim();
294
+ if (trimmed.length === 0 || trimmed.length > MAX_BEDROCK_DIAGNOSTIC_VALUE_CHARS)
295
+ return undefined;
296
+ return trimmed;
297
+ }
298
+ /**
299
+ * The SDK puts the modeled code on `error.name` for service exceptions and unmodeled stream errors alike, so
300
+ * do not narrow to `BedrockRuntimeServiceException`. Modeled Bedrock errors all end in `Exception`, unlike
301
+ * transport names such as `TimeoutError`.
302
+ */
303
+ function extractBedrockErrorCode(error) {
304
+ if (!(error instanceof Error) || !error.name.endsWith("Exception"))
305
+ return undefined;
306
+ return normalizeDiagnosticValue(error.name);
307
+ }
308
+ /**
309
+ * Structured metadata alongside `errorMessage`, which stays byte-identical because `isRetryableAssistantError`
310
+ * matches against it. Unknown fields are omitted, never guessed: a modeled mid-stream exception reaches us as
311
+ * a bare object literal, leaving only `fallbackRequestId`. `details` only, as the throw is not always `Error`.
312
+ */
313
+ function appendBedrockFailureDiagnostic(output, error, fallbackRequestId) {
314
+ const metadata = error?.$metadata;
315
+ const details = {};
316
+ if (typeof metadata?.httpStatusCode === "number")
317
+ details.status = metadata.httpStatusCode;
318
+ const errorCode = extractBedrockErrorCode(error);
319
+ if (errorCode !== undefined)
320
+ details.errorCode = errorCode;
321
+ const requestId = normalizeDiagnosticValue(metadata?.requestId) ?? fallbackRequestId;
322
+ if (requestId !== undefined)
323
+ details.requestId = requestId;
324
+ if (Object.keys(details).length === 0)
325
+ return;
326
+ appendAssistantMessageDiagnostic(output, { type: "bedrock_response_failure", timestamp: Date.now(), details });
327
+ }
263
328
  /**
264
329
  * Header keys that must never be overwritten by caller-supplied headers.
265
330
  * `host` and `x-amz-*` participate in the SigV4 canonical request; `authorization`
@@ -293,6 +358,35 @@ function addCustomHeadersMiddleware(client, headers) {
293
358
  };
294
359
  client.middlewareStack.add(middleware, { step: "build", name: "pi-ai-custom-headers", priority: "low" });
295
360
  }
361
+ function isSmithyHttpResponse(response) {
362
+ if (!response || typeof response !== "object")
363
+ return false;
364
+ const candidate = response;
365
+ return typeof candidate.statusCode === "number" && !!candidate.headers && typeof candidate.headers === "object";
366
+ }
367
+ function toProviderResponse(response) {
368
+ if (!isSmithyHttpResponse(response))
369
+ return undefined;
370
+ return { status: response.statusCode, headers: { ...response.headers } };
371
+ }
372
+ /**
373
+ * Bedrock's modeled `$metadata` only preserves selected HTTP metadata (for example
374
+ * requestId), so custom gateway headers are otherwise lost before callers see
375
+ * `onResponse`. Capture the raw Smithy HTTP response at the deserialize step,
376
+ * after the SDK receives the response but before the event stream is consumed.
377
+ */
378
+ function addResponseHeadersMiddleware(client, onResponse, model, onObserved) {
379
+ const middleware = (next) => async (args) => {
380
+ const result = await next(args);
381
+ const providerResponse = toProviderResponse(result.response);
382
+ if (providerResponse) {
383
+ onObserved();
384
+ await onResponse(providerResponse, model);
385
+ }
386
+ return result;
387
+ };
388
+ client.middlewareStack.add(middleware, { step: "deserialize", name: "pi-ai-response-headers" });
389
+ }
296
390
  export const streamSimple = (model, context, options) => {
297
391
  const base = {
298
392
  ...buildBaseOptions(model, context, options, undefined),
@@ -389,19 +483,61 @@ function handleContentBlockDelta(event, blocks, output, stream) {
389
483
  partial: output,
390
484
  });
391
485
  }
392
- if (delta.reasoningContent.signature) {
486
+ // `thinkingSignature` holds either an Anthropic signature or an opaque redacted
487
+ // payload, never both: mixing them would corrupt whichever arrived first.
488
+ if (delta.reasoningContent.signature && !thinkingBlock.redacted) {
393
489
  thinkingBlock.thinkingSignature =
394
490
  (thinkingBlock.thinkingSignature || "") + delta.reasoningContent.signature;
395
491
  }
492
+ if (delta.reasoningContent.redactedContent?.length) {
493
+ // Encrypted reasoning from non-Anthropic models on Bedrock (e.g. OpenAI GPT-5.6).
494
+ // The payload is opaque, so keep it verbatim in `thinkingSignature` the way the
495
+ // Anthropic path stores redacted thinking, and replay it on the next turn.
496
+ if (!thinkingBlock.redacted) {
497
+ thinkingBlock.redacted = true;
498
+ thinkingBlock.thinkingSignature = "";
499
+ thinkingBlock.thinking += REDACTED_THINKING_PLACEHOLDER;
500
+ stream.push({
501
+ type: "thinking_delta",
502
+ contentIndex: thinkingIndex,
503
+ delta: REDACTED_THINKING_PLACEHOLDER,
504
+ partial: output,
505
+ });
506
+ }
507
+ thinkingBlock.redactedChunks ??= [];
508
+ thinkingBlock.redactedChunks.push(delta.reasoningContent.redactedContent);
509
+ }
396
510
  }
397
511
  }
398
512
  }
513
+ /**
514
+ * Encodes buffered encrypted reasoning into `thinkingSignature` and drops the scratch
515
+ * buffer, which must never reach a persisted message: `Uint8Array` serializes to an
516
+ * index-keyed object roughly ten times the size of the base64 payload.
517
+ */
518
+ function flushRedactedContent(block) {
519
+ if (block.type !== "thinking" || !block.redactedChunks)
520
+ return;
521
+ block.thinkingSignature = bytesToBase64(block.redactedChunks);
522
+ delete block.redactedChunks;
523
+ }
524
+ /**
525
+ * Strips every streaming scratch field. Runs from the terminal paths as well as
526
+ * `contentBlockStop`, because a stream can settle without stopping each block.
527
+ */
528
+ function finalizeStreamingBlock(block) {
529
+ delete block.index;
530
+ // partialJson is only a streaming scratch buffer; never persist it.
531
+ delete block.partialJson;
532
+ flushRedactedContent(block);
533
+ }
399
534
  function handleMetadata(event, model, output) {
400
535
  if (event.usage) {
401
536
  output.usage.input = event.usage.inputTokens || 0;
402
537
  output.usage.output = event.usage.outputTokens || 0;
403
538
  output.usage.cacheRead = event.usage.cacheReadInputTokens || 0;
404
539
  output.usage.cacheWrite = event.usage.cacheWriteInputTokens || 0;
540
+ output.usage.cacheWrite1h = event.usage.cacheDetails?.reduce((total, detail) => total + (detail.ttl === CacheTTL.ONE_HOUR ? (detail.inputTokens ?? 0) : 0), 0);
405
541
  output.usage.totalTokens = event.usage.totalTokens || output.usage.input + output.usage.output;
406
542
  calculateCost(model, output.usage);
407
543
  }
@@ -417,6 +553,7 @@ function handleContentBlockStop(event, blocks, output, stream) {
417
553
  stream.push({ type: "text_end", contentIndex: index, content: block.text, partial: output });
418
554
  break;
419
555
  case "thinking":
556
+ flushRedactedContent(block);
420
557
  stream.push({ type: "thinking_end", contentIndex: index, content: block.thinking, partial: output });
421
558
  break;
422
559
  case "toolCall":
@@ -478,13 +615,13 @@ function mapThinkingLevelToEffort(model, level) {
478
615
  }
479
616
  /**
480
617
  * Resolve cache retention preference.
481
- * Defaults to "short" and uses PI_CACHE_RETENTION for backward compatibility.
618
+ * Defaults to "short" and uses DRAHT_CACHE_RETENTION for backward compatibility.
482
619
  */
483
620
  function resolveCacheRetention(cacheRetention, env) {
484
621
  if (cacheRetention) {
485
622
  return cacheRetention;
486
623
  }
487
- if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") {
624
+ if (getProviderEnvValue("DRAHT_CACHE_RETENTION", env) === "long") {
488
625
  return "long";
489
626
  }
490
627
  return "short";
@@ -602,7 +739,7 @@ function convertToolResultContent(content) {
602
739
  }
603
740
  function convertMessages(context, model, cacheRetention, env) {
604
741
  const result = [];
605
- const transformedMessages = transformMessages(context.messages, model, normalizeToolCallId);
742
+ const transformedMessages = transformMessages(withoutInitialSystemMessage(context.messages), model, normalizeToolCallId);
606
743
  for (let i = 0; i < transformedMessages.length; i++) {
607
744
  const m = transformedMessages[i];
608
745
  switch (m.role) {
@@ -630,10 +767,7 @@ function convertMessages(context, model, cacheRetention, env) {
630
767
  if (content.length === 0)
631
768
  content.push({ text: EMPTY_TEXT_PLACEHOLDER });
632
769
  }
633
- result.push({
634
- role: ConversationRole.USER,
635
- content,
636
- });
770
+ result.push({ role: ConversationRole.USER, content });
637
771
  break;
638
772
  }
639
773
  case "assistant": {
@@ -659,6 +793,15 @@ function convertMessages(context, model, cacheRetention, env) {
659
793
  });
660
794
  break;
661
795
  case "thinking": {
796
+ // Encrypted reasoning is opaque: replay the stored payload as the
797
+ // `redactedContent` member instead of lowering it to reasoning text.
798
+ if (c.redacted) {
799
+ const redactedContent = decodeRedactedContent(c.thinkingSignature);
800
+ if (redactedContent?.length) {
801
+ contentBlocks.push({ reasoningContent: { redactedContent } });
802
+ }
803
+ continue;
804
+ }
662
805
  // Skip empty thinking blocks
663
806
  const thinking = sanitizeSurrogates(c.thinking);
664
807
  if (thinking.trim().length === 0)
@@ -734,10 +877,7 @@ function convertMessages(context, model, cacheRetention, env) {
734
877
  }
735
878
  // Skip the messages we've already processed
736
879
  i = j - 1;
737
- result.push({
738
- role: ConversationRole.USER,
739
- content: toolResults,
740
- });
880
+ result.push({ role: ConversationRole.USER, content: toolResults });
741
881
  break;
742
882
  }
743
883
  default:
@@ -769,7 +909,7 @@ function convertToolConfig(tools, toolChoice, supportsStrictMode) {
769
909
  toolSpec: {
770
910
  name: tool.name,
771
911
  description: tool.description,
772
- inputSchema: { json: tool.parameters },
912
+ inputSchema: { json: getJsonSchemaToolParameters(tool, strict) },
773
913
  ...(strict === true ? { strict: true } : {}),
774
914
  },
775
915
  };
@@ -911,11 +1051,43 @@ function createImageBlock(mimeType, data) {
911
1051
  default:
912
1052
  throw new Error(`Unknown image type: ${mimeType}`);
913
1053
  }
1054
+ return { source: { bytes: base64ToBytes(data) }, format };
1055
+ }
1056
+ function base64ToBytes(data) {
914
1057
  const binaryString = atob(data);
915
1058
  const bytes = new Uint8Array(binaryString.length);
916
1059
  for (let i = 0; i < binaryString.length; i++) {
917
1060
  bytes[i] = binaryString.charCodeAt(i);
918
1061
  }
919
- return { source: { bytes }, format };
1062
+ return bytes;
1063
+ }
1064
+ /**
1065
+ * Decodes a stored redacted payload. The AWS SDK hands the blob over as bytes, but a
1066
+ * persisted session carries it as base64. A hand-edited or externally produced session
1067
+ * can hold a signature that is not base64; drop that block instead of failing the
1068
+ * whole request.
1069
+ */
1070
+ function decodeRedactedContent(signature) {
1071
+ if (!signature)
1072
+ return undefined;
1073
+ try {
1074
+ return base64ToBytes(signature);
1075
+ }
1076
+ catch {
1077
+ return undefined;
1078
+ }
1079
+ }
1080
+ function bytesToBase64(chunks) {
1081
+ // Encrypted reasoning runs to tens of KB, so build the binary string in slices
1082
+ // rather than one concatenation per byte. The window stays under the engine's
1083
+ // argument-count limit for spread calls.
1084
+ const WINDOW = 0x8000;
1085
+ let binary = "";
1086
+ for (const chunk of chunks) {
1087
+ for (let i = 0; i < chunk.length; i += WINDOW) {
1088
+ binary += String.fromCharCode(...chunk.subarray(i, i + WINDOW));
1089
+ }
1090
+ }
1091
+ return btoa(binary);
920
1092
  }
921
1093
  //# sourceMappingURL=bedrock-converse-stream.js.map