@code-yeongyu/senpi-ai 2026.7.25-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 (969) hide show
  1. package/README.md +1663 -0
  2. package/dist/api/anthropic-messages.d.ts +71 -0
  3. package/dist/api/anthropic-messages.d.ts.map +1 -0
  4. package/dist/api/anthropic-messages.js +1626 -0
  5. package/dist/api/anthropic-messages.js.map +1 -0
  6. package/dist/api/anthropic-messages.lazy.d.ts +3 -0
  7. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  8. package/dist/api/anthropic-messages.lazy.js +3 -0
  9. package/dist/api/anthropic-messages.lazy.js.map +1 -0
  10. package/dist/api/azure-openai-responses.d.ts +15 -0
  11. package/dist/api/azure-openai-responses.d.ts.map +1 -0
  12. package/dist/api/azure-openai-responses.js +242 -0
  13. package/dist/api/azure-openai-responses.js.map +1 -0
  14. package/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  15. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  16. package/dist/api/azure-openai-responses.lazy.js +3 -0
  17. package/dist/api/azure-openai-responses.lazy.js.map +1 -0
  18. package/dist/api/bedrock-converse-stream.d.ts +38 -0
  19. package/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  20. package/dist/api/bedrock-converse-stream.js +939 -0
  21. package/dist/api/bedrock-converse-stream.js.map +1 -0
  22. package/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  23. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  24. package/dist/api/bedrock-converse-stream.lazy.js +30 -0
  25. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  26. package/dist/api/cloudflare.d.ts +12 -0
  27. package/dist/api/cloudflare.d.ts.map +1 -0
  28. package/dist/api/cloudflare.js +22 -0
  29. package/dist/api/cloudflare.js.map +1 -0
  30. package/dist/api/constrained-sampling.d.ts +17 -0
  31. package/dist/api/constrained-sampling.d.ts.map +1 -0
  32. package/dist/api/constrained-sampling.js +104 -0
  33. package/dist/api/constrained-sampling.js.map +1 -0
  34. package/dist/api/github-copilot-headers.d.ts +8 -0
  35. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  36. package/dist/api/github-copilot-headers.js +29 -0
  37. package/dist/api/github-copilot-headers.js.map +1 -0
  38. package/dist/api/google-generative-ai.d.ts +13 -0
  39. package/dist/api/google-generative-ai.d.ts.map +1 -0
  40. package/dist/api/google-generative-ai.js +440 -0
  41. package/dist/api/google-generative-ai.js.map +1 -0
  42. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  43. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  44. package/dist/api/google-generative-ai.lazy.js +3 -0
  45. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  46. package/dist/api/google-shared.d.ts +70 -0
  47. package/dist/api/google-shared.d.ts.map +1 -0
  48. package/dist/api/google-shared.js +360 -0
  49. package/dist/api/google-shared.js.map +1 -0
  50. package/dist/api/google-vertex.d.ts +15 -0
  51. package/dist/api/google-vertex.d.ts.map +1 -0
  52. package/dist/api/google-vertex.js +485 -0
  53. package/dist/api/google-vertex.js.map +1 -0
  54. package/dist/api/google-vertex.lazy.d.ts +3 -0
  55. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  56. package/dist/api/google-vertex.lazy.js +3 -0
  57. package/dist/api/google-vertex.lazy.js.map +1 -0
  58. package/dist/api/lazy.d.ts +15 -0
  59. package/dist/api/lazy.d.ts.map +1 -0
  60. package/dist/api/lazy.js +85 -0
  61. package/dist/api/lazy.js.map +1 -0
  62. package/dist/api/mistral-conversations.d.ts +25 -0
  63. package/dist/api/mistral-conversations.d.ts.map +1 -0
  64. package/dist/api/mistral-conversations.js +566 -0
  65. package/dist/api/mistral-conversations.js.map +1 -0
  66. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  67. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  68. package/dist/api/mistral-conversations.lazy.js +3 -0
  69. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  70. package/dist/api/openai-codex-responses.d.ts +31 -0
  71. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  72. package/dist/api/openai-codex-responses.js +1326 -0
  73. package/dist/api/openai-codex-responses.js.map +1 -0
  74. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  75. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  76. package/dist/api/openai-codex-responses.lazy.js +3 -0
  77. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  78. package/dist/api/openai-completions.d.ts +22 -0
  79. package/dist/api/openai-completions.d.ts.map +1 -0
  80. package/dist/api/openai-completions.js +1384 -0
  81. package/dist/api/openai-completions.js.map +1 -0
  82. package/dist/api/openai-completions.lazy.d.ts +3 -0
  83. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  84. package/dist/api/openai-completions.lazy.js +3 -0
  85. package/dist/api/openai-completions.lazy.js.map +1 -0
  86. package/dist/api/openai-prompt-cache.d.ts +3 -0
  87. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  88. package/dist/api/openai-prompt-cache.js +10 -0
  89. package/dist/api/openai-prompt-cache.js.map +1 -0
  90. package/dist/api/openai-responses-shared.d.ts +29 -0
  91. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  92. package/dist/api/openai-responses-shared.js +730 -0
  93. package/dist/api/openai-responses-shared.js.map +1 -0
  94. package/dist/api/openai-responses.d.ts +14 -0
  95. package/dist/api/openai-responses.d.ts.map +1 -0
  96. package/dist/api/openai-responses.js +696 -0
  97. package/dist/api/openai-responses.js.map +1 -0
  98. package/dist/api/openai-responses.lazy.d.ts +3 -0
  99. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  100. package/dist/api/openai-responses.lazy.js +3 -0
  101. package/dist/api/openai-responses.lazy.js.map +1 -0
  102. package/dist/api/openrouter-images.d.ts +3 -0
  103. package/dist/api/openrouter-images.d.ts.map +1 -0
  104. package/dist/api/openrouter-images.js +131 -0
  105. package/dist/api/openrouter-images.js.map +1 -0
  106. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  107. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  108. package/dist/api/openrouter-images.lazy.js +4 -0
  109. package/dist/api/openrouter-images.lazy.js.map +1 -0
  110. package/dist/api/pi-messages.d.ts +97 -0
  111. package/dist/api/pi-messages.d.ts.map +1 -0
  112. package/dist/api/pi-messages.js +305 -0
  113. package/dist/api/pi-messages.js.map +1 -0
  114. package/dist/api/pi-messages.lazy.d.ts +3 -0
  115. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  116. package/dist/api/pi-messages.lazy.js +3 -0
  117. package/dist/api/pi-messages.lazy.js.map +1 -0
  118. package/dist/api/simple-options.d.ts +33 -0
  119. package/dist/api/simple-options.d.ts.map +1 -0
  120. package/dist/api/simple-options.js +177 -0
  121. package/dist/api/simple-options.js.map +1 -0
  122. package/dist/api/transform-messages.d.ts +23 -0
  123. package/dist/api/transform-messages.d.ts.map +1 -0
  124. package/dist/api/transform-messages.js +255 -0
  125. package/dist/api/transform-messages.js.map +1 -0
  126. package/dist/api-registry.d.ts +34 -0
  127. package/dist/api-registry.d.ts.map +1 -0
  128. package/dist/api-registry.js +96 -0
  129. package/dist/api-registry.js.map +1 -0
  130. package/dist/auth/context.d.ts +7 -0
  131. package/dist/auth/context.d.ts.map +1 -0
  132. package/dist/auth/context.js +42 -0
  133. package/dist/auth/context.js.map +1 -0
  134. package/dist/auth/credential-store.d.ts +17 -0
  135. package/dist/auth/credential-store.d.ts.map +1 -0
  136. package/dist/auth/credential-store.js +42 -0
  137. package/dist/auth/credential-store.js.map +1 -0
  138. package/dist/auth/helpers.d.ts +21 -0
  139. package/dist/auth/helpers.d.ts.map +1 -0
  140. package/dist/auth/helpers.js +48 -0
  141. package/dist/auth/helpers.js.map +1 -0
  142. package/dist/auth/oauth/anthropic.d.ts +9 -0
  143. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  144. package/dist/auth/oauth/anthropic.js +302 -0
  145. package/dist/auth/oauth/anthropic.js.map +1 -0
  146. package/dist/auth/oauth/device-code.d.ts +23 -0
  147. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  148. package/dist/auth/oauth/device-code.js +69 -0
  149. package/dist/auth/oauth/device-code.js.map +1 -0
  150. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  151. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  152. package/dist/auth/oauth/github-copilot.js +312 -0
  153. package/dist/auth/oauth/github-copilot.js.map +1 -0
  154. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  155. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  156. package/dist/auth/oauth/kimi-coding.js +249 -0
  157. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  158. package/dist/auth/oauth/load.d.ts +27 -0
  159. package/dist/auth/oauth/load.d.ts.map +1 -0
  160. package/dist/auth/oauth/load.js +59 -0
  161. package/dist/auth/oauth/load.js.map +1 -0
  162. package/dist/auth/oauth/oauth-page.d.ts +3 -0
  163. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  164. package/dist/auth/oauth/oauth-page.js +105 -0
  165. package/dist/auth/oauth/oauth-page.js.map +1 -0
  166. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  167. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  168. package/dist/auth/oauth/openai-codex.js +427 -0
  169. package/dist/auth/oauth/openai-codex.js.map +1 -0
  170. package/dist/auth/oauth/openrouter.d.ts +13 -0
  171. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  172. package/dist/auth/oauth/openrouter.js +222 -0
  173. package/dist/auth/oauth/openrouter.js.map +1 -0
  174. package/dist/auth/oauth/pkce.d.ts +13 -0
  175. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  176. package/dist/auth/oauth/pkce.js +31 -0
  177. package/dist/auth/oauth/pkce.js.map +1 -0
  178. package/dist/auth/oauth/radius.d.ts +17 -0
  179. package/dist/auth/oauth/radius.d.ts.map +1 -0
  180. package/dist/auth/oauth/radius.js +318 -0
  181. package/dist/auth/oauth/radius.js.map +1 -0
  182. package/dist/auth/oauth/xai.d.ts +6 -0
  183. package/dist/auth/oauth/xai.d.ts.map +1 -0
  184. package/dist/auth/oauth/xai.js +189 -0
  185. package/dist/auth/oauth/xai.js.map +1 -0
  186. package/dist/auth/resolve.d.ts +24 -0
  187. package/dist/auth/resolve.d.ts.map +1 -0
  188. package/dist/auth/resolve.js +112 -0
  189. package/dist/auth/resolve.js.map +1 -0
  190. package/dist/auth/types.d.ts +219 -0
  191. package/dist/auth/types.d.ts.map +1 -0
  192. package/dist/auth/types.js +2 -0
  193. package/dist/auth/types.js.map +1 -0
  194. package/dist/bedrock-provider.d.ts +5 -0
  195. package/dist/bedrock-provider.d.ts.map +1 -0
  196. package/dist/bedrock-provider.js +6 -0
  197. package/dist/bedrock-provider.js.map +1 -0
  198. package/dist/bun-oauth.d.ts +3 -0
  199. package/dist/bun-oauth.d.ts.map +1 -0
  200. package/dist/bun-oauth.js +21 -0
  201. package/dist/bun-oauth.js.map +1 -0
  202. package/dist/cli.d.ts +3 -0
  203. package/dist/cli.d.ts.map +1 -0
  204. package/dist/cli.js +112 -0
  205. package/dist/cli.js.map +1 -0
  206. package/dist/compat/extension-oauth-types.d.ts +42 -0
  207. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  208. package/dist/compat/extension-oauth-types.js +2 -0
  209. package/dist/compat/extension-oauth-types.js.map +1 -0
  210. package/dist/compat.d.ts +53 -0
  211. package/dist/compat.d.ts.map +1 -0
  212. package/dist/compat.js +176 -0
  213. package/dist/compat.js.map +1 -0
  214. package/dist/context-provenance.d.ts +16 -0
  215. package/dist/context-provenance.d.ts.map +1 -0
  216. package/dist/context-provenance.js +32 -0
  217. package/dist/context-provenance.js.map +1 -0
  218. package/dist/env-api-keys.d.ts +21 -0
  219. package/dist/env-api-keys.d.ts.map +1 -0
  220. package/dist/env-api-keys.js +155 -0
  221. package/dist/env-api-keys.js.map +1 -0
  222. package/dist/image-models.d.ts +10 -0
  223. package/dist/image-models.d.ts.map +1 -0
  224. package/dist/image-models.generated.d.ts +605 -0
  225. package/dist/image-models.generated.d.ts.map +1 -0
  226. package/dist/image-models.generated.js +607 -0
  227. package/dist/image-models.generated.js.map +1 -0
  228. package/dist/image-models.js +23 -0
  229. package/dist/image-models.js.map +1 -0
  230. package/dist/images-api-registry.d.ts +31 -0
  231. package/dist/images-api-registry.d.ts.map +1 -0
  232. package/dist/images-api-registry.js +87 -0
  233. package/dist/images-api-registry.js.map +1 -0
  234. package/dist/images-models.d.ts +95 -0
  235. package/dist/images-models.d.ts.map +1 -0
  236. package/dist/images-models.js +140 -0
  237. package/dist/images-models.js.map +1 -0
  238. package/dist/images.d.ts +4 -0
  239. package/dist/images.d.ts.map +1 -0
  240. package/dist/images.js +14 -0
  241. package/dist/images.js.map +1 -0
  242. package/dist/index.d.ts +45 -0
  243. package/dist/index.d.ts.map +1 -0
  244. package/dist/index.js +32 -0
  245. package/dist/index.js.map +1 -0
  246. package/dist/legacy-api-aliases.d.ts +42 -0
  247. package/dist/legacy-api-aliases.d.ts.map +1 -0
  248. package/dist/legacy-api-aliases.js +49 -0
  249. package/dist/legacy-api-aliases.js.map +1 -0
  250. package/dist/model-catalog.d.ts +17 -0
  251. package/dist/model-catalog.d.ts.map +1 -0
  252. package/dist/model-catalog.js +4 -0
  253. package/dist/model-catalog.js.map +1 -0
  254. package/dist/model.d.ts +27 -0
  255. package/dist/model.d.ts.map +1 -0
  256. package/dist/model.js +2 -0
  257. package/dist/model.js.map +1 -0
  258. package/dist/models-store.d.ts +32 -0
  259. package/dist/models-store.d.ts.map +1 -0
  260. package/dist/models-store.js +16 -0
  261. package/dist/models-store.js.map +1 -0
  262. package/dist/models.d.ts +179 -0
  263. package/dist/models.d.ts.map +1 -0
  264. package/dist/models.generated.d.ts +79 -0
  265. package/dist/models.generated.d.ts.map +1 -0
  266. package/dist/models.generated.js +81 -0
  267. package/dist/models.generated.js.map +1 -0
  268. package/dist/models.js +449 -0
  269. package/dist/models.js.map +1 -0
  270. package/dist/node/provider-scope.d.ts +12 -0
  271. package/dist/node/provider-scope.d.ts.map +1 -0
  272. package/dist/node/provider-scope.js +34 -0
  273. package/dist/node/provider-scope.js.map +1 -0
  274. package/dist/oauth.d.ts +3 -0
  275. package/dist/oauth.d.ts.map +1 -0
  276. package/dist/oauth.js +2 -0
  277. package/dist/oauth.js.map +1 -0
  278. package/dist/providers/alibaba-token-plan.d.ts +3 -0
  279. package/dist/providers/alibaba-token-plan.d.ts.map +1 -0
  280. package/dist/providers/alibaba-token-plan.js +15 -0
  281. package/dist/providers/alibaba-token-plan.js.map +1 -0
  282. package/dist/providers/alibaba-token-plan.models.d.ts +4 -0
  283. package/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
  284. package/dist/providers/alibaba-token-plan.models.js +6 -0
  285. package/dist/providers/alibaba-token-plan.models.js.map +1 -0
  286. package/dist/providers/all.d.ts +28 -0
  287. package/dist/providers/all.d.ts.map +1 -0
  288. package/dist/providers/all.js +162 -0
  289. package/dist/providers/all.js.map +1 -0
  290. package/dist/providers/amazon-bedrock.d.ts +3 -0
  291. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  292. package/dist/providers/amazon-bedrock.js +85 -0
  293. package/dist/providers/amazon-bedrock.js.map +1 -0
  294. package/dist/providers/amazon-bedrock.models.d.ts +4 -0
  295. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  296. package/dist/providers/amazon-bedrock.models.js +6 -0
  297. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  298. package/dist/providers/ant-ling.d.ts +3 -0
  299. package/dist/providers/ant-ling.d.ts.map +1 -0
  300. package/dist/providers/ant-ling.js +15 -0
  301. package/dist/providers/ant-ling.js.map +1 -0
  302. package/dist/providers/ant-ling.models.d.ts +4 -0
  303. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  304. package/dist/providers/ant-ling.models.js +6 -0
  305. package/dist/providers/ant-ling.models.js.map +1 -0
  306. package/dist/providers/anthropic.d.ts +7 -0
  307. package/dist/providers/anthropic.d.ts.map +1 -0
  308. package/dist/providers/anthropic.js +50 -0
  309. package/dist/providers/anthropic.js.map +1 -0
  310. package/dist/providers/anthropic.models.d.ts +4 -0
  311. package/dist/providers/anthropic.models.d.ts.map +1 -0
  312. package/dist/providers/anthropic.models.js +6 -0
  313. package/dist/providers/anthropic.models.js.map +1 -0
  314. package/dist/providers/azure-openai-responses.d.ts +3 -0
  315. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  316. package/dist/providers/azure-openai-responses.js +14 -0
  317. package/dist/providers/azure-openai-responses.js.map +1 -0
  318. package/dist/providers/azure-openai-responses.models.d.ts +4 -0
  319. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  320. package/dist/providers/azure-openai-responses.models.js +6 -0
  321. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  322. package/dist/providers/cerebras.d.ts +3 -0
  323. package/dist/providers/cerebras.d.ts.map +1 -0
  324. package/dist/providers/cerebras.js +15 -0
  325. package/dist/providers/cerebras.js.map +1 -0
  326. package/dist/providers/cerebras.models.d.ts +4 -0
  327. package/dist/providers/cerebras.models.d.ts.map +1 -0
  328. package/dist/providers/cerebras.models.js +6 -0
  329. package/dist/providers/cerebras.models.js.map +1 -0
  330. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  331. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  332. package/dist/providers/cloudflare-ai-gateway.js +21 -0
  333. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  334. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -0
  335. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  336. package/dist/providers/cloudflare-ai-gateway.models.js +6 -0
  337. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  338. package/dist/providers/cloudflare-auth.d.ts +4 -0
  339. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  340. package/dist/providers/cloudflare-auth.js +81 -0
  341. package/dist/providers/cloudflare-auth.js.map +1 -0
  342. package/dist/providers/cloudflare-stream.d.ts +8 -0
  343. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  344. package/dist/providers/cloudflare-stream.js +21 -0
  345. package/dist/providers/cloudflare-stream.js.map +1 -0
  346. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  347. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  348. package/dist/providers/cloudflare-workers-ai.js +15 -0
  349. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  350. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -0
  351. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  352. package/dist/providers/cloudflare-workers-ai.models.js +6 -0
  353. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  354. package/dist/providers/data/.manifest.json +1 -0
  355. package/dist/providers/data/alibaba-token-plan.json +1 -0
  356. package/dist/providers/data/amazon-bedrock.json +1 -0
  357. package/dist/providers/data/ant-ling.json +1 -0
  358. package/dist/providers/data/anthropic.json +1 -0
  359. package/dist/providers/data/azure-openai-responses.json +1 -0
  360. package/dist/providers/data/cerebras.json +1 -0
  361. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  362. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  363. package/dist/providers/data/deepseek.json +1 -0
  364. package/dist/providers/data/fireworks.json +1 -0
  365. package/dist/providers/data/github-copilot.json +1 -0
  366. package/dist/providers/data/google-vertex.json +1 -0
  367. package/dist/providers/data/google.json +1 -0
  368. package/dist/providers/data/groq.json +1 -0
  369. package/dist/providers/data/huggingface.json +1 -0
  370. package/dist/providers/data/kimi-coding.json +1 -0
  371. package/dist/providers/data/minimax-cn.json +1 -0
  372. package/dist/providers/data/minimax.json +1 -0
  373. package/dist/providers/data/mistral.json +1 -0
  374. package/dist/providers/data/moonshotai-cn.json +1 -0
  375. package/dist/providers/data/moonshotai.json +1 -0
  376. package/dist/providers/data/nvidia.json +1 -0
  377. package/dist/providers/data/openai-codex.json +1 -0
  378. package/dist/providers/data/openai.json +1 -0
  379. package/dist/providers/data/opencode-go.json +1 -0
  380. package/dist/providers/data/opencode.json +1 -0
  381. package/dist/providers/data/openrouter.json +1 -0
  382. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  383. package/dist/providers/data/qwen-token-plan.json +1 -0
  384. package/dist/providers/data/together.json +1 -0
  385. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  386. package/dist/providers/data/xai.json +1 -0
  387. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  388. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  389. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  390. package/dist/providers/data/xiaomi.json +1 -0
  391. package/dist/providers/data/zai-coding-cn.json +1 -0
  392. package/dist/providers/data/zai.json +1 -0
  393. package/dist/providers/deepseek.d.ts +3 -0
  394. package/dist/providers/deepseek.d.ts.map +1 -0
  395. package/dist/providers/deepseek.js +15 -0
  396. package/dist/providers/deepseek.js.map +1 -0
  397. package/dist/providers/deepseek.models.d.ts +4 -0
  398. package/dist/providers/deepseek.models.d.ts.map +1 -0
  399. package/dist/providers/deepseek.models.js +6 -0
  400. package/dist/providers/deepseek.models.js.map +1 -0
  401. package/dist/providers/faux.d.ts +116 -0
  402. package/dist/providers/faux.d.ts.map +1 -0
  403. package/dist/providers/faux.js +466 -0
  404. package/dist/providers/faux.js.map +1 -0
  405. package/dist/providers/fireworks.d.ts +3 -0
  406. package/dist/providers/fireworks.d.ts.map +1 -0
  407. package/dist/providers/fireworks.js +19 -0
  408. package/dist/providers/fireworks.js.map +1 -0
  409. package/dist/providers/fireworks.models.d.ts +4 -0
  410. package/dist/providers/fireworks.models.d.ts.map +1 -0
  411. package/dist/providers/fireworks.models.js +6 -0
  412. package/dist/providers/fireworks.models.js.map +1 -0
  413. package/dist/providers/github-copilot.d.ts +3 -0
  414. package/dist/providers/github-copilot.d.ts.map +1 -0
  415. package/dist/providers/github-copilot.js +35 -0
  416. package/dist/providers/github-copilot.js.map +1 -0
  417. package/dist/providers/github-copilot.models.d.ts +4 -0
  418. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  419. package/dist/providers/github-copilot.models.js +6 -0
  420. package/dist/providers/github-copilot.models.js.map +1 -0
  421. package/dist/providers/google-shared.d.ts +2 -0
  422. package/dist/providers/google-shared.d.ts.map +1 -0
  423. package/dist/providers/google-shared.js +2 -0
  424. package/dist/providers/google-shared.js.map +1 -0
  425. package/dist/providers/google-vertex.d.ts +7 -0
  426. package/dist/providers/google-vertex.d.ts.map +1 -0
  427. package/dist/providers/google-vertex.js +89 -0
  428. package/dist/providers/google-vertex.js.map +1 -0
  429. package/dist/providers/google-vertex.models.d.ts +4 -0
  430. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  431. package/dist/providers/google-vertex.models.js +6 -0
  432. package/dist/providers/google-vertex.models.js.map +1 -0
  433. package/dist/providers/google.d.ts +7 -0
  434. package/dist/providers/google.d.ts.map +1 -0
  435. package/dist/providers/google.js +18 -0
  436. package/dist/providers/google.js.map +1 -0
  437. package/dist/providers/google.models.d.ts +4 -0
  438. package/dist/providers/google.models.d.ts.map +1 -0
  439. package/dist/providers/google.models.js +6 -0
  440. package/dist/providers/google.models.js.map +1 -0
  441. package/dist/providers/groq.d.ts +3 -0
  442. package/dist/providers/groq.d.ts.map +1 -0
  443. package/dist/providers/groq.js +15 -0
  444. package/dist/providers/groq.js.map +1 -0
  445. package/dist/providers/groq.models.d.ts +4 -0
  446. package/dist/providers/groq.models.d.ts.map +1 -0
  447. package/dist/providers/groq.models.js +6 -0
  448. package/dist/providers/groq.models.js.map +1 -0
  449. package/dist/providers/huggingface.d.ts +3 -0
  450. package/dist/providers/huggingface.d.ts.map +1 -0
  451. package/dist/providers/huggingface.js +15 -0
  452. package/dist/providers/huggingface.js.map +1 -0
  453. package/dist/providers/huggingface.models.d.ts +4 -0
  454. package/dist/providers/huggingface.models.d.ts.map +1 -0
  455. package/dist/providers/huggingface.models.js +6 -0
  456. package/dist/providers/huggingface.models.js.map +1 -0
  457. package/dist/providers/images/register-builtins.d.ts +4 -0
  458. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  459. package/dist/providers/images/register-builtins.js +34 -0
  460. package/dist/providers/images/register-builtins.js.map +1 -0
  461. package/dist/providers/kimi-coding.d.ts +3 -0
  462. package/dist/providers/kimi-coding.d.ts.map +1 -0
  463. package/dist/providers/kimi-coding.js +23 -0
  464. package/dist/providers/kimi-coding.js.map +1 -0
  465. package/dist/providers/kimi-coding.models.d.ts +4 -0
  466. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  467. package/dist/providers/kimi-coding.models.js +6 -0
  468. package/dist/providers/kimi-coding.models.js.map +1 -0
  469. package/dist/providers/minimax-cn.d.ts +3 -0
  470. package/dist/providers/minimax-cn.d.ts.map +1 -0
  471. package/dist/providers/minimax-cn.js +15 -0
  472. package/dist/providers/minimax-cn.js.map +1 -0
  473. package/dist/providers/minimax-cn.models.d.ts +4 -0
  474. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  475. package/dist/providers/minimax-cn.models.js +6 -0
  476. package/dist/providers/minimax-cn.models.js.map +1 -0
  477. package/dist/providers/minimax.d.ts +3 -0
  478. package/dist/providers/minimax.d.ts.map +1 -0
  479. package/dist/providers/minimax.js +15 -0
  480. package/dist/providers/minimax.js.map +1 -0
  481. package/dist/providers/minimax.models.d.ts +4 -0
  482. package/dist/providers/minimax.models.d.ts.map +1 -0
  483. package/dist/providers/minimax.models.js +6 -0
  484. package/dist/providers/minimax.models.js.map +1 -0
  485. package/dist/providers/mistral.d.ts +3 -0
  486. package/dist/providers/mistral.d.ts.map +1 -0
  487. package/dist/providers/mistral.js +15 -0
  488. package/dist/providers/mistral.js.map +1 -0
  489. package/dist/providers/mistral.models.d.ts +4 -0
  490. package/dist/providers/mistral.models.d.ts.map +1 -0
  491. package/dist/providers/mistral.models.js +6 -0
  492. package/dist/providers/mistral.models.js.map +1 -0
  493. package/dist/providers/moonshotai-cn.d.ts +3 -0
  494. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  495. package/dist/providers/moonshotai-cn.js +15 -0
  496. package/dist/providers/moonshotai-cn.js.map +1 -0
  497. package/dist/providers/moonshotai-cn.models.d.ts +4 -0
  498. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  499. package/dist/providers/moonshotai-cn.models.js +6 -0
  500. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  501. package/dist/providers/moonshotai.d.ts +3 -0
  502. package/dist/providers/moonshotai.d.ts.map +1 -0
  503. package/dist/providers/moonshotai.js +15 -0
  504. package/dist/providers/moonshotai.js.map +1 -0
  505. package/dist/providers/moonshotai.models.d.ts +4 -0
  506. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  507. package/dist/providers/moonshotai.models.js +6 -0
  508. package/dist/providers/moonshotai.models.js.map +1 -0
  509. package/dist/providers/nvidia.d.ts +3 -0
  510. package/dist/providers/nvidia.d.ts.map +1 -0
  511. package/dist/providers/nvidia.js +15 -0
  512. package/dist/providers/nvidia.js.map +1 -0
  513. package/dist/providers/nvidia.models.d.ts +4 -0
  514. package/dist/providers/nvidia.models.d.ts.map +1 -0
  515. package/dist/providers/nvidia.models.js +6 -0
  516. package/dist/providers/nvidia.models.js.map +1 -0
  517. package/dist/providers/openai-codex.d.ts +3 -0
  518. package/dist/providers/openai-codex.d.ts.map +1 -0
  519. package/dist/providers/openai-codex.js +18 -0
  520. package/dist/providers/openai-codex.js.map +1 -0
  521. package/dist/providers/openai-codex.models.d.ts +4 -0
  522. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  523. package/dist/providers/openai-codex.models.js +6 -0
  524. package/dist/providers/openai-codex.models.js.map +1 -0
  525. package/dist/providers/openai-completions.d.ts +3 -0
  526. package/dist/providers/openai-completions.d.ts.map +1 -0
  527. package/dist/providers/openai-completions.js +2 -0
  528. package/dist/providers/openai-completions.js.map +1 -0
  529. package/dist/providers/openai-responses-shared.d.ts +2 -0
  530. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  531. package/dist/providers/openai-responses-shared.js +2 -0
  532. package/dist/providers/openai-responses-shared.js.map +1 -0
  533. package/dist/providers/openai-responses.d.ts +3 -0
  534. package/dist/providers/openai-responses.d.ts.map +1 -0
  535. package/dist/providers/openai-responses.js +2 -0
  536. package/dist/providers/openai-responses.js.map +1 -0
  537. package/dist/providers/openai.d.ts +3 -0
  538. package/dist/providers/openai.d.ts.map +1 -0
  539. package/dist/providers/openai.js +15 -0
  540. package/dist/providers/openai.js.map +1 -0
  541. package/dist/providers/openai.models.d.ts +4 -0
  542. package/dist/providers/openai.models.d.ts.map +1 -0
  543. package/dist/providers/openai.models.js +6 -0
  544. package/dist/providers/openai.models.js.map +1 -0
  545. package/dist/providers/opencode-go.d.ts +3 -0
  546. package/dist/providers/opencode-go.d.ts.map +1 -0
  547. package/dist/providers/opencode-go.js +20 -0
  548. package/dist/providers/opencode-go.js.map +1 -0
  549. package/dist/providers/opencode-go.models.d.ts +4 -0
  550. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  551. package/dist/providers/opencode-go.models.js +6 -0
  552. package/dist/providers/opencode-go.models.js.map +1 -0
  553. package/dist/providers/opencode.d.ts +3 -0
  554. package/dist/providers/opencode.d.ts.map +1 -0
  555. package/dist/providers/opencode.js +22 -0
  556. package/dist/providers/opencode.js.map +1 -0
  557. package/dist/providers/opencode.models.d.ts +4 -0
  558. package/dist/providers/opencode.models.d.ts.map +1 -0
  559. package/dist/providers/opencode.models.js +6 -0
  560. package/dist/providers/opencode.models.js.map +1 -0
  561. package/dist/providers/openrouter-images.d.ts +3 -0
  562. package/dist/providers/openrouter-images.d.ts.map +1 -0
  563. package/dist/providers/openrouter-images.js +22 -0
  564. package/dist/providers/openrouter-images.js.map +1 -0
  565. package/dist/providers/openrouter.d.ts +3 -0
  566. package/dist/providers/openrouter.d.ts.map +1 -0
  567. package/dist/providers/openrouter.js +23 -0
  568. package/dist/providers/openrouter.js.map +1 -0
  569. package/dist/providers/openrouter.models.d.ts +4 -0
  570. package/dist/providers/openrouter.models.d.ts.map +1 -0
  571. package/dist/providers/openrouter.models.js +6 -0
  572. package/dist/providers/openrouter.models.js.map +1 -0
  573. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  574. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  575. package/dist/providers/qwen-token-plan-cn.js +15 -0
  576. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  577. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  578. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  579. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  580. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  581. package/dist/providers/qwen-token-plan.d.ts +3 -0
  582. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  583. package/dist/providers/qwen-token-plan.js +15 -0
  584. package/dist/providers/qwen-token-plan.js.map +1 -0
  585. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  586. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  587. package/dist/providers/qwen-token-plan.models.js +6 -0
  588. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  589. package/dist/providers/radius-config.d.ts +26 -0
  590. package/dist/providers/radius-config.d.ts.map +1 -0
  591. package/dist/providers/radius-config.js +63 -0
  592. package/dist/providers/radius-config.js.map +1 -0
  593. package/dist/providers/radius.d.ts +9 -0
  594. package/dist/providers/radius.d.ts.map +1 -0
  595. package/dist/providers/radius.js +54 -0
  596. package/dist/providers/radius.js.map +1 -0
  597. package/dist/providers/register-builtins.d.ts +2 -0
  598. package/dist/providers/register-builtins.d.ts.map +1 -0
  599. package/dist/providers/register-builtins.js +2 -0
  600. package/dist/providers/register-builtins.js.map +1 -0
  601. package/dist/providers/together.d.ts +3 -0
  602. package/dist/providers/together.d.ts.map +1 -0
  603. package/dist/providers/together.js +15 -0
  604. package/dist/providers/together.js.map +1 -0
  605. package/dist/providers/together.models.d.ts +4 -0
  606. package/dist/providers/together.models.d.ts.map +1 -0
  607. package/dist/providers/together.models.js +6 -0
  608. package/dist/providers/together.models.js.map +1 -0
  609. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  610. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  611. package/dist/providers/vercel-ai-gateway.js +15 -0
  612. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  613. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -0
  614. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  615. package/dist/providers/vercel-ai-gateway.models.js +6 -0
  616. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  617. package/dist/providers/xai.d.ts +3 -0
  618. package/dist/providers/xai.d.ts.map +1 -0
  619. package/dist/providers/xai.js +27 -0
  620. package/dist/providers/xai.js.map +1 -0
  621. package/dist/providers/xai.models.d.ts +4 -0
  622. package/dist/providers/xai.models.d.ts.map +1 -0
  623. package/dist/providers/xai.models.js +6 -0
  624. package/dist/providers/xai.models.js.map +1 -0
  625. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  626. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  627. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  628. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  629. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -0
  630. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  631. package/dist/providers/xiaomi-token-plan-ams.models.js +6 -0
  632. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  633. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  634. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  635. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  636. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  637. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -0
  638. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  639. package/dist/providers/xiaomi-token-plan-cn.models.js +6 -0
  640. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  641. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  642. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  643. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  644. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  645. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -0
  646. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  647. package/dist/providers/xiaomi-token-plan-sgp.models.js +6 -0
  648. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  649. package/dist/providers/xiaomi.d.ts +3 -0
  650. package/dist/providers/xiaomi.d.ts.map +1 -0
  651. package/dist/providers/xiaomi.js +15 -0
  652. package/dist/providers/xiaomi.js.map +1 -0
  653. package/dist/providers/xiaomi.models.d.ts +4 -0
  654. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  655. package/dist/providers/xiaomi.models.js +6 -0
  656. package/dist/providers/xiaomi.models.js.map +1 -0
  657. package/dist/providers/zai-coding-cn.d.ts +3 -0
  658. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  659. package/dist/providers/zai-coding-cn.js +15 -0
  660. package/dist/providers/zai-coding-cn.js.map +1 -0
  661. package/dist/providers/zai-coding-cn.models.d.ts +4 -0
  662. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  663. package/dist/providers/zai-coding-cn.models.js +6 -0
  664. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  665. package/dist/providers/zai.d.ts +3 -0
  666. package/dist/providers/zai.d.ts.map +1 -0
  667. package/dist/providers/zai.js +15 -0
  668. package/dist/providers/zai.js.map +1 -0
  669. package/dist/providers/zai.models.d.ts +4 -0
  670. package/dist/providers/zai.models.d.ts.map +1 -0
  671. package/dist/providers/zai.models.js +6 -0
  672. package/dist/providers/zai.models.js.map +1 -0
  673. package/dist/session-resources.d.ts +4 -0
  674. package/dist/session-resources.d.ts.map +1 -0
  675. package/dist/session-resources.js +22 -0
  676. package/dist/session-resources.js.map +1 -0
  677. package/dist/stream.d.ts +2 -0
  678. package/dist/stream.d.ts.map +1 -0
  679. package/dist/stream.js +2 -0
  680. package/dist/stream.js.map +1 -0
  681. package/dist/tool-call-middleware/context-transformer.d.ts +22 -0
  682. package/dist/tool-call-middleware/context-transformer.d.ts.map +1 -0
  683. package/dist/tool-call-middleware/context-transformer.js +182 -0
  684. package/dist/tool-call-middleware/context-transformer.js.map +1 -0
  685. package/dist/tool-call-middleware/index.d.ts +14 -0
  686. package/dist/tool-call-middleware/index.d.ts.map +1 -0
  687. package/dist/tool-call-middleware/index.js +37 -0
  688. package/dist/tool-call-middleware/index.js.map +1 -0
  689. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +9 -0
  690. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -0
  691. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +92 -0
  692. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -0
  693. package/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +7 -0
  694. package/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -0
  695. package/dist/tool-call-middleware/protocols/anthropic-xml/format.js +54 -0
  696. package/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -0
  697. package/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +4 -0
  698. package/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +1 -0
  699. package/dist/tool-call-middleware/protocols/anthropic-xml/index.js +4 -0
  700. package/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +1 -0
  701. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +7 -0
  702. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +1 -0
  703. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +16 -0
  704. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +1 -0
  705. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts +19 -0
  706. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts.map +1 -0
  707. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js +8 -0
  708. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js.map +1 -0
  709. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
  710. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
  711. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
  712. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
  713. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +14 -0
  714. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -0
  715. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +42 -0
  716. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -0
  717. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
  718. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
  719. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
  720. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
  721. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +6 -0
  722. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -0
  723. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +49 -0
  724. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -0
  725. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
  726. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
  727. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
  728. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
  729. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
  730. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
  731. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
  732. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
  733. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +13 -0
  734. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -0
  735. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +107 -0
  736. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -0
  737. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +7 -0
  738. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -0
  739. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +214 -0
  740. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -0
  741. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +4 -0
  742. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -0
  743. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +17 -0
  744. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -0
  745. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +5 -0
  746. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +1 -0
  747. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +34 -0
  748. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +1 -0
  749. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts +15 -0
  750. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts.map +1 -0
  751. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.js +198 -0
  752. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.js.map +1 -0
  753. package/dist/tool-call-middleware/protocols/antml/config.d.ts +3 -0
  754. package/dist/tool-call-middleware/protocols/antml/config.d.ts.map +1 -0
  755. package/dist/tool-call-middleware/protocols/antml/config.js +8 -0
  756. package/dist/tool-call-middleware/protocols/antml/config.js.map +1 -0
  757. package/dist/tool-call-middleware/protocols/antml/format.d.ts +6 -0
  758. package/dist/tool-call-middleware/protocols/antml/format.d.ts.map +1 -0
  759. package/dist/tool-call-middleware/protocols/antml/format.js +33 -0
  760. package/dist/tool-call-middleware/protocols/antml/format.js.map +1 -0
  761. package/dist/tool-call-middleware/protocols/antml/index.d.ts +7 -0
  762. package/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -0
  763. package/dist/tool-call-middleware/protocols/antml/index.js +7 -0
  764. package/dist/tool-call-middleware/protocols/antml/index.js.map +1 -0
  765. package/dist/tool-call-middleware/protocols/antml/parse.d.ts +4 -0
  766. package/dist/tool-call-middleware/protocols/antml/parse.d.ts.map +1 -0
  767. package/dist/tool-call-middleware/protocols/antml/parse.js +6 -0
  768. package/dist/tool-call-middleware/protocols/antml/parse.js.map +1 -0
  769. package/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
  770. package/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
  771. package/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
  772. package/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
  773. package/dist/tool-call-middleware/protocols/antml/repair.d.ts +12 -0
  774. package/dist/tool-call-middleware/protocols/antml/repair.d.ts.map +1 -0
  775. package/dist/tool-call-middleware/protocols/antml/repair.js +46 -0
  776. package/dist/tool-call-middleware/protocols/antml/repair.js.map +1 -0
  777. package/dist/tool-call-middleware/protocols/antml/stream.d.ts +4 -0
  778. package/dist/tool-call-middleware/protocols/antml/stream.d.ts.map +1 -0
  779. package/dist/tool-call-middleware/protocols/antml/stream.js +6 -0
  780. package/dist/tool-call-middleware/protocols/antml/stream.js.map +1 -0
  781. package/dist/tool-call-middleware/protocols/gemma4.d.ts +28 -0
  782. package/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -0
  783. package/dist/tool-call-middleware/protocols/gemma4.js +663 -0
  784. package/dist/tool-call-middleware/protocols/gemma4.js.map +1 -0
  785. package/dist/tool-call-middleware/protocols/hermes.d.ts +21 -0
  786. package/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -0
  787. package/dist/tool-call-middleware/protocols/hermes.js +69 -0
  788. package/dist/tool-call-middleware/protocols/hermes.js.map +1 -0
  789. package/dist/tool-call-middleware/protocols/json-mix.d.ts +12 -0
  790. package/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -0
  791. package/dist/tool-call-middleware/protocols/json-mix.js +704 -0
  792. package/dist/tool-call-middleware/protocols/json-mix.js.map +1 -0
  793. package/dist/tool-call-middleware/protocols/morph-xml.d.ts +15 -0
  794. package/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -0
  795. package/dist/tool-call-middleware/protocols/morph-xml.js +957 -0
  796. package/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -0
  797. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts +14 -0
  798. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -0
  799. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js +54 -0
  800. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -0
  801. package/dist/tool-call-middleware/protocols/yaml-xml.d.ts +8 -0
  802. package/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -0
  803. package/dist/tool-call-middleware/protocols/yaml-xml.js +328 -0
  804. package/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -0
  805. package/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
  806. package/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
  807. package/dist/tool-call-middleware/recovery-code-mask.js +185 -0
  808. package/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
  809. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
  810. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
  811. package/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
  812. package/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
  813. package/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
  814. package/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
  815. package/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
  816. package/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
  817. package/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
  818. package/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
  819. package/dist/tool-call-middleware/recovery-event-stream.js +37 -0
  820. package/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
  821. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
  822. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
  823. package/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
  824. package/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
  825. package/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
  826. package/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
  827. package/dist/tool-call-middleware/recovery-native-projection.js +148 -0
  828. package/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
  829. package/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
  830. package/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
  831. package/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
  832. package/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
  833. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
  834. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
  835. package/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
  836. package/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
  837. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
  838. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
  839. package/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
  840. package/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
  841. package/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
  842. package/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
  843. package/dist/tool-call-middleware/recovery-text-projection.js +77 -0
  844. package/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
  845. package/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
  846. package/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
  847. package/dist/tool-call-middleware/stream-message-metadata.js +63 -0
  848. package/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
  849. package/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
  850. package/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
  851. package/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
  852. package/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
  853. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
  854. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
  855. package/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
  856. package/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
  857. package/dist/tool-call-middleware/stream-wrapper.d.ts +4 -0
  858. package/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -0
  859. package/dist/tool-call-middleware/stream-wrapper.js +121 -0
  860. package/dist/tool-call-middleware/stream-wrapper.js.map +1 -0
  861. package/dist/tool-call-middleware/types.d.ts +109 -0
  862. package/dist/tool-call-middleware/types.d.ts.map +1 -0
  863. package/dist/tool-call-middleware/types.js +2 -0
  864. package/dist/tool-call-middleware/types.js.map +1 -0
  865. package/dist/types.d.ts +762 -0
  866. package/dist/types.d.ts.map +1 -0
  867. package/dist/types.js +5 -0
  868. package/dist/types.js.map +1 -0
  869. package/dist/utils/abort-signals.d.ts +6 -0
  870. package/dist/utils/abort-signals.d.ts.map +1 -0
  871. package/dist/utils/abort-signals.js +34 -0
  872. package/dist/utils/abort-signals.js.map +1 -0
  873. package/dist/utils/deferred-tools.d.ts +9 -0
  874. package/dist/utils/deferred-tools.d.ts.map +1 -0
  875. package/dist/utils/deferred-tools.js +36 -0
  876. package/dist/utils/deferred-tools.js.map +1 -0
  877. package/dist/utils/diagnostics.d.ts +19 -0
  878. package/dist/utils/diagnostics.d.ts.map +1 -0
  879. package/dist/utils/diagnostics.js +25 -0
  880. package/dist/utils/diagnostics.js.map +1 -0
  881. package/dist/utils/error-body.d.ts +25 -0
  882. package/dist/utils/error-body.d.ts.map +1 -0
  883. package/dist/utils/error-body.js +114 -0
  884. package/dist/utils/error-body.js.map +1 -0
  885. package/dist/utils/estimate.d.ts +17 -0
  886. package/dist/utils/estimate.d.ts.map +1 -0
  887. package/dist/utils/estimate.js +119 -0
  888. package/dist/utils/estimate.js.map +1 -0
  889. package/dist/utils/event-stream.d.ts +24 -0
  890. package/dist/utils/event-stream.d.ts.map +1 -0
  891. package/dist/utils/event-stream.js +117 -0
  892. package/dist/utils/event-stream.js.map +1 -0
  893. package/dist/utils/hash.d.ts +3 -0
  894. package/dist/utils/hash.d.ts.map +1 -0
  895. package/dist/utils/hash.js +14 -0
  896. package/dist/utils/hash.js.map +1 -0
  897. package/dist/utils/headers.d.ts +4 -0
  898. package/dist/utils/headers.d.ts.map +1 -0
  899. package/dist/utils/headers.js +18 -0
  900. package/dist/utils/headers.js.map +1 -0
  901. package/dist/utils/json-parse.d.ts +16 -0
  902. package/dist/utils/json-parse.d.ts.map +1 -0
  903. package/dist/utils/json-parse.js +113 -0
  904. package/dist/utils/json-parse.js.map +1 -0
  905. package/dist/utils/node-http-proxy.d.ts +4 -0
  906. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  907. package/dist/utils/node-http-proxy.js +92 -0
  908. package/dist/utils/node-http-proxy.js.map +1 -0
  909. package/dist/utils/openai-codex-auth.d.ts +11 -0
  910. package/dist/utils/openai-codex-auth.d.ts.map +1 -0
  911. package/dist/utils/openai-codex-auth.js +30 -0
  912. package/dist/utils/openai-codex-auth.js.map +1 -0
  913. package/dist/utils/overflow.d.ts +55 -0
  914. package/dist/utils/overflow.d.ts.map +1 -0
  915. package/dist/utils/overflow.js +155 -0
  916. package/dist/utils/overflow.js.map +1 -0
  917. package/dist/utils/provider-env.d.ts +7 -0
  918. package/dist/utils/provider-env.d.ts.map +1 -0
  919. package/dist/utils/provider-env.js +44 -0
  920. package/dist/utils/provider-env.js.map +1 -0
  921. package/dist/utils/provider-retry.d.ts +16 -0
  922. package/dist/utils/provider-retry.d.ts.map +1 -0
  923. package/dist/utils/provider-retry.js +94 -0
  924. package/dist/utils/provider-retry.js.map +1 -0
  925. package/dist/utils/retry.d.ts +53 -0
  926. package/dist/utils/retry.d.ts.map +1 -0
  927. package/dist/utils/retry.js +177 -0
  928. package/dist/utils/retry.js.map +1 -0
  929. package/dist/utils/sanitize-unicode.d.ts +22 -0
  930. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  931. package/dist/utils/sanitize-unicode.js +26 -0
  932. package/dist/utils/sanitize-unicode.js.map +1 -0
  933. package/dist/utils/server-fallback-receipt.d.ts +30 -0
  934. package/dist/utils/server-fallback-receipt.d.ts.map +1 -0
  935. package/dist/utils/server-fallback-receipt.js +70 -0
  936. package/dist/utils/server-fallback-receipt.js.map +1 -0
  937. package/dist/utils/stop-details.d.ts +4 -0
  938. package/dist/utils/stop-details.d.ts.map +1 -0
  939. package/dist/utils/stop-details.js +6 -0
  940. package/dist/utils/stop-details.js.map +1 -0
  941. package/dist/utils/text.d.ts +6 -0
  942. package/dist/utils/text.d.ts.map +1 -0
  943. package/dist/utils/text.js +10 -0
  944. package/dist/utils/text.js.map +1 -0
  945. package/dist/utils/tool-choice-fallback.d.ts +5 -0
  946. package/dist/utils/tool-choice-fallback.d.ts.map +1 -0
  947. package/dist/utils/tool-choice-fallback.js +41 -0
  948. package/dist/utils/tool-choice-fallback.js.map +1 -0
  949. package/dist/utils/tool-pair-repair.d.ts +5 -0
  950. package/dist/utils/tool-pair-repair.d.ts.map +1 -0
  951. package/dist/utils/tool-pair-repair.js +70 -0
  952. package/dist/utils/tool-pair-repair.js.map +1 -0
  953. package/dist/utils/tool-schema-compat.d.ts +19 -0
  954. package/dist/utils/tool-schema-compat.d.ts.map +1 -0
  955. package/dist/utils/tool-schema-compat.js +215 -0
  956. package/dist/utils/tool-schema-compat.js.map +1 -0
  957. package/dist/utils/typebox-helpers.d.ts +17 -0
  958. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  959. package/dist/utils/typebox-helpers.js +21 -0
  960. package/dist/utils/typebox-helpers.js.map +1 -0
  961. package/dist/utils/uuid.d.ts +3 -0
  962. package/dist/utils/uuid.d.ts.map +1 -0
  963. package/dist/utils/uuid.js +50 -0
  964. package/dist/utils/uuid.js.map +1 -0
  965. package/dist/utils/validation.d.ts +18 -0
  966. package/dist/utils/validation.d.ts.map +1 -0
  967. package/dist/utils/validation.js +269 -0
  968. package/dist/utils/validation.js.map +1 -0
  969. package/package.json +110 -0
@@ -0,0 +1,1384 @@
1
+ import OpenAI from "openai";
2
+ import { calculateCost, clampThinkingLevel, supportsXhigh } from "../models.js";
3
+ import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
4
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
+ import { shortHash } from "../utils/hash.js";
6
+ import { headersToRecord } from "../utils/headers.js";
7
+ import { parseStreamingJson } from "../utils/json-parse.js";
8
+ import { getProviderEnvValue } from "../utils/provider-env.js";
9
+ import { retryProviderRequest } from "../utils/provider-retry.js";
10
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
11
+ import { isForcedToolChoiceUnsupportedError, omitToolChoiceParam } from "../utils/tool-choice-fallback.js";
12
+ import { normalizeToolParametersForMoonshot, normalizeToolParametersForOpenAICompat, } from "../utils/tool-schema-compat.js";
13
+ import { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
14
+ import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
15
+ import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
16
+ import { applyExtraBody, buildBaseOptions, clampMaxForOpenAI, OPENAI_COMPLETIONS_RESERVED_BODY_KEYS, } from "./simple-options.js";
17
+ import { transformMessages } from "./transform-messages.js";
18
+ const KIMI_K3_THINKING_LEVEL_MAP = {
19
+ off: null,
20
+ minimal: null,
21
+ low: "low",
22
+ medium: null,
23
+ high: "high",
24
+ xhigh: null,
25
+ max: "max",
26
+ };
27
+ const DEEPSEEK_THINKING_LEVEL_MAP = {
28
+ minimal: "high",
29
+ low: "high",
30
+ medium: "high",
31
+ high: "high",
32
+ xhigh: "max",
33
+ max: "max",
34
+ };
35
+ const OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP = {
36
+ minimal: "high",
37
+ low: "high",
38
+ medium: "high",
39
+ high: "high",
40
+ xhigh: "high",
41
+ max: "high",
42
+ };
43
+ const MIMO_THINKING_LEVEL_MAP = {
44
+ minimal: "low",
45
+ low: "low",
46
+ medium: "medium",
47
+ high: "high",
48
+ xhigh: "high",
49
+ max: null,
50
+ };
51
+ const OLLAMA_THINKING_LEVEL_MAP = {
52
+ off: "none",
53
+ minimal: null,
54
+ low: "low",
55
+ medium: "medium",
56
+ high: "high",
57
+ xhigh: null,
58
+ max: "max",
59
+ };
60
+ function getThinkingLevelMap(model, compat) {
61
+ if (model.thinkingLevelMap !== undefined) {
62
+ return model.thinkingLevelMap;
63
+ }
64
+ const id = model.id.toLowerCase();
65
+ const isKimiK3 = id === "k3" || id.startsWith("k3-") || /(?:^|[/:-])kimi-k3(?:$|[/.:_-])/.test(id);
66
+ const isDeepSeek = id.includes("deepseek");
67
+ const isMiMo = /\bmimo\b/.test(id);
68
+ const isGlm52 = /(?:^|[/:-])glm-5\.2(?:$|[/.:_-])/.test(id);
69
+ if (model.provider === "ollama") {
70
+ return OLLAMA_THINKING_LEVEL_MAP;
71
+ }
72
+ if (isKimiK3) {
73
+ return KIMI_K3_THINKING_LEVEL_MAP;
74
+ }
75
+ if (compat.thinkingFormat === "openrouter" && isDeepSeek) {
76
+ return OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP;
77
+ }
78
+ if ((compat.thinkingFormat === "openai" || compat.thinkingFormat === "openrouter") && isMiMo) {
79
+ return MIMO_THINKING_LEVEL_MAP;
80
+ }
81
+ if (isDeepSeek) {
82
+ return DEEPSEEK_THINKING_LEVEL_MAP;
83
+ }
84
+ if (isGlm52) {
85
+ if (compat.thinkingFormat === "zai") {
86
+ return DEEPSEEK_THINKING_LEVEL_MAP;
87
+ }
88
+ if (compat.thinkingFormat === "openrouter") {
89
+ return { xhigh: "xhigh" };
90
+ }
91
+ return { max: "max" };
92
+ }
93
+ return undefined;
94
+ }
95
+ function resolveReasoningEffort(thinkingLevelMap, effort) {
96
+ const mapped = thinkingLevelMap?.[effort];
97
+ return mapped === undefined ? effort : typeof mapped === "string" ? mapped : undefined;
98
+ }
99
+ /**
100
+ * Check if conversation messages contain tool calls or tool results.
101
+ * This is needed because Anthropic (via proxy) requires the tools param
102
+ * to be present when messages include tool_calls or tool role messages.
103
+ */
104
+ function hasHeader(headers, name) {
105
+ if (!headers)
106
+ return false;
107
+ const expected = name.toLowerCase();
108
+ for (const [key, value] of Object.entries(headers)) {
109
+ if (key.toLowerCase() === expected && value !== null && value.trim().length > 0)
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+ function getClientApiKey(provider, apiKey, headers) {
115
+ if (apiKey)
116
+ return apiKey;
117
+ if (hasHeader(headers, "authorization") || hasHeader(headers, "cf-aig-authorization"))
118
+ return "unused";
119
+ throw new Error(`No API key for provider: ${provider}`);
120
+ }
121
+ function hasToolHistory(messages) {
122
+ for (const msg of messages) {
123
+ if (msg.role === "toolResult") {
124
+ return true;
125
+ }
126
+ if (msg.role === "assistant") {
127
+ if (msg.content.some((block) => block.type === "toolCall")) {
128
+ return true;
129
+ }
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ function getDeferredToolNames(messages) {
135
+ const names = new Set();
136
+ for (const message of messages) {
137
+ if (message.role === "toolResult") {
138
+ for (const name of message.addedToolNames ?? []) {
139
+ names.add(name);
140
+ }
141
+ }
142
+ }
143
+ return names;
144
+ }
145
+ function getToolsByName(tools, names) {
146
+ if (!tools)
147
+ return [];
148
+ const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
149
+ return Array.from(names)
150
+ .map((name) => toolsByName.get(name))
151
+ .filter((tool) => tool !== undefined);
152
+ }
153
+ function isTextContentBlock(block) {
154
+ return block.type === "text";
155
+ }
156
+ function isThinkingContentBlock(block) {
157
+ return block.type === "thinking";
158
+ }
159
+ function isToolCallBlock(block) {
160
+ return block.type === "toolCall";
161
+ }
162
+ function isImageContentBlock(block) {
163
+ return block.type === "image";
164
+ }
165
+ function isRecord(value) {
166
+ return typeof value === "object" && value !== null;
167
+ }
168
+ function getOpenRouterRawMetadata(error) {
169
+ if (!isRecord(error) || !isRecord(error.error) || !isRecord(error.error.metadata))
170
+ return undefined;
171
+ const rawMetadata = error.error.metadata.raw;
172
+ return typeof rawMetadata === "string" ? rawMetadata : undefined;
173
+ }
174
+ function isForcedOpenAICompletionsToolChoice(toolChoice) {
175
+ return toolChoice !== undefined && toolChoice !== "auto" && toolChoice !== "none";
176
+ }
177
+ function isEncryptedReasoningDetail(detail) {
178
+ if (typeof detail !== "object" || detail === null) {
179
+ return false;
180
+ }
181
+ const candidate = detail;
182
+ return (candidate.type === "reasoning.encrypted" &&
183
+ typeof candidate.id === "string" &&
184
+ candidate.id.length > 0 &&
185
+ typeof candidate.data === "string" &&
186
+ candidate.data.length > 0);
187
+ }
188
+ function resolveCacheRetention(cacheRetention, env) {
189
+ if (cacheRetention) {
190
+ return cacheRetention;
191
+ }
192
+ if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") {
193
+ return "long";
194
+ }
195
+ return "short";
196
+ }
197
+ export const stream = (model, context, options) => {
198
+ const stream = new AssistantMessageEventStream();
199
+ (async () => {
200
+ const output = {
201
+ role: "assistant",
202
+ content: [],
203
+ api: model.api,
204
+ provider: model.provider,
205
+ model: model.id,
206
+ usage: {
207
+ input: 0,
208
+ output: 0,
209
+ cacheRead: 0,
210
+ cacheWrite: 0,
211
+ totalTokens: 0,
212
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
213
+ },
214
+ stopReason: "stop",
215
+ timestamp: Date.now(),
216
+ };
217
+ try {
218
+ const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
219
+ const compat = getCompat(model);
220
+ const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);
221
+ const cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env);
222
+ const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
223
+ const client = createClient(model, context, apiKey, options?.headers, cacheSessionId, compat);
224
+ let params = buildParams(model, context, options, compat, cacheRetention, grammarToolInputProperties);
225
+ const nextParams = await options?.onPayload?.(params, model);
226
+ if (nextParams !== undefined) {
227
+ params = nextParams;
228
+ }
229
+ params = normalizeRequestToolSchemas(params, compat);
230
+ const requestOptions = {
231
+ ...(options?.signal ? { signal: options.signal } : {}),
232
+ ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
233
+ maxRetries: 0,
234
+ };
235
+ const createChatCompletion = client.chat.completions.create.bind(client.chat.completions);
236
+ const createStream = (body) => createChatCompletion(body, requestOptions).withResponse();
237
+ const createRequest = async () => {
238
+ try {
239
+ return await createStream(params);
240
+ }
241
+ catch (error) {
242
+ if (isForcedToolChoiceUnsupportedError(error, isForcedOpenAICompletionsToolChoice(params.tool_choice))) {
243
+ params = omitToolChoiceParam(params);
244
+ return createStream(params);
245
+ }
246
+ throw error;
247
+ }
248
+ };
249
+ const { data: openaiStream, response } = await retryProviderRequest(createRequest, {
250
+ maxRetries: options?.maxRetries,
251
+ maxRetryDelayMs: options?.maxRetryDelayMs,
252
+ signal: options?.signal,
253
+ });
254
+ await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
255
+ stream.push({ type: "start", partial: output });
256
+ let textBlock = null;
257
+ let thinkingBlock = null;
258
+ let hasFinishReason = false;
259
+ const toolCallBlocksByIndex = new Map();
260
+ const toolCallBlocksById = new Map();
261
+ const pendingReasoningDetailsByToolCallId = new Map();
262
+ const blocks = output.content;
263
+ const getContentIndex = (block) => blocks.indexOf(block);
264
+ const getCustomToolCallInput = (block) => {
265
+ const property = block.customInput?.property;
266
+ if (property === undefined)
267
+ return "";
268
+ const value = block.arguments[property];
269
+ return typeof value === "string" ? value : "";
270
+ };
271
+ const appendCustomToolCallInput = (block, nextInput, close) => {
272
+ const customInput = block.customInput;
273
+ if (!customInput)
274
+ return undefined;
275
+ const delta = appendGrammarToolInputJsonDelta(customInput.jsonBuffer, customInput.property, nextInput, close);
276
+ block.arguments = { [customInput.property]: nextInput };
277
+ return delta;
278
+ };
279
+ const finishBlock = (block) => {
280
+ const contentIndex = getContentIndex(block);
281
+ if (contentIndex === -1) {
282
+ return;
283
+ }
284
+ if (block.type === "text") {
285
+ stream.push({
286
+ type: "text_end",
287
+ contentIndex,
288
+ content: block.text,
289
+ partial: output,
290
+ });
291
+ }
292
+ else if (block.type === "thinking") {
293
+ stream.push({
294
+ type: "thinking_end",
295
+ contentIndex,
296
+ content: block.thinking,
297
+ partial: output,
298
+ });
299
+ }
300
+ else if (block.type === "toolCall") {
301
+ if (block.customInput) {
302
+ const delta = appendCustomToolCallInput(block, getCustomToolCallInput(block), true);
303
+ if (delta !== undefined) {
304
+ stream.push({
305
+ type: "toolcall_delta",
306
+ contentIndex,
307
+ delta,
308
+ partial: output,
309
+ });
310
+ }
311
+ }
312
+ else {
313
+ block.arguments = parseStreamingJson(block.partialArgs);
314
+ }
315
+ // Finalize in-place and strip the scratch buffers so replay only
316
+ // carries parsed arguments.
317
+ delete block.partialArgs;
318
+ delete block.customInput;
319
+ delete block.streamIndex;
320
+ stream.push({
321
+ type: "toolcall_end",
322
+ contentIndex,
323
+ toolCall: block,
324
+ partial: output,
325
+ });
326
+ }
327
+ };
328
+ const ensureTextBlock = () => {
329
+ if (!textBlock) {
330
+ textBlock = { type: "text", text: "" };
331
+ blocks.push(textBlock);
332
+ stream.push({ type: "text_start", contentIndex: getContentIndex(textBlock), partial: output });
333
+ }
334
+ return textBlock;
335
+ };
336
+ const ensureThinkingBlock = (thinkingSignature) => {
337
+ if (!thinkingBlock) {
338
+ thinkingBlock = {
339
+ type: "thinking",
340
+ thinking: "",
341
+ thinkingSignature,
342
+ };
343
+ blocks.push(thinkingBlock);
344
+ stream.push({ type: "thinking_start", contentIndex: getContentIndex(thinkingBlock), partial: output });
345
+ }
346
+ return thinkingBlock;
347
+ };
348
+ const applyPendingReasoningDetail = (block) => {
349
+ if (!block.id) {
350
+ return;
351
+ }
352
+ const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
353
+ if (pendingReasoningDetail) {
354
+ block.thoughtSignature = pendingReasoningDetail;
355
+ pendingReasoningDetailsByToolCallId.delete(block.id);
356
+ }
357
+ };
358
+ const ensureToolCallBlock = (toolCall) => {
359
+ const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
360
+ const name = toolCall.function?.name ?? toolCall.custom?.name ?? "";
361
+ let block = streamIndex !== undefined ? toolCallBlocksByIndex.get(streamIndex) : undefined;
362
+ if (!block && toolCall.id) {
363
+ block = toolCallBlocksById.get(toolCall.id);
364
+ }
365
+ if (!block) {
366
+ // Note: the "input" fallback here should/must not be taken. in case the LLM makes up
367
+ // a tool we don't knwo about, we at least have a place to stash our stuff.
368
+ const customInputProperty = toolCall.custom
369
+ ? (grammarToolInputProperties.get(name) ?? "input")
370
+ : undefined;
371
+ const hasCustomInput = customInputProperty !== undefined;
372
+ block = {
373
+ type: "toolCall",
374
+ id: toolCall.id || "",
375
+ name,
376
+ arguments: hasCustomInput ? { [customInputProperty]: "" } : {},
377
+ partialArgs: hasCustomInput ? undefined : "",
378
+ customInput: hasCustomInput
379
+ ? { property: customInputProperty, jsonBuffer: { input: "", started: false, closed: false } }
380
+ : undefined,
381
+ streamIndex,
382
+ };
383
+ if (streamIndex !== undefined) {
384
+ toolCallBlocksByIndex.set(streamIndex, block);
385
+ }
386
+ if (toolCall.id) {
387
+ toolCallBlocksById.set(toolCall.id, block);
388
+ }
389
+ blocks.push(block);
390
+ stream.push({
391
+ type: "toolcall_start",
392
+ contentIndex: getContentIndex(block),
393
+ partial: output,
394
+ });
395
+ }
396
+ if (streamIndex !== undefined && block.streamIndex === undefined) {
397
+ block.streamIndex = streamIndex;
398
+ toolCallBlocksByIndex.set(streamIndex, block);
399
+ }
400
+ if (toolCall.id) {
401
+ toolCallBlocksById.set(toolCall.id, block);
402
+ }
403
+ if (!block.name && name) {
404
+ block.name = name;
405
+ }
406
+ if (toolCall.custom && !block.customInput) {
407
+ const customInputProperty = grammarToolInputProperties.get(block.name) ?? "input";
408
+ block.arguments = { [customInputProperty]: "" };
409
+ block.customInput = {
410
+ property: customInputProperty,
411
+ jsonBuffer: { input: "", started: false, closed: false },
412
+ };
413
+ delete block.partialArgs;
414
+ }
415
+ applyPendingReasoningDetail(block);
416
+ return block;
417
+ };
418
+ for await (const chunk of openaiStream) {
419
+ if (!chunk || typeof chunk !== "object")
420
+ continue;
421
+ // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
422
+ // and each chunk in a streamed completion carries the same id.
423
+ output.responseId ||= chunk.id;
424
+ if (typeof chunk.model === "string" && chunk.model.length > 0 && chunk.model !== model.id) {
425
+ output.responseModel ||= chunk.model;
426
+ }
427
+ if (chunk.usage) {
428
+ output.usage = parseChunkUsage(chunk.usage, model);
429
+ }
430
+ const choice = Array.isArray(chunk.choices) ? chunk.choices[0] : undefined;
431
+ if (!choice)
432
+ continue;
433
+ // Fallback: some providers (e.g., Moonshot) return usage
434
+ // in choice.usage instead of the standard chunk.usage
435
+ const choiceUsage = choice.usage;
436
+ if (!chunk.usage && choiceUsage) {
437
+ output.usage = parseChunkUsage(choiceUsage, model);
438
+ }
439
+ if (choice.finish_reason) {
440
+ const finishReasonResult = mapStopReason(choice.finish_reason);
441
+ output.stopReason = finishReasonResult.stopReason;
442
+ if (finishReasonResult.errorMessage) {
443
+ output.errorMessage = finishReasonResult.errorMessage;
444
+ }
445
+ hasFinishReason = true;
446
+ }
447
+ if (choice.delta) {
448
+ if (choice.delta.content !== null &&
449
+ choice.delta.content !== undefined &&
450
+ choice.delta.content.length > 0) {
451
+ const block = ensureTextBlock();
452
+ block.text += choice.delta.content;
453
+ stream.push({
454
+ type: "text_delta",
455
+ contentIndex: getContentIndex(block),
456
+ delta: choice.delta.content,
457
+ partial: output,
458
+ });
459
+ }
460
+ // Some endpoints return reasoning in reasoning_content (llama.cpp),
461
+ // or reasoning (other openai compatible endpoints)
462
+ // Use the first non-empty reasoning field to avoid duplication
463
+ // (e.g., chutes.ai returns both reasoning_content and reasoning with same content)
464
+ const reasoningFields = ["reasoning_content", "reasoning", "reasoning_text"];
465
+ const deltaFields = choice.delta;
466
+ let foundReasoningField = null;
467
+ for (const field of reasoningFields) {
468
+ const value = deltaFields[field];
469
+ if (typeof value === "string" && value.length > 0) {
470
+ foundReasoningField = field;
471
+ break;
472
+ }
473
+ }
474
+ if (foundReasoningField) {
475
+ const delta = deltaFields[foundReasoningField];
476
+ if (typeof delta === "string" && delta.length > 0) {
477
+ const thinkingSignature = model.provider === "opencode-go" && foundReasoningField === "reasoning"
478
+ ? "reasoning_content"
479
+ : foundReasoningField;
480
+ const block = ensureThinkingBlock(thinkingSignature);
481
+ block.thinking += delta;
482
+ stream.push({
483
+ type: "thinking_delta",
484
+ contentIndex: getContentIndex(block),
485
+ delta,
486
+ partial: output,
487
+ });
488
+ }
489
+ }
490
+ if (choice?.delta?.tool_calls) {
491
+ for (const toolCall of choice.delta.tool_calls) {
492
+ const block = ensureToolCallBlock(toolCall);
493
+ if (!block.id && toolCall.id) {
494
+ block.id = toolCall.id;
495
+ toolCallBlocksById.set(toolCall.id, block);
496
+ }
497
+ const name = toolCall.function?.name ?? toolCall.custom?.name;
498
+ if (!block.name && name) {
499
+ block.name = name;
500
+ }
501
+ let delta = "";
502
+ if (toolCall.function?.arguments) {
503
+ delta = toolCall.function.arguments;
504
+ block.partialArgs = (block.partialArgs ?? "") + toolCall.function.arguments;
505
+ block.arguments = parseStreamingJson(block.partialArgs);
506
+ }
507
+ else if (toolCall.custom?.input) {
508
+ const nextInput = getCustomToolCallInput(block) + toolCall.custom.input;
509
+ delta = appendCustomToolCallInput(block, nextInput, false) ?? "";
510
+ }
511
+ stream.push({
512
+ type: "toolcall_delta",
513
+ contentIndex: getContentIndex(block),
514
+ delta,
515
+ partial: output,
516
+ });
517
+ }
518
+ }
519
+ const reasoningDetails = choice.delta.reasoning_details;
520
+ if (Array.isArray(reasoningDetails)) {
521
+ for (const detail of reasoningDetails) {
522
+ if (isEncryptedReasoningDetail(detail)) {
523
+ const serializedDetail = JSON.stringify(detail);
524
+ const matchingToolCall = toolCallBlocksById.get(detail.id);
525
+ if (matchingToolCall) {
526
+ matchingToolCall.thoughtSignature = serializedDetail;
527
+ }
528
+ else {
529
+ pendingReasoningDetailsByToolCallId.set(detail.id, serializedDetail);
530
+ }
531
+ }
532
+ }
533
+ }
534
+ }
535
+ }
536
+ for (const block of blocks) {
537
+ finishBlock(block);
538
+ }
539
+ if (options?.signal?.aborted) {
540
+ throw new Error("Request was aborted");
541
+ }
542
+ if (output.stopReason === "aborted") {
543
+ throw new Error("Request was aborted");
544
+ }
545
+ if (output.stopReason === "error") {
546
+ throw new Error(output.errorMessage || "Provider returned an error stop reason");
547
+ }
548
+ if (!hasFinishReason) {
549
+ throw new Error("Stream ended without finish_reason");
550
+ }
551
+ stream.push({ type: "done", reason: output.stopReason, message: output });
552
+ stream.end();
553
+ }
554
+ catch (error) {
555
+ for (const block of output.content) {
556
+ delete block.index;
557
+ // Streaming scratch buffers are only used during parsing; never persist them.
558
+ delete block.partialArgs;
559
+ delete block.customInput;
560
+ delete block.streamIndex;
561
+ }
562
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
563
+ output.errorMessage = formatProviderError(normalizeProviderError(error));
564
+ // Some providers via OpenRouter give additional information in this field.
565
+ // normalizeProviderError already stringifies the parsed body (error.error)
566
+ // into errorMessage, so only append the raw metadata when it is not already
567
+ // present to avoid double-printing it.
568
+ const rawMetadata = getOpenRouterRawMetadata(error);
569
+ if (rawMetadata && !output.errorMessage.includes(String(rawMetadata))) {
570
+ output.errorMessage += `\n${rawMetadata}`;
571
+ }
572
+ stream.push({ type: "error", reason: output.stopReason, error: output });
573
+ stream.end();
574
+ }
575
+ })();
576
+ return stream;
577
+ };
578
+ export const streamSimple = (model, context, options) => {
579
+ getClientApiKey(model.provider, options?.apiKey, options?.headers);
580
+ const base = buildBaseOptions(model, context, options, options?.apiKey);
581
+ const compat = getCompat(model);
582
+ const thinkingLevelMap = getThinkingLevelMap(model, compat);
583
+ const thinkingModel = thinkingLevelMap === model.thinkingLevelMap ? model : { ...model, thinkingLevelMap };
584
+ const clampedReasoning = options?.reasoning ? clampThinkingLevel(thinkingModel, options.reasoning) : undefined;
585
+ const reasoningEffort = clampedReasoning === "off"
586
+ ? undefined
587
+ : clampedReasoning === "max" && thinkingLevelMap?.max !== undefined
588
+ ? "max"
589
+ : clampMaxForOpenAI(clampedReasoning, supportsXhigh(thinkingModel));
590
+ const toolChoice = options?.toolChoice;
591
+ return stream(model, context, {
592
+ ...base,
593
+ reasoningEffort,
594
+ toolChoice,
595
+ });
596
+ };
597
+ function createClient(model, context, apiKey, optionsHeaders, sessionId, compat = getCompat(model)) {
598
+ const headers = { ...model.headers };
599
+ if (model.provider === "github-copilot") {
600
+ const hasImages = hasCopilotVisionInput(context.messages);
601
+ const copilotHeaders = buildCopilotDynamicHeaders({
602
+ messages: context.messages,
603
+ hasImages,
604
+ });
605
+ Object.assign(headers, copilotHeaders);
606
+ }
607
+ if (sessionId && compat.sendSessionAffinityHeaders) {
608
+ if (compat.sessionAffinityFormat === "openrouter") {
609
+ headers["x-session-id"] = sessionId;
610
+ }
611
+ else {
612
+ if (compat.sessionAffinityFormat === "openai") {
613
+ headers.session_id = sessionId;
614
+ }
615
+ headers["x-client-request-id"] = sessionId;
616
+ headers["x-session-affinity"] = sessionId;
617
+ }
618
+ }
619
+ // Merge options headers last so they can override defaults
620
+ if (optionsHeaders) {
621
+ Object.assign(headers, optionsHeaders);
622
+ }
623
+ return new OpenAI({
624
+ apiKey,
625
+ baseURL: model.baseUrl,
626
+ dangerouslyAllowBrowser: true,
627
+ defaultHeaders: headers,
628
+ });
629
+ }
630
+ function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {
631
+ const messages = convertMessages(model, context, compat, {
632
+ preserveThinking: options?.reasoningEffort !== undefined,
633
+ grammarToolInputProperties,
634
+ });
635
+ const cacheControl = getCompatCacheControl(compat, cacheRetention);
636
+ const thinkingLevelMap = getThinkingLevelMap(model, compat);
637
+ const params = {
638
+ model: model.id,
639
+ messages,
640
+ stream: true,
641
+ prompt_cache_key: (model.baseUrl.includes("api.openai.com") && cacheRetention !== "none") ||
642
+ (cacheRetention === "long" && compat.supportsLongCacheRetention)
643
+ ? clampOpenAIPromptCacheKey(options?.sessionId)
644
+ : undefined,
645
+ prompt_cache_retention: cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : undefined,
646
+ };
647
+ if (compat.supportsUsageInStreaming !== false) {
648
+ params.stream_options = { include_usage: true };
649
+ }
650
+ if (compat.supportsStore) {
651
+ params.store = false;
652
+ }
653
+ if (options?.maxTokens) {
654
+ if (compat.maxTokensField === "max_tokens") {
655
+ params.max_tokens = options.maxTokens;
656
+ }
657
+ else {
658
+ params.max_completion_tokens = options.maxTokens;
659
+ }
660
+ }
661
+ if (options?.temperature !== undefined) {
662
+ params.temperature = options.temperature;
663
+ }
664
+ const deferredToolNames = compat.deferredToolsMode === "kimi" ? getDeferredToolNames(context.messages) : new Set();
665
+ const activeTools = context.tools?.filter((tool) => !deferredToolNames.has(tool.name));
666
+ if (activeTools && activeTools.length > 0) {
667
+ params.tools = convertTools(activeTools, compat);
668
+ if (compat.zaiToolStream) {
669
+ params.tool_stream = true;
670
+ }
671
+ }
672
+ else if (hasToolHistory(context.messages)) {
673
+ // Anthropic (via LiteLLM/proxy) requires tools param when conversation has tool_calls/tool_results
674
+ params.tools = [];
675
+ }
676
+ if (cacheControl) {
677
+ applyAnthropicCacheControl(messages, params.tools, cacheControl);
678
+ }
679
+ if (options?.toolChoice) {
680
+ params.tool_choice = options.toolChoice;
681
+ }
682
+ if (compat.thinkingFormat === "zai" && model.reasoning) {
683
+ const zaiParams = params;
684
+ zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
685
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
686
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
687
+ if (effort !== undefined) {
688
+ zaiParams.reasoning_effort = effort;
689
+ }
690
+ }
691
+ }
692
+ else if (compat.thinkingFormat === "qwen" && model.reasoning) {
693
+ params.enable_thinking = !!options?.reasoningEffort;
694
+ }
695
+ else if (compat.thinkingFormat === "qwen-chat-template" && model.reasoning) {
696
+ params.chat_template_kwargs = {
697
+ enable_thinking: !!options?.reasoningEffort,
698
+ preserve_thinking: true,
699
+ };
700
+ }
701
+ else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
702
+ const chatTemplateKwargs = buildChatTemplateKwargs(model, options, compat);
703
+ if (chatTemplateKwargs) {
704
+ params.chat_template_kwargs = chatTemplateKwargs;
705
+ }
706
+ }
707
+ else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
708
+ if (options?.reasoningEffort) {
709
+ params.thinking = { type: "enabled" };
710
+ if (compat.supportsReasoningEffort) {
711
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
712
+ if (effort !== undefined) {
713
+ params.reasoning_effort = effort;
714
+ }
715
+ }
716
+ }
717
+ else if (compat.supportsDisabledThinking !== false && thinkingLevelMap?.off !== null) {
718
+ params.thinking = { type: "disabled" };
719
+ }
720
+ }
721
+ else if (compat.thinkingFormat === "openrouter" && model.reasoning) {
722
+ // OpenRouter normalizes reasoning across providers via a nested reasoning object.
723
+ const openRouterParams = params;
724
+ if (options?.reasoningEffort) {
725
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
726
+ if (effort !== undefined) {
727
+ openRouterParams.reasoning = { effort };
728
+ }
729
+ }
730
+ else if (thinkingLevelMap?.off !== null) {
731
+ openRouterParams.reasoning = { effort: thinkingLevelMap?.off ?? "none" };
732
+ }
733
+ }
734
+ else if (compat.thinkingFormat === "ant-ling" && model.reasoning && options?.reasoningEffort) {
735
+ const effort = thinkingLevelMap?.[options.reasoningEffort];
736
+ if (typeof effort === "string") {
737
+ params.reasoning = { effort };
738
+ }
739
+ }
740
+ else if (compat.thinkingFormat === "together" && model.reasoning) {
741
+ const togetherParams = params;
742
+ togetherParams.reasoning = { enabled: !!options?.reasoningEffort };
743
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
744
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
745
+ if (effort !== undefined) {
746
+ togetherParams.reasoning_effort = effort;
747
+ }
748
+ }
749
+ }
750
+ else if (compat.thinkingFormat === "string-thinking" && model.reasoning) {
751
+ if (options?.reasoningEffort) {
752
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
753
+ if (effort !== undefined) {
754
+ params.thinking = effort;
755
+ }
756
+ }
757
+ else if (thinkingLevelMap?.off !== null) {
758
+ params.thinking = thinkingLevelMap?.off ?? "none";
759
+ }
760
+ }
761
+ else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {
762
+ // OpenAI-style reasoning_effort
763
+ const effort = resolveReasoningEffort(thinkingLevelMap, options.reasoningEffort);
764
+ if (effort !== undefined) {
765
+ params.reasoning_effort = effort;
766
+ }
767
+ }
768
+ else if (!options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {
769
+ const offValue = thinkingLevelMap?.off;
770
+ if (typeof offValue === "string") {
771
+ params.reasoning_effort = offValue;
772
+ }
773
+ }
774
+ // OpenRouter provider routing preferences
775
+ if (model.compat?.openRouterRouting) {
776
+ params.provider = model.compat.openRouterRouting;
777
+ }
778
+ // Vercel AI Gateway provider routing preferences
779
+ if (model.compat?.vercelGatewayRouting) {
780
+ const routing = model.compat.vercelGatewayRouting;
781
+ if (routing.only || routing.order) {
782
+ const gatewayOptions = {};
783
+ if (routing.only)
784
+ gatewayOptions.only = routing.only;
785
+ if (routing.order)
786
+ gatewayOptions.order = routing.order;
787
+ params.providerOptions = { gateway: gatewayOptions };
788
+ }
789
+ }
790
+ applyExtraBody(params, options?.extraBody, OPENAI_COMPLETIONS_RESERVED_BODY_KEYS);
791
+ return params;
792
+ }
793
+ function buildChatTemplateKwargs(model, options, compat) {
794
+ const kwargs = {};
795
+ for (const [key, value] of Object.entries(compat.chatTemplateKwargs)) {
796
+ const resolved = resolveChatTemplateKwargValue(model, options, compat, value);
797
+ if (resolved !== undefined) {
798
+ kwargs[key] = resolved;
799
+ }
800
+ }
801
+ return Object.keys(kwargs).length > 0 ? kwargs : undefined;
802
+ }
803
+ function resolveChatTemplateKwargValue(model, options, compat, value) {
804
+ if (typeof value !== "object" || value === null) {
805
+ return value;
806
+ }
807
+ const reasoningEffort = options?.reasoningEffort;
808
+ if (!reasoningEffort && value.omitWhenOff) {
809
+ return undefined;
810
+ }
811
+ if (value.$var === "thinking.enabled") {
812
+ return !!reasoningEffort;
813
+ }
814
+ const thinkingLevelMap = getThinkingLevelMap(model, compat);
815
+ const mappedValue = reasoningEffort ? thinkingLevelMap?.[reasoningEffort] : thinkingLevelMap?.off;
816
+ return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
817
+ }
818
+ function getCompatCacheControl(compat, cacheRetention) {
819
+ if (compat.cacheControlFormat !== "anthropic" || cacheRetention === "none") {
820
+ return undefined;
821
+ }
822
+ const ttl = cacheRetention === "long" && compat.supportsLongCacheRetention ? "1h" : undefined;
823
+ return { type: "ephemeral", ...(ttl ? { ttl } : {}) };
824
+ }
825
+ function applyAnthropicCacheControl(messages, tools, cacheControl) {
826
+ addCacheControlToSystemPrompt(messages, cacheControl);
827
+ addCacheControlToLastTool(tools, cacheControl);
828
+ addCacheControlToLastConversationMessage(messages, cacheControl);
829
+ }
830
+ function addCacheControlToSystemPrompt(messages, cacheControl) {
831
+ for (const message of messages) {
832
+ if (message.role === "system" || message.role === "developer") {
833
+ addCacheControlToInstructionMessage(message, cacheControl);
834
+ return;
835
+ }
836
+ }
837
+ }
838
+ function addCacheControlToLastConversationMessage(messages, cacheControl) {
839
+ for (let i = messages.length - 1; i >= 0; i--) {
840
+ const message = messages[i];
841
+ if (message.role === "user" || message.role === "assistant" || message.role === "tool") {
842
+ if (addCacheControlToMessage(message, cacheControl)) {
843
+ return;
844
+ }
845
+ }
846
+ }
847
+ }
848
+ function addCacheControlToLastTool(tools, cacheControl) {
849
+ if (!tools || tools.length === 0) {
850
+ return;
851
+ }
852
+ const lastTool = tools[tools.length - 1];
853
+ lastTool.cache_control = cacheControl;
854
+ }
855
+ function addCacheControlToInstructionMessage(message, cacheControl) {
856
+ return addCacheControlToTextContent(message, cacheControl);
857
+ }
858
+ function addCacheControlToMessage(message, cacheControl) {
859
+ if (message.role === "user" || message.role === "assistant" || message.role === "tool") {
860
+ return addCacheControlToTextContent(message, cacheControl);
861
+ }
862
+ return false;
863
+ }
864
+ function addCacheControlToTextContent(message, cacheControl) {
865
+ const content = message.content;
866
+ if (typeof content === "string") {
867
+ if (content.length === 0) {
868
+ return false;
869
+ }
870
+ message.content = [
871
+ {
872
+ type: "text",
873
+ text: content,
874
+ cache_control: cacheControl,
875
+ },
876
+ ];
877
+ return true;
878
+ }
879
+ if (!Array.isArray(content)) {
880
+ return false;
881
+ }
882
+ for (let i = content.length - 1; i >= 0; i--) {
883
+ const part = content[i];
884
+ if (part?.type === "text") {
885
+ const textPart = part;
886
+ textPart.cache_control = cacheControl;
887
+ return true;
888
+ }
889
+ }
890
+ return false;
891
+ }
892
+ export function convertMessages(model, context, compat, options = {}) {
893
+ const params = [];
894
+ const normalizeToolCallId = (id) => {
895
+ // Handle pipe-separated IDs from OpenAI Responses API
896
+ // Format: {call_id}|{id} where {id} can be 400+ chars with special chars (+, /, =)
897
+ // These come from providers like github-copilot, openai-codex, opencode
898
+ // Extract just the call_id part and normalize it
899
+ // Multiple tool calls in the same turn can share call_id but differ by item_id.
900
+ // Preserve item-level uniqueness when replaying into Chat Completions, which
901
+ // requires distinct tool call ids.
902
+ if (id.includes("|")) {
903
+ // Sanitize to allowed chars and truncate to 40 chars (OpenAI limit)
904
+ const separatorIndex = id.indexOf("|");
905
+ const callId = id.slice(0, separatorIndex).replace(/[^a-zA-Z0-9_-]/g, "_");
906
+ const itemId = id.slice(separatorIndex + 1).replace(/[^a-zA-Z0-9_-]/g, "_");
907
+ const combinedId = itemId.length > 0 ? `${callId}_${itemId}` : callId;
908
+ if (combinedId.length <= 40) {
909
+ return combinedId;
910
+ }
911
+ const hash = shortHash(id).slice(0, 8);
912
+ const prefix = callId.slice(0, Math.max(1, 40 - hash.length - 1));
913
+ return `${prefix}_${hash}`;
914
+ }
915
+ if (model.provider === "openai")
916
+ return id.length > 40 ? id.slice(0, 40) : id;
917
+ return id;
918
+ };
919
+ const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id), {
920
+ preserveThinking: options.preserveThinking,
921
+ });
922
+ if (context.systemPrompt) {
923
+ const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;
924
+ const role = useDeveloperRole ? "developer" : "system";
925
+ params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
926
+ }
927
+ let lastRole = null;
928
+ for (let i = 0; i < transformedMessages.length; i++) {
929
+ const msg = transformedMessages[i];
930
+ // Some providers don't allow user messages directly after tool results
931
+ // Insert a synthetic assistant message to bridge the gap
932
+ if (compat.requiresAssistantAfterToolResult && lastRole === "toolResult" && msg.role === "user") {
933
+ params.push({
934
+ role: "assistant",
935
+ content: "I have processed the tool results.",
936
+ });
937
+ }
938
+ if (msg.role === "user") {
939
+ if (typeof msg.content === "string") {
940
+ params.push({
941
+ role: "user",
942
+ content: sanitizeSurrogates(msg.content),
943
+ });
944
+ }
945
+ else {
946
+ const content = msg.content.map((item) => {
947
+ if (item.type === "text") {
948
+ return {
949
+ type: "text",
950
+ text: sanitizeSurrogates(item.text),
951
+ };
952
+ }
953
+ else {
954
+ return {
955
+ type: "image_url",
956
+ image_url: {
957
+ url: `data:${item.mimeType};base64,${item.data}`,
958
+ },
959
+ };
960
+ }
961
+ });
962
+ if (content.length === 0)
963
+ continue;
964
+ params.push({
965
+ role: "user",
966
+ content,
967
+ });
968
+ }
969
+ }
970
+ else if (msg.role === "assistant") {
971
+ // Some providers don't accept null content, use empty string instead
972
+ const assistantMsg = {
973
+ role: "assistant",
974
+ content: compat.requiresAssistantAfterToolResult ? "" : null,
975
+ };
976
+ const assistantTextParts = msg.content
977
+ .filter(isTextContentBlock)
978
+ .filter((block) => block.text.trim().length > 0)
979
+ .map((block) => ({
980
+ type: "text",
981
+ text: sanitizeSurrogates(block.text),
982
+ }));
983
+ const assistantText = assistantTextParts.map((part) => part.text).join("");
984
+ const nonEmptyThinkingBlocks = msg.content
985
+ .filter(isThinkingContentBlock)
986
+ .filter((block) => block.thinking.trim().length > 0);
987
+ if (nonEmptyThinkingBlocks.length > 0) {
988
+ if (compat.requiresThinkingAsText) {
989
+ // Convert thinking blocks to plain text (no tags to avoid model mimicking them)
990
+ const thinkingText = nonEmptyThinkingBlocks
991
+ .map((block) => sanitizeSurrogates(block.thinking))
992
+ .join("\n\n");
993
+ assistantMsg.content = [{ type: "text", text: thinkingText }, ...assistantTextParts];
994
+ }
995
+ else {
996
+ // Always send assistant content as a plain string (OpenAI Chat Completions
997
+ // API standard format). Sending as an array of {type:"text", text:"..."}
998
+ // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via
999
+ // NVIDIA NIM) to mirror the content-block structure literally in their
1000
+ // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].
1001
+ if (assistantText.length > 0) {
1002
+ assistantMsg.content = assistantText;
1003
+ }
1004
+ // Use the signature from the first thinking block if available (for llama.cpp server + gpt-oss)
1005
+ let signature = nonEmptyThinkingBlocks[0].thinkingSignature;
1006
+ if (model.provider === "opencode-go" && signature === "reasoning") {
1007
+ signature = "reasoning_content";
1008
+ }
1009
+ if (signature && signature.length > 0) {
1010
+ Object.assign(assistantMsg, {
1011
+ [signature]: nonEmptyThinkingBlocks.map((block) => block.thinking).join("\n"),
1012
+ });
1013
+ }
1014
+ }
1015
+ }
1016
+ else if (assistantText.length > 0) {
1017
+ // Always send assistant content as a plain string (OpenAI Chat Completions
1018
+ // API standard format). Sending as an array of {type:"text", text:"..."}
1019
+ // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via
1020
+ // NVIDIA NIM) to mirror the content-block structure literally in their
1021
+ // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].
1022
+ assistantMsg.content = assistantText;
1023
+ }
1024
+ const toolCalls = msg.content.filter(isToolCallBlock);
1025
+ if (toolCalls.length > 0) {
1026
+ assistantMsg.tool_calls = toolCalls.map((tc) => {
1027
+ const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);
1028
+ if (customInputProperty !== undefined) {
1029
+ return {
1030
+ id: tc.id,
1031
+ type: "custom",
1032
+ custom: {
1033
+ name: tc.name,
1034
+ input: sanitizeSurrogates(getGrammarToolInput(tc.name, tc.arguments, customInputProperty)),
1035
+ },
1036
+ };
1037
+ }
1038
+ return {
1039
+ id: tc.id,
1040
+ type: "function",
1041
+ function: {
1042
+ name: tc.name,
1043
+ arguments: JSON.stringify(tc.arguments),
1044
+ },
1045
+ };
1046
+ });
1047
+ const reasoningDetails = toolCalls
1048
+ .filter((tc) => tc.thoughtSignature)
1049
+ .map((tc) => {
1050
+ try {
1051
+ return JSON.parse(tc.thoughtSignature);
1052
+ }
1053
+ catch {
1054
+ return null;
1055
+ }
1056
+ })
1057
+ .filter(Boolean);
1058
+ if (reasoningDetails.length > 0) {
1059
+ Object.assign(assistantMsg, { reasoning_details: reasoningDetails });
1060
+ }
1061
+ }
1062
+ if (compat.requiresReasoningContentOnAssistantMessages &&
1063
+ model.reasoning &&
1064
+ assistantMsg.reasoning_content === undefined) {
1065
+ assistantMsg.reasoning_content = "";
1066
+ }
1067
+ // Skip assistant messages that have no content and no tool calls.
1068
+ // Some providers require "either content or tool_calls, but not none".
1069
+ // Other providers also don't accept empty assistant messages.
1070
+ // This handles aborted assistant responses that got no content.
1071
+ const content = assistantMsg.content;
1072
+ const hasContent = content !== null &&
1073
+ content !== undefined &&
1074
+ (typeof content === "string" ? content.length > 0 : content.length > 0);
1075
+ if (!hasContent && !assistantMsg.tool_calls) {
1076
+ continue;
1077
+ }
1078
+ params.push(assistantMsg);
1079
+ }
1080
+ else if (msg.role === "toolResult") {
1081
+ const imageBlocks = [];
1082
+ const deferredToolNames = new Set();
1083
+ let j = i;
1084
+ for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
1085
+ const toolMsg = transformedMessages[j];
1086
+ // Extract text and image content
1087
+ const textResult = toolMsg.content
1088
+ .filter(isTextContentBlock)
1089
+ .map((block) => block.text)
1090
+ .join("\n");
1091
+ const hasImages = toolMsg.content.some((c) => c.type === "image");
1092
+ // Always send tool result with text (or placeholder if only images)
1093
+ const hasText = textResult.length > 0;
1094
+ const toolResultText = hasText ? textResult : hasImages ? "(see attached image)" : "(no tool output)";
1095
+ // Some providers require the 'name' field in tool results
1096
+ const toolResultMsg = {
1097
+ role: "tool",
1098
+ content: sanitizeSurrogates(toolResultText),
1099
+ tool_call_id: toolMsg.toolCallId,
1100
+ };
1101
+ if (compat.requiresToolResultName && toolMsg.toolName) {
1102
+ Object.assign(toolResultMsg, { name: toolMsg.toolName });
1103
+ }
1104
+ params.push(toolResultMsg);
1105
+ if (compat.deferredToolsMode === "kimi") {
1106
+ for (const name of toolMsg.addedToolNames ?? []) {
1107
+ deferredToolNames.add(name);
1108
+ }
1109
+ }
1110
+ if (hasImages && model.input.includes("image")) {
1111
+ for (const block of toolMsg.content) {
1112
+ if (isImageContentBlock(block)) {
1113
+ imageBlocks.push({
1114
+ type: "image_url",
1115
+ image_url: {
1116
+ url: `data:${block.mimeType};base64,${block.data}`,
1117
+ },
1118
+ });
1119
+ }
1120
+ }
1121
+ }
1122
+ }
1123
+ i = j - 1;
1124
+ if (imageBlocks.length > 0) {
1125
+ if (compat.requiresAssistantAfterToolResult) {
1126
+ params.push({
1127
+ role: "assistant",
1128
+ content: "I have processed the tool results.",
1129
+ });
1130
+ }
1131
+ params.push({
1132
+ role: "user",
1133
+ content: [
1134
+ {
1135
+ type: "text",
1136
+ text: "Attached image(s) from tool result:",
1137
+ },
1138
+ ...imageBlocks,
1139
+ ],
1140
+ });
1141
+ lastRole = "user";
1142
+ }
1143
+ else {
1144
+ lastRole = "toolResult";
1145
+ }
1146
+ if (deferredToolNames.size > 0) {
1147
+ const deferredTools = getToolsByName(context.tools, deferredToolNames);
1148
+ if (deferredTools.length > 0) {
1149
+ const kimiToolMessage = {
1150
+ role: "system",
1151
+ tools: convertTools(deferredTools, compat),
1152
+ };
1153
+ // Kimi accepts a system message with tools but omits the standard content field.
1154
+ params.push(kimiToolMessage);
1155
+ }
1156
+ }
1157
+ continue;
1158
+ }
1159
+ lastRole = msg.role;
1160
+ }
1161
+ return params;
1162
+ }
1163
+ function convertTools(tools, compat) {
1164
+ return tools.map((tool) => {
1165
+ const grammar = resolveGrammarConstrainedSampling(tool, compat.supportsOpenAIGrammarTools);
1166
+ if (grammar) {
1167
+ return {
1168
+ type: "custom",
1169
+ custom: {
1170
+ name: tool.name,
1171
+ description: tool.description,
1172
+ format: {
1173
+ type: "grammar",
1174
+ grammar: {
1175
+ syntax: grammar.format,
1176
+ definition: grammar.definition,
1177
+ },
1178
+ },
1179
+ },
1180
+ };
1181
+ }
1182
+ if (tool.freeform) {
1183
+ throw new Error("Freeform tools cannot be sent to OpenAI Chat Completions; use Responses API");
1184
+ }
1185
+ const normalizedParameters = compat.toolSchemaFlavor === "moonshot-mfjs"
1186
+ ? normalizeToolParametersForMoonshot(tool.parameters)
1187
+ : normalizeToolParametersForOpenAICompat(tool.parameters);
1188
+ const strict = resolveJsonSchemaStrictSampling(tool, compat.supportsStrictMode !== false);
1189
+ return {
1190
+ type: "function",
1191
+ function: {
1192
+ name: tool.name,
1193
+ description: tool.description,
1194
+ parameters: normalizedParameters,
1195
+ // Only include strict if provider supports it. Some reject unknown fields.
1196
+ ...(compat.supportsStrictMode !== false && { strict: strict ?? false }),
1197
+ },
1198
+ };
1199
+ });
1200
+ }
1201
+ function normalizeRequestToolSchemas(params, compat) {
1202
+ if (!params.tools)
1203
+ return params;
1204
+ return {
1205
+ ...params,
1206
+ tools: params.tools.map((tool) => {
1207
+ if (tool.type !== "function" || !tool.function.parameters)
1208
+ return tool;
1209
+ const parameters = compat.toolSchemaFlavor === "moonshot-mfjs"
1210
+ ? normalizeToolParametersForMoonshot(tool.function.parameters)
1211
+ : normalizeToolParametersForOpenAICompat(tool.function.parameters);
1212
+ return {
1213
+ ...tool,
1214
+ function: { ...tool.function, parameters },
1215
+ };
1216
+ }),
1217
+ };
1218
+ }
1219
+ function parseChunkUsage(rawUsage, model) {
1220
+ const promptTokens = rawUsage.prompt_tokens || 0;
1221
+ const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;
1222
+ const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
1223
+ // Follow documented OpenAI/OpenRouter semantics: cached_tokens is cache-read
1224
+ // tokens (hits). OpenAI does not document or emit cache_write_tokens, but
1225
+ // OpenRouter-compatible providers can include it as a separate write count.
1226
+ // OpenRouter's own provider/tests affirm the separate mapping:
1227
+ // https://github.com/OpenRouterTeam/ai-sdk-provider/pull/409
1228
+ // Do not subtract writes from cached_tokens, otherwise spec-compliant
1229
+ // providers are under-reported. DS4 mirrors this contract too:
1230
+ // https://github.com/antirez/ds4/pull/29
1231
+ const input = Math.max(0, promptTokens - cacheReadTokens - cacheWriteTokens);
1232
+ // OpenAI completion_tokens already includes reasoning_tokens.
1233
+ const outputTokens = rawUsage.completion_tokens || 0;
1234
+ const usage = {
1235
+ input,
1236
+ output: outputTokens,
1237
+ cacheRead: cacheReadTokens,
1238
+ cacheWrite: cacheWriteTokens,
1239
+ reasoning: rawUsage.completion_tokens_details?.reasoning_tokens || 0,
1240
+ totalTokens: input + outputTokens + cacheReadTokens + cacheWriteTokens,
1241
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
1242
+ };
1243
+ calculateCost(model, usage);
1244
+ return usage;
1245
+ }
1246
+ function mapStopReason(reason) {
1247
+ if (reason === null)
1248
+ return { stopReason: "stop" };
1249
+ switch (reason) {
1250
+ case "stop":
1251
+ case "end":
1252
+ return { stopReason: "stop" };
1253
+ case "length":
1254
+ return { stopReason: "length" };
1255
+ case "function_call":
1256
+ case "tool_calls":
1257
+ return { stopReason: "toolUse" };
1258
+ case "content_filter":
1259
+ return { stopReason: "error", errorMessage: "Provider finish_reason: content_filter" };
1260
+ case "network_error":
1261
+ return { stopReason: "error", errorMessage: "Provider finish_reason: network_error" };
1262
+ default:
1263
+ return {
1264
+ stopReason: "error",
1265
+ errorMessage: `Provider finish_reason: ${reason}`,
1266
+ };
1267
+ }
1268
+ }
1269
+ /**
1270
+ * Detect compatibility settings from provider and baseUrl for known providers.
1271
+ * Provider takes precedence over URL-based detection since it's explicitly configured.
1272
+ * Returns a fully resolved OpenAICompletionsCompat object with all fields set.
1273
+ */
1274
+ function detectCompat(model) {
1275
+ const provider = model.provider;
1276
+ const baseUrl = model.baseUrl;
1277
+ const isZai = provider === "zai" ||
1278
+ provider === "zai-coding-cn" ||
1279
+ baseUrl.includes("api.z.ai") ||
1280
+ baseUrl.includes("open.bigmodel.cn");
1281
+ const isTogether = provider === "together" || baseUrl.includes("api.together.ai") || baseUrl.includes("api.together.xyz");
1282
+ const isMoonshot = provider === "moonshotai" || provider === "moonshotai-cn" || baseUrl.includes("api.moonshot.");
1283
+ const isOpenRouter = provider === "openrouter" || baseUrl.includes("openrouter.ai");
1284
+ const isCloudflareWorkersAI = provider === "cloudflare-workers-ai" || baseUrl.includes("api.cloudflare.com");
1285
+ const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
1286
+ const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
1287
+ const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com");
1288
+ const isNonStandard = isNvidia ||
1289
+ provider === "cerebras" ||
1290
+ baseUrl.includes("cerebras.ai") ||
1291
+ provider === "xai" ||
1292
+ baseUrl.includes("api.x.ai") ||
1293
+ isTogether ||
1294
+ baseUrl.includes("chutes.ai") ||
1295
+ baseUrl.includes("deepseek.com") ||
1296
+ isZai ||
1297
+ isMoonshot ||
1298
+ provider === "opencode" ||
1299
+ baseUrl.includes("opencode.ai") ||
1300
+ isCloudflareWorkersAI ||
1301
+ isCloudflareAiGateway ||
1302
+ isAntLing;
1303
+ const useMaxTokens = baseUrl.includes("chutes.ai") || isMoonshot || isCloudflareAiGateway || isTogether || isNvidia || isAntLing;
1304
+ const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
1305
+ const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
1306
+ const isOpenRouterDeveloperRoleModel = isOpenRouter && (model.id.startsWith("anthropic/") || model.id.startsWith("openai/"));
1307
+ const cacheControlFormat = provider === "openrouter" && model.id.startsWith("anthropic/") ? "anthropic" : undefined;
1308
+ return {
1309
+ supportsStore: !isNonStandard,
1310
+ supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
1311
+ supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
1312
+ supportsUsageInStreaming: true,
1313
+ maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
1314
+ requiresToolResultName: false,
1315
+ requiresAssistantAfterToolResult: false,
1316
+ requiresThinkingAsText: false,
1317
+ requiresReasoningContentOnAssistantMessages: isDeepSeek,
1318
+ thinkingFormat: isDeepSeek
1319
+ ? "deepseek"
1320
+ : isZai
1321
+ ? "zai"
1322
+ : isTogether
1323
+ ? "together"
1324
+ : isAntLing
1325
+ ? "ant-ling"
1326
+ : isOpenRouter
1327
+ ? "openrouter"
1328
+ : "openai",
1329
+ openRouterRouting: {},
1330
+ vercelGatewayRouting: {},
1331
+ chatTemplateKwargs: {},
1332
+ zaiToolStream: false,
1333
+ supportsStrictMode: !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia,
1334
+ toolSchemaFlavor: isMoonshot ? "moonshot-mfjs" : undefined,
1335
+ supportsDisabledThinking: true,
1336
+ toolCallFormat: undefined,
1337
+ supportsOpenAIGrammarTools: false,
1338
+ cacheControlFormat,
1339
+ sendSessionAffinityHeaders: false,
1340
+ deferredToolsMode: undefined,
1341
+ sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
1342
+ supportsLongCacheRetention: !(isTogether ||
1343
+ isCloudflareWorkersAI ||
1344
+ isCloudflareAiGateway ||
1345
+ isNvidia ||
1346
+ isAntLing),
1347
+ };
1348
+ }
1349
+ /**
1350
+ * Get resolved compatibility settings for a model.
1351
+ * Auto-detects from provider/URL then overrides with explicit model.compat.
1352
+ */
1353
+ function getCompat(model) {
1354
+ const detected = detectCompat(model);
1355
+ if (!model.compat)
1356
+ return detected;
1357
+ return {
1358
+ supportsStore: model.compat.supportsStore ?? detected.supportsStore,
1359
+ supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
1360
+ supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
1361
+ supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
1362
+ maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
1363
+ requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
1364
+ requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
1365
+ requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
1366
+ requiresReasoningContentOnAssistantMessages: model.compat.requiresReasoningContentOnAssistantMessages ??
1367
+ detected.requiresReasoningContentOnAssistantMessages,
1368
+ thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,
1369
+ supportsDisabledThinking: model.compat.supportsDisabledThinking ?? detected.supportsDisabledThinking,
1370
+ openRouterRouting: model.compat.openRouterRouting ?? detected.openRouterRouting,
1371
+ vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
1372
+ chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
1373
+ zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
1374
+ supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
1375
+ toolCallFormat: model.compat.toolCallFormat ?? detected.toolCallFormat,
1376
+ supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,
1377
+ cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
1378
+ sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
1379
+ deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
1380
+ sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
1381
+ supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
1382
+ };
1383
+ }
1384
+ //# sourceMappingURL=openai-completions.js.map