@ashx-j/lunr-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/README.md +1621 -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 +1060 -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 +221 -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 +883 -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 +9 -0
  27. package/dist/api/cloudflare.d.ts.map +1 -0
  28. package/dist/api/cloudflare.js +9 -0
  29. package/dist/api/cloudflare.js.map +1 -0
  30. package/dist/api/github-copilot-headers.d.ts +8 -0
  31. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  32. package/dist/api/github-copilot-headers.js +29 -0
  33. package/dist/api/github-copilot-headers.js.map +1 -0
  34. package/dist/api/google-generative-ai.d.ts +13 -0
  35. package/dist/api/google-generative-ai.d.ts.map +1 -0
  36. package/dist/api/google-generative-ai.js +407 -0
  37. package/dist/api/google-generative-ai.js.map +1 -0
  38. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  39. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  40. package/dist/api/google-generative-ai.lazy.js +3 -0
  41. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  42. package/dist/api/google-shared.d.ts +70 -0
  43. package/dist/api/google-shared.d.ts.map +1 -0
  44. package/dist/api/google-shared.js +329 -0
  45. package/dist/api/google-shared.js.map +1 -0
  46. package/dist/api/google-vertex.d.ts +15 -0
  47. package/dist/api/google-vertex.d.ts.map +1 -0
  48. package/dist/api/google-vertex.js +456 -0
  49. package/dist/api/google-vertex.js.map +1 -0
  50. package/dist/api/google-vertex.lazy.d.ts +3 -0
  51. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  52. package/dist/api/google-vertex.lazy.js +3 -0
  53. package/dist/api/google-vertex.lazy.js.map +1 -0
  54. package/dist/api/lazy.d.ts +15 -0
  55. package/dist/api/lazy.d.ts.map +1 -0
  56. package/dist/api/lazy.js +58 -0
  57. package/dist/api/lazy.js.map +1 -0
  58. package/dist/api/mistral-conversations.d.ts +25 -0
  59. package/dist/api/mistral-conversations.d.ts.map +1 -0
  60. package/dist/api/mistral-conversations.js +555 -0
  61. package/dist/api/mistral-conversations.js.map +1 -0
  62. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  63. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  64. package/dist/api/mistral-conversations.lazy.js +3 -0
  65. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  66. package/dist/api/openai-codex-responses.d.ts +31 -0
  67. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  68. package/dist/api/openai-codex-responses.js +1227 -0
  69. package/dist/api/openai-codex-responses.js.map +1 -0
  70. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  71. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  72. package/dist/api/openai-codex-responses.lazy.js +3 -0
  73. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  74. package/dist/api/openai-completions.d.ts +20 -0
  75. package/dist/api/openai-completions.d.ts.map +1 -0
  76. package/dist/api/openai-completions.js +1116 -0
  77. package/dist/api/openai-completions.js.map +1 -0
  78. package/dist/api/openai-completions.lazy.d.ts +3 -0
  79. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  80. package/dist/api/openai-completions.lazy.js +3 -0
  81. package/dist/api/openai-completions.lazy.js.map +1 -0
  82. package/dist/api/openai-prompt-cache.d.ts +3 -0
  83. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  84. package/dist/api/openai-prompt-cache.js +10 -0
  85. package/dist/api/openai-prompt-cache.js.map +1 -0
  86. package/dist/api/openai-responses-shared.d.ts +20 -0
  87. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  88. package/dist/api/openai-responses-shared.js +535 -0
  89. package/dist/api/openai-responses-shared.js.map +1 -0
  90. package/dist/api/openai-responses.d.ts +14 -0
  91. package/dist/api/openai-responses.d.ts.map +1 -0
  92. package/dist/api/openai-responses.js +246 -0
  93. package/dist/api/openai-responses.js.map +1 -0
  94. package/dist/api/openai-responses.lazy.d.ts +3 -0
  95. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  96. package/dist/api/openai-responses.lazy.js +3 -0
  97. package/dist/api/openai-responses.lazy.js.map +1 -0
  98. package/dist/api/openrouter-images.d.ts +3 -0
  99. package/dist/api/openrouter-images.d.ts.map +1 -0
  100. package/dist/api/openrouter-images.js +126 -0
  101. package/dist/api/openrouter-images.js.map +1 -0
  102. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  103. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  104. package/dist/api/openrouter-images.lazy.js +4 -0
  105. package/dist/api/openrouter-images.lazy.js.map +1 -0
  106. package/dist/api/pi-messages.d.ts +97 -0
  107. package/dist/api/pi-messages.d.ts.map +1 -0
  108. package/dist/api/pi-messages.js +309 -0
  109. package/dist/api/pi-messages.js.map +1 -0
  110. package/dist/api/pi-messages.lazy.d.ts +3 -0
  111. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  112. package/dist/api/pi-messages.lazy.js +3 -0
  113. package/dist/api/pi-messages.lazy.js.map +1 -0
  114. package/dist/api/simple-options.d.ts +9 -0
  115. package/dist/api/simple-options.d.ts.map +1 -0
  116. package/dist/api/simple-options.js +52 -0
  117. package/dist/api/simple-options.js.map +1 -0
  118. package/dist/api/transform-messages.d.ts +8 -0
  119. package/dist/api/transform-messages.d.ts.map +1 -0
  120. package/dist/api/transform-messages.js +187 -0
  121. package/dist/api/transform-messages.js.map +1 -0
  122. package/dist/auth/context.d.ts +7 -0
  123. package/dist/auth/context.d.ts.map +1 -0
  124. package/dist/auth/context.js +42 -0
  125. package/dist/auth/context.js.map +1 -0
  126. package/dist/auth/credential-store.d.ts +17 -0
  127. package/dist/auth/credential-store.d.ts.map +1 -0
  128. package/dist/auth/credential-store.js +40 -0
  129. package/dist/auth/credential-store.js.map +1 -0
  130. package/dist/auth/helpers.d.ts +21 -0
  131. package/dist/auth/helpers.d.ts.map +1 -0
  132. package/dist/auth/helpers.js +47 -0
  133. package/dist/auth/helpers.js.map +1 -0
  134. package/dist/auth/oauth/anthropic.d.ts +9 -0
  135. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  136. package/dist/auth/oauth/anthropic.js +302 -0
  137. package/dist/auth/oauth/anthropic.js.map +1 -0
  138. package/dist/auth/oauth/device-code.d.ts +23 -0
  139. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  140. package/dist/auth/oauth/device-code.js +69 -0
  141. package/dist/auth/oauth/device-code.js.map +1 -0
  142. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  143. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  144. package/dist/auth/oauth/github-copilot.js +312 -0
  145. package/dist/auth/oauth/github-copilot.js.map +1 -0
  146. package/dist/auth/oauth/load.d.ts +23 -0
  147. package/dist/auth/oauth/load.d.ts.map +1 -0
  148. package/dist/auth/oauth/load.js +49 -0
  149. package/dist/auth/oauth/load.js.map +1 -0
  150. package/dist/auth/oauth/oauth-page.d.ts +3 -0
  151. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  152. package/dist/auth/oauth/oauth-page.js +105 -0
  153. package/dist/auth/oauth/oauth-page.js.map +1 -0
  154. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  155. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  156. package/dist/auth/oauth/openai-codex.js +443 -0
  157. package/dist/auth/oauth/openai-codex.js.map +1 -0
  158. package/dist/auth/oauth/pkce.d.ts +13 -0
  159. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  160. package/dist/auth/oauth/pkce.js +31 -0
  161. package/dist/auth/oauth/pkce.js.map +1 -0
  162. package/dist/auth/oauth/radius.d.ts +16 -0
  163. package/dist/auth/oauth/radius.d.ts.map +1 -0
  164. package/dist/auth/oauth/radius.js +318 -0
  165. package/dist/auth/oauth/radius.js.map +1 -0
  166. package/dist/auth/oauth/xai.d.ts +6 -0
  167. package/dist/auth/oauth/xai.d.ts.map +1 -0
  168. package/dist/auth/oauth/xai.js +189 -0
  169. package/dist/auth/oauth/xai.js.map +1 -0
  170. package/dist/auth/resolve.d.ts +24 -0
  171. package/dist/auth/resolve.d.ts.map +1 -0
  172. package/dist/auth/resolve.js +103 -0
  173. package/dist/auth/resolve.js.map +1 -0
  174. package/dist/auth/types.d.ts +219 -0
  175. package/dist/auth/types.d.ts.map +1 -0
  176. package/dist/auth/types.js +2 -0
  177. package/dist/auth/types.js.map +1 -0
  178. package/dist/bedrock-provider.d.ts +5 -0
  179. package/dist/bedrock-provider.d.ts.map +1 -0
  180. package/dist/bedrock-provider.js +6 -0
  181. package/dist/bedrock-provider.js.map +1 -0
  182. package/dist/bun-oauth.d.ts +3 -0
  183. package/dist/bun-oauth.d.ts.map +1 -0
  184. package/dist/bun-oauth.js +17 -0
  185. package/dist/bun-oauth.js.map +1 -0
  186. package/dist/cli.d.ts +3 -0
  187. package/dist/cli.d.ts.map +1 -0
  188. package/dist/cli.js +112 -0
  189. package/dist/cli.js.map +1 -0
  190. package/dist/compat/extension-oauth-types.d.ts +39 -0
  191. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  192. package/dist/compat/extension-oauth-types.js +2 -0
  193. package/dist/compat/extension-oauth-types.js.map +1 -0
  194. package/dist/compat.d.ts +67 -0
  195. package/dist/compat.d.ts.map +1 -0
  196. package/dist/compat.js +199 -0
  197. package/dist/compat.js.map +1 -0
  198. package/dist/env-api-keys.d.ts +18 -0
  199. package/dist/env-api-keys.d.ts.map +1 -0
  200. package/dist/env-api-keys.js +150 -0
  201. package/dist/env-api-keys.js.map +1 -0
  202. package/dist/image-models.d.ts +10 -0
  203. package/dist/image-models.d.ts.map +1 -0
  204. package/dist/image-models.generated.d.ts +545 -0
  205. package/dist/image-models.generated.d.ts.map +1 -0
  206. package/dist/image-models.generated.js +547 -0
  207. package/dist/image-models.generated.js.map +1 -0
  208. package/dist/image-models.js +23 -0
  209. package/dist/image-models.js.map +1 -0
  210. package/dist/images-api-registry.d.ts +14 -0
  211. package/dist/images-api-registry.d.ts.map +1 -0
  212. package/dist/images-api-registry.js +22 -0
  213. package/dist/images-api-registry.js.map +1 -0
  214. package/dist/images-models.d.ts +95 -0
  215. package/dist/images-models.d.ts.map +1 -0
  216. package/dist/images-models.js +142 -0
  217. package/dist/images-models.js.map +1 -0
  218. package/dist/images.d.ts +4 -0
  219. package/dist/images.d.ts.map +1 -0
  220. package/dist/images.js +14 -0
  221. package/dist/images.js.map +1 -0
  222. package/dist/index.d.ts +33 -0
  223. package/dist/index.d.ts.map +1 -0
  224. package/dist/index.js +20 -0
  225. package/dist/index.js.map +1 -0
  226. package/dist/legacy-api-aliases.d.ts +42 -0
  227. package/dist/legacy-api-aliases.d.ts.map +1 -0
  228. package/dist/legacy-api-aliases.js +49 -0
  229. package/dist/legacy-api-aliases.js.map +1 -0
  230. package/dist/models-store.d.ts +25 -0
  231. package/dist/models-store.d.ts.map +1 -0
  232. package/dist/models-store.js +14 -0
  233. package/dist/models-store.js.map +1 -0
  234. package/dist/models.d.ts +178 -0
  235. package/dist/models.d.ts.map +1 -0
  236. package/dist/models.generated.d.ts +23416 -0
  237. package/dist/models.generated.d.ts.map +1 -0
  238. package/dist/models.generated.js +83 -0
  239. package/dist/models.generated.js.map +1 -0
  240. package/dist/models.js +432 -0
  241. package/dist/models.js.map +1 -0
  242. package/dist/oauth.d.ts +3 -0
  243. package/dist/oauth.d.ts.map +1 -0
  244. package/dist/oauth.js +2 -0
  245. package/dist/oauth.js.map +1 -0
  246. package/dist/providers/all.d.ts +26 -0
  247. package/dist/providers/all.d.ts.map +1 -0
  248. package/dist/providers/all.js +125 -0
  249. package/dist/providers/all.js.map +1 -0
  250. package/dist/providers/amazon-bedrock.d.ts +3 -0
  251. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  252. package/dist/providers/amazon-bedrock.js +84 -0
  253. package/dist/providers/amazon-bedrock.js.map +1 -0
  254. package/dist/providers/amazon-bedrock.models.d.ts +1992 -0
  255. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  256. package/dist/providers/amazon-bedrock.models.js +1895 -0
  257. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  258. package/dist/providers/ant-ling.d.ts +3 -0
  259. package/dist/providers/ant-ling.d.ts.map +1 -0
  260. package/dist/providers/ant-ling.js +15 -0
  261. package/dist/providers/ant-ling.js.map +1 -0
  262. package/dist/providers/ant-ling.models.d.ts +86 -0
  263. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  264. package/dist/providers/ant-ling.models.js +60 -0
  265. package/dist/providers/ant-ling.models.js.map +1 -0
  266. package/dist/providers/anthropic.d.ts +3 -0
  267. package/dist/providers/anthropic.d.ts.map +1 -0
  268. package/dist/providers/anthropic.js +20 -0
  269. package/dist/providers/anthropic.js.map +1 -0
  270. package/dist/providers/anthropic.models.d.ts +284 -0
  271. package/dist/providers/anthropic.models.d.ts.map +1 -0
  272. package/dist/providers/anthropic.models.js +255 -0
  273. package/dist/providers/anthropic.models.js.map +1 -0
  274. package/dist/providers/azure-openai-responses.d.ts +3 -0
  275. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  276. package/dist/providers/azure-openai-responses.js +14 -0
  277. package/dist/providers/azure-openai-responses.js.map +1 -0
  278. package/dist/providers/azure-openai-responses.models.d.ts +887 -0
  279. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  280. package/dist/providers/azure-openai-responses.models.js +814 -0
  281. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  282. package/dist/providers/cerebras.d.ts +3 -0
  283. package/dist/providers/cerebras.d.ts.map +1 -0
  284. package/dist/providers/cerebras.js +15 -0
  285. package/dist/providers/cerebras.js.map +1 -0
  286. package/dist/providers/cerebras.models.d.ts +66 -0
  287. package/dist/providers/cerebras.models.d.ts.map +1 -0
  288. package/dist/providers/cerebras.models.js +59 -0
  289. package/dist/providers/cerebras.models.js.map +1 -0
  290. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  291. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  292. package/dist/providers/cloudflare-ai-gateway.js +21 -0
  293. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  294. package/dist/providers/cloudflare-ai-gateway.models.d.ts +888 -0
  295. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  296. package/dist/providers/cloudflare-ai-gateway.models.js +758 -0
  297. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  298. package/dist/providers/cloudflare-auth.d.ts +4 -0
  299. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  300. package/dist/providers/cloudflare-auth.js +81 -0
  301. package/dist/providers/cloudflare-auth.js.map +1 -0
  302. package/dist/providers/cloudflare-stream.d.ts +8 -0
  303. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  304. package/dist/providers/cloudflare-stream.js +21 -0
  305. package/dist/providers/cloudflare-stream.js.map +1 -0
  306. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  307. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  308. package/dist/providers/cloudflare-workers-ai.js +15 -0
  309. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  310. package/dist/providers/cloudflare-workers-ai.models.d.ts +302 -0
  311. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  312. package/dist/providers/cloudflare-workers-ai.models.js +239 -0
  313. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  314. package/dist/providers/deepseek.d.ts +3 -0
  315. package/dist/providers/deepseek.d.ts.map +1 -0
  316. package/dist/providers/deepseek.js +15 -0
  317. package/dist/providers/deepseek.js.map +1 -0
  318. package/dist/providers/deepseek.models.d.ts +63 -0
  319. package/dist/providers/deepseek.models.d.ts.map +1 -0
  320. package/dist/providers/deepseek.models.js +43 -0
  321. package/dist/providers/deepseek.models.js.map +1 -0
  322. package/dist/providers/faux.d.ts +97 -0
  323. package/dist/providers/faux.d.ts.map +1 -0
  324. package/dist/providers/faux.js +395 -0
  325. package/dist/providers/faux.js.map +1 -0
  326. package/dist/providers/fireworks.d.ts +3 -0
  327. package/dist/providers/fireworks.d.ts.map +1 -0
  328. package/dist/providers/fireworks.js +19 -0
  329. package/dist/providers/fireworks.js.map +1 -0
  330. package/dist/providers/fireworks.models.d.ts +381 -0
  331. package/dist/providers/fireworks.models.d.ts.map +1 -0
  332. package/dist/providers/fireworks.models.js +295 -0
  333. package/dist/providers/fireworks.models.js.map +1 -0
  334. package/dist/providers/github-copilot.d.ts +3 -0
  335. package/dist/providers/github-copilot.d.ts.map +1 -0
  336. package/dist/providers/github-copilot.js +35 -0
  337. package/dist/providers/github-copilot.js.map +1 -0
  338. package/dist/providers/github-copilot.models.d.ts +791 -0
  339. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  340. package/dist/providers/github-copilot.models.js +541 -0
  341. package/dist/providers/github-copilot.models.js.map +1 -0
  342. package/dist/providers/google-vertex.d.ts +3 -0
  343. package/dist/providers/google-vertex.d.ts.map +1 -0
  344. package/dist/providers/google-vertex.js +86 -0
  345. package/dist/providers/google-vertex.js.map +1 -0
  346. package/dist/providers/google-vertex.models.d.ts +202 -0
  347. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  348. package/dist/providers/google-vertex.models.js +182 -0
  349. package/dist/providers/google-vertex.models.js.map +1 -0
  350. package/dist/providers/google.d.ts +3 -0
  351. package/dist/providers/google.d.ts.map +1 -0
  352. package/dist/providers/google.js +15 -0
  353. package/dist/providers/google.js.map +1 -0
  354. package/dist/providers/google.models.d.ts +328 -0
  355. package/dist/providers/google.models.d.ts.map +1 -0
  356. package/dist/providers/google.models.js +288 -0
  357. package/dist/providers/google.models.js.map +1 -0
  358. package/dist/providers/groq.d.ts +3 -0
  359. package/dist/providers/groq.d.ts.map +1 -0
  360. package/dist/providers/groq.js +15 -0
  361. package/dist/providers/groq.js.map +1 -0
  362. package/dist/providers/groq.models.d.ts +128 -0
  363. package/dist/providers/groq.models.d.ts.map +1 -0
  364. package/dist/providers/groq.models.js +125 -0
  365. package/dist/providers/groq.models.js.map +1 -0
  366. package/dist/providers/huggingface.d.ts +3 -0
  367. package/dist/providers/huggingface.d.ts.map +1 -0
  368. package/dist/providers/huggingface.js +15 -0
  369. package/dist/providers/huggingface.js.map +1 -0
  370. package/dist/providers/huggingface.models.d.ts +983 -0
  371. package/dist/providers/huggingface.models.d.ts.map +1 -0
  372. package/dist/providers/huggingface.models.js +887 -0
  373. package/dist/providers/huggingface.models.js.map +1 -0
  374. package/dist/providers/images/register-builtins.d.ts +4 -0
  375. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  376. package/dist/providers/images/register-builtins.js +34 -0
  377. package/dist/providers/images/register-builtins.js.map +1 -0
  378. package/dist/providers/kimi-coding.d.ts +3 -0
  379. package/dist/providers/kimi-coding.d.ts.map +1 -0
  380. package/dist/providers/kimi-coding.js +15 -0
  381. package/dist/providers/kimi-coding.js.map +1 -0
  382. package/dist/providers/kimi-coding.models.d.ts +82 -0
  383. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  384. package/dist/providers/kimi-coding.models.js +63 -0
  385. package/dist/providers/kimi-coding.models.js.map +1 -0
  386. package/dist/providers/minimax-cn.d.ts +3 -0
  387. package/dist/providers/minimax-cn.d.ts.map +1 -0
  388. package/dist/providers/minimax-cn.js +15 -0
  389. package/dist/providers/minimax-cn.js.map +1 -0
  390. package/dist/providers/minimax-cn.models.d.ts +54 -0
  391. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  392. package/dist/providers/minimax-cn.models.js +56 -0
  393. package/dist/providers/minimax-cn.models.js.map +1 -0
  394. package/dist/providers/minimax.d.ts +3 -0
  395. package/dist/providers/minimax.d.ts.map +1 -0
  396. package/dist/providers/minimax.js +15 -0
  397. package/dist/providers/minimax.js.map +1 -0
  398. package/dist/providers/minimax.models.d.ts +54 -0
  399. package/dist/providers/minimax.models.d.ts.map +1 -0
  400. package/dist/providers/minimax.models.js +56 -0
  401. package/dist/providers/minimax.models.js.map +1 -0
  402. package/dist/providers/mistral.d.ts +3 -0
  403. package/dist/providers/mistral.d.ts.map +1 -0
  404. package/dist/providers/mistral.js +15 -0
  405. package/dist/providers/mistral.js.map +1 -0
  406. package/dist/providers/mistral.models.d.ts +513 -0
  407. package/dist/providers/mistral.models.d.ts.map +1 -0
  408. package/dist/providers/mistral.models.js +515 -0
  409. package/dist/providers/mistral.models.js.map +1 -0
  410. package/dist/providers/moonshotai-cn.d.ts +3 -0
  411. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  412. package/dist/providers/moonshotai-cn.js +15 -0
  413. package/dist/providers/moonshotai-cn.js.map +1 -0
  414. package/dist/providers/moonshotai-cn.models.d.ts +270 -0
  415. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  416. package/dist/providers/moonshotai-cn.models.js +188 -0
  417. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  418. package/dist/providers/moonshotai.d.ts +3 -0
  419. package/dist/providers/moonshotai.d.ts.map +1 -0
  420. package/dist/providers/moonshotai.js +15 -0
  421. package/dist/providers/moonshotai.js.map +1 -0
  422. package/dist/providers/moonshotai.models.d.ts +270 -0
  423. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  424. package/dist/providers/moonshotai.models.js +188 -0
  425. package/dist/providers/moonshotai.models.js.map +1 -0
  426. package/dist/providers/nvidia.d.ts +3 -0
  427. package/dist/providers/nvidia.d.ts.map +1 -0
  428. package/dist/providers/nvidia.js +15 -0
  429. package/dist/providers/nvidia.js.map +1 -0
  430. package/dist/providers/nvidia.models.d.ts +563 -0
  431. package/dist/providers/nvidia.models.d.ts.map +1 -0
  432. package/dist/providers/nvidia.models.js +385 -0
  433. package/dist/providers/nvidia.models.js.map +1 -0
  434. package/dist/providers/openai-codex.d.ts +3 -0
  435. package/dist/providers/openai-codex.d.ts.map +1 -0
  436. package/dist/providers/openai-codex.js +18 -0
  437. package/dist/providers/openai-codex.js.map +1 -0
  438. package/dist/providers/openai-codex.models.d.ts +206 -0
  439. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  440. package/dist/providers/openai-codex.models.js +142 -0
  441. package/dist/providers/openai-codex.models.js.map +1 -0
  442. package/dist/providers/openai.d.ts +3 -0
  443. package/dist/providers/openai.d.ts.map +1 -0
  444. package/dist/providers/openai.js +15 -0
  445. package/dist/providers/openai.js.map +1 -0
  446. package/dist/providers/openai.models.d.ts +958 -0
  447. package/dist/providers/openai.models.d.ts.map +1 -0
  448. package/dist/providers/openai.models.js +828 -0
  449. package/dist/providers/openai.models.js.map +1 -0
  450. package/dist/providers/opencode-go.d.ts +3 -0
  451. package/dist/providers/opencode-go.d.ts.map +1 -0
  452. package/dist/providers/opencode-go.js +18 -0
  453. package/dist/providers/opencode-go.js.map +1 -0
  454. package/dist/providers/opencode-go.models.d.ts +353 -0
  455. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  456. package/dist/providers/opencode-go.models.js +276 -0
  457. package/dist/providers/opencode-go.models.js.map +1 -0
  458. package/dist/providers/opencode.d.ts +3 -0
  459. package/dist/providers/opencode.d.ts.map +1 -0
  460. package/dist/providers/opencode.js +22 -0
  461. package/dist/providers/opencode.js.map +1 -0
  462. package/dist/providers/opencode.models.d.ts +1241 -0
  463. package/dist/providers/opencode.models.d.ts.map +1 -0
  464. package/dist/providers/opencode.models.js +999 -0
  465. package/dist/providers/opencode.models.js.map +1 -0
  466. package/dist/providers/openrouter-images.d.ts +3 -0
  467. package/dist/providers/openrouter-images.d.ts.map +1 -0
  468. package/dist/providers/openrouter-images.js +14 -0
  469. package/dist/providers/openrouter-images.js.map +1 -0
  470. package/dist/providers/openrouter.d.ts +3 -0
  471. package/dist/providers/openrouter.d.ts.map +1 -0
  472. package/dist/providers/openrouter.js +15 -0
  473. package/dist/providers/openrouter.js.map +1 -0
  474. package/dist/providers/openrouter.models.d.ts +5754 -0
  475. package/dist/providers/openrouter.models.d.ts.map +1 -0
  476. package/dist/providers/openrouter.models.js +4913 -0
  477. package/dist/providers/openrouter.models.js.map +1 -0
  478. package/dist/providers/qwen-cloud-cn.d.ts +3 -0
  479. package/dist/providers/qwen-cloud-cn.d.ts.map +1 -0
  480. package/dist/providers/qwen-cloud-cn.js +17 -0
  481. package/dist/providers/qwen-cloud-cn.js.map +1 -0
  482. package/dist/providers/qwen-cloud-cn.models.d.ts +192 -0
  483. package/dist/providers/qwen-cloud-cn.models.d.ts.map +1 -0
  484. package/dist/providers/qwen-cloud-cn.models.js +134 -0
  485. package/dist/providers/qwen-cloud-cn.models.js.map +1 -0
  486. package/dist/providers/qwen-cloud.d.ts +3 -0
  487. package/dist/providers/qwen-cloud.d.ts.map +1 -0
  488. package/dist/providers/qwen-cloud.js +17 -0
  489. package/dist/providers/qwen-cloud.js.map +1 -0
  490. package/dist/providers/qwen-cloud.models.d.ts +192 -0
  491. package/dist/providers/qwen-cloud.models.d.ts.map +1 -0
  492. package/dist/providers/qwen-cloud.models.js +134 -0
  493. package/dist/providers/qwen-cloud.models.js.map +1 -0
  494. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  495. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  496. package/dist/providers/qwen-token-plan-cn.js +21 -0
  497. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  498. package/dist/providers/qwen-token-plan-cn.models.d.ts +364 -0
  499. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  500. package/dist/providers/qwen-token-plan-cn.models.js +277 -0
  501. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  502. package/dist/providers/qwen-token-plan.d.ts +3 -0
  503. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  504. package/dist/providers/qwen-token-plan.js +17 -0
  505. package/dist/providers/qwen-token-plan.js.map +1 -0
  506. package/dist/providers/qwen-token-plan.models.d.ts +366 -0
  507. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  508. package/dist/providers/qwen-token-plan.models.js +277 -0
  509. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  510. package/dist/providers/radius-config.d.ts +26 -0
  511. package/dist/providers/radius-config.d.ts.map +1 -0
  512. package/dist/providers/radius-config.js +59 -0
  513. package/dist/providers/radius-config.js.map +1 -0
  514. package/dist/providers/radius.d.ts +9 -0
  515. package/dist/providers/radius.d.ts.map +1 -0
  516. package/dist/providers/radius.js +54 -0
  517. package/dist/providers/radius.js.map +1 -0
  518. package/dist/providers/together.d.ts +3 -0
  519. package/dist/providers/together.d.ts.map +1 -0
  520. package/dist/providers/together.js +15 -0
  521. package/dist/providers/together.js.map +1 -0
  522. package/dist/providers/together.models.d.ts +629 -0
  523. package/dist/providers/together.models.d.ts.map +1 -0
  524. package/dist/providers/together.models.js +399 -0
  525. package/dist/providers/together.models.js.map +1 -0
  526. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  527. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  528. package/dist/providers/vercel-ai-gateway.js +15 -0
  529. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  530. package/dist/providers/vercel-ai-gateway.models.d.ts +3306 -0
  531. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  532. package/dist/providers/vercel-ai-gateway.models.js +3232 -0
  533. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  534. package/dist/providers/xai.d.ts +3 -0
  535. package/dist/providers/xai.d.ts.map +1 -0
  536. package/dist/providers/xai.js +27 -0
  537. package/dist/providers/xai.js.map +1 -0
  538. package/dist/providers/xai.models.d.ts +71 -0
  539. package/dist/providers/xai.models.d.ts.map +1 -0
  540. package/dist/providers/xai.models.js +60 -0
  541. package/dist/providers/xai.models.js.map +1 -0
  542. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  543. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  544. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  545. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  546. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +66 -0
  547. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  548. package/dist/providers/xiaomi-token-plan-ams.models.js +59 -0
  549. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  550. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  551. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  552. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  553. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  554. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +66 -0
  555. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  556. package/dist/providers/xiaomi-token-plan-cn.models.js +59 -0
  557. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  558. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  559. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  560. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  561. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  562. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +66 -0
  563. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  564. package/dist/providers/xiaomi-token-plan-sgp.models.js +59 -0
  565. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  566. package/dist/providers/xiaomi.d.ts +3 -0
  567. package/dist/providers/xiaomi.d.ts.map +1 -0
  568. package/dist/providers/xiaomi.js +15 -0
  569. package/dist/providers/xiaomi.js.map +1 -0
  570. package/dist/providers/xiaomi.models.d.ts +129 -0
  571. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  572. package/dist/providers/xiaomi.models.js +113 -0
  573. package/dist/providers/xiaomi.models.js.map +1 -0
  574. package/dist/providers/zai-coding-cn.d.ts +3 -0
  575. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  576. package/dist/providers/zai-coding-cn.js +15 -0
  577. package/dist/providers/zai-coding-cn.js.map +1 -0
  578. package/dist/providers/zai-coding-cn.models.d.ts +153 -0
  579. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  580. package/dist/providers/zai-coding-cn.models.js +114 -0
  581. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  582. package/dist/providers/zai.d.ts +3 -0
  583. package/dist/providers/zai.d.ts.map +1 -0
  584. package/dist/providers/zai.js +15 -0
  585. package/dist/providers/zai.js.map +1 -0
  586. package/dist/providers/zai.models.d.ts +153 -0
  587. package/dist/providers/zai.models.d.ts.map +1 -0
  588. package/dist/providers/zai.models.js +114 -0
  589. package/dist/providers/zai.models.js.map +1 -0
  590. package/dist/session-resources.d.ts +4 -0
  591. package/dist/session-resources.d.ts.map +1 -0
  592. package/dist/session-resources.js +22 -0
  593. package/dist/session-resources.js.map +1 -0
  594. package/dist/types.d.ts +627 -0
  595. package/dist/types.d.ts.map +1 -0
  596. package/dist/types.js +2 -0
  597. package/dist/types.js.map +1 -0
  598. package/dist/utils/abort-signals.d.ts +6 -0
  599. package/dist/utils/abort-signals.d.ts.map +1 -0
  600. package/dist/utils/abort-signals.js +34 -0
  601. package/dist/utils/abort-signals.js.map +1 -0
  602. package/dist/utils/deferred-tools.d.ts +9 -0
  603. package/dist/utils/deferred-tools.d.ts.map +1 -0
  604. package/dist/utils/deferred-tools.js +36 -0
  605. package/dist/utils/deferred-tools.js.map +1 -0
  606. package/dist/utils/diagnostics.d.ts +19 -0
  607. package/dist/utils/diagnostics.d.ts.map +1 -0
  608. package/dist/utils/diagnostics.js +25 -0
  609. package/dist/utils/diagnostics.js.map +1 -0
  610. package/dist/utils/error-body.d.ts +25 -0
  611. package/dist/utils/error-body.d.ts.map +1 -0
  612. package/dist/utils/error-body.js +109 -0
  613. package/dist/utils/error-body.js.map +1 -0
  614. package/dist/utils/estimate.d.ts +17 -0
  615. package/dist/utils/estimate.d.ts.map +1 -0
  616. package/dist/utils/estimate.js +116 -0
  617. package/dist/utils/estimate.js.map +1 -0
  618. package/dist/utils/event-stream.d.ts +21 -0
  619. package/dist/utils/event-stream.d.ts.map +1 -0
  620. package/dist/utils/event-stream.js +81 -0
  621. package/dist/utils/event-stream.js.map +1 -0
  622. package/dist/utils/hash.d.ts +3 -0
  623. package/dist/utils/hash.d.ts.map +1 -0
  624. package/dist/utils/hash.js +14 -0
  625. package/dist/utils/hash.js.map +1 -0
  626. package/dist/utils/headers.d.ts +4 -0
  627. package/dist/utils/headers.d.ts.map +1 -0
  628. package/dist/utils/headers.js +18 -0
  629. package/dist/utils/headers.js.map +1 -0
  630. package/dist/utils/json-parse.d.ts +16 -0
  631. package/dist/utils/json-parse.d.ts.map +1 -0
  632. package/dist/utils/json-parse.js +113 -0
  633. package/dist/utils/json-parse.js.map +1 -0
  634. package/dist/utils/node-http-proxy.d.ts +4 -0
  635. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  636. package/dist/utils/node-http-proxy.js +92 -0
  637. package/dist/utils/node-http-proxy.js.map +1 -0
  638. package/dist/utils/overflow.d.ts +58 -0
  639. package/dist/utils/overflow.d.ts.map +1 -0
  640. package/dist/utils/overflow.js +158 -0
  641. package/dist/utils/overflow.js.map +1 -0
  642. package/dist/utils/provider-env.d.ts +7 -0
  643. package/dist/utils/provider-env.d.ts.map +1 -0
  644. package/dist/utils/provider-env.js +44 -0
  645. package/dist/utils/provider-env.js.map +1 -0
  646. package/dist/utils/retry.d.ts +12 -0
  647. package/dist/utils/retry.d.ts.map +1 -0
  648. package/dist/utils/retry.js +90 -0
  649. package/dist/utils/retry.js.map +1 -0
  650. package/dist/utils/sanitize-unicode.d.ts +22 -0
  651. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  652. package/dist/utils/sanitize-unicode.js +26 -0
  653. package/dist/utils/sanitize-unicode.js.map +1 -0
  654. package/dist/utils/typebox-helpers.d.ts +17 -0
  655. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  656. package/dist/utils/typebox-helpers.js +21 -0
  657. package/dist/utils/typebox-helpers.js.map +1 -0
  658. package/dist/utils/validation.d.ts +18 -0
  659. package/dist/utils/validation.d.ts.map +1 -0
  660. package/dist/utils/validation.js +269 -0
  661. package/dist/utils/validation.js.map +1 -0
  662. package/package.json +96 -0
@@ -0,0 +1,1116 @@
1
+ import OpenAI from "openai";
2
+ import { calculateCost, clampThinkingLevel } from "../models.js";
3
+ import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
4
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
+ import { headersToRecord } from "../utils/headers.js";
6
+ import { parseStreamingJson } from "../utils/json-parse.js";
7
+ import { getProviderEnvValue } from "../utils/provider-env.js";
8
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
9
+ import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
10
+ import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
11
+ import { buildBaseOptions } from "./simple-options.js";
12
+ import { transformMessages } from "./transform-messages.js";
13
+ /**
14
+ * Check if conversation messages contain tool calls or tool results.
15
+ * This is needed because Anthropic (via proxy) requires the tools param
16
+ * to be present when messages include tool_calls or tool role messages.
17
+ */
18
+ function hasHeader(headers, name) {
19
+ if (!headers)
20
+ return false;
21
+ const expected = name.toLowerCase();
22
+ for (const [key, value] of Object.entries(headers)) {
23
+ if (key.toLowerCase() === expected && value !== null && value.trim().length > 0)
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ function getClientApiKey(provider, apiKey, headers) {
29
+ if (apiKey)
30
+ return apiKey;
31
+ if (hasHeader(headers, "authorization") || hasHeader(headers, "cf-aig-authorization"))
32
+ return "unused";
33
+ throw new Error(`No API key for provider: ${provider}`);
34
+ }
35
+ function hasToolHistory(messages) {
36
+ for (const msg of messages) {
37
+ if (msg.role === "toolResult") {
38
+ return true;
39
+ }
40
+ if (msg.role === "assistant") {
41
+ if (msg.content.some((block) => block.type === "toolCall")) {
42
+ return true;
43
+ }
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ function getDeferredToolNames(messages) {
49
+ const names = new Set();
50
+ for (const message of messages) {
51
+ if (message.role === "toolResult") {
52
+ for (const name of message.addedToolNames ?? []) {
53
+ names.add(name);
54
+ }
55
+ }
56
+ }
57
+ return names;
58
+ }
59
+ function getToolsByName(tools, names) {
60
+ if (!tools)
61
+ return [];
62
+ const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
63
+ return Array.from(names)
64
+ .map((name) => toolsByName.get(name))
65
+ .filter((tool) => tool !== undefined);
66
+ }
67
+ function isTextContentBlock(block) {
68
+ return block.type === "text";
69
+ }
70
+ function isThinkingContentBlock(block) {
71
+ return block.type === "thinking";
72
+ }
73
+ function isToolCallBlock(block) {
74
+ return block.type === "toolCall";
75
+ }
76
+ function isImageContentBlock(block) {
77
+ return block.type === "image";
78
+ }
79
+ function isEncryptedReasoningDetail(detail) {
80
+ if (typeof detail !== "object" || detail === null) {
81
+ return false;
82
+ }
83
+ const candidate = detail;
84
+ return (candidate.type === "reasoning.encrypted" &&
85
+ typeof candidate.id === "string" &&
86
+ candidate.id.length > 0 &&
87
+ typeof candidate.data === "string" &&
88
+ candidate.data.length > 0);
89
+ }
90
+ function resolveCacheRetention(cacheRetention, env) {
91
+ if (cacheRetention) {
92
+ return cacheRetention;
93
+ }
94
+ if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") {
95
+ return "long";
96
+ }
97
+ return "short";
98
+ }
99
+ export const stream = (model, context, options) => {
100
+ const stream = new AssistantMessageEventStream();
101
+ (async () => {
102
+ const output = {
103
+ role: "assistant",
104
+ content: [],
105
+ api: model.api,
106
+ provider: model.provider,
107
+ model: model.id,
108
+ usage: {
109
+ input: 0,
110
+ output: 0,
111
+ cacheRead: 0,
112
+ cacheWrite: 0,
113
+ totalTokens: 0,
114
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
115
+ },
116
+ stopReason: "stop",
117
+ timestamp: Date.now(),
118
+ };
119
+ try {
120
+ const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
121
+ const compat = getCompat(model);
122
+ const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
123
+ const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
124
+ const client = createClient(model, context, apiKey, options?.headers, cacheSessionId, compat);
125
+ let params = buildParams(model, context, options, compat, cacheRetention);
126
+ const nextParams = await options?.onPayload?.(params, model);
127
+ if (nextParams !== undefined) {
128
+ params = nextParams;
129
+ }
130
+ const requestOptions = {
131
+ ...(options?.signal ? { signal: options.signal } : {}),
132
+ ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
133
+ maxRetries: options?.maxRetries ?? 0,
134
+ };
135
+ const { data: openaiStream, response } = await client.chat.completions
136
+ .create(params, requestOptions)
137
+ .withResponse();
138
+ await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
139
+ stream.push({ type: "start", partial: output });
140
+ let textBlock = null;
141
+ let thinkingBlock = null;
142
+ let hasFinishReason = false;
143
+ const toolCallBlocksByIndex = new Map();
144
+ const toolCallBlocksById = new Map();
145
+ const pendingReasoningDetailsByToolCallId = new Map();
146
+ const blocks = output.content;
147
+ const getContentIndex = (block) => blocks.indexOf(block);
148
+ const finishBlock = (block) => {
149
+ const contentIndex = getContentIndex(block);
150
+ if (contentIndex === -1) {
151
+ return;
152
+ }
153
+ if (block.type === "text") {
154
+ stream.push({
155
+ type: "text_end",
156
+ contentIndex,
157
+ content: block.text,
158
+ partial: output,
159
+ });
160
+ }
161
+ else if (block.type === "thinking") {
162
+ stream.push({
163
+ type: "thinking_end",
164
+ contentIndex,
165
+ content: block.thinking,
166
+ partial: output,
167
+ });
168
+ }
169
+ else if (block.type === "toolCall") {
170
+ block.arguments = parseStreamingJson(block.partialArgs);
171
+ // Finalize in-place and strip the scratch buffers so replay only
172
+ // carries parsed arguments.
173
+ delete block.partialArgs;
174
+ delete block.streamIndex;
175
+ stream.push({
176
+ type: "toolcall_end",
177
+ contentIndex,
178
+ toolCall: block,
179
+ partial: output,
180
+ });
181
+ }
182
+ };
183
+ const ensureTextBlock = () => {
184
+ if (!textBlock) {
185
+ textBlock = { type: "text", text: "" };
186
+ blocks.push(textBlock);
187
+ stream.push({ type: "text_start", contentIndex: getContentIndex(textBlock), partial: output });
188
+ }
189
+ return textBlock;
190
+ };
191
+ const ensureThinkingBlock = (thinkingSignature) => {
192
+ if (!thinkingBlock) {
193
+ thinkingBlock = {
194
+ type: "thinking",
195
+ thinking: "",
196
+ thinkingSignature,
197
+ };
198
+ blocks.push(thinkingBlock);
199
+ stream.push({ type: "thinking_start", contentIndex: getContentIndex(thinkingBlock), partial: output });
200
+ }
201
+ return thinkingBlock;
202
+ };
203
+ const applyPendingReasoningDetail = (block) => {
204
+ if (!block.id) {
205
+ return;
206
+ }
207
+ const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
208
+ if (pendingReasoningDetail) {
209
+ block.thoughtSignature = pendingReasoningDetail;
210
+ pendingReasoningDetailsByToolCallId.delete(block.id);
211
+ }
212
+ };
213
+ const ensureToolCallBlock = (toolCall) => {
214
+ const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
215
+ let block = streamIndex !== undefined ? toolCallBlocksByIndex.get(streamIndex) : undefined;
216
+ if (!block && toolCall.id) {
217
+ block = toolCallBlocksById.get(toolCall.id);
218
+ }
219
+ if (!block) {
220
+ block = {
221
+ type: "toolCall",
222
+ id: toolCall.id || "",
223
+ name: toolCall.function?.name || "",
224
+ arguments: {},
225
+ partialArgs: "",
226
+ streamIndex,
227
+ };
228
+ if (streamIndex !== undefined) {
229
+ toolCallBlocksByIndex.set(streamIndex, block);
230
+ }
231
+ if (toolCall.id) {
232
+ toolCallBlocksById.set(toolCall.id, block);
233
+ }
234
+ blocks.push(block);
235
+ stream.push({
236
+ type: "toolcall_start",
237
+ contentIndex: getContentIndex(block),
238
+ partial: output,
239
+ });
240
+ }
241
+ if (streamIndex !== undefined && block.streamIndex === undefined) {
242
+ block.streamIndex = streamIndex;
243
+ toolCallBlocksByIndex.set(streamIndex, block);
244
+ }
245
+ if (toolCall.id) {
246
+ toolCallBlocksById.set(toolCall.id, block);
247
+ }
248
+ applyPendingReasoningDetail(block);
249
+ return block;
250
+ };
251
+ for await (const chunk of openaiStream) {
252
+ if (!chunk || typeof chunk !== "object")
253
+ continue;
254
+ // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
255
+ // and each chunk in a streamed completion carries the same id.
256
+ output.responseId ||= chunk.id;
257
+ if (typeof chunk.model === "string" && chunk.model.length > 0 && chunk.model !== model.id) {
258
+ output.responseModel ||= chunk.model;
259
+ }
260
+ if (chunk.usage) {
261
+ output.usage = parseChunkUsage(chunk.usage, model);
262
+ }
263
+ const choice = Array.isArray(chunk.choices) ? chunk.choices[0] : undefined;
264
+ if (!choice)
265
+ continue;
266
+ // Fallback: some providers (e.g., Moonshot) return usage
267
+ // in choice.usage instead of the standard chunk.usage
268
+ if (!chunk.usage && choice.usage) {
269
+ output.usage = parseChunkUsage(choice.usage, model);
270
+ }
271
+ if (choice.finish_reason) {
272
+ const finishReasonResult = mapStopReason(choice.finish_reason);
273
+ output.stopReason = finishReasonResult.stopReason;
274
+ if (finishReasonResult.errorMessage) {
275
+ output.errorMessage = finishReasonResult.errorMessage;
276
+ }
277
+ hasFinishReason = true;
278
+ }
279
+ if (choice.delta) {
280
+ if (choice.delta.content !== null &&
281
+ choice.delta.content !== undefined &&
282
+ choice.delta.content.length > 0) {
283
+ const block = ensureTextBlock();
284
+ block.text += choice.delta.content;
285
+ stream.push({
286
+ type: "text_delta",
287
+ contentIndex: getContentIndex(block),
288
+ delta: choice.delta.content,
289
+ partial: output,
290
+ });
291
+ }
292
+ // Some endpoints return reasoning in reasoning_content (llama.cpp),
293
+ // or reasoning (other openai compatible endpoints)
294
+ // Use the first non-empty reasoning field to avoid duplication
295
+ // (e.g., chutes.ai returns both reasoning_content and reasoning with same content)
296
+ const reasoningFields = ["reasoning_content", "reasoning", "reasoning_text"];
297
+ const deltaFields = choice.delta;
298
+ let foundReasoningField = null;
299
+ for (const field of reasoningFields) {
300
+ const value = deltaFields[field];
301
+ if (typeof value === "string" && value.length > 0) {
302
+ foundReasoningField = field;
303
+ break;
304
+ }
305
+ }
306
+ if (foundReasoningField) {
307
+ const delta = deltaFields[foundReasoningField];
308
+ if (typeof delta === "string" && delta.length > 0) {
309
+ const thinkingSignature = model.provider === "opencode-go" && foundReasoningField === "reasoning"
310
+ ? "reasoning_content"
311
+ : foundReasoningField;
312
+ const block = ensureThinkingBlock(thinkingSignature);
313
+ block.thinking += delta;
314
+ stream.push({
315
+ type: "thinking_delta",
316
+ contentIndex: getContentIndex(block),
317
+ delta,
318
+ partial: output,
319
+ });
320
+ }
321
+ }
322
+ if (choice?.delta?.tool_calls) {
323
+ for (const toolCall of choice.delta.tool_calls) {
324
+ const block = ensureToolCallBlock(toolCall);
325
+ if (!block.id && toolCall.id) {
326
+ block.id = toolCall.id;
327
+ toolCallBlocksById.set(toolCall.id, block);
328
+ }
329
+ if (!block.name && toolCall.function?.name) {
330
+ block.name = toolCall.function.name;
331
+ }
332
+ let delta = "";
333
+ if (toolCall.function?.arguments) {
334
+ delta = toolCall.function.arguments;
335
+ block.partialArgs = (block.partialArgs ?? "") + toolCall.function.arguments;
336
+ block.arguments = parseStreamingJson(block.partialArgs);
337
+ }
338
+ stream.push({
339
+ type: "toolcall_delta",
340
+ contentIndex: getContentIndex(block),
341
+ delta,
342
+ partial: output,
343
+ });
344
+ }
345
+ }
346
+ const reasoningDetails = choice.delta.reasoning_details;
347
+ if (Array.isArray(reasoningDetails)) {
348
+ for (const detail of reasoningDetails) {
349
+ if (isEncryptedReasoningDetail(detail)) {
350
+ const serializedDetail = JSON.stringify(detail);
351
+ const matchingToolCall = toolCallBlocksById.get(detail.id);
352
+ if (matchingToolCall) {
353
+ matchingToolCall.thoughtSignature = serializedDetail;
354
+ }
355
+ else {
356
+ pendingReasoningDetailsByToolCallId.set(detail.id, serializedDetail);
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ for (const block of blocks) {
364
+ finishBlock(block);
365
+ }
366
+ if (options?.signal?.aborted) {
367
+ throw new Error("Request was aborted");
368
+ }
369
+ if (output.stopReason === "aborted") {
370
+ throw new Error("Request was aborted");
371
+ }
372
+ if (output.stopReason === "error") {
373
+ throw new Error(output.errorMessage || "Provider returned an error stop reason");
374
+ }
375
+ if (!hasFinishReason) {
376
+ throw new Error("Stream ended without finish_reason");
377
+ }
378
+ stream.push({ type: "done", reason: output.stopReason, message: output });
379
+ stream.end();
380
+ }
381
+ catch (error) {
382
+ for (const block of output.content) {
383
+ delete block.index;
384
+ // Streaming scratch buffers are only used during parsing; never persist them.
385
+ delete block.partialArgs;
386
+ delete block.streamIndex;
387
+ }
388
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
389
+ output.errorMessage = formatProviderError(normalizeProviderError(error));
390
+ // Some providers via OpenRouter give additional information in this field.
391
+ // normalizeProviderError already stringifies the parsed body (error.error)
392
+ // into errorMessage, so only append the raw metadata when it is not already
393
+ // present to avoid double-printing it.
394
+ const rawMetadata = error?.error?.metadata?.raw;
395
+ if (rawMetadata && !output.errorMessage.includes(String(rawMetadata))) {
396
+ output.errorMessage += `\n${rawMetadata}`;
397
+ }
398
+ stream.push({ type: "error", reason: output.stopReason, error: output });
399
+ stream.end();
400
+ }
401
+ })();
402
+ return stream;
403
+ };
404
+ export const streamSimple = (model, context, options) => {
405
+ getClientApiKey(model.provider, options?.apiKey, options?.headers);
406
+ const base = buildBaseOptions(model, context, options, options?.apiKey);
407
+ const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
408
+ const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
409
+ const toolChoice = options?.toolChoice;
410
+ return stream(model, context, {
411
+ ...base,
412
+ reasoningEffort,
413
+ toolChoice,
414
+ });
415
+ };
416
+ function createClient(model, context, apiKey, optionsHeaders, sessionId, compat = getCompat(model)) {
417
+ const headers = { ...model.headers };
418
+ if (model.provider === "github-copilot") {
419
+ const hasImages = hasCopilotVisionInput(context.messages);
420
+ const copilotHeaders = buildCopilotDynamicHeaders({
421
+ messages: context.messages,
422
+ hasImages,
423
+ });
424
+ Object.assign(headers, copilotHeaders);
425
+ }
426
+ if (sessionId && compat.sendSessionAffinityHeaders) {
427
+ if (compat.sessionAffinityFormat === "openrouter") {
428
+ headers["x-session-id"] = sessionId;
429
+ }
430
+ else {
431
+ if (compat.sessionAffinityFormat === "openai") {
432
+ headers.session_id = sessionId;
433
+ }
434
+ headers["x-client-request-id"] = sessionId;
435
+ headers["x-session-affinity"] = sessionId;
436
+ }
437
+ }
438
+ // Merge options headers last so they can override defaults
439
+ if (optionsHeaders) {
440
+ Object.assign(headers, optionsHeaders);
441
+ }
442
+ return new OpenAI({
443
+ apiKey,
444
+ baseURL: model.baseUrl,
445
+ dangerouslyAllowBrowser: true,
446
+ defaultHeaders: headers,
447
+ });
448
+ }
449
+ function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env)) {
450
+ const messages = convertMessages(model, context, compat);
451
+ const cacheControl = getCompatCacheControl(compat, cacheRetention);
452
+ const params = {
453
+ model: model.id,
454
+ messages,
455
+ stream: true,
456
+ prompt_cache_key: (model.baseUrl.includes("api.openai.com") && cacheRetention !== "none") ||
457
+ (cacheRetention === "long" && compat.supportsLongCacheRetention)
458
+ ? clampOpenAIPromptCacheKey(options?.sessionId)
459
+ : undefined,
460
+ prompt_cache_retention: cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : undefined,
461
+ };
462
+ if (compat.supportsUsageInStreaming !== false) {
463
+ params.stream_options = { include_usage: true };
464
+ }
465
+ if (compat.supportsStore) {
466
+ params.store = false;
467
+ }
468
+ if (options?.maxTokens) {
469
+ if (compat.maxTokensField === "max_tokens") {
470
+ params.max_tokens = options.maxTokens;
471
+ }
472
+ else {
473
+ params.max_completion_tokens = options.maxTokens;
474
+ }
475
+ }
476
+ if (options?.temperature !== undefined) {
477
+ params.temperature = options.temperature;
478
+ }
479
+ const deferredToolNames = compat.deferredToolsMode === "kimi" ? getDeferredToolNames(context.messages) : new Set();
480
+ const activeTools = context.tools?.filter((tool) => !deferredToolNames.has(tool.name));
481
+ if (activeTools && activeTools.length > 0) {
482
+ params.tools = convertTools(activeTools, compat);
483
+ if (compat.zaiToolStream) {
484
+ params.tool_stream = true;
485
+ }
486
+ }
487
+ else if (hasToolHistory(context.messages)) {
488
+ // Anthropic (via LiteLLM/proxy) requires tools param when conversation has tool_calls/tool_results
489
+ params.tools = [];
490
+ }
491
+ if (cacheControl) {
492
+ applyAnthropicCacheControl(messages, params.tools, cacheControl);
493
+ }
494
+ if (options?.toolChoice) {
495
+ params.tool_choice = options.toolChoice;
496
+ }
497
+ if (compat.thinkingFormat === "zai" && model.reasoning) {
498
+ const zaiParams = params;
499
+ zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
500
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
501
+ const mappedEffort = model.thinkingLevelMap?.[options.reasoningEffort];
502
+ const effort = mappedEffort === undefined ? options.reasoningEffort : mappedEffort;
503
+ if (typeof effort === "string") {
504
+ zaiParams.reasoning_effort = effort;
505
+ }
506
+ }
507
+ }
508
+ else if (compat.thinkingFormat === "qwen" && model.reasoning) {
509
+ params.enable_thinking = !!options?.reasoningEffort;
510
+ }
511
+ else if (compat.thinkingFormat === "qwen-chat-template" && model.reasoning) {
512
+ params.chat_template_kwargs = {
513
+ enable_thinking: !!options?.reasoningEffort,
514
+ preserve_thinking: true,
515
+ };
516
+ }
517
+ else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
518
+ const chatTemplateKwargs = buildChatTemplateKwargs(model, options, compat);
519
+ if (chatTemplateKwargs) {
520
+ params.chat_template_kwargs = chatTemplateKwargs;
521
+ }
522
+ }
523
+ else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
524
+ if (options?.reasoningEffort) {
525
+ params.thinking = { type: "enabled" };
526
+ }
527
+ else if (model.thinkingLevelMap?.off !== null) {
528
+ params.thinking = { type: "disabled" };
529
+ }
530
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
531
+ params.reasoning_effort =
532
+ model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
533
+ }
534
+ }
535
+ else if (compat.thinkingFormat === "openrouter" && model.reasoning) {
536
+ // OpenRouter normalizes reasoning across providers via a nested reasoning object.
537
+ const openRouterParams = params;
538
+ if (options?.reasoningEffort) {
539
+ openRouterParams.reasoning = {
540
+ effort: model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort,
541
+ };
542
+ }
543
+ else if (model.thinkingLevelMap?.off !== null) {
544
+ openRouterParams.reasoning = { effort: model.thinkingLevelMap?.off ?? "none" };
545
+ }
546
+ }
547
+ else if (compat.thinkingFormat === "ant-ling" && model.reasoning && options?.reasoningEffort) {
548
+ const effort = model.thinkingLevelMap?.[options.reasoningEffort];
549
+ if (typeof effort === "string") {
550
+ params.reasoning = { effort };
551
+ }
552
+ }
553
+ else if (compat.thinkingFormat === "together" && model.reasoning) {
554
+ const togetherParams = params;
555
+ togetherParams.reasoning = { enabled: !!options?.reasoningEffort };
556
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
557
+ togetherParams.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
558
+ }
559
+ }
560
+ else if (compat.thinkingFormat === "string-thinking" && model.reasoning) {
561
+ const stringThinkingParams = params;
562
+ if (options?.reasoningEffort) {
563
+ stringThinkingParams.thinking = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
564
+ }
565
+ else if (model.thinkingLevelMap?.off !== null) {
566
+ stringThinkingParams.thinking = model.thinkingLevelMap?.off ?? "none";
567
+ }
568
+ }
569
+ else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {
570
+ // OpenAI-style reasoning_effort
571
+ params.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
572
+ }
573
+ else if (!options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {
574
+ const offValue = model.thinkingLevelMap?.off;
575
+ if (typeof offValue === "string") {
576
+ params.reasoning_effort = offValue;
577
+ }
578
+ }
579
+ // OpenRouter provider routing preferences
580
+ if (model.compat?.openRouterRouting) {
581
+ params.provider = model.compat.openRouterRouting;
582
+ }
583
+ // Vercel AI Gateway provider routing preferences
584
+ if (model.compat?.vercelGatewayRouting) {
585
+ const routing = model.compat.vercelGatewayRouting;
586
+ if (routing.only || routing.order) {
587
+ const gatewayOptions = {};
588
+ if (routing.only)
589
+ gatewayOptions.only = routing.only;
590
+ if (routing.order)
591
+ gatewayOptions.order = routing.order;
592
+ params.providerOptions = { gateway: gatewayOptions };
593
+ }
594
+ }
595
+ return params;
596
+ }
597
+ function buildChatTemplateKwargs(model, options, compat) {
598
+ const kwargs = {};
599
+ for (const [key, value] of Object.entries(compat.chatTemplateKwargs)) {
600
+ const resolved = resolveChatTemplateKwargValue(model, options, value);
601
+ if (resolved !== undefined) {
602
+ kwargs[key] = resolved;
603
+ }
604
+ }
605
+ return Object.keys(kwargs).length > 0 ? kwargs : undefined;
606
+ }
607
+ function resolveChatTemplateKwargValue(model, options, value) {
608
+ if (typeof value !== "object" || value === null) {
609
+ return value;
610
+ }
611
+ const reasoningEffort = options?.reasoningEffort;
612
+ if (!reasoningEffort && value.omitWhenOff) {
613
+ return undefined;
614
+ }
615
+ if (value.$var === "thinking.enabled") {
616
+ return !!reasoningEffort;
617
+ }
618
+ const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;
619
+ return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
620
+ }
621
+ function getCompatCacheControl(compat, cacheRetention) {
622
+ if (compat.cacheControlFormat !== "anthropic" || cacheRetention === "none") {
623
+ return undefined;
624
+ }
625
+ const ttl = cacheRetention === "long" && compat.supportsLongCacheRetention ? "1h" : undefined;
626
+ return { type: "ephemeral", ...(ttl ? { ttl } : {}) };
627
+ }
628
+ function applyAnthropicCacheControl(messages, tools, cacheControl) {
629
+ addCacheControlToSystemPrompt(messages, cacheControl);
630
+ addCacheControlToLastTool(tools, cacheControl);
631
+ addCacheControlToLastConversationMessages(messages, cacheControl);
632
+ }
633
+ function addCacheControlToSystemPrompt(messages, cacheControl) {
634
+ for (const message of messages) {
635
+ if (message.role === "system" || message.role === "developer") {
636
+ addCacheControlToInstructionMessage(message, cacheControl);
637
+ return;
638
+ }
639
+ }
640
+ }
641
+ // lunr: marks the last TWO user/assistant messages (pi#1736, opencode's
642
+ // slice(-2) pattern) so the last assistant turn sits inside the cache window.
643
+ // Budget: 1 system + 1 tool + 2 messages = Anthropic's max of 4 breakpoints.
644
+ function addCacheControlToLastConversationMessages(messages, cacheControl) {
645
+ let marked = 0;
646
+ for (let i = messages.length - 1; i >= 0 && marked < 2; i--) {
647
+ const message = messages[i];
648
+ if (message.role === "user" || message.role === "assistant") {
649
+ if (addCacheControlToMessage(message, cacheControl)) {
650
+ marked++;
651
+ }
652
+ }
653
+ }
654
+ }
655
+ function addCacheControlToLastTool(tools, cacheControl) {
656
+ if (!tools || tools.length === 0) {
657
+ return;
658
+ }
659
+ const lastTool = tools[tools.length - 1];
660
+ lastTool.cache_control = cacheControl;
661
+ }
662
+ function addCacheControlToInstructionMessage(message, cacheControl) {
663
+ return addCacheControlToTextContent(message, cacheControl);
664
+ }
665
+ function addCacheControlToMessage(message, cacheControl) {
666
+ if (message.role === "user" || message.role === "assistant") {
667
+ return addCacheControlToTextContent(message, cacheControl);
668
+ }
669
+ return false;
670
+ }
671
+ function addCacheControlToTextContent(message, cacheControl) {
672
+ const content = message.content;
673
+ if (typeof content === "string") {
674
+ if (content.length === 0) {
675
+ return false;
676
+ }
677
+ message.content = [
678
+ {
679
+ type: "text",
680
+ text: content,
681
+ cache_control: cacheControl,
682
+ },
683
+ ];
684
+ return true;
685
+ }
686
+ if (!Array.isArray(content)) {
687
+ return false;
688
+ }
689
+ for (let i = content.length - 1; i >= 0; i--) {
690
+ const part = content[i];
691
+ if (part?.type === "text") {
692
+ const textPart = part;
693
+ textPart.cache_control = cacheControl;
694
+ return true;
695
+ }
696
+ }
697
+ return false;
698
+ }
699
+ export function convertMessages(model, context, compat) {
700
+ const params = [];
701
+ const normalizeToolCallId = (id) => {
702
+ // Handle pipe-separated IDs from OpenAI Responses API
703
+ // Format: {call_id}|{id} where {id} can be 400+ chars with special chars (+, /, =)
704
+ // These come from providers like github-copilot, openai-codex, opencode
705
+ // Extract just the call_id part and normalize it
706
+ if (id.includes("|")) {
707
+ const [callId] = id.split("|");
708
+ // Sanitize to allowed chars and truncate to 40 chars (OpenAI limit)
709
+ return callId.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 40);
710
+ }
711
+ if (model.provider === "openai")
712
+ return id.length > 40 ? id.slice(0, 40) : id;
713
+ return id;
714
+ };
715
+ const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id));
716
+ if (context.systemPrompt) {
717
+ const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;
718
+ const role = useDeveloperRole ? "developer" : "system";
719
+ params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
720
+ }
721
+ let lastRole = null;
722
+ for (let i = 0; i < transformedMessages.length; i++) {
723
+ const msg = transformedMessages[i];
724
+ // Some providers don't allow user messages directly after tool results
725
+ // Insert a synthetic assistant message to bridge the gap
726
+ if (compat.requiresAssistantAfterToolResult && lastRole === "toolResult" && msg.role === "user") {
727
+ params.push({
728
+ role: "assistant",
729
+ content: "I have processed the tool results.",
730
+ });
731
+ }
732
+ if (msg.role === "user") {
733
+ if (typeof msg.content === "string") {
734
+ params.push({
735
+ role: "user",
736
+ content: sanitizeSurrogates(msg.content),
737
+ });
738
+ }
739
+ else {
740
+ const content = msg.content.map((item) => {
741
+ if (item.type === "text") {
742
+ return {
743
+ type: "text",
744
+ text: sanitizeSurrogates(item.text),
745
+ };
746
+ }
747
+ else {
748
+ return {
749
+ type: "image_url",
750
+ image_url: {
751
+ url: `data:${item.mimeType};base64,${item.data}`,
752
+ },
753
+ };
754
+ }
755
+ });
756
+ if (content.length === 0)
757
+ continue;
758
+ params.push({
759
+ role: "user",
760
+ content,
761
+ });
762
+ }
763
+ }
764
+ else if (msg.role === "assistant") {
765
+ // Some providers don't accept null content, use empty string instead
766
+ const assistantMsg = {
767
+ role: "assistant",
768
+ content: compat.requiresAssistantAfterToolResult ? "" : null,
769
+ };
770
+ const assistantTextParts = msg.content
771
+ .filter(isTextContentBlock)
772
+ .filter((block) => block.text.trim().length > 0)
773
+ .map((block) => ({
774
+ type: "text",
775
+ text: sanitizeSurrogates(block.text),
776
+ }));
777
+ const assistantText = assistantTextParts.map((part) => part.text).join("");
778
+ const nonEmptyThinkingBlocks = msg.content
779
+ .filter(isThinkingContentBlock)
780
+ .filter((block) => block.thinking.trim().length > 0);
781
+ if (nonEmptyThinkingBlocks.length > 0) {
782
+ if (compat.requiresThinkingAsText) {
783
+ // Convert thinking blocks to plain text (no tags to avoid model mimicking them)
784
+ const thinkingText = nonEmptyThinkingBlocks
785
+ .map((block) => sanitizeSurrogates(block.thinking))
786
+ .join("\n\n");
787
+ assistantMsg.content = [{ type: "text", text: thinkingText }, ...assistantTextParts];
788
+ }
789
+ else {
790
+ // Always send assistant content as a plain string (OpenAI Chat Completions
791
+ // API standard format). Sending as an array of {type:"text", text:"..."}
792
+ // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via
793
+ // NVIDIA NIM) to mirror the content-block structure literally in their
794
+ // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].
795
+ if (assistantText.length > 0) {
796
+ assistantMsg.content = assistantText;
797
+ }
798
+ // Use the signature from the first thinking block if available (for llama.cpp server + gpt-oss)
799
+ let signature = nonEmptyThinkingBlocks[0].thinkingSignature;
800
+ if (model.provider === "opencode-go" && signature === "reasoning") {
801
+ signature = "reasoning_content";
802
+ }
803
+ if (signature && signature.length > 0) {
804
+ assistantMsg[signature] = nonEmptyThinkingBlocks.map((block) => block.thinking).join("\n");
805
+ }
806
+ }
807
+ }
808
+ else if (assistantText.length > 0) {
809
+ // Always send assistant content as a plain string (OpenAI Chat Completions
810
+ // API standard format). Sending as an array of {type:"text", text:"..."}
811
+ // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via
812
+ // NVIDIA NIM) to mirror the content-block structure literally in their
813
+ // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].
814
+ assistantMsg.content = assistantText;
815
+ }
816
+ const toolCalls = msg.content.filter(isToolCallBlock);
817
+ if (toolCalls.length > 0) {
818
+ assistantMsg.tool_calls = toolCalls.map((tc) => ({
819
+ id: tc.id,
820
+ type: "function",
821
+ function: {
822
+ name: tc.name,
823
+ arguments: JSON.stringify(tc.arguments),
824
+ },
825
+ }));
826
+ const reasoningDetails = toolCalls
827
+ .filter((tc) => tc.thoughtSignature)
828
+ .map((tc) => {
829
+ try {
830
+ return JSON.parse(tc.thoughtSignature);
831
+ }
832
+ catch {
833
+ return null;
834
+ }
835
+ })
836
+ .filter(Boolean);
837
+ if (reasoningDetails.length > 0) {
838
+ assistantMsg.reasoning_details = reasoningDetails;
839
+ }
840
+ }
841
+ if (compat.requiresReasoningContentOnAssistantMessages &&
842
+ model.reasoning &&
843
+ assistantMsg.reasoning_content === undefined) {
844
+ assistantMsg.reasoning_content = "";
845
+ }
846
+ // Skip assistant messages that have no content and no tool calls.
847
+ // Some providers require "either content or tool_calls, but not none".
848
+ // Other providers also don't accept empty assistant messages.
849
+ // This handles aborted assistant responses that got no content.
850
+ const content = assistantMsg.content;
851
+ const hasContent = content !== null &&
852
+ content !== undefined &&
853
+ (typeof content === "string" ? content.length > 0 : content.length > 0);
854
+ if (!hasContent && !assistantMsg.tool_calls) {
855
+ continue;
856
+ }
857
+ params.push(assistantMsg);
858
+ }
859
+ else if (msg.role === "toolResult") {
860
+ const imageBlocks = [];
861
+ const deferredToolNames = new Set();
862
+ let j = i;
863
+ for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
864
+ const toolMsg = transformedMessages[j];
865
+ // Extract text and image content
866
+ const textResult = toolMsg.content
867
+ .filter(isTextContentBlock)
868
+ .map((block) => block.text)
869
+ .join("\n");
870
+ const hasImages = toolMsg.content.some((c) => c.type === "image");
871
+ // Always send tool result with text (or placeholder if only images)
872
+ const hasText = textResult.length > 0;
873
+ const toolResultText = hasText ? textResult : hasImages ? "(see attached image)" : "(no tool output)";
874
+ // Some providers require the 'name' field in tool results
875
+ const toolResultMsg = {
876
+ role: "tool",
877
+ content: sanitizeSurrogates(toolResultText),
878
+ tool_call_id: toolMsg.toolCallId,
879
+ };
880
+ if (compat.requiresToolResultName && toolMsg.toolName) {
881
+ toolResultMsg.name = toolMsg.toolName;
882
+ }
883
+ params.push(toolResultMsg);
884
+ if (compat.deferredToolsMode === "kimi") {
885
+ for (const name of toolMsg.addedToolNames ?? []) {
886
+ deferredToolNames.add(name);
887
+ }
888
+ }
889
+ if (hasImages && model.input.includes("image")) {
890
+ for (const block of toolMsg.content) {
891
+ if (isImageContentBlock(block)) {
892
+ imageBlocks.push({
893
+ type: "image_url",
894
+ image_url: {
895
+ url: `data:${block.mimeType};base64,${block.data}`,
896
+ },
897
+ });
898
+ }
899
+ }
900
+ }
901
+ }
902
+ i = j - 1;
903
+ if (imageBlocks.length > 0) {
904
+ if (compat.requiresAssistantAfterToolResult) {
905
+ params.push({
906
+ role: "assistant",
907
+ content: "I have processed the tool results.",
908
+ });
909
+ }
910
+ params.push({
911
+ role: "user",
912
+ content: [
913
+ {
914
+ type: "text",
915
+ text: "Attached image(s) from tool result:",
916
+ },
917
+ ...imageBlocks,
918
+ ],
919
+ });
920
+ lastRole = "user";
921
+ }
922
+ else {
923
+ lastRole = "toolResult";
924
+ }
925
+ if (deferredToolNames.size > 0) {
926
+ const deferredTools = getToolsByName(context.tools, deferredToolNames);
927
+ if (deferredTools.length > 0) {
928
+ const kimiToolMessage = {
929
+ role: "system",
930
+ tools: convertTools(deferredTools, compat),
931
+ };
932
+ // Kimi accepts a system message with tools but omits the standard content field.
933
+ params.push(kimiToolMessage);
934
+ }
935
+ }
936
+ continue;
937
+ }
938
+ lastRole = msg.role;
939
+ }
940
+ return params;
941
+ }
942
+ function convertTools(tools, compat) {
943
+ return tools.map((tool) => ({
944
+ type: "function",
945
+ function: {
946
+ name: tool.name,
947
+ description: tool.description,
948
+ parameters: tool.parameters, // TypeBox already generates JSON Schema
949
+ // Only include strict if provider supports it. Some reject unknown fields.
950
+ ...(compat.supportsStrictMode !== false && { strict: false }),
951
+ },
952
+ }));
953
+ }
954
+ function parseChunkUsage(rawUsage, model) {
955
+ const promptTokens = rawUsage.prompt_tokens || 0;
956
+ const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;
957
+ const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
958
+ // Follow documented OpenAI/OpenRouter semantics: cached_tokens is cache-read
959
+ // tokens (hits). OpenAI does not document or emit cache_write_tokens, but
960
+ // OpenRouter-compatible providers can include it as a separate write count.
961
+ // OpenRouter's own provider/tests affirm the separate mapping:
962
+ // https://github.com/OpenRouterTeam/ai-sdk-provider/pull/409
963
+ // Do not subtract writes from cached_tokens, otherwise spec-compliant
964
+ // providers are under-reported. DS4 mirrors this contract too:
965
+ // https://github.com/antirez/ds4/pull/29
966
+ // lunr: DeepSeek reports prompt_cache_miss_tokens explicitly; prefer it
967
+ // over the implicit (prompt - hit - write) remainder when present.
968
+ const input = rawUsage.prompt_cache_miss_tokens !== undefined
969
+ ? Math.max(0, rawUsage.prompt_cache_miss_tokens)
970
+ : Math.max(0, promptTokens - cacheReadTokens - cacheWriteTokens);
971
+ // OpenAI completion_tokens already includes reasoning_tokens.
972
+ const outputTokens = rawUsage.completion_tokens || 0;
973
+ const usage = {
974
+ input,
975
+ output: outputTokens,
976
+ cacheRead: cacheReadTokens,
977
+ cacheWrite: cacheWriteTokens,
978
+ reasoning: rawUsage.completion_tokens_details?.reasoning_tokens || 0,
979
+ totalTokens: input + outputTokens + cacheReadTokens + cacheWriteTokens,
980
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
981
+ };
982
+ calculateCost(model, usage);
983
+ return usage;
984
+ }
985
+ function mapStopReason(reason) {
986
+ if (reason === null)
987
+ return { stopReason: "stop" };
988
+ switch (reason) {
989
+ case "stop":
990
+ case "end":
991
+ return { stopReason: "stop" };
992
+ case "length":
993
+ return { stopReason: "length" };
994
+ case "function_call":
995
+ case "tool_calls":
996
+ return { stopReason: "toolUse" };
997
+ case "content_filter":
998
+ return { stopReason: "error", errorMessage: "Provider finish_reason: content_filter" };
999
+ case "network_error":
1000
+ return { stopReason: "error", errorMessage: "Provider finish_reason: network_error" };
1001
+ default:
1002
+ return {
1003
+ stopReason: "error",
1004
+ errorMessage: `Provider finish_reason: ${reason}`,
1005
+ };
1006
+ }
1007
+ }
1008
+ /**
1009
+ * Auto-detect compatibility settings from provider name and baseUrl.
1010
+ * Used as the base when model.compat is not set; explicit model.compat
1011
+ * entries override these detected values.
1012
+ */
1013
+ function detectCompat(model) {
1014
+ const provider = model.provider;
1015
+ const baseUrl = model.baseUrl;
1016
+ const isZai = provider === "zai" ||
1017
+ provider === "zai-coding-cn" ||
1018
+ baseUrl.includes("api.z.ai") ||
1019
+ baseUrl.includes("open.bigmodel.cn");
1020
+ const isTogether = provider === "together" || baseUrl.includes("api.together.ai") || baseUrl.includes("api.together.xyz");
1021
+ const isMoonshot = provider === "moonshotai" || provider === "moonshotai-cn" || baseUrl.includes("api.moonshot.");
1022
+ const isOpenRouter = provider === "openrouter" || baseUrl.includes("openrouter.ai");
1023
+ const isCloudflareWorkersAI = provider === "cloudflare-workers-ai" || baseUrl.includes("api.cloudflare.com");
1024
+ const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
1025
+ const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
1026
+ const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com");
1027
+ const isNonStandard = isNvidia ||
1028
+ provider === "cerebras" ||
1029
+ baseUrl.includes("cerebras.ai") ||
1030
+ provider === "xai" ||
1031
+ baseUrl.includes("api.x.ai") ||
1032
+ isTogether ||
1033
+ baseUrl.includes("chutes.ai") ||
1034
+ baseUrl.includes("deepseek.com") ||
1035
+ isZai ||
1036
+ isMoonshot ||
1037
+ provider === "opencode" ||
1038
+ baseUrl.includes("opencode.ai") ||
1039
+ isCloudflareWorkersAI ||
1040
+ isCloudflareAiGateway ||
1041
+ isAntLing;
1042
+ const useMaxTokens = baseUrl.includes("chutes.ai") || isMoonshot || isCloudflareAiGateway || isTogether || isNvidia || isAntLing;
1043
+ const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
1044
+ const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
1045
+ const isOpenRouterDeveloperRoleModel = isOpenRouter && (model.id.startsWith("anthropic/") || model.id.startsWith("openai/"));
1046
+ const cacheControlFormat = provider === "openrouter" && model.id.startsWith("anthropic/") ? "anthropic" : undefined;
1047
+ return {
1048
+ supportsStore: !isNonStandard,
1049
+ supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
1050
+ supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
1051
+ supportsUsageInStreaming: true,
1052
+ maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
1053
+ requiresToolResultName: false,
1054
+ requiresAssistantAfterToolResult: false,
1055
+ requiresThinkingAsText: false,
1056
+ requiresReasoningContentOnAssistantMessages: isDeepSeek,
1057
+ thinkingFormat: isDeepSeek
1058
+ ? "deepseek"
1059
+ : isZai
1060
+ ? "zai"
1061
+ : isTogether
1062
+ ? "together"
1063
+ : isAntLing
1064
+ ? "ant-ling"
1065
+ : isOpenRouter
1066
+ ? "openrouter"
1067
+ : "openai",
1068
+ openRouterRouting: {},
1069
+ vercelGatewayRouting: {},
1070
+ chatTemplateKwargs: {},
1071
+ zaiToolStream: false,
1072
+ supportsStrictMode: !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia,
1073
+ cacheControlFormat,
1074
+ sendSessionAffinityHeaders: false,
1075
+ deferredToolsMode: undefined,
1076
+ sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
1077
+ supportsLongCacheRetention: !(isTogether ||
1078
+ isCloudflareWorkersAI ||
1079
+ isCloudflareAiGateway ||
1080
+ isNvidia ||
1081
+ isAntLing),
1082
+ };
1083
+ }
1084
+ /**
1085
+ * Get resolved compatibility settings for a model.
1086
+ * Auto-detects from provider/URL then overrides with explicit model.compat.
1087
+ */
1088
+ function getCompat(model) {
1089
+ const detected = detectCompat(model);
1090
+ if (!model.compat)
1091
+ return detected;
1092
+ return {
1093
+ supportsStore: model.compat.supportsStore ?? detected.supportsStore,
1094
+ supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
1095
+ supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
1096
+ supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
1097
+ maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
1098
+ requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
1099
+ requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
1100
+ requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
1101
+ requiresReasoningContentOnAssistantMessages: model.compat.requiresReasoningContentOnAssistantMessages ??
1102
+ detected.requiresReasoningContentOnAssistantMessages,
1103
+ thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,
1104
+ openRouterRouting: model.compat.openRouterRouting ?? {},
1105
+ vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
1106
+ chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
1107
+ zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
1108
+ supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
1109
+ cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
1110
+ sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
1111
+ deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
1112
+ sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
1113
+ supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
1114
+ };
1115
+ }
1116
+ //# sourceMappingURL=openai-completions.js.map