@fractaal/pi-ai 0.85.4 → 0.86.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 (712) hide show
  1. package/README.md +322 -46
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +403 -140
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -1
  6. package/dist/api/azure-openai-config.d.ts +15 -0
  7. package/dist/api/azure-openai-config.d.ts.map +1 -0
  8. package/dist/api/azure-openai-config.js +76 -0
  9. package/dist/api/azure-openai-config.js.map +1 -0
  10. package/dist/api/azure-openai-responses.d.ts +5 -6
  11. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  12. package/dist/api/azure-openai-responses.js +42 -86
  13. package/dist/api/azure-openai-responses.js.map +1 -1
  14. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -1
  15. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  16. package/dist/api/bedrock-converse-stream.js +233 -24
  17. package/dist/api/bedrock-converse-stream.js.map +1 -1
  18. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -1
  19. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
  20. package/dist/api/cloudflare-ai-binding.d.ts +77 -0
  21. package/dist/api/cloudflare-ai-binding.d.ts.map +1 -0
  22. package/dist/api/cloudflare-ai-binding.js +72 -0
  23. package/dist/api/cloudflare-ai-binding.js.map +1 -0
  24. package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
  25. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
  26. package/dist/api/cloudflare-workers-ai-system-one.js +48 -0
  27. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
  28. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
  29. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
  30. package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
  31. package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
  32. package/dist/api/cloudflare.d.ts +2 -0
  33. package/dist/api/cloudflare.d.ts.map +1 -1
  34. package/dist/api/cloudflare.js +2 -0
  35. package/dist/api/cloudflare.js.map +1 -1
  36. package/dist/api/constrained-sampling.d.ts +10 -1
  37. package/dist/api/constrained-sampling.d.ts.map +1 -1
  38. package/dist/api/constrained-sampling.js +137 -4
  39. package/dist/api/constrained-sampling.js.map +1 -1
  40. package/dist/api/github-copilot-headers.d.ts.map +1 -1
  41. package/dist/api/github-copilot-headers.js.map +1 -1
  42. package/dist/api/google-generative-ai.d.ts +2 -2
  43. package/dist/api/google-generative-ai.d.ts.map +1 -1
  44. package/dist/api/google-generative-ai.js +39 -82
  45. package/dist/api/google-generative-ai.js.map +1 -1
  46. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -1
  47. package/dist/api/google-shared.d.ts +27 -5
  48. package/dist/api/google-shared.d.ts.map +1 -1
  49. package/dist/api/google-shared.js +126 -18
  50. package/dist/api/google-shared.js.map +1 -1
  51. package/dist/api/google-vertex.d.ts +2 -2
  52. package/dist/api/google-vertex.d.ts.map +1 -1
  53. package/dist/api/google-vertex.js +42 -73
  54. package/dist/api/google-vertex.js.map +1 -1
  55. package/dist/api/google-vertex.lazy.d.ts.map +1 -1
  56. package/dist/api/lazy.d.ts +5 -1
  57. package/dist/api/lazy.d.ts.map +1 -1
  58. package/dist/api/lazy.js +19 -7
  59. package/dist/api/lazy.js.map +1 -1
  60. package/dist/api/llama-cpp-classify.d.ts +33 -0
  61. package/dist/api/llama-cpp-classify.d.ts.map +1 -0
  62. package/dist/api/llama-cpp-classify.js +365 -0
  63. package/dist/api/llama-cpp-classify.js.map +1 -0
  64. package/dist/api/llama-cpp-classify.lazy.d.ts +3 -0
  65. package/dist/api/llama-cpp-classify.lazy.d.ts.map +1 -0
  66. package/dist/api/llama-cpp-classify.lazy.js +4 -0
  67. package/dist/api/llama-cpp-classify.lazy.js.map +1 -0
  68. package/dist/api/mistral-conversations.d.ts +2 -2
  69. package/dist/api/mistral-conversations.d.ts.map +1 -1
  70. package/dist/api/mistral-conversations.js +250 -69
  71. package/dist/api/mistral-conversations.js.map +1 -1
  72. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -1
  73. package/dist/api/openai-codex-compaction-history.d.ts +2 -2
  74. package/dist/api/openai-codex-compaction-history.d.ts.map +1 -1
  75. package/dist/api/openai-codex-compaction-history.js +1 -2
  76. package/dist/api/openai-codex-compaction-history.js.map +1 -1
  77. package/dist/api/openai-codex-responses.d.ts +1 -1
  78. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  79. package/dist/api/openai-codex-responses.js +107 -60
  80. package/dist/api/openai-codex-responses.js.map +1 -1
  81. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -1
  82. package/dist/api/openai-codex-responses.lazy.js.map +1 -1
  83. package/dist/api/openai-completions.d.ts +11 -4
  84. package/dist/api/openai-completions.d.ts.map +1 -1
  85. package/dist/api/openai-completions.js +250 -134
  86. package/dist/api/openai-completions.js.map +1 -1
  87. package/dist/api/openai-completions.lazy.d.ts.map +1 -1
  88. package/dist/api/openai-prompt-cache.d.ts.map +1 -1
  89. package/dist/api/openai-prompt-cache.js.map +1 -1
  90. package/dist/api/openai-responses-shared.d.ts +8 -4
  91. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  92. package/dist/api/openai-responses-shared.js +114 -62
  93. package/dist/api/openai-responses-shared.js.map +1 -1
  94. package/dist/api/openai-responses.d.ts.map +1 -1
  95. package/dist/api/openai-responses.js +55 -23
  96. package/dist/api/openai-responses.js.map +1 -1
  97. package/dist/api/openai-responses.lazy.d.ts.map +1 -1
  98. package/dist/api/openrouter-images.d.ts +2 -1
  99. package/dist/api/openrouter-images.d.ts.map +1 -1
  100. package/dist/api/openrouter-images.js +1 -0
  101. package/dist/api/openrouter-images.js.map +1 -1
  102. package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
  103. package/dist/api/openrouter-images.lazy.js.map +1 -1
  104. package/dist/api/pi-messages.d.ts +5 -3
  105. package/dist/api/pi-messages.d.ts.map +1 -1
  106. package/dist/api/pi-messages.js +10 -3
  107. package/dist/api/pi-messages.js.map +1 -1
  108. package/dist/api/pi-messages.lazy.d.ts.map +1 -1
  109. package/dist/api/simple-options.d.ts +10 -3
  110. package/dist/api/simple-options.d.ts.map +1 -1
  111. package/dist/api/simple-options.js +31 -11
  112. package/dist/api/simple-options.js.map +1 -1
  113. package/dist/api/system-one-shared.d.ts +23 -0
  114. package/dist/api/system-one-shared.d.ts.map +1 -0
  115. package/dist/api/system-one-shared.js +183 -0
  116. package/dist/api/system-one-shared.js.map +1 -0
  117. package/dist/api/transform-messages.d.ts.map +1 -1
  118. package/dist/api/transform-messages.js +21 -7
  119. package/dist/api/transform-messages.js.map +1 -1
  120. package/dist/api/typesafe-system-one.d.ts +4 -0
  121. package/dist/api/typesafe-system-one.d.ts.map +1 -0
  122. package/dist/api/typesafe-system-one.js +19 -0
  123. package/dist/api/typesafe-system-one.js.map +1 -0
  124. package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
  125. package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
  126. package/dist/api/typesafe-system-one.lazy.js +4 -0
  127. package/dist/api/typesafe-system-one.lazy.js.map +1 -0
  128. package/dist/auth/context.d.ts.map +1 -1
  129. package/dist/auth/context.js.map +1 -1
  130. package/dist/auth/credential-store.d.ts +6 -6
  131. package/dist/auth/credential-store.d.ts.map +1 -1
  132. package/dist/auth/credential-store.js +22 -11
  133. package/dist/auth/credential-store.js.map +1 -1
  134. package/dist/auth/helpers.d.ts +1 -0
  135. package/dist/auth/helpers.d.ts.map +1 -1
  136. package/dist/auth/helpers.js +8 -3
  137. package/dist/auth/helpers.js.map +1 -1
  138. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  139. package/dist/auth/oauth/anthropic.js +78 -131
  140. package/dist/auth/oauth/anthropic.js.map +1 -1
  141. package/dist/auth/oauth/callback-server.d.ts +55 -0
  142. package/dist/auth/oauth/callback-server.d.ts.map +1 -0
  143. package/dist/auth/oauth/callback-server.js +146 -0
  144. package/dist/auth/oauth/callback-server.js.map +1 -0
  145. package/dist/auth/oauth/device-code.d.ts +2 -1
  146. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  147. package/dist/auth/oauth/device-code.js +5 -5
  148. package/dist/auth/oauth/device-code.js.map +1 -1
  149. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  150. package/dist/auth/oauth/github-copilot.js +121 -41
  151. package/dist/auth/oauth/github-copilot.js.map +1 -1
  152. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  153. package/dist/auth/oauth/kimi-coding.js +5 -6
  154. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  155. package/dist/auth/oauth/load.d.ts +4 -0
  156. package/dist/auth/oauth/load.d.ts.map +1 -1
  157. package/dist/auth/oauth/load.js +10 -0
  158. package/dist/auth/oauth/load.js.map +1 -1
  159. package/dist/auth/oauth/meta.d.ts +17 -0
  160. package/dist/auth/oauth/meta.d.ts.map +1 -0
  161. package/dist/auth/oauth/meta.js +190 -0
  162. package/dist/auth/oauth/meta.js.map +1 -0
  163. package/dist/auth/oauth/openai-chatgpt.d.ts +9 -0
  164. package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -0
  165. package/dist/auth/oauth/openai-chatgpt.js +263 -0
  166. package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
  167. package/dist/auth/oauth/openai-codex-errors.d.ts.map +1 -1
  168. package/dist/auth/oauth/openai-codex-errors.js.map +1 -1
  169. package/dist/auth/oauth/openai-codex.d.ts +1 -1
  170. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  171. package/dist/auth/oauth/openai-codex.js +23 -152
  172. package/dist/auth/oauth/openai-codex.js.map +1 -1
  173. package/dist/auth/oauth/openrouter.d.ts +1 -1
  174. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  175. package/dist/auth/oauth/openrouter.js +25 -144
  176. package/dist/auth/oauth/openrouter.js.map +1 -1
  177. package/dist/auth/oauth/pkce.d.ts.map +1 -1
  178. package/dist/auth/oauth/pkce.js.map +1 -1
  179. package/dist/auth/oauth/radius.d.ts +1 -1
  180. package/dist/auth/oauth/radius.d.ts.map +1 -1
  181. package/dist/auth/oauth/radius.js +26 -93
  182. package/dist/auth/oauth/radius.js.map +1 -1
  183. package/dist/auth/oauth/xai.d.ts.map +1 -1
  184. package/dist/auth/oauth/xai.js +3 -2
  185. package/dist/auth/oauth/xai.js.map +1 -1
  186. package/dist/auth/resolve.d.ts +19 -9
  187. package/dist/auth/resolve.d.ts.map +1 -1
  188. package/dist/auth/resolve.js +72 -53
  189. package/dist/auth/resolve.js.map +1 -1
  190. package/dist/auth/types.d.ts +29 -8
  191. package/dist/auth/types.d.ts.map +1 -1
  192. package/dist/auth/types.js.map +1 -1
  193. package/dist/bedrock-provider.d.ts.map +1 -1
  194. package/dist/bun-oauth.d.ts.map +1 -1
  195. package/dist/bun-oauth.js +4 -0
  196. package/dist/bun-oauth.js.map +1 -1
  197. package/dist/cli.d.ts.map +1 -1
  198. package/dist/cli.js +4 -1
  199. package/dist/cli.js.map +1 -1
  200. package/dist/compat/extension-oauth-types.d.ts.map +1 -1
  201. package/dist/compat.d.ts +3 -3
  202. package/dist/compat.d.ts.map +1 -1
  203. package/dist/compat.js +9 -6
  204. package/dist/compat.js.map +1 -1
  205. package/dist/env-api-keys.d.ts +5 -0
  206. package/dist/env-api-keys.d.ts.map +1 -1
  207. package/dist/env-api-keys.js +10 -1
  208. package/dist/env-api-keys.js.map +1 -1
  209. package/dist/image-models.d.ts +19 -8
  210. package/dist/image-models.d.ts.map +1 -1
  211. package/dist/image-models.js +14 -13
  212. package/dist/image-models.js.map +1 -1
  213. package/dist/images-api-registry.d.ts +7 -7
  214. package/dist/images-api-registry.d.ts.map +1 -1
  215. package/dist/images-api-registry.js.map +1 -1
  216. package/dist/images.d.ts +7 -2
  217. package/dist/images.d.ts.map +1 -1
  218. package/dist/images.js +5 -0
  219. package/dist/images.js.map +1 -1
  220. package/dist/index.d.ts +4 -3
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +3 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/legacy-api-aliases.d.ts.map +1 -1
  225. package/dist/model-catalog.d.ts +25 -9
  226. package/dist/model-catalog.d.ts.map +1 -1
  227. package/dist/model-catalog.js +14 -2
  228. package/dist/model-catalog.js.map +1 -1
  229. package/dist/models-store.d.ts +12 -14
  230. package/dist/models-store.d.ts.map +1 -1
  231. package/dist/models-store.js +6 -3
  232. package/dist/models-store.js.map +1 -1
  233. package/dist/models.d.ts +138 -47
  234. package/dist/models.d.ts.map +1 -1
  235. package/dist/models.generated.d.ts +136 -38
  236. package/dist/models.generated.d.ts.map +1 -1
  237. package/dist/models.generated.js +136 -38
  238. package/dist/models.generated.js.map +1 -1
  239. package/dist/models.js +390 -104
  240. package/dist/models.js.map +1 -1
  241. package/dist/oauth.d.ts.map +1 -1
  242. package/dist/providers/all.d.ts +19 -13
  243. package/dist/providers/all.d.ts.map +1 -1
  244. package/dist/providers/all.js +33 -23
  245. package/dist/providers/all.js.map +1 -1
  246. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  247. package/dist/providers/amazon-bedrock.js +15 -7
  248. package/dist/providers/amazon-bedrock.js.map +1 -1
  249. package/dist/providers/amazon-bedrock.models.d.ts +4 -2
  250. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  251. package/dist/providers/amazon-bedrock.models.js +4 -2
  252. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  253. package/dist/providers/ant-ling.d.ts.map +1 -1
  254. package/dist/providers/ant-ling.js.map +1 -1
  255. package/dist/providers/ant-ling.models.d.ts +4 -2
  256. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  257. package/dist/providers/ant-ling.models.js +4 -2
  258. package/dist/providers/ant-ling.models.js.map +1 -1
  259. package/dist/providers/anthropic.d.ts.map +1 -1
  260. package/dist/providers/anthropic.js +39 -8
  261. package/dist/providers/anthropic.js.map +1 -1
  262. package/dist/providers/anthropic.models.d.ts +4 -2
  263. package/dist/providers/anthropic.models.d.ts.map +1 -1
  264. package/dist/providers/anthropic.models.js +4 -2
  265. package/dist/providers/anthropic.models.js.map +1 -1
  266. package/dist/providers/azure.d.ts +3 -0
  267. package/dist/providers/azure.d.ts.map +1 -0
  268. package/dist/providers/azure.js +46 -0
  269. package/dist/providers/azure.js.map +1 -0
  270. package/dist/providers/azure.models.d.ts +6 -0
  271. package/dist/providers/azure.models.d.ts.map +1 -0
  272. package/dist/providers/azure.models.js +8 -0
  273. package/dist/providers/azure.models.js.map +1 -0
  274. package/dist/providers/baseten.d.ts +3 -0
  275. package/dist/providers/baseten.d.ts.map +1 -0
  276. package/dist/providers/baseten.js +15 -0
  277. package/dist/providers/baseten.js.map +1 -0
  278. package/dist/providers/baseten.models.d.ts +6 -0
  279. package/dist/providers/baseten.models.d.ts.map +1 -0
  280. package/dist/providers/baseten.models.js +8 -0
  281. package/dist/providers/baseten.models.js.map +1 -0
  282. package/dist/providers/cerebras.d.ts.map +1 -1
  283. package/dist/providers/cerebras.js.map +1 -1
  284. package/dist/providers/cerebras.models.d.ts +4 -2
  285. package/dist/providers/cerebras.models.d.ts.map +1 -1
  286. package/dist/providers/cerebras.models.js +4 -2
  287. package/dist/providers/cerebras.models.js.map +1 -1
  288. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
  289. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  290. package/dist/providers/cloudflare-ai-gateway.js +4 -0
  291. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  292. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
  293. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  294. package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
  295. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  296. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  297. package/dist/providers/cloudflare-auth.js +15 -10
  298. package/dist/providers/cloudflare-auth.js.map +1 -1
  299. package/dist/providers/cloudflare-stream.d.ts +6 -2
  300. package/dist/providers/cloudflare-stream.d.ts.map +1 -1
  301. package/dist/providers/cloudflare-stream.js +6 -0
  302. package/dist/providers/cloudflare-stream.js.map +1 -1
  303. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  304. package/dist/providers/cloudflare-workers-ai.js +10 -3
  305. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  306. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
  307. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  308. package/dist/providers/cloudflare-workers-ai.models.js +4 -2
  309. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  310. package/dist/providers/data/.manifest.json +1 -1
  311. package/dist/providers/data/amazon-bedrock.json +1 -1
  312. package/dist/providers/data/ant-ling.json +1 -1
  313. package/dist/providers/data/anthropic.json +1 -1
  314. package/dist/providers/data/azure.json +1 -0
  315. package/dist/providers/data/baseten.json +1 -0
  316. package/dist/providers/data/cerebras.json +1 -1
  317. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  318. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  319. package/dist/providers/data/deepseek.json +1 -1
  320. package/dist/providers/data/fireworks.json +1 -1
  321. package/dist/providers/data/github-copilot.json +1 -1
  322. package/dist/providers/data/google-vertex.json +1 -1
  323. package/dist/providers/data/google.json +1 -1
  324. package/dist/providers/data/groq.json +1 -1
  325. package/dist/providers/data/huggingface.json +1 -1
  326. package/dist/providers/data/kimi-coding.json +1 -1
  327. package/dist/providers/data/meta.json +1 -0
  328. package/dist/providers/data/minimax-cn.json +1 -1
  329. package/dist/providers/data/minimax.json +1 -1
  330. package/dist/providers/data/mistral.json +1 -1
  331. package/dist/providers/data/moonshotai-cn.json +1 -1
  332. package/dist/providers/data/moonshotai.json +1 -1
  333. package/dist/providers/data/nvidia.json +1 -1
  334. package/dist/providers/data/openai-codex.json +1 -1
  335. package/dist/providers/data/openai.json +1 -1
  336. package/dist/providers/data/opencode-go.json +1 -1
  337. package/dist/providers/data/opencode.json +1 -1
  338. package/dist/providers/data/openrouter.json +1 -1
  339. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  340. package/dist/providers/data/qwen-token-plan-individual.json +1 -0
  341. package/dist/providers/data/qwen-token-plan.json +1 -1
  342. package/dist/providers/data/radius.json +1 -0
  343. package/dist/providers/data/together.json +1 -1
  344. package/dist/providers/data/typesafe.json +1 -0
  345. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  346. package/dist/providers/data/xai.json +1 -1
  347. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  348. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  349. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  350. package/dist/providers/data/xiaomi.json +1 -1
  351. package/dist/providers/data/zai-coding-cn.json +1 -1
  352. package/dist/providers/data/zai.json +1 -1
  353. package/dist/providers/deepseek.d.ts.map +1 -1
  354. package/dist/providers/deepseek.js.map +1 -1
  355. package/dist/providers/deepseek.models.d.ts +4 -2
  356. package/dist/providers/deepseek.models.d.ts.map +1 -1
  357. package/dist/providers/deepseek.models.js +4 -2
  358. package/dist/providers/deepseek.models.js.map +1 -1
  359. package/dist/providers/faux.d.ts +19 -13
  360. package/dist/providers/faux.d.ts.map +1 -1
  361. package/dist/providers/faux.js +109 -18
  362. package/dist/providers/faux.js.map +1 -1
  363. package/dist/providers/fireworks.d.ts.map +1 -1
  364. package/dist/providers/fireworks.js.map +1 -1
  365. package/dist/providers/fireworks.models.d.ts +4 -2
  366. package/dist/providers/fireworks.models.d.ts.map +1 -1
  367. package/dist/providers/fireworks.models.js +4 -2
  368. package/dist/providers/fireworks.models.js.map +1 -1
  369. package/dist/providers/github-copilot.d.ts.map +1 -1
  370. package/dist/providers/github-copilot.js +1 -1
  371. package/dist/providers/github-copilot.js.map +1 -1
  372. package/dist/providers/github-copilot.models.d.ts +4 -2
  373. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  374. package/dist/providers/github-copilot.models.js +4 -2
  375. package/dist/providers/github-copilot.models.js.map +1 -1
  376. package/dist/providers/google-vertex.d.ts.map +1 -1
  377. package/dist/providers/google-vertex.js +15 -7
  378. package/dist/providers/google-vertex.js.map +1 -1
  379. package/dist/providers/google-vertex.models.d.ts +4 -2
  380. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  381. package/dist/providers/google-vertex.models.js +4 -2
  382. package/dist/providers/google-vertex.models.js.map +1 -1
  383. package/dist/providers/google.d.ts.map +1 -1
  384. package/dist/providers/google.js.map +1 -1
  385. package/dist/providers/google.models.d.ts +4 -2
  386. package/dist/providers/google.models.d.ts.map +1 -1
  387. package/dist/providers/google.models.js +4 -2
  388. package/dist/providers/google.models.js.map +1 -1
  389. package/dist/providers/groq.d.ts.map +1 -1
  390. package/dist/providers/groq.js.map +1 -1
  391. package/dist/providers/groq.models.d.ts +4 -2
  392. package/dist/providers/groq.models.d.ts.map +1 -1
  393. package/dist/providers/groq.models.js +4 -2
  394. package/dist/providers/groq.models.js.map +1 -1
  395. package/dist/providers/huggingface.d.ts.map +1 -1
  396. package/dist/providers/huggingface.js.map +1 -1
  397. package/dist/providers/huggingface.models.d.ts +4 -2
  398. package/dist/providers/huggingface.models.d.ts.map +1 -1
  399. package/dist/providers/huggingface.models.js +4 -2
  400. package/dist/providers/huggingface.models.js.map +1 -1
  401. package/dist/providers/images/register-builtins.d.ts +1 -1
  402. package/dist/providers/images/register-builtins.d.ts.map +1 -1
  403. package/dist/providers/images/register-builtins.js.map +1 -1
  404. package/dist/providers/kimi-coding.d.ts.map +1 -1
  405. package/dist/providers/kimi-coding.js +1 -0
  406. package/dist/providers/kimi-coding.js.map +1 -1
  407. package/dist/providers/kimi-coding.models.d.ts +4 -2
  408. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  409. package/dist/providers/kimi-coding.models.js +4 -2
  410. package/dist/providers/kimi-coding.models.js.map +1 -1
  411. package/dist/providers/meta.d.ts +3 -0
  412. package/dist/providers/meta.d.ts.map +1 -0
  413. package/dist/providers/meta.js +24 -0
  414. package/dist/providers/meta.js.map +1 -0
  415. package/dist/providers/meta.models.d.ts +6 -0
  416. package/dist/providers/meta.models.d.ts.map +1 -0
  417. package/dist/providers/meta.models.js +8 -0
  418. package/dist/providers/meta.models.js.map +1 -0
  419. package/dist/providers/minimax-cn.d.ts.map +1 -1
  420. package/dist/providers/minimax-cn.js.map +1 -1
  421. package/dist/providers/minimax-cn.models.d.ts +4 -2
  422. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  423. package/dist/providers/minimax-cn.models.js +4 -2
  424. package/dist/providers/minimax-cn.models.js.map +1 -1
  425. package/dist/providers/minimax.d.ts.map +1 -1
  426. package/dist/providers/minimax.js.map +1 -1
  427. package/dist/providers/minimax.models.d.ts +4 -2
  428. package/dist/providers/minimax.models.d.ts.map +1 -1
  429. package/dist/providers/minimax.models.js +4 -2
  430. package/dist/providers/minimax.models.js.map +1 -1
  431. package/dist/providers/mistral.d.ts.map +1 -1
  432. package/dist/providers/mistral.js.map +1 -1
  433. package/dist/providers/mistral.models.d.ts +4 -2
  434. package/dist/providers/mistral.models.d.ts.map +1 -1
  435. package/dist/providers/mistral.models.js +4 -2
  436. package/dist/providers/mistral.models.js.map +1 -1
  437. package/dist/providers/moonshotai-cn.d.ts.map +1 -1
  438. package/dist/providers/moonshotai-cn.js.map +1 -1
  439. package/dist/providers/moonshotai-cn.models.d.ts +4 -2
  440. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  441. package/dist/providers/moonshotai-cn.models.js +4 -2
  442. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  443. package/dist/providers/moonshotai.d.ts.map +1 -1
  444. package/dist/providers/moonshotai.js.map +1 -1
  445. package/dist/providers/moonshotai.models.d.ts +4 -2
  446. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  447. package/dist/providers/moonshotai.models.js +4 -2
  448. package/dist/providers/moonshotai.models.js.map +1 -1
  449. package/dist/providers/nvidia.d.ts.map +1 -1
  450. package/dist/providers/nvidia.js.map +1 -1
  451. package/dist/providers/nvidia.models.d.ts +4 -2
  452. package/dist/providers/nvidia.models.d.ts.map +1 -1
  453. package/dist/providers/nvidia.models.js +4 -2
  454. package/dist/providers/nvidia.models.js.map +1 -1
  455. package/dist/providers/openai-codex-catalog.d.ts +1 -0
  456. package/dist/providers/openai-codex-catalog.d.ts.map +1 -1
  457. package/dist/providers/openai-codex-catalog.js +19 -10
  458. package/dist/providers/openai-codex-catalog.js.map +1 -1
  459. package/dist/providers/openai-codex.d.ts.map +1 -1
  460. package/dist/providers/openai-codex.js +5 -1
  461. package/dist/providers/openai-codex.js.map +1 -1
  462. package/dist/providers/openai-codex.models.d.ts +4 -2
  463. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  464. package/dist/providers/openai-codex.models.js +4 -2
  465. package/dist/providers/openai-codex.models.js.map +1 -1
  466. package/dist/providers/openai.d.ts.map +1 -1
  467. package/dist/providers/openai.js +11 -2
  468. package/dist/providers/openai.js.map +1 -1
  469. package/dist/providers/openai.models.d.ts +4 -2
  470. package/dist/providers/openai.models.d.ts.map +1 -1
  471. package/dist/providers/openai.models.js +4 -2
  472. package/dist/providers/openai.models.js.map +1 -1
  473. package/dist/providers/opencode-go.d.ts.map +1 -1
  474. package/dist/providers/opencode-go.js +5 -4
  475. package/dist/providers/opencode-go.js.map +1 -1
  476. package/dist/providers/opencode-go.models.d.ts +4 -2
  477. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  478. package/dist/providers/opencode-go.models.js +4 -2
  479. package/dist/providers/opencode-go.models.js.map +1 -1
  480. package/dist/providers/opencode-headers.d.ts +4 -0
  481. package/dist/providers/opencode-headers.d.ts.map +1 -0
  482. package/dist/providers/opencode-headers.js +22 -0
  483. package/dist/providers/opencode-headers.js.map +1 -0
  484. package/dist/providers/opencode.d.ts +3 -1
  485. package/dist/providers/opencode.d.ts.map +1 -1
  486. package/dist/providers/opencode.js +10 -6
  487. package/dist/providers/opencode.js.map +1 -1
  488. package/dist/providers/opencode.models.d.ts +4 -2
  489. package/dist/providers/opencode.models.d.ts.map +1 -1
  490. package/dist/providers/opencode.models.js +4 -2
  491. package/dist/providers/opencode.models.js.map +1 -1
  492. package/dist/providers/openrouter.d.ts +1 -1
  493. package/dist/providers/openrouter.d.ts.map +1 -1
  494. package/dist/providers/openrouter.js +16 -3
  495. package/dist/providers/openrouter.js.map +1 -1
  496. package/dist/providers/openrouter.models.d.ts +4 -2
  497. package/dist/providers/openrouter.models.d.ts.map +1 -1
  498. package/dist/providers/openrouter.models.js +4 -2
  499. package/dist/providers/openrouter.models.js.map +1 -1
  500. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -1
  501. package/dist/providers/qwen-token-plan-cn.js.map +1 -1
  502. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
  503. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
  504. package/dist/providers/qwen-token-plan-cn.models.js +4 -2
  505. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
  506. package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
  507. package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
  508. package/dist/providers/qwen-token-plan-individual.js +15 -0
  509. package/dist/providers/qwen-token-plan-individual.js.map +1 -0
  510. package/dist/providers/qwen-token-plan-individual.models.d.ts +6 -0
  511. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
  512. package/dist/providers/qwen-token-plan-individual.models.js +8 -0
  513. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
  514. package/dist/providers/qwen-token-plan.d.ts.map +1 -1
  515. package/dist/providers/qwen-token-plan.js.map +1 -1
  516. package/dist/providers/qwen-token-plan.models.d.ts +4 -2
  517. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
  518. package/dist/providers/qwen-token-plan.models.js +4 -2
  519. package/dist/providers/qwen-token-plan.models.js.map +1 -1
  520. package/dist/providers/radius-config.d.ts.map +1 -1
  521. package/dist/providers/radius-config.js.map +1 -1
  522. package/dist/providers/radius.d.ts.map +1 -1
  523. package/dist/providers/radius.js +53 -29
  524. package/dist/providers/radius.js.map +1 -1
  525. package/dist/providers/radius.models.d.ts +6 -0
  526. package/dist/providers/radius.models.d.ts.map +1 -0
  527. package/dist/providers/radius.models.js +8 -0
  528. package/dist/providers/radius.models.js.map +1 -0
  529. package/dist/providers/together.d.ts.map +1 -1
  530. package/dist/providers/together.js.map +1 -1
  531. package/dist/providers/together.models.d.ts +4 -2
  532. package/dist/providers/together.models.d.ts.map +1 -1
  533. package/dist/providers/together.models.js +4 -2
  534. package/dist/providers/together.models.js.map +1 -1
  535. package/dist/providers/typesafe.d.ts +3 -0
  536. package/dist/providers/typesafe.d.ts.map +1 -0
  537. package/dist/providers/typesafe.js +18 -0
  538. package/dist/providers/typesafe.js.map +1 -0
  539. package/dist/providers/typesafe.models.d.ts +6 -0
  540. package/dist/providers/typesafe.models.d.ts.map +1 -0
  541. package/dist/providers/typesafe.models.js +8 -0
  542. package/dist/providers/typesafe.models.js.map +1 -0
  543. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -1
  544. package/dist/providers/vercel-ai-gateway.js +5 -2
  545. package/dist/providers/vercel-ai-gateway.js.map +1 -1
  546. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
  547. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  548. package/dist/providers/vercel-ai-gateway.models.js +4 -2
  549. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  550. package/dist/providers/xai.d.ts +1 -1
  551. package/dist/providers/xai.d.ts.map +1 -1
  552. package/dist/providers/xai.js +2 -5
  553. package/dist/providers/xai.js.map +1 -1
  554. package/dist/providers/xai.models.d.ts +4 -2
  555. package/dist/providers/xai.models.d.ts.map +1 -1
  556. package/dist/providers/xai.models.js +4 -2
  557. package/dist/providers/xai.models.js.map +1 -1
  558. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -1
  559. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -1
  560. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
  561. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  562. package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
  563. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  564. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -1
  565. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -1
  566. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
  567. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  568. package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
  569. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  570. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -1
  571. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -1
  572. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
  573. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  574. package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
  575. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  576. package/dist/providers/xiaomi.d.ts.map +1 -1
  577. package/dist/providers/xiaomi.js.map +1 -1
  578. package/dist/providers/xiaomi.models.d.ts +4 -2
  579. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  580. package/dist/providers/xiaomi.models.js +4 -2
  581. package/dist/providers/xiaomi.models.js.map +1 -1
  582. package/dist/providers/zai-coding-cn.d.ts.map +1 -1
  583. package/dist/providers/zai-coding-cn.js.map +1 -1
  584. package/dist/providers/zai-coding-cn.models.d.ts +4 -2
  585. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  586. package/dist/providers/zai-coding-cn.models.js +4 -2
  587. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  588. package/dist/providers/zai.d.ts.map +1 -1
  589. package/dist/providers/zai.js.map +1 -1
  590. package/dist/providers/zai.models.d.ts +4 -2
  591. package/dist/providers/zai.models.d.ts.map +1 -1
  592. package/dist/providers/zai.models.js +4 -2
  593. package/dist/providers/zai.models.js.map +1 -1
  594. package/dist/session-resources.d.ts.map +1 -1
  595. package/dist/session-resources.js.map +1 -1
  596. package/dist/types.d.ts +414 -126
  597. package/dist/types.d.ts.map +1 -1
  598. package/dist/types.js.map +1 -1
  599. package/dist/utils/abort-signals.d.ts.map +1 -1
  600. package/dist/utils/abort-signals.js.map +1 -1
  601. package/dist/utils/abort.d.ts +8 -0
  602. package/dist/utils/abort.d.ts.map +1 -0
  603. package/dist/utils/abort.js +49 -0
  604. package/dist/utils/abort.js.map +1 -0
  605. package/dist/utils/assistant-message-frame.d.ts +77 -0
  606. package/dist/utils/assistant-message-frame.d.ts.map +1 -0
  607. package/dist/utils/assistant-message-frame.js +425 -0
  608. package/dist/utils/assistant-message-frame.js.map +1 -0
  609. package/dist/utils/diagnostics.d.ts +3 -2
  610. package/dist/utils/diagnostics.d.ts.map +1 -1
  611. package/dist/utils/diagnostics.js.map +1 -1
  612. package/dist/utils/error-body.d.ts.map +1 -1
  613. package/dist/utils/error-body.js +23 -4
  614. package/dist/utils/error-body.js.map +1 -1
  615. package/dist/utils/estimate.d.ts +2 -2
  616. package/dist/utils/estimate.d.ts.map +1 -1
  617. package/dist/utils/estimate.js +8 -29
  618. package/dist/utils/estimate.js.map +1 -1
  619. package/dist/utils/event-stream.d.ts.map +1 -1
  620. package/dist/utils/event-stream.js +25 -7
  621. package/dist/utils/event-stream.js.map +1 -1
  622. package/dist/utils/hash.d.ts.map +1 -1
  623. package/dist/utils/hash.js.map +1 -1
  624. package/dist/utils/headers.d.ts +1 -1
  625. package/dist/utils/headers.d.ts.map +1 -1
  626. package/dist/utils/headers.js +10 -8
  627. package/dist/utils/headers.js.map +1 -1
  628. package/dist/utils/json-parse.d.ts.map +1 -1
  629. package/dist/utils/json-parse.js.map +1 -1
  630. package/dist/utils/model-operations.d.ts +11 -0
  631. package/dist/utils/model-operations.d.ts.map +1 -0
  632. package/dist/utils/model-operations.js +47 -0
  633. package/dist/utils/model-operations.js.map +1 -0
  634. package/dist/utils/models-error.d.ts +8 -0
  635. package/dist/utils/models-error.d.ts.map +1 -0
  636. package/dist/utils/models-error.js +19 -0
  637. package/dist/utils/models-error.js.map +1 -0
  638. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  639. package/dist/utils/node-http-proxy.js +53 -12
  640. package/dist/utils/node-http-proxy.js.map +1 -1
  641. package/dist/utils/oauth-page.d.ts.map +1 -0
  642. package/dist/{auth/oauth → utils}/oauth-page.js +1 -1
  643. package/dist/utils/oauth-page.js.map +1 -0
  644. package/dist/utils/overflow.d.ts +11 -1
  645. package/dist/utils/overflow.d.ts.map +1 -1
  646. package/dist/utils/overflow.js +24 -6
  647. package/dist/utils/overflow.js.map +1 -1
  648. package/dist/utils/pi-user-agent.d.ts +2 -0
  649. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  650. package/dist/utils/pi-user-agent.js +12 -0
  651. package/dist/utils/pi-user-agent.js.map +1 -0
  652. package/dist/utils/provider-env.d.ts.map +1 -1
  653. package/dist/utils/provider-env.js.map +1 -1
  654. package/dist/utils/provider-retry.d.ts.map +1 -1
  655. package/dist/utils/provider-retry.js +3 -2
  656. package/dist/utils/provider-retry.js.map +1 -1
  657. package/dist/utils/retry.d.ts +6 -1
  658. package/dist/utils/retry.d.ts.map +1 -1
  659. package/dist/utils/retry.js +23 -2
  660. package/dist/utils/retry.js.map +1 -1
  661. package/dist/utils/sanitize-unicode.d.ts.map +1 -1
  662. package/dist/utils/sanitize-unicode.js.map +1 -1
  663. package/dist/utils/sleep.d.ts +2 -0
  664. package/dist/utils/sleep.d.ts.map +1 -0
  665. package/dist/utils/sleep.js +15 -0
  666. package/dist/utils/sleep.js.map +1 -0
  667. package/dist/utils/text.d.ts +9 -1
  668. package/dist/utils/text.d.ts.map +1 -1
  669. package/dist/utils/text.js +26 -0
  670. package/dist/utils/text.js.map +1 -1
  671. package/dist/utils/transcript.d.ts +87 -0
  672. package/dist/utils/transcript.d.ts.map +1 -0
  673. package/dist/utils/transcript.js +207 -0
  674. package/dist/utils/transcript.js.map +1 -0
  675. package/dist/utils/typebox-helpers.d.ts.map +1 -1
  676. package/dist/utils/typebox-helpers.js.map +1 -1
  677. package/dist/utils/uuid.d.ts +2 -2
  678. package/dist/utils/uuid.d.ts.map +1 -1
  679. package/dist/utils/uuid.js +35 -39
  680. package/dist/utils/uuid.js.map +1 -1
  681. package/dist/utils/validation.d.ts.map +1 -1
  682. package/dist/utils/validation.js +224 -13
  683. package/dist/utils/validation.js.map +1 -1
  684. package/package.json +21 -15
  685. package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
  686. package/dist/auth/oauth/oauth-page.js.map +0 -1
  687. package/dist/image-models.generated.d.ts +0 -605
  688. package/dist/image-models.generated.d.ts.map +0 -1
  689. package/dist/image-models.generated.js +0 -607
  690. package/dist/image-models.generated.js.map +0 -1
  691. package/dist/images-models.d.ts +0 -95
  692. package/dist/images-models.d.ts.map +0 -1
  693. package/dist/images-models.js +0 -142
  694. package/dist/images-models.js.map +0 -1
  695. package/dist/providers/azure-openai-responses.d.ts +0 -3
  696. package/dist/providers/azure-openai-responses.d.ts.map +0 -1
  697. package/dist/providers/azure-openai-responses.js +0 -14
  698. package/dist/providers/azure-openai-responses.js.map +0 -1
  699. package/dist/providers/azure-openai-responses.models.d.ts +0 -4
  700. package/dist/providers/azure-openai-responses.models.d.ts.map +0 -1
  701. package/dist/providers/azure-openai-responses.models.js +0 -6
  702. package/dist/providers/azure-openai-responses.models.js.map +0 -1
  703. package/dist/providers/data/azure-openai-responses.json +0 -1
  704. package/dist/providers/openrouter-images.d.ts +0 -3
  705. package/dist/providers/openrouter-images.d.ts.map +0 -1
  706. package/dist/providers/openrouter-images.js +0 -22
  707. package/dist/providers/openrouter-images.js.map +0 -1
  708. package/dist/utils/deferred-tools.d.ts +0 -9
  709. package/dist/utils/deferred-tools.d.ts.map +0 -1
  710. package/dist/utils/deferred-tools.js +0 -36
  711. package/dist/utils/deferred-tools.js.map +0 -1
  712. /package/dist/{auth/oauth → utils}/oauth-page.d.ts +0 -0
package/dist/models.js CHANGED
@@ -1,9 +1,22 @@
1
1
  import { lazyStream } from "./api/lazy.js";
2
2
  import { defaultProviderAuthContext as defaultAuthContext } from "./auth/context.js";
3
3
  import { InMemoryCredentialStore } from "./auth/credential-store.js";
4
- import { ModelsError, resolveProviderAuth } from "./auth/resolve.js";
4
+ import { ModelsError, refreshStoredOAuthCredential, resolveProviderAuth, } from "./auth/resolve.js";
5
5
  import { InMemoryModelsStore } from "./models-store.js";
6
+ import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
7
+ import { assertChatModel, assertClassifierModel, assertImageModel, classifierErrorResult, getModelType, imageErrorResult, isModelType, } from "./utils/model-operations.js";
8
+ import { normalizeContext } from "./utils/transcript.js";
6
9
  export { ModelsError } from "./auth/resolve.js";
10
+ export { getModelType, isModelType } from "./utils/model-operations.js";
11
+ const KNOWN_MODEL_TYPES = { chat: true, image: true, classifier: true };
12
+ /** Models from stores and remote sources may have types that only newer versions know. */
13
+ function hasKnownModelType(model) {
14
+ return Object.hasOwn(KNOWN_MODEL_TYPES, getModelType(model));
15
+ }
16
+ /** Drops stored models whose type this version does not know. */
17
+ function withKnownModelTypes(entry) {
18
+ return { ...entry, models: entry.models.filter(hasKnownModelType) };
19
+ }
7
20
  function mergeHeaders(base, override) {
8
21
  if (!base && !override)
9
22
  return undefined;
@@ -23,18 +36,26 @@ class ModelsImpl {
23
36
  credentials;
24
37
  modelsStore;
25
38
  authContext;
39
+ refreshGenerations = new Map();
40
+ refreshControllers = new Map();
41
+ publicationChains = new Map();
26
42
  constructor(options) {
27
43
  this.credentials = options?.credentials ?? new InMemoryCredentialStore();
28
44
  this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore();
29
45
  this.authContext = options?.authContext ?? defaultAuthContext();
30
46
  }
31
47
  setProvider(provider) {
48
+ this.supersedeProviderRefresh(provider.id);
32
49
  this.providers.set(provider.id, provider);
33
50
  }
34
51
  deleteProvider(id) {
52
+ this.supersedeProviderRefresh(id);
35
53
  this.providers.delete(id);
36
54
  }
37
55
  clearProviders() {
56
+ for (const id of new Set([...this.providers.keys(), ...this.refreshControllers.keys()])) {
57
+ this.supersedeProviderRefresh(id);
58
+ }
38
59
  this.providers.clear();
39
60
  }
40
61
  getProviders() {
@@ -66,90 +87,177 @@ class ModelsImpl {
66
87
  }
67
88
  return models;
68
89
  }
90
+ getAllModels(provider) {
91
+ if (provider !== undefined) {
92
+ const entry = this.providers.get(provider);
93
+ if (!entry)
94
+ return [];
95
+ try {
96
+ return entry.getAllModels?.() ?? entry.getModels();
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ const models = [];
103
+ for (const entry of this.providers.values()) {
104
+ try {
105
+ models.push(...(entry.getAllModels?.() ?? entry.getModels()));
106
+ }
107
+ catch {
108
+ // Best-effort: ill-behaved providers yield no models.
109
+ }
110
+ }
111
+ return models;
112
+ }
113
+ getModelsOfType(type, provider) {
114
+ return this.getAllModels(provider).filter((model) => isModelType(model, type));
115
+ }
69
116
  getModel(provider, id) {
70
117
  return this.getModels(provider).find((model) => model.id === id);
71
118
  }
119
+ getModelOfType(type, provider, id) {
120
+ return this.getModelsOfType(type, provider).find((model) => model.id === id);
121
+ }
122
+ supersedeProviderRefresh(providerId) {
123
+ const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
124
+ this.refreshGenerations.set(providerId, generation);
125
+ const previous = this.refreshControllers.get(providerId);
126
+ if (previous) {
127
+ this.refreshControllers.delete(providerId);
128
+ previous.abort();
129
+ }
130
+ return generation;
131
+ }
132
+ beginProviderRefresh(providerId) {
133
+ const generation = this.supersedeProviderRefresh(providerId);
134
+ const controller = new AbortController();
135
+ this.refreshControllers.set(providerId, controller);
136
+ return { generation, controller };
137
+ }
138
+ publishProviderModels(providerId, generation, signal, publication) {
139
+ const previous = this.publicationChains.get(providerId) ?? Promise.resolve();
140
+ const queued = (async () => {
141
+ await previous.catch(() => { });
142
+ if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
143
+ return false;
144
+ if (publication.persist === null) {
145
+ await this.modelsStore.delete(providerId, { signal });
146
+ }
147
+ else if (publication.persist !== undefined) {
148
+ await this.modelsStore.write(providerId, structuredClone(publication.persist), { signal });
149
+ }
150
+ if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
151
+ return false;
152
+ publication.update?.();
153
+ return true;
154
+ })();
155
+ const tail = queued.catch(() => { });
156
+ this.publicationChains.set(providerId, tail);
157
+ void tail.then(() => {
158
+ if (this.publicationChains.get(providerId) === tail)
159
+ this.publicationChains.delete(providerId);
160
+ });
161
+ return raceWithAbortSignal(queued, signal);
162
+ }
163
+ async runProviderRefreshPhase(provider, credential, allowNetwork, force, generation, signal) {
164
+ const stored = await this.modelsStore.read(provider.id, { signal });
165
+ await provider.refreshModels({
166
+ credential,
167
+ stored: stored ? withKnownModelTypes(structuredClone(stored)) : undefined,
168
+ publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
169
+ allowNetwork,
170
+ force: allowNetwork ? force : undefined,
171
+ signal,
172
+ });
173
+ }
72
174
  async refresh(options = {}) {
73
175
  const allowNetwork = options.allowNetwork ?? true;
176
+ const callerSignal = operationSignal(options.signal);
74
177
  const errors = new Map();
75
- const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined);
76
- await Promise.all(refreshable.map(async (provider) => {
77
- if (options.signal?.aborted)
78
- return;
79
- const store = {
80
- read: () => this.modelsStore.read(provider.id),
81
- write: (entry) => this.modelsStore.write(provider.id, entry),
82
- delete: () => this.modelsStore.delete(provider.id),
83
- };
84
- let stored;
85
- try {
86
- stored = await this.readCredential(provider.id);
87
- const credential = await this.resolveRefreshCredential(provider, stored, allowNetwork, options.signal);
178
+ if (callerSignal.aborted)
179
+ return { aborted: true, errors };
180
+ const selected = options.providers ? new Set(options.providers) : undefined;
181
+ const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined && (!selected || selected.has(provider.id)));
182
+ const refresh = Promise.all(refreshable.map(async (provider) => {
183
+ const { generation, controller } = this.beginProviderRefresh(provider.id);
184
+ const signal = AbortSignal.any([callerSignal, controller.signal]);
185
+ const operation = (async () => {
186
+ let storedCredential;
187
+ let credentialError;
188
+ try {
189
+ storedCredential = await this.readCredential(provider.id, signal);
190
+ }
191
+ catch (error) {
192
+ credentialError = error;
193
+ }
194
+ // Restore cached provider state before auth resolution or network access.
195
+ await this.runProviderRefreshPhase(provider, storedCredential, false, undefined, generation, signal);
196
+ if (credentialError !== undefined)
197
+ throw credentialError;
198
+ if (!allowNetwork || signal.aborted)
199
+ return;
200
+ const credential = await this.resolveRefreshCredential(provider, storedCredential, signal);
88
201
  if (!credential)
89
202
  return;
90
- await provider.refreshModels({
91
- credential,
92
- store,
93
- allowNetwork,
94
- force: options.force,
95
- signal: options.signal,
96
- });
203
+ await this.runProviderRefreshPhase(provider, credential, true, options.force, generation, signal);
204
+ })();
205
+ try {
206
+ await raceWithAbortSignal(operation, signal);
97
207
  }
98
208
  catch (error) {
99
- if (!options.signal?.aborted) {
209
+ if (!signal.aborted) {
100
210
  errors.set(provider.id, error instanceof Error
101
211
  ? error
102
212
  : new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
103
213
  }
104
- try {
105
- await provider.refreshModels({
106
- credential: stored,
107
- store,
108
- allowNetwork: false,
109
- signal: options.signal,
110
- });
111
- }
112
- catch {
113
- // Preserve the original auth/network error; cache restoration is best-effort here.
214
+ }
215
+ finally {
216
+ if (this.refreshControllers.get(provider.id) === controller) {
217
+ this.refreshControllers.delete(provider.id);
114
218
  }
115
219
  }
116
220
  }));
117
- return { aborted: options.signal?.aborted ?? false, errors };
221
+ try {
222
+ await raceWithAbortSignal(refresh, callerSignal);
223
+ }
224
+ catch (error) {
225
+ if (!callerSignal.aborted)
226
+ throw error;
227
+ }
228
+ return { aborted: callerSignal.aborted, errors: new Map(errors) };
118
229
  }
119
- async resolveRefreshCredential(provider, stored, allowNetwork, signal) {
230
+ async resolveRefreshCredential(provider, stored, signal) {
120
231
  if (stored?.type === "oauth") {
121
232
  const oauth = provider.auth.oauth;
122
233
  if (!oauth)
123
234
  return undefined;
124
- if (!allowNetwork || Date.now() < stored.expires)
235
+ if (Date.now() < stored.expires)
125
236
  return stored;
126
- if (signal?.aborted)
237
+ if (signal.aborted)
127
238
  return undefined;
128
- const post = await this.credentials.modify(provider.id, async (current) => {
129
- if (current?.type !== "oauth" || Date.now() < current.expires)
130
- return undefined;
131
- return oauth.refresh(current, signal);
132
- });
133
- return post?.type === "oauth" ? post : undefined;
239
+ // A refresh that has started survives cancellation or a superseding model refresh, so a
240
+ // rotated refresh token is always persisted. A newer refresh then sees the fresh credential.
241
+ return refreshStoredOAuthCredential(this.credentials, provider.id, oauth, (current) => Date.now() >= current.expires, signal);
134
242
  }
135
243
  const apiKey = provider.auth.apiKey;
136
244
  if (!apiKey)
137
245
  return undefined;
138
246
  const credential = stored?.type === "api_key" ? stored : undefined;
139
- const result = await apiKey.resolve({ ctx: this.authContext, credential });
247
+ const result = await apiKey.resolve({ ctx: this.authContext, credential, signal });
140
248
  if (!result)
141
249
  return undefined;
142
250
  return { type: "api_key", key: result.auth.apiKey, env: result.env };
143
251
  }
144
- async readCredential(providerId) {
252
+ async readCredential(providerId, signal) {
145
253
  try {
146
- return await this.credentials.read(providerId);
254
+ return await this.credentials.read(providerId, { signal });
147
255
  }
148
256
  catch (error) {
149
257
  throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
150
258
  }
151
259
  }
152
- async checkProviderAuth(provider, credential) {
260
+ async checkProviderAuth(provider, credential, signal) {
153
261
  if (credential?.type === "oauth") {
154
262
  return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : undefined;
155
263
  }
@@ -161,42 +269,75 @@ class ModelsImpl {
161
269
  return await apiKey.check({
162
270
  ctx: this.authContext,
163
271
  credential: credential?.type === "api_key" ? credential : undefined,
272
+ signal,
164
273
  });
165
274
  }
166
275
  catch (error) {
167
276
  throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
168
277
  }
169
278
  }
170
- const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
279
+ const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext, { signal });
171
280
  return resolution ? { source: resolution.source, type: "api_key" } : undefined;
172
281
  }
173
- async checkAuth(providerId) {
174
- const provider = this.providers.get(providerId);
175
- if (!provider)
176
- return undefined;
177
- return this.checkProviderAuth(provider, await this.readCredential(providerId));
282
+ checkAuth(providerId, options) {
283
+ const signal = operationSignal(options?.signal);
284
+ const check = (async () => {
285
+ signal.throwIfAborted();
286
+ const provider = this.providers.get(providerId);
287
+ if (!provider)
288
+ return undefined;
289
+ return this.checkProviderAuth(provider, await this.readCredential(providerId, signal), signal);
290
+ })();
291
+ return raceWithAbortSignal(check, signal);
178
292
  }
179
- async getAvailable(providerId) {
293
+ async getAuthenticatedProviders(providerId, signal) {
294
+ signal.throwIfAborted();
180
295
  const providers = providerId
181
296
  ? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
182
297
  : this.getProviders();
183
298
  const checks = await Promise.all(providers.map(async (provider) => {
184
- const credential = await this.readCredential(provider.id);
185
- return { provider, credential, auth: await this.checkProviderAuth(provider, credential) };
299
+ const credential = await this.readCredential(provider.id, signal);
300
+ return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
186
301
  }));
187
- return checks.flatMap(({ provider, credential, auth }) => {
188
- if (!auth)
189
- return [];
190
- const models = provider.getModels();
191
- return provider.filterModels?.(models, credential) ?? models;
192
- });
302
+ return checks.filter((entry) => entry.auth !== undefined);
303
+ }
304
+ getAvailable(providerId, options) {
305
+ const signal = operationSignal(options?.signal);
306
+ const available = (async () => {
307
+ const providers = await this.getAuthenticatedProviders(providerId, signal);
308
+ return providers.flatMap(({ provider, credential }) => {
309
+ const models = provider.getModels();
310
+ return provider.filterModels?.(models, credential) ?? models;
311
+ });
312
+ })();
313
+ return raceWithAbortSignal(available, signal);
314
+ }
315
+ async getAvailableOfType(type, providerId, options) {
316
+ return (await this.getAllAvailable(providerId, options)).filter((model) => isModelType(model, type));
317
+ }
318
+ getAllAvailable(providerId, options) {
319
+ const signal = operationSignal(options?.signal);
320
+ const available = (async () => {
321
+ const providers = await this.getAuthenticatedProviders(providerId, signal);
322
+ return providers.flatMap(({ provider, credential }) => {
323
+ const models = provider.getAllModels?.() ?? provider.getModels();
324
+ if (provider.filterAllModels)
325
+ return provider.filterAllModels(models, credential);
326
+ if (!provider.filterModels)
327
+ return models;
328
+ const availableChatIds = new Set(provider.filterModels(provider.getModels(), credential).map((model) => model.id));
329
+ return models.filter((model) => !isModelType(model, "chat") || availableChatIds.has(model.id));
330
+ });
331
+ })();
332
+ return raceWithAbortSignal(available, signal);
193
333
  }
194
334
  async getAuth(providerOrModel, overrides) {
335
+ const signal = operationSignal(overrides?.signal);
195
336
  const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
196
337
  const provider = this.providers.get(providerId);
197
338
  if (!provider)
198
339
  return undefined;
199
- const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
340
+ const result = await resolveProviderAuth(provider, this.credentials, this.authContext, { ...overrides, signal });
200
341
  if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
201
342
  return result;
202
343
  return {
@@ -207,7 +348,9 @@ class ModelsImpl {
207
348
  },
208
349
  };
209
350
  }
210
- async login(providerId, type, interaction) {
351
+ async login(providerId, type, interaction, options) {
352
+ const signal = operationSignal(interaction.signal);
353
+ signal.throwIfAborted();
211
354
  const provider = this.providers.get(providerId);
212
355
  if (!provider)
213
356
  throw new ModelsError("provider", `Unknown provider: ${providerId}`);
@@ -215,20 +358,52 @@ class ModelsImpl {
215
358
  if (!method?.login) {
216
359
  throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
217
360
  }
218
- const credential = await method.login(interaction);
361
+ const loginOperation = method.login({ ...interaction, signal }, options);
362
+ const credential = await raceWithAbortSignal(loginOperation, signal);
363
+ let mutationStarted = false;
364
+ let markMutationStarted;
365
+ const started = new Promise((resolve) => {
366
+ markMutationStarted = resolve;
367
+ });
368
+ const mutation = this.credentials.modify(providerId, async () => {
369
+ mutationStarted = true;
370
+ markMutationStarted?.();
371
+ return credential;
372
+ }, { signal });
373
+ void mutation.catch(() => { });
219
374
  try {
220
- await this.credentials.modify(providerId, async () => credential);
375
+ await new Promise((resolve, reject) => {
376
+ const onAbort = () => {
377
+ if (!mutationStarted)
378
+ reject(signal.reason);
379
+ };
380
+ signal.addEventListener("abort", onAbort, { once: true });
381
+ void Promise.race([started, mutation]).then(() => {
382
+ signal.removeEventListener("abort", onAbort);
383
+ resolve();
384
+ }, (error) => {
385
+ signal.removeEventListener("abort", onAbort);
386
+ reject(error);
387
+ });
388
+ if (signal.aborted)
389
+ onAbort();
390
+ });
391
+ await mutation;
221
392
  }
222
393
  catch (error) {
394
+ signal.throwIfAborted();
223
395
  throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
224
396
  }
225
397
  return credential;
226
398
  }
227
- async logout(providerId) {
399
+ async logout(providerId, options) {
400
+ const signal = operationSignal(options?.signal);
401
+ signal.throwIfAborted();
228
402
  try {
229
- await this.credentials.delete(providerId);
403
+ await this.credentials.delete(providerId, { signal });
230
404
  }
231
405
  catch (error) {
406
+ signal.throwIfAborted();
232
407
  throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
233
408
  }
234
409
  }
@@ -239,11 +414,16 @@ class ModelsImpl {
239
414
  }
240
415
  return provider;
241
416
  }
417
+ requireChatProvider(model) {
418
+ assertChatModel(model);
419
+ return this.requireProvider(model);
420
+ }
242
421
  async applyAuth(model, options) {
243
422
  this.requireProvider(model);
244
423
  const resolution = await this.getAuth(model, {
245
424
  apiKey: options?.apiKey,
246
425
  env: options?.env,
426
+ signal: options?.signal,
247
427
  });
248
428
  if (!resolution) {
249
429
  throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
@@ -261,44 +441,108 @@ class ModelsImpl {
261
441
  return { requestModel, requestOptions };
262
442
  }
263
443
  stream(model, context, options) {
444
+ const transcript = normalizeContext(context);
264
445
  return lazyStream(model, async () => {
265
- const provider = this.requireProvider(model);
446
+ const provider = this.requireChatProvider(model);
266
447
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
267
- return provider.stream(requestModel, context, requestOptions);
448
+ return provider.stream(requestModel, transcript, requestOptions);
268
449
  });
269
450
  }
270
451
  async complete(model, context, options) {
271
452
  return this.stream(model, context, options).result();
272
453
  }
273
454
  streamSimple(model, context, options) {
455
+ const transcript = normalizeContext(context);
274
456
  return lazyStream(model, async () => {
275
- const provider = this.requireProvider(model);
457
+ const provider = this.requireChatProvider(model);
276
458
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
277
- return provider.streamSimple(requestModel, context, requestOptions);
459
+ return provider.streamSimple(requestModel, transcript, requestOptions);
278
460
  });
279
461
  }
280
462
  async completeSimple(model, context, options) {
281
463
  return this.streamSimple(model, context, options).result();
282
464
  }
465
+ streamDeferred(model, handle, options) {
466
+ return lazyStream(model, async () => {
467
+ const provider = this.requireChatProvider(model);
468
+ if (!provider.fetchDeferred) {
469
+ throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
470
+ }
471
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
472
+ return provider.fetchDeferred(requestModel, handle, requestOptions);
473
+ });
474
+ }
475
+ async fetchDeferred(model, handle, options) {
476
+ return this.streamDeferred(model, handle, options).result();
477
+ }
478
+ async cancelDeferred(model, handle, options) {
479
+ const provider = this.requireChatProvider(model);
480
+ if (!provider.cancelDeferred) {
481
+ throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
482
+ }
483
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
484
+ await provider.cancelDeferred(requestModel, handle, requestOptions);
485
+ }
486
+ async generateImages(model, context, options) {
487
+ try {
488
+ assertImageModel(model);
489
+ const provider = this.requireProvider(model);
490
+ if (!provider.generateImages) {
491
+ throw new ModelsError("provider", `Provider ${model.provider} does not support image generation`);
492
+ }
493
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
494
+ return await provider.generateImages(requestModel, context, requestOptions);
495
+ }
496
+ catch (error) {
497
+ return imageErrorResult(model, error, options?.signal?.aborted);
498
+ }
499
+ }
500
+ async classify(model, context, options) {
501
+ try {
502
+ assertClassifierModel(model);
503
+ const provider = this.requireProvider(model);
504
+ if (!provider.classify) {
505
+ throw new ModelsError("provider", `Provider ${model.provider} does not support classification`);
506
+ }
507
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
508
+ return await provider.classify(requestModel, context, requestOptions);
509
+ }
510
+ catch (error) {
511
+ return classifierErrorResult(model, error, options?.signal?.aborted);
512
+ }
513
+ }
283
514
  }
284
515
  export function createModels(options) {
285
516
  return new ModelsImpl(options);
286
517
  }
287
518
  /**
288
519
  * Builds a provider from parts. Built-in provider factories and models.json
289
- * custom providers both go through this. A single `api` streams all models;
290
- * an `api` map dispatches on `model.api`, and a model whose api has no entry
291
- * produces a stream error.
520
+ * custom providers both go through this. A single `api` streams all chat
521
+ * models; an `api` map dispatches on `model.api`, and a model whose api has
522
+ * no entry produces a stream error. One-shot operation maps dispatch on
523
+ * `model.api` the same way. At least one concrete implementation across
524
+ * `api`/`images`/`classifiers` is required; empty maps are rejected.
292
525
  */
293
526
  export function createProvider(input) {
527
+ const single = input.api && typeof input.api.stream === "function"
528
+ ? input.api
529
+ : undefined;
530
+ const byApi = single || !input.api ? undefined : input.api;
531
+ const images = input.images;
532
+ const classifiers = input.classifiers;
533
+ const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
534
+ const imageImplementations = Object.values(images ?? {}).filter((entry) => entry !== undefined);
535
+ const classifierImplementations = Object.values(classifiers ?? {}).filter((entry) => entry !== undefined);
536
+ if (streams.length === 0 && imageImplementations.length === 0 && classifierImplementations.length === 0) {
537
+ throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);
538
+ }
294
539
  const baselineModels = input.models;
295
540
  let dynamicModels = [];
296
- let inflightRefresh;
297
541
  const fetchModels = input.fetchModels;
298
542
  const currentModels = () => {
299
543
  const merged = [...baselineModels];
300
544
  for (const model of dynamicModels) {
301
- const index = merged.findIndex((entry) => entry.id === model.id);
545
+ const index = merged.findIndex((entry) => getModelType(entry) === getModelType(model) && entry.id === model.id);
302
546
  if (index >= 0)
303
547
  merged[index] = model;
304
548
  else
@@ -306,8 +550,6 @@ export function createProvider(input) {
306
550
  }
307
551
  return merged;
308
552
  };
309
- const single = typeof input.api.stream === "function" ? input.api : undefined;
310
- const byApi = single ? undefined : input.api;
311
553
  const apiFor = (model) => single ?? byApi?.[model.api];
312
554
  const dispatch = (model, run) => {
313
555
  const streams = apiFor(model);
@@ -318,42 +560,84 @@ export function createProvider(input) {
318
560
  }
319
561
  return run(streams);
320
562
  };
321
- return {
563
+ const provider = {
322
564
  id: input.id,
323
565
  name: input.name ?? input.id,
324
566
  baseUrl: input.baseUrl,
325
567
  headers: input.headers,
326
568
  auth: input.auth,
327
- getModels: currentModels,
569
+ getModels: () => currentModels().filter((model) => isModelType(model, "chat")),
570
+ getAllModels: currentModels,
328
571
  refreshModels: fetchModels
329
- ? (context) => {
330
- inflightRefresh ??= (async () => {
331
- try {
332
- const stored = await context.store.read();
333
- if (stored) {
334
- dynamicModels = stored.models
335
- .filter((model) => model.provider === input.id)
336
- .map((model) => model);
337
- }
338
- if (!context.allowNetwork || context.signal?.aborted)
339
- return;
340
- const refreshed = await fetchModels(context);
341
- if (context.signal?.aborted)
342
- return;
343
- dynamicModels = refreshed;
344
- await context.store.write({ models: refreshed, checkedAt: Date.now() });
345
- }
346
- finally {
347
- inflightRefresh = undefined;
572
+ ? async (context) => {
573
+ if (context.stored) {
574
+ const restored = context.stored.models
575
+ .filter((model) => model.provider === input.id)
576
+ .map((model) => model);
577
+ if (!(await context.publish({
578
+ update: () => {
579
+ dynamicModels = restored;
580
+ },
581
+ }))) {
582
+ return;
348
583
  }
349
- })();
350
- return inflightRefresh;
584
+ }
585
+ if (!context.allowNetwork || context.signal.aborted)
586
+ return;
587
+ const fetched = await fetchModels(context);
588
+ if (context.signal.aborted)
589
+ return;
590
+ const refreshed = fetched.filter(hasKnownModelType);
591
+ await context.publish({
592
+ persist: { models: refreshed, checkedAt: Date.now() },
593
+ update: () => {
594
+ dynamicModels = refreshed;
595
+ },
596
+ });
351
597
  }
352
598
  : undefined,
353
599
  filterModels: input.filterModels,
600
+ filterAllModels: input.filterAllModels,
354
601
  stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
355
602
  streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
356
603
  };
604
+ if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
605
+ provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
606
+ const implementation = apiFor(model);
607
+ if (!implementation?.fetchDeferred) {
608
+ throw new ModelsError("provider", `Provider ${input.id} does not support deferred responses for "${model.api}"`);
609
+ }
610
+ return implementation.fetchDeferred(model, handle, options);
611
+ });
612
+ }
613
+ if (streams.some((entry) => entry.cancelDeferred !== undefined)) {
614
+ provider.cancelDeferred = async (model, handle, options) => {
615
+ const implementation = apiFor(model);
616
+ if (!implementation?.cancelDeferred) {
617
+ throw new ModelsError("provider", `Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);
618
+ }
619
+ await implementation.cancelDeferred(model, handle, options);
620
+ };
621
+ }
622
+ if (images && imageImplementations.length > 0) {
623
+ provider.generateImages = async (model, context, options) => {
624
+ const implementation = images[model.api];
625
+ if (!implementation) {
626
+ return imageErrorResult(model, new ModelsError("provider", `Provider ${input.id} has no image generation implementation for "${model.api}"`));
627
+ }
628
+ return implementation.generateImages(model, context, options);
629
+ };
630
+ }
631
+ if (classifiers && classifierImplementations.length > 0) {
632
+ provider.classify = async (model, context, options) => {
633
+ const implementation = classifiers[model.api];
634
+ if (!implementation) {
635
+ return classifierErrorResult(model, new ModelsError("provider", `Provider ${input.id} has no classifier implementation for "${model.api}"`));
636
+ }
637
+ return implementation.classify(model, context, options);
638
+ };
639
+ }
640
+ return provider;
357
641
  }
358
642
  /**
359
643
  * Runtime-checked narrowing for dynamically looked-up models:
@@ -364,9 +648,11 @@ export function createProvider(input) {
364
648
  * // model: Model<"anthropic-messages">, stream options fully typed
365
649
  * }
366
650
  * ```
651
+ *
652
+ * Non-chat models never match, even when their api id equals `api`.
367
653
  */
368
654
  export function hasApi(model, api) {
369
- return model.api === api;
655
+ return isModelType(model, "chat") && model.api === api;
370
656
  }
371
657
  export function calculateCost(model, usage) {
372
658
  const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
@@ -421,12 +707,12 @@ export function clampThinkingLevel(model, level) {
421
707
  return availableLevels[0] ?? "off";
422
708
  }
423
709
  /**
424
- * Check if two models are equal by comparing both their id and provider.
710
+ * Check if two models are equal by comparing their type, id, and provider.
425
711
  * Returns false if either model is null or undefined.
426
712
  */
427
713
  export function modelsAreEqual(a, b) {
428
714
  if (!a || !b)
429
715
  return false;
430
- return a.id === b.id && a.provider === b.provider;
716
+ return getModelType(a) === getModelType(b) && a.id === b.id && a.provider === b.provider;
431
717
  }
432
718
  //# sourceMappingURL=models.js.map