@bastani/pi-ai 0.9.20-alpha.8 → 0.9.20

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 (370) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +172 -24
  3. package/dist/api/anthropic-messages.d.ts.map +1 -1
  4. package/dist/api/anthropic-messages.js +9 -3
  5. package/dist/api/anthropic-messages.js.map +1 -1
  6. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  7. package/dist/api/azure-openai-responses.js +4 -1
  8. package/dist/api/azure-openai-responses.js.map +1 -1
  9. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  10. package/dist/api/bedrock-converse-stream.js +5 -3
  11. package/dist/api/bedrock-converse-stream.js.map +1 -1
  12. package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
  13. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
  14. package/dist/api/cloudflare-workers-ai-system-one.js +43 -0
  15. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
  16. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
  17. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
  18. package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
  19. package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
  20. package/dist/api/cloudflare.d.ts +2 -0
  21. package/dist/api/cloudflare.d.ts.map +1 -1
  22. package/dist/api/cloudflare.js +2 -0
  23. package/dist/api/cloudflare.js.map +1 -1
  24. package/dist/api/constrained-sampling.d.ts +8 -3
  25. package/dist/api/constrained-sampling.d.ts.map +1 -1
  26. package/dist/api/constrained-sampling.js +29 -11
  27. package/dist/api/constrained-sampling.js.map +1 -1
  28. package/dist/api/google-generative-ai.d.ts.map +1 -1
  29. package/dist/api/google-generative-ai.js +1 -0
  30. package/dist/api/google-generative-ai.js.map +1 -1
  31. package/dist/api/google-vertex.d.ts.map +1 -1
  32. package/dist/api/google-vertex.js +1 -0
  33. package/dist/api/google-vertex.js.map +1 -1
  34. package/dist/api/mistral-conversations.d.ts.map +1 -1
  35. package/dist/api/mistral-conversations.js +3 -2
  36. package/dist/api/mistral-conversations.js.map +1 -1
  37. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  38. package/dist/api/openai-codex-responses.js +20 -4
  39. package/dist/api/openai-codex-responses.js.map +1 -1
  40. package/dist/api/openai-completions.d.ts.map +1 -1
  41. package/dist/api/openai-completions.js +1 -0
  42. package/dist/api/openai-completions.js.map +1 -1
  43. package/dist/api/openai-responses-shared.d.ts +2 -1
  44. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  45. package/dist/api/openai-responses-shared.js +1 -0
  46. package/dist/api/openai-responses-shared.js.map +1 -1
  47. package/dist/api/openai-responses.d.ts.map +1 -1
  48. package/dist/api/openai-responses.js +1 -0
  49. package/dist/api/openai-responses.js.map +1 -1
  50. package/dist/api/openrouter-images.d.ts +2 -1
  51. package/dist/api/openrouter-images.d.ts.map +1 -1
  52. package/dist/api/openrouter-images.js +1 -0
  53. package/dist/api/openrouter-images.js.map +1 -1
  54. package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
  55. package/dist/api/openrouter-images.lazy.js.map +1 -1
  56. package/dist/api/pi-messages.d.ts.map +1 -1
  57. package/dist/api/pi-messages.js +1 -0
  58. package/dist/api/pi-messages.js.map +1 -1
  59. package/dist/api/simple-options.d.ts.map +1 -1
  60. package/dist/api/simple-options.js +1 -0
  61. package/dist/api/simple-options.js.map +1 -1
  62. package/dist/api/system-one-shared.d.ts +23 -0
  63. package/dist/api/system-one-shared.d.ts.map +1 -0
  64. package/dist/api/system-one-shared.js +170 -0
  65. package/dist/api/system-one-shared.js.map +1 -0
  66. package/dist/api/typesafe-system-one.d.ts +4 -0
  67. package/dist/api/typesafe-system-one.d.ts.map +1 -0
  68. package/dist/api/typesafe-system-one.js +19 -0
  69. package/dist/api/typesafe-system-one.js.map +1 -0
  70. package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
  71. package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
  72. package/dist/api/typesafe-system-one.lazy.js +4 -0
  73. package/dist/api/typesafe-system-one.lazy.js.map +1 -0
  74. package/dist/auth/resolve.d.ts +2 -8
  75. package/dist/auth/resolve.d.ts.map +1 -1
  76. package/dist/auth/resolve.js +3 -19
  77. package/dist/auth/resolve.js.map +1 -1
  78. package/dist/env-api-keys.d.ts.map +1 -1
  79. package/dist/env-api-keys.js +1 -0
  80. package/dist/env-api-keys.js.map +1 -1
  81. package/dist/image-models.d.ts +19 -8
  82. package/dist/image-models.d.ts.map +1 -1
  83. package/dist/image-models.js +14 -13
  84. package/dist/image-models.js.map +1 -1
  85. package/dist/images-api-registry.d.ts +7 -7
  86. package/dist/images-api-registry.d.ts.map +1 -1
  87. package/dist/images-api-registry.js.map +1 -1
  88. package/dist/images.d.ts +7 -2
  89. package/dist/images.d.ts.map +1 -1
  90. package/dist/images.js +5 -0
  91. package/dist/images.js.map +1 -1
  92. package/dist/index.d.ts +0 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +0 -1
  95. package/dist/index.js.map +1 -1
  96. package/dist/model-catalog.d.ts +25 -9
  97. package/dist/model-catalog.d.ts.map +1 -1
  98. package/dist/model-catalog.js +14 -2
  99. package/dist/model-catalog.js.map +1 -1
  100. package/dist/models-store.d.ts +3 -2
  101. package/dist/models-store.d.ts.map +1 -1
  102. package/dist/models-store.js.map +1 -1
  103. package/dist/models.d.ts +95 -28
  104. package/dist/models.d.ts.map +1 -1
  105. package/dist/models.generated.d.ts +131 -41
  106. package/dist/models.generated.d.ts.map +1 -1
  107. package/dist/models.generated.js +131 -41
  108. package/dist/models.generated.js.map +1 -1
  109. package/dist/models.js +155 -28
  110. package/dist/models.js.map +1 -1
  111. package/dist/providers/all.d.ts +19 -13
  112. package/dist/providers/all.d.ts.map +1 -1
  113. package/dist/providers/all.js +25 -21
  114. package/dist/providers/all.js.map +1 -1
  115. package/dist/providers/amazon-bedrock.models.d.ts +4 -2
  116. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  117. package/dist/providers/amazon-bedrock.models.js +4 -2
  118. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  119. package/dist/providers/ant-ling.models.d.ts +4 -2
  120. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  121. package/dist/providers/ant-ling.models.js +4 -2
  122. package/dist/providers/ant-ling.models.js.map +1 -1
  123. package/dist/providers/anthropic.models.d.ts +4 -2
  124. package/dist/providers/anthropic.models.d.ts.map +1 -1
  125. package/dist/providers/anthropic.models.js +4 -2
  126. package/dist/providers/anthropic.models.js.map +1 -1
  127. package/dist/providers/azure-openai-responses.models.d.ts +4 -2
  128. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  129. package/dist/providers/azure-openai-responses.models.js +4 -2
  130. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  131. package/dist/providers/baseten.models.d.ts +4 -2
  132. package/dist/providers/baseten.models.d.ts.map +1 -1
  133. package/dist/providers/baseten.models.js +4 -2
  134. package/dist/providers/baseten.models.js.map +1 -1
  135. package/dist/providers/cerebras.models.d.ts +4 -2
  136. package/dist/providers/cerebras.models.d.ts.map +1 -1
  137. package/dist/providers/cerebras.models.js +4 -2
  138. package/dist/providers/cerebras.models.js.map +1 -1
  139. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
  140. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  141. package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
  142. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  143. package/dist/providers/cloudflare-stream.d.ts +6 -2
  144. package/dist/providers/cloudflare-stream.d.ts.map +1 -1
  145. package/dist/providers/cloudflare-stream.js +6 -0
  146. package/dist/providers/cloudflare-stream.js.map +1 -1
  147. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  148. package/dist/providers/cloudflare-workers-ai.js +10 -3
  149. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  150. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
  151. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  152. package/dist/providers/cloudflare-workers-ai.models.js +4 -2
  153. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  154. package/dist/providers/data/.manifest.json +1 -1
  155. package/dist/providers/data/amazon-bedrock.json +1 -1
  156. package/dist/providers/data/ant-ling.json +1 -1
  157. package/dist/providers/data/anthropic.json +1 -1
  158. package/dist/providers/data/azure-openai-responses.json +1 -1
  159. package/dist/providers/data/baseten.json +1 -1
  160. package/dist/providers/data/cerebras.json +1 -1
  161. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  162. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  163. package/dist/providers/data/deepseek.json +1 -1
  164. package/dist/providers/data/fireworks.json +1 -1
  165. package/dist/providers/data/github-copilot.json +1 -1
  166. package/dist/providers/data/google-vertex.json +1 -1
  167. package/dist/providers/data/google.json +1 -1
  168. package/dist/providers/data/groq.json +1 -1
  169. package/dist/providers/data/huggingface.json +1 -1
  170. package/dist/providers/data/kimi-coding.json +1 -1
  171. package/dist/providers/data/meta.json +1 -1
  172. package/dist/providers/data/minimax-cn.json +1 -1
  173. package/dist/providers/data/minimax.json +1 -1
  174. package/dist/providers/data/mistral.json +1 -1
  175. package/dist/providers/data/moonshotai-cn.json +1 -1
  176. package/dist/providers/data/moonshotai.json +1 -1
  177. package/dist/providers/data/nvidia.json +1 -1
  178. package/dist/providers/data/openai-codex.json +1 -1
  179. package/dist/providers/data/openai.json +1 -1
  180. package/dist/providers/data/opencode-go.json +1 -1
  181. package/dist/providers/data/opencode.json +1 -1
  182. package/dist/providers/data/openrouter.json +1 -1
  183. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  184. package/dist/providers/data/qwen-token-plan-individual.json +1 -1
  185. package/dist/providers/data/qwen-token-plan.json +1 -1
  186. package/dist/providers/data/radius.json +1 -1
  187. package/dist/providers/data/together.json +1 -1
  188. package/dist/providers/data/typesafe.json +1 -0
  189. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  190. package/dist/providers/data/xai.json +1 -1
  191. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  192. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  193. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  194. package/dist/providers/data/xiaomi.json +1 -1
  195. package/dist/providers/data/zai-coding-cn.json +1 -1
  196. package/dist/providers/data/zai.json +1 -1
  197. package/dist/providers/deepseek.models.d.ts +4 -2
  198. package/dist/providers/deepseek.models.d.ts.map +1 -1
  199. package/dist/providers/deepseek.models.js +4 -2
  200. package/dist/providers/deepseek.models.js.map +1 -1
  201. package/dist/providers/fireworks.models.d.ts +4 -2
  202. package/dist/providers/fireworks.models.d.ts.map +1 -1
  203. package/dist/providers/fireworks.models.js +4 -2
  204. package/dist/providers/fireworks.models.js.map +1 -1
  205. package/dist/providers/github-copilot.models.d.ts +4 -2
  206. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  207. package/dist/providers/github-copilot.models.js +4 -2
  208. package/dist/providers/github-copilot.models.js.map +1 -1
  209. package/dist/providers/google-vertex.models.d.ts +4 -2
  210. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  211. package/dist/providers/google-vertex.models.js +4 -2
  212. package/dist/providers/google-vertex.models.js.map +1 -1
  213. package/dist/providers/google.models.d.ts +4 -2
  214. package/dist/providers/google.models.d.ts.map +1 -1
  215. package/dist/providers/google.models.js +4 -2
  216. package/dist/providers/google.models.js.map +1 -1
  217. package/dist/providers/groq.models.d.ts +4 -2
  218. package/dist/providers/groq.models.d.ts.map +1 -1
  219. package/dist/providers/groq.models.js +4 -2
  220. package/dist/providers/groq.models.js.map +1 -1
  221. package/dist/providers/huggingface.models.d.ts +4 -2
  222. package/dist/providers/huggingface.models.d.ts.map +1 -1
  223. package/dist/providers/huggingface.models.js +4 -2
  224. package/dist/providers/huggingface.models.js.map +1 -1
  225. package/dist/providers/images/register-builtins.d.ts +1 -1
  226. package/dist/providers/images/register-builtins.d.ts.map +1 -1
  227. package/dist/providers/images/register-builtins.js.map +1 -1
  228. package/dist/providers/kimi-coding.models.d.ts +4 -2
  229. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  230. package/dist/providers/kimi-coding.models.js +4 -2
  231. package/dist/providers/kimi-coding.models.js.map +1 -1
  232. package/dist/providers/meta.models.d.ts +4 -2
  233. package/dist/providers/meta.models.d.ts.map +1 -1
  234. package/dist/providers/meta.models.js +4 -2
  235. package/dist/providers/meta.models.js.map +1 -1
  236. package/dist/providers/minimax-cn.models.d.ts +4 -2
  237. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  238. package/dist/providers/minimax-cn.models.js +4 -2
  239. package/dist/providers/minimax-cn.models.js.map +1 -1
  240. package/dist/providers/minimax.models.d.ts +4 -2
  241. package/dist/providers/minimax.models.d.ts.map +1 -1
  242. package/dist/providers/minimax.models.js +4 -2
  243. package/dist/providers/minimax.models.js.map +1 -1
  244. package/dist/providers/mistral.models.d.ts +4 -2
  245. package/dist/providers/mistral.models.d.ts.map +1 -1
  246. package/dist/providers/mistral.models.js +4 -2
  247. package/dist/providers/mistral.models.js.map +1 -1
  248. package/dist/providers/moonshotai-cn.models.d.ts +4 -2
  249. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  250. package/dist/providers/moonshotai-cn.models.js +4 -2
  251. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  252. package/dist/providers/moonshotai.models.d.ts +4 -2
  253. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  254. package/dist/providers/moonshotai.models.js +4 -2
  255. package/dist/providers/moonshotai.models.js.map +1 -1
  256. package/dist/providers/nvidia.models.d.ts +4 -2
  257. package/dist/providers/nvidia.models.d.ts.map +1 -1
  258. package/dist/providers/nvidia.models.js +4 -2
  259. package/dist/providers/nvidia.models.js.map +1 -1
  260. package/dist/providers/openai-codex.models.d.ts +4 -2
  261. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  262. package/dist/providers/openai-codex.models.js +4 -2
  263. package/dist/providers/openai-codex.models.js.map +1 -1
  264. package/dist/providers/openai.models.d.ts +4 -2
  265. package/dist/providers/openai.models.d.ts.map +1 -1
  266. package/dist/providers/openai.models.js +4 -2
  267. package/dist/providers/openai.models.js.map +1 -1
  268. package/dist/providers/opencode-go.models.d.ts +4 -2
  269. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  270. package/dist/providers/opencode-go.models.js +4 -2
  271. package/dist/providers/opencode-go.models.js.map +1 -1
  272. package/dist/providers/opencode.models.d.ts +4 -2
  273. package/dist/providers/opencode.models.d.ts.map +1 -1
  274. package/dist/providers/opencode.models.js +4 -2
  275. package/dist/providers/opencode.models.js.map +1 -1
  276. package/dist/providers/openrouter.d.ts.map +1 -1
  277. package/dist/providers/openrouter.js +11 -2
  278. package/dist/providers/openrouter.js.map +1 -1
  279. package/dist/providers/openrouter.models.d.ts +4 -2
  280. package/dist/providers/openrouter.models.d.ts.map +1 -1
  281. package/dist/providers/openrouter.models.js +4 -2
  282. package/dist/providers/openrouter.models.js.map +1 -1
  283. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
  284. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
  285. package/dist/providers/qwen-token-plan-cn.models.js +4 -2
  286. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
  287. package/dist/providers/qwen-token-plan-individual.models.d.ts +4 -2
  288. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -1
  289. package/dist/providers/qwen-token-plan-individual.models.js +4 -2
  290. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -1
  291. package/dist/providers/qwen-token-plan.models.d.ts +4 -2
  292. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
  293. package/dist/providers/qwen-token-plan.models.js +4 -2
  294. package/dist/providers/qwen-token-plan.models.js.map +1 -1
  295. package/dist/providers/radius.models.d.ts +4 -2
  296. package/dist/providers/radius.models.d.ts.map +1 -1
  297. package/dist/providers/radius.models.js +4 -2
  298. package/dist/providers/radius.models.js.map +1 -1
  299. package/dist/providers/together.models.d.ts +4 -2
  300. package/dist/providers/together.models.d.ts.map +1 -1
  301. package/dist/providers/together.models.js +4 -2
  302. package/dist/providers/together.models.js.map +1 -1
  303. package/dist/providers/typesafe.d.ts +3 -0
  304. package/dist/providers/typesafe.d.ts.map +1 -0
  305. package/dist/providers/typesafe.js +18 -0
  306. package/dist/providers/typesafe.js.map +1 -0
  307. package/dist/providers/typesafe.models.d.ts +5 -0
  308. package/dist/providers/typesafe.models.d.ts.map +1 -0
  309. package/dist/providers/typesafe.models.js +8 -0
  310. package/dist/providers/typesafe.models.js.map +1 -0
  311. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
  312. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  313. package/dist/providers/vercel-ai-gateway.models.js +4 -2
  314. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  315. package/dist/providers/xai.models.d.ts +4 -2
  316. package/dist/providers/xai.models.d.ts.map +1 -1
  317. package/dist/providers/xai.models.js +4 -2
  318. package/dist/providers/xai.models.js.map +1 -1
  319. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
  320. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  321. package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
  322. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  323. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
  324. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  325. package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
  326. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  327. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
  328. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  329. package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
  330. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  331. package/dist/providers/xiaomi.models.d.ts +4 -2
  332. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  333. package/dist/providers/xiaomi.models.js +4 -2
  334. package/dist/providers/xiaomi.models.js.map +1 -1
  335. package/dist/providers/zai-coding-cn.models.d.ts +4 -2
  336. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  337. package/dist/providers/zai-coding-cn.models.js +4 -2
  338. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  339. package/dist/providers/zai.models.d.ts +4 -2
  340. package/dist/providers/zai.models.d.ts.map +1 -1
  341. package/dist/providers/zai.models.js +4 -2
  342. package/dist/providers/zai.models.js.map +1 -1
  343. package/dist/types.d.ts +109 -26
  344. package/dist/types.d.ts.map +1 -1
  345. package/dist/types.js.map +1 -1
  346. package/dist/utils/headers.d.ts +1 -1
  347. package/dist/utils/headers.d.ts.map +1 -1
  348. package/dist/utils/headers.js +10 -8
  349. package/dist/utils/headers.js.map +1 -1
  350. package/dist/utils/model-operations.d.ts +11 -0
  351. package/dist/utils/model-operations.d.ts.map +1 -0
  352. package/dist/utils/model-operations.js +47 -0
  353. package/dist/utils/model-operations.js.map +1 -0
  354. package/dist/utils/models-error.d.ts +8 -0
  355. package/dist/utils/models-error.d.ts.map +1 -0
  356. package/dist/utils/models-error.js +19 -0
  357. package/dist/utils/models-error.js.map +1 -0
  358. package/package.json +1 -2
  359. package/dist/image-models.generated.d.ts +0 -830
  360. package/dist/image-models.generated.d.ts.map +0 -1
  361. package/dist/image-models.generated.js +0 -832
  362. package/dist/image-models.generated.js.map +0 -1
  363. package/dist/images-models.d.ts +0 -95
  364. package/dist/images-models.d.ts.map +0 -1
  365. package/dist/images-models.js +0 -143
  366. package/dist/images-models.js.map +0 -1
  367. package/dist/providers/openrouter-images.d.ts +0 -3
  368. package/dist/providers/openrouter-images.d.ts.map +0 -1
  369. package/dist/providers/openrouter-images.js +0 -22
  370. package/dist/providers/openrouter-images.js.map +0 -1
package/dist/models.js CHANGED
@@ -4,8 +4,19 @@ import { InMemoryCredentialStore } from "./auth/credential-store.js";
4
4
  import { ModelsError, resolveProviderAuth } from "./auth/resolve.js";
5
5
  import { InMemoryModelsStore } from "./models-store.js";
6
6
  import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
7
+ import { assertChatModel, assertClassifierModel, assertImageModel, classifierErrorResult, getModelType, imageErrorResult, isModelType, } from "./utils/model-operations.js";
7
8
  import { normalizeContext } from "./utils/transcript.js";
8
9
  export { ModelsError, REQUEST_AUTH_PREPARATION_TIMEOUT_MS, requestAuthTimeoutMessage, } from "./auth/resolve.js";
10
+ export { assertChatModel, classifierErrorResult, getModelType, imageErrorResult, 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
+ }
9
20
  function mergeHeaders(base, override) {
10
21
  if (!base && !override)
11
22
  return undefined;
@@ -76,9 +87,38 @@ class ModelsImpl {
76
87
  }
77
88
  return models;
78
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
+ }
79
116
  getModel(provider, id) {
80
117
  return this.getModels(provider).find((model) => model.id === id);
81
118
  }
119
+ getModelOfType(type, provider, id) {
120
+ return this.getModelsOfType(type, provider).find((model) => model.id === id);
121
+ }
82
122
  supersedeProviderRefresh(providerId) {
83
123
  const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
84
124
  this.refreshGenerations.set(providerId, generation);
@@ -124,7 +164,7 @@ class ModelsImpl {
124
164
  const stored = await this.modelsStore.read(provider.id, { signal });
125
165
  await provider.refreshModels({
126
166
  credential,
127
- stored: stored ? structuredClone(stored) : undefined,
167
+ stored: stored ? withKnownModelTypes(structuredClone(stored)) : undefined,
128
168
  publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
129
169
  allowNetwork,
130
170
  force: allowNetwork ? force : undefined,
@@ -253,26 +293,47 @@ class ModelsImpl {
253
293
  })();
254
294
  return raceWithAbortSignal(check, signal);
255
295
  }
296
+ async getAuthenticatedProviders(providerId, signal) {
297
+ signal.throwIfAborted();
298
+ const providers = providerId
299
+ ? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
300
+ : this.getProviders();
301
+ const checks = await Promise.all(providers.map(async (provider) => {
302
+ const credential = await this.readCredential(provider.id, signal);
303
+ return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
304
+ }));
305
+ return checks.filter((entry) => entry.auth !== undefined);
306
+ }
256
307
  getAvailable(providerId, options) {
257
308
  const signal = operationSignal(options?.signal);
258
309
  const available = (async () => {
259
- signal.throwIfAborted();
260
- const providers = providerId
261
- ? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
262
- : this.getProviders();
263
- const checks = await Promise.all(providers.map(async (provider) => {
264
- const credential = await this.readCredential(provider.id, signal);
265
- return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
266
- }));
267
- return checks.flatMap(({ provider, credential, auth }) => {
268
- if (!auth)
269
- return [];
310
+ const providers = await this.getAuthenticatedProviders(providerId, signal);
311
+ return providers.flatMap(({ provider, credential }) => {
270
312
  const models = provider.getModels();
271
313
  return provider.filterModels?.(models, credential) ?? models;
272
314
  });
273
315
  })();
274
316
  return raceWithAbortSignal(available, signal);
275
317
  }
318
+ async getAvailableOfType(type, providerId, options) {
319
+ return (await this.getAllAvailable(providerId, options)).filter((model) => isModelType(model, type));
320
+ }
321
+ getAllAvailable(providerId, options) {
322
+ const signal = operationSignal(options?.signal);
323
+ const available = (async () => {
324
+ const providers = await this.getAuthenticatedProviders(providerId, signal);
325
+ return providers.flatMap(({ provider, credential }) => {
326
+ const models = provider.getAllModels?.() ?? provider.getModels();
327
+ if (provider.filterAllModels)
328
+ return provider.filterAllModels(models, credential);
329
+ if (!provider.filterModels)
330
+ return models;
331
+ const availableChatIds = new Set(provider.filterModels(provider.getModels(), credential).map((model) => model.id));
332
+ return models.filter((model) => !isModelType(model, "chat") || availableChatIds.has(model.id));
333
+ });
334
+ })();
335
+ return raceWithAbortSignal(available, signal);
336
+ }
276
337
  async getAuth(providerOrModel, overrides) {
277
338
  const signal = operationSignal(overrides?.signal);
278
339
  const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
@@ -356,6 +417,10 @@ class ModelsImpl {
356
417
  }
357
418
  return provider;
358
419
  }
420
+ requireChatProvider(model) {
421
+ assertChatModel(model);
422
+ return this.requireProvider(model);
423
+ }
359
424
  async applyAuth(model, options) {
360
425
  this.requireProvider(model);
361
426
  const resolution = await this.getAuth(model, {
@@ -381,7 +446,7 @@ class ModelsImpl {
381
446
  stream(model, context, options) {
382
447
  const transcript = normalizeContext(context);
383
448
  return lazyStream(model, async () => {
384
- const provider = this.requireProvider(model);
449
+ const provider = this.requireChatProvider(model);
385
450
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
386
451
  return provider.stream(requestModel, transcript, requestOptions);
387
452
  });
@@ -392,7 +457,7 @@ class ModelsImpl {
392
457
  streamSimple(model, context, options) {
393
458
  const transcript = normalizeContext(context);
394
459
  return lazyStream(model, async () => {
395
- const provider = this.requireProvider(model);
460
+ const provider = this.requireChatProvider(model);
396
461
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
397
462
  return provider.streamSimple(requestModel, transcript, requestOptions);
398
463
  });
@@ -402,7 +467,7 @@ class ModelsImpl {
402
467
  }
403
468
  async fetchDeferred(model, handle, options) {
404
469
  return lazyStream(model, async () => {
405
- const provider = this.requireProvider(model);
470
+ const provider = this.requireChatProvider(model);
406
471
  if (!provider.fetchDeferred) {
407
472
  throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
408
473
  }
@@ -411,31 +476,73 @@ class ModelsImpl {
411
476
  }).result();
412
477
  }
413
478
  async cancelDeferred(model, handle, options) {
414
- const provider = this.requireProvider(model);
479
+ const provider = this.requireChatProvider(model);
415
480
  if (!provider.cancelDeferred) {
416
481
  throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
417
482
  }
418
483
  const { requestModel, requestOptions } = await this.applyAuth(model, options);
419
484
  await provider.cancelDeferred(requestModel, handle, requestOptions);
420
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
+ }
421
514
  }
422
515
  export function createModels(options) {
423
516
  return new ModelsImpl(options);
424
517
  }
425
518
  /**
426
519
  * Builds a provider from parts. Built-in provider factories and models.json
427
- * custom providers both go through this. A single `api` streams all models;
428
- * an `api` map dispatches on `model.api`, and a model whose api has no entry
429
- * 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.
430
525
  */
431
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
+ }
432
539
  const baselineModels = input.models;
433
540
  let dynamicModels = [];
434
541
  const fetchModels = input.fetchModels;
435
542
  const currentModels = () => {
436
543
  const merged = [...baselineModels];
437
544
  for (const model of dynamicModels) {
438
- const index = merged.findIndex((entry) => entry.id === model.id);
545
+ const index = merged.findIndex((entry) => getModelType(entry) === getModelType(model) && entry.id === model.id);
439
546
  if (index >= 0)
440
547
  merged[index] = model;
441
548
  else
@@ -443,8 +550,6 @@ export function createProvider(input) {
443
550
  }
444
551
  return merged;
445
552
  };
446
- const single = typeof input.api.stream === "function" ? input.api : undefined;
447
- const byApi = single ? undefined : input.api;
448
553
  const apiFor = (model) => single ?? byApi?.[model.api];
449
554
  const dispatch = (model, run) => {
450
555
  const streams = apiFor(model);
@@ -461,7 +566,8 @@ export function createProvider(input) {
461
566
  baseUrl: input.baseUrl,
462
567
  headers: input.headers,
463
568
  auth: input.auth,
464
- getModels: currentModels,
569
+ getModels: () => currentModels().filter((model) => isModelType(model, "chat")),
570
+ getAllModels: currentModels,
465
571
  refreshModels: fetchModels
466
572
  ? async (context) => {
467
573
  if (context.stored) {
@@ -478,9 +584,10 @@ export function createProvider(input) {
478
584
  }
479
585
  if (!context.allowNetwork || context.signal.aborted)
480
586
  return;
481
- const refreshed = await fetchModels(context);
587
+ const fetched = await fetchModels(context);
482
588
  if (context.signal.aborted)
483
589
  return;
590
+ const refreshed = fetched.filter(hasKnownModelType);
484
591
  await context.publish({
485
592
  persist: { models: refreshed, checkedAt: Date.now() },
486
593
  update: () => {
@@ -490,10 +597,10 @@ export function createProvider(input) {
490
597
  }
491
598
  : undefined,
492
599
  filterModels: input.filterModels,
600
+ filterAllModels: input.filterAllModels,
493
601
  stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
494
602
  streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
495
603
  };
496
- const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
497
604
  if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
498
605
  provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
499
606
  const implementation = apiFor(model);
@@ -512,6 +619,24 @@ export function createProvider(input) {
512
619
  await implementation.cancelDeferred(model, handle, options);
513
620
  };
514
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
+ }
515
640
  return provider;
516
641
  }
517
642
  /**
@@ -523,9 +648,11 @@ export function createProvider(input) {
523
648
  * // model: Model<"anthropic-messages">, stream options fully typed
524
649
  * }
525
650
  * ```
651
+ *
652
+ * Non-chat models never match, even when their api id equals `api`.
526
653
  */
527
654
  export function hasApi(model, api) {
528
- return model.api === api;
655
+ return isModelType(model, "chat") && model.api === api;
529
656
  }
530
657
  export function calculateCost(model, usage) {
531
658
  const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
@@ -580,12 +707,12 @@ export function clampThinkingLevel(model, level) {
580
707
  return availableLevels[0] ?? "off";
581
708
  }
582
709
  /**
583
- * 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.
584
711
  * Returns false if either model is null or undefined.
585
712
  */
586
713
  export function modelsAreEqual(a, b) {
587
714
  if (!a || !b)
588
715
  return false;
589
- return a.id === b.id && a.provider === b.provider;
716
+ return getModelType(a) === getModelType(b) && a.id === b.id && a.provider === b.provider;
590
717
  }
591
718
  //# sourceMappingURL=models.js.map