@earendil-works/pi-ai 0.82.1 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +18 -8
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +14 -7
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +10 -2
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +64 -4
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/google-generative-ai.d.ts.map +1 -1
  12. package/dist/api/google-generative-ai.js +14 -4
  13. package/dist/api/google-generative-ai.js.map +1 -1
  14. package/dist/api/google-shared.d.ts +11 -1
  15. package/dist/api/google-shared.d.ts.map +1 -1
  16. package/dist/api/google-shared.js +44 -7
  17. package/dist/api/google-shared.js.map +1 -1
  18. package/dist/api/google-vertex.d.ts.map +1 -1
  19. package/dist/api/google-vertex.js +14 -4
  20. package/dist/api/google-vertex.js.map +1 -1
  21. package/dist/api/lazy.d.ts +5 -1
  22. package/dist/api/lazy.d.ts.map +1 -1
  23. package/dist/api/lazy.js +19 -7
  24. package/dist/api/lazy.js.map +1 -1
  25. package/dist/api/mistral-conversations.d.ts.map +1 -1
  26. package/dist/api/mistral-conversations.js +19 -10
  27. package/dist/api/mistral-conversations.js.map +1 -1
  28. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  29. package/dist/api/openai-codex-responses.js +51 -21
  30. package/dist/api/openai-codex-responses.js.map +1 -1
  31. package/dist/api/openai-completions.d.ts +5 -2
  32. package/dist/api/openai-completions.d.ts.map +1 -1
  33. package/dist/api/openai-completions.js +77 -16
  34. package/dist/api/openai-completions.js.map +1 -1
  35. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  36. package/dist/api/openai-responses-shared.js +31 -8
  37. package/dist/api/openai-responses-shared.js.map +1 -1
  38. package/dist/api/openai-responses.d.ts.map +1 -1
  39. package/dist/api/openai-responses.js +12 -4
  40. package/dist/api/openai-responses.js.map +1 -1
  41. package/dist/api/openrouter-images.d.ts.map +1 -1
  42. package/dist/api/openrouter-images.js +3 -2
  43. package/dist/api/openrouter-images.js.map +1 -1
  44. package/dist/api/pi-messages.d.ts.map +1 -1
  45. package/dist/api/pi-messages.js +2 -2
  46. package/dist/api/pi-messages.js.map +1 -1
  47. package/dist/api/simple-options.d.ts +2 -0
  48. package/dist/api/simple-options.d.ts.map +1 -1
  49. package/dist/api/simple-options.js +9 -2
  50. package/dist/api/simple-options.js.map +1 -1
  51. package/dist/auth/credential-store.d.ts +6 -6
  52. package/dist/auth/credential-store.d.ts.map +1 -1
  53. package/dist/auth/credential-store.js +22 -11
  54. package/dist/auth/credential-store.js.map +1 -1
  55. package/dist/auth/helpers.d.ts +1 -0
  56. package/dist/auth/helpers.d.ts.map +1 -1
  57. package/dist/auth/helpers.js +7 -2
  58. package/dist/auth/helpers.js.map +1 -1
  59. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  60. package/dist/auth/oauth/anthropic.js +14 -8
  61. package/dist/auth/oauth/anthropic.js.map +1 -1
  62. package/dist/auth/oauth/device-code.d.ts +1 -1
  63. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  64. package/dist/auth/oauth/device-code.js +4 -4
  65. package/dist/auth/oauth/device-code.js.map +1 -1
  66. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  67. package/dist/auth/oauth/github-copilot.js +43 -30
  68. package/dist/auth/oauth/github-copilot.js.map +1 -1
  69. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  70. package/dist/auth/oauth/kimi-coding.js +17 -5
  71. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  72. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  73. package/dist/auth/oauth/openai-codex.js +12 -5
  74. package/dist/auth/oauth/openai-codex.js.map +1 -1
  75. package/dist/auth/oauth/openrouter.d.ts +3 -1
  76. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  77. package/dist/auth/oauth/openrouter.js +91 -36
  78. package/dist/auth/oauth/openrouter.js.map +1 -1
  79. package/dist/auth/oauth/radius.d.ts.map +1 -1
  80. package/dist/auth/oauth/radius.js +8 -7
  81. package/dist/auth/oauth/radius.js.map +1 -1
  82. package/dist/auth/oauth/xai.d.ts.map +1 -1
  83. package/dist/auth/oauth/xai.js +3 -2
  84. package/dist/auth/oauth/xai.js.map +1 -1
  85. package/dist/auth/resolve.d.ts +3 -0
  86. package/dist/auth/resolve.d.ts.map +1 -1
  87. package/dist/auth/resolve.js +38 -19
  88. package/dist/auth/resolve.js.map +1 -1
  89. package/dist/auth/types.d.ts +20 -8
  90. package/dist/auth/types.d.ts.map +1 -1
  91. package/dist/auth/types.js.map +1 -1
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +1 -0
  94. package/dist/cli.js.map +1 -1
  95. package/dist/env-api-keys.d.ts.map +1 -1
  96. package/dist/env-api-keys.js +1 -0
  97. package/dist/env-api-keys.js.map +1 -1
  98. package/dist/image-models.generated.d.ts +30 -0
  99. package/dist/image-models.generated.d.ts.map +1 -1
  100. package/dist/image-models.generated.js +32 -2
  101. package/dist/image-models.generated.js.map +1 -1
  102. package/dist/images-models.d.ts.map +1 -1
  103. package/dist/images-models.js +1 -0
  104. package/dist/images-models.js.map +1 -1
  105. package/dist/models-store.d.ts +9 -12
  106. package/dist/models-store.d.ts.map +1 -1
  107. package/dist/models-store.js +6 -3
  108. package/dist/models-store.js.map +1 -1
  109. package/dist/models.d.ts +40 -18
  110. package/dist/models.d.ts.map +1 -1
  111. package/dist/models.generated.d.ts +2 -0
  112. package/dist/models.generated.d.ts.map +1 -1
  113. package/dist/models.generated.js +2 -0
  114. package/dist/models.generated.js.map +1 -1
  115. package/dist/models.js +245 -89
  116. package/dist/models.js.map +1 -1
  117. package/dist/providers/all.d.ts.map +1 -1
  118. package/dist/providers/all.js +2 -0
  119. package/dist/providers/all.js.map +1 -1
  120. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  121. package/dist/providers/amazon-bedrock.js +15 -7
  122. package/dist/providers/amazon-bedrock.js.map +1 -1
  123. package/dist/providers/anthropic.d.ts.map +1 -1
  124. package/dist/providers/anthropic.js +15 -6
  125. package/dist/providers/anthropic.js.map +1 -1
  126. package/dist/providers/baseten.d.ts +3 -0
  127. package/dist/providers/baseten.d.ts.map +1 -0
  128. package/dist/providers/baseten.js +15 -0
  129. package/dist/providers/baseten.js.map +1 -0
  130. package/dist/providers/baseten.models.d.ts +4 -0
  131. package/dist/providers/baseten.models.d.ts.map +1 -0
  132. package/dist/providers/baseten.models.js +6 -0
  133. package/dist/providers/baseten.models.js.map +1 -0
  134. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  135. package/dist/providers/cloudflare-auth.js +15 -10
  136. package/dist/providers/cloudflare-auth.js.map +1 -1
  137. package/dist/providers/data/.manifest.json +1 -1
  138. package/dist/providers/data/amazon-bedrock.json +1 -1
  139. package/dist/providers/data/anthropic.json +1 -1
  140. package/dist/providers/data/azure-openai-responses.json +1 -1
  141. package/dist/providers/data/baseten.json +1 -0
  142. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  143. package/dist/providers/data/fireworks.json +1 -1
  144. package/dist/providers/data/github-copilot.json +1 -1
  145. package/dist/providers/data/groq.json +1 -1
  146. package/dist/providers/data/huggingface.json +1 -1
  147. package/dist/providers/data/mistral.json +1 -1
  148. package/dist/providers/data/nvidia.json +1 -1
  149. package/dist/providers/data/openai-codex.json +1 -1
  150. package/dist/providers/data/openai.json +1 -1
  151. package/dist/providers/data/opencode-go.json +1 -1
  152. package/dist/providers/data/opencode.json +1 -1
  153. package/dist/providers/data/openrouter.json +1 -1
  154. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  155. package/dist/providers/data/qwen-token-plan.json +1 -1
  156. package/dist/providers/data/together.json +1 -1
  157. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  158. package/dist/providers/data/zai-coding-cn.json +1 -1
  159. package/dist/providers/data/zai.json +1 -1
  160. package/dist/providers/faux.d.ts +18 -13
  161. package/dist/providers/faux.d.ts.map +1 -1
  162. package/dist/providers/faux.js +99 -6
  163. package/dist/providers/faux.js.map +1 -1
  164. package/dist/providers/github-copilot.d.ts.map +1 -1
  165. package/dist/providers/github-copilot.js +1 -1
  166. package/dist/providers/github-copilot.js.map +1 -1
  167. package/dist/providers/google-vertex.d.ts.map +1 -1
  168. package/dist/providers/google-vertex.js +15 -7
  169. package/dist/providers/google-vertex.js.map +1 -1
  170. package/dist/providers/kimi-coding.d.ts.map +1 -1
  171. package/dist/providers/kimi-coding.js +1 -0
  172. package/dist/providers/kimi-coding.js.map +1 -1
  173. package/dist/providers/openai-codex.d.ts.map +1 -1
  174. package/dist/providers/openai-codex.js +5 -1
  175. package/dist/providers/openai-codex.js.map +1 -1
  176. package/dist/providers/opencode-go.d.ts.map +1 -1
  177. package/dist/providers/opencode-go.js +1 -1
  178. package/dist/providers/opencode-go.js.map +1 -1
  179. package/dist/providers/radius.d.ts.map +1 -1
  180. package/dist/providers/radius.js +36 -26
  181. package/dist/providers/radius.js.map +1 -1
  182. package/dist/providers/xai.d.ts.map +1 -1
  183. package/dist/providers/xai.js +1 -0
  184. package/dist/providers/xai.js.map +1 -1
  185. package/dist/types.d.ts +102 -76
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/abort.d.ts +8 -0
  189. package/dist/utils/abort.d.ts.map +1 -0
  190. package/dist/utils/abort.js +49 -0
  191. package/dist/utils/abort.js.map +1 -0
  192. package/dist/utils/error-body.d.ts.map +1 -1
  193. package/dist/utils/error-body.js +23 -4
  194. package/dist/utils/error-body.js.map +1 -1
  195. package/dist/utils/overflow.d.ts +10 -1
  196. package/dist/utils/overflow.d.ts.map +1 -1
  197. package/dist/utils/overflow.js +12 -1
  198. package/dist/utils/overflow.js.map +1 -1
  199. package/dist/utils/validation.d.ts.map +1 -1
  200. package/dist/utils/validation.js +6 -0
  201. package/dist/utils/validation.js.map +1 -1
  202. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"models.generated.js","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"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","sourcesContent":["// This file is auto-generated by scripts/generate-models.ts\n// Do not edit manually - run 'npm run generate-models' to update\n\nimport { AMAZON_BEDROCK_MODELS } from \"./providers/amazon-bedrock.models.ts\";\nimport { ANT_LING_MODELS } from \"./providers/ant-ling.models.ts\";\nimport { ANTHROPIC_MODELS } from \"./providers/anthropic.models.ts\";\nimport { AZURE_OPENAI_RESPONSES_MODELS } from \"./providers/azure-openai-responses.models.ts\";\nimport { CEREBRAS_MODELS } from \"./providers/cerebras.models.ts\";\nimport { CLOUDFLARE_AI_GATEWAY_MODELS } from \"./providers/cloudflare-ai-gateway.models.ts\";\nimport { CLOUDFLARE_WORKERS_AI_MODELS } from \"./providers/cloudflare-workers-ai.models.ts\";\nimport { DEEPSEEK_MODELS } from \"./providers/deepseek.models.ts\";\nimport { FIREWORKS_MODELS } from \"./providers/fireworks.models.ts\";\nimport { GITHUB_COPILOT_MODELS } from \"./providers/github-copilot.models.ts\";\nimport { GOOGLE_MODELS } from \"./providers/google.models.ts\";\nimport { GOOGLE_VERTEX_MODELS } from \"./providers/google-vertex.models.ts\";\nimport { GROQ_MODELS } from \"./providers/groq.models.ts\";\nimport { HUGGINGFACE_MODELS } from \"./providers/huggingface.models.ts\";\nimport { KIMI_CODING_MODELS } from \"./providers/kimi-coding.models.ts\";\nimport { MINIMAX_MODELS } from \"./providers/minimax.models.ts\";\nimport { MINIMAX_CN_MODELS } from \"./providers/minimax-cn.models.ts\";\nimport { MISTRAL_MODELS } from \"./providers/mistral.models.ts\";\nimport { MOONSHOTAI_MODELS } from \"./providers/moonshotai.models.ts\";\nimport { MOONSHOTAI_CN_MODELS } from \"./providers/moonshotai-cn.models.ts\";\nimport { NVIDIA_MODELS } from \"./providers/nvidia.models.ts\";\nimport { OPENAI_MODELS } from \"./providers/openai.models.ts\";\nimport { OPENAI_CODEX_MODELS } from \"./providers/openai-codex.models.ts\";\nimport { OPENCODE_MODELS } from \"./providers/opencode.models.ts\";\nimport { OPENCODE_GO_MODELS } from \"./providers/opencode-go.models.ts\";\nimport { OPENROUTER_MODELS } from \"./providers/openrouter.models.ts\";\nimport { QWEN_TOKEN_PLAN_MODELS } from \"./providers/qwen-token-plan.models.ts\";\nimport { QWEN_TOKEN_PLAN_CN_MODELS } from \"./providers/qwen-token-plan-cn.models.ts\";\nimport { TOGETHER_MODELS } from \"./providers/together.models.ts\";\nimport { VERCEL_AI_GATEWAY_MODELS } from \"./providers/vercel-ai-gateway.models.ts\";\nimport { XAI_MODELS } from \"./providers/xai.models.ts\";\nimport { XIAOMI_MODELS } from \"./providers/xiaomi.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_AMS_MODELS } from \"./providers/xiaomi-token-plan-ams.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_CN_MODELS } from \"./providers/xiaomi-token-plan-cn.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_SGP_MODELS } from \"./providers/xiaomi-token-plan-sgp.models.ts\";\nimport { ZAI_MODELS } from \"./providers/zai.models.ts\";\nimport { ZAI_CODING_CN_MODELS } from \"./providers/zai-coding-cn.models.ts\";\n\nexport const MODELS: {\n\treadonly \"amazon-bedrock\": typeof AMAZON_BEDROCK_MODELS;\n\treadonly \"ant-ling\": typeof ANT_LING_MODELS;\n\treadonly \"anthropic\": typeof ANTHROPIC_MODELS;\n\treadonly \"azure-openai-responses\": typeof AZURE_OPENAI_RESPONSES_MODELS;\n\treadonly \"cerebras\": typeof CEREBRAS_MODELS;\n\treadonly \"cloudflare-ai-gateway\": typeof CLOUDFLARE_AI_GATEWAY_MODELS;\n\treadonly \"cloudflare-workers-ai\": typeof CLOUDFLARE_WORKERS_AI_MODELS;\n\treadonly \"deepseek\": typeof DEEPSEEK_MODELS;\n\treadonly \"fireworks\": typeof FIREWORKS_MODELS;\n\treadonly \"github-copilot\": typeof GITHUB_COPILOT_MODELS;\n\treadonly \"google\": typeof GOOGLE_MODELS;\n\treadonly \"google-vertex\": typeof GOOGLE_VERTEX_MODELS;\n\treadonly \"groq\": typeof GROQ_MODELS;\n\treadonly \"huggingface\": typeof HUGGINGFACE_MODELS;\n\treadonly \"kimi-coding\": typeof KIMI_CODING_MODELS;\n\treadonly \"minimax\": typeof MINIMAX_MODELS;\n\treadonly \"minimax-cn\": typeof MINIMAX_CN_MODELS;\n\treadonly \"mistral\": typeof MISTRAL_MODELS;\n\treadonly \"moonshotai\": typeof MOONSHOTAI_MODELS;\n\treadonly \"moonshotai-cn\": typeof MOONSHOTAI_CN_MODELS;\n\treadonly \"nvidia\": typeof NVIDIA_MODELS;\n\treadonly \"openai\": typeof OPENAI_MODELS;\n\treadonly \"openai-codex\": typeof OPENAI_CODEX_MODELS;\n\treadonly \"opencode\": typeof OPENCODE_MODELS;\n\treadonly \"opencode-go\": typeof OPENCODE_GO_MODELS;\n\treadonly \"openrouter\": typeof OPENROUTER_MODELS;\n\treadonly \"qwen-token-plan\": typeof QWEN_TOKEN_PLAN_MODELS;\n\treadonly \"qwen-token-plan-cn\": typeof QWEN_TOKEN_PLAN_CN_MODELS;\n\treadonly \"together\": typeof TOGETHER_MODELS;\n\treadonly \"vercel-ai-gateway\": typeof VERCEL_AI_GATEWAY_MODELS;\n\treadonly \"xai\": typeof XAI_MODELS;\n\treadonly \"xiaomi\": typeof XIAOMI_MODELS;\n\treadonly \"xiaomi-token-plan-ams\": typeof XIAOMI_TOKEN_PLAN_AMS_MODELS;\n\treadonly \"xiaomi-token-plan-cn\": typeof XIAOMI_TOKEN_PLAN_CN_MODELS;\n\treadonly \"xiaomi-token-plan-sgp\": typeof XIAOMI_TOKEN_PLAN_SGP_MODELS;\n\treadonly \"zai\": typeof ZAI_MODELS;\n\treadonly \"zai-coding-cn\": typeof ZAI_CODING_CN_MODELS;\n} = {\n\t\"amazon-bedrock\": AMAZON_BEDROCK_MODELS,\n\t\"ant-ling\": ANT_LING_MODELS,\n\t\"anthropic\": ANTHROPIC_MODELS,\n\t\"azure-openai-responses\": AZURE_OPENAI_RESPONSES_MODELS,\n\t\"cerebras\": CEREBRAS_MODELS,\n\t\"cloudflare-ai-gateway\": CLOUDFLARE_AI_GATEWAY_MODELS,\n\t\"cloudflare-workers-ai\": CLOUDFLARE_WORKERS_AI_MODELS,\n\t\"deepseek\": DEEPSEEK_MODELS,\n\t\"fireworks\": FIREWORKS_MODELS,\n\t\"github-copilot\": GITHUB_COPILOT_MODELS,\n\t\"google\": GOOGLE_MODELS,\n\t\"google-vertex\": GOOGLE_VERTEX_MODELS,\n\t\"groq\": GROQ_MODELS,\n\t\"huggingface\": HUGGINGFACE_MODELS,\n\t\"kimi-coding\": KIMI_CODING_MODELS,\n\t\"minimax\": MINIMAX_MODELS,\n\t\"minimax-cn\": MINIMAX_CN_MODELS,\n\t\"mistral\": MISTRAL_MODELS,\n\t\"moonshotai\": MOONSHOTAI_MODELS,\n\t\"moonshotai-cn\": MOONSHOTAI_CN_MODELS,\n\t\"nvidia\": NVIDIA_MODELS,\n\t\"openai\": OPENAI_MODELS,\n\t\"openai-codex\": OPENAI_CODEX_MODELS,\n\t\"opencode\": OPENCODE_MODELS,\n\t\"opencode-go\": OPENCODE_GO_MODELS,\n\t\"openrouter\": OPENROUTER_MODELS,\n\t\"qwen-token-plan\": QWEN_TOKEN_PLAN_MODELS,\n\t\"qwen-token-plan-cn\": QWEN_TOKEN_PLAN_CN_MODELS,\n\t\"together\": TOGETHER_MODELS,\n\t\"vercel-ai-gateway\": VERCEL_AI_GATEWAY_MODELS,\n\t\"xai\": XAI_MODELS,\n\t\"xiaomi\": XIAOMI_MODELS,\n\t\"xiaomi-token-plan-ams\": XIAOMI_TOKEN_PLAN_AMS_MODELS,\n\t\"xiaomi-token-plan-cn\": XIAOMI_TOKEN_PLAN_CN_MODELS,\n\t\"xiaomi-token-plan-sgp\": XIAOMI_TOKEN_PLAN_SGP_MODELS,\n\t\"zai\": ZAI_MODELS,\n\t\"zai-coding-cn\": ZAI_CODING_CN_MODELS,\n};\n"]}
1
+ {"version":3,"file":"models.generated.js","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"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","sourcesContent":["// This file is auto-generated by scripts/generate-models.ts\n// Do not edit manually - run 'npm run generate-models' to update\n\nimport { AMAZON_BEDROCK_MODELS } from \"./providers/amazon-bedrock.models.ts\";\nimport { ANT_LING_MODELS } from \"./providers/ant-ling.models.ts\";\nimport { ANTHROPIC_MODELS } from \"./providers/anthropic.models.ts\";\nimport { AZURE_OPENAI_RESPONSES_MODELS } from \"./providers/azure-openai-responses.models.ts\";\nimport { BASETEN_MODELS } from \"./providers/baseten.models.ts\";\nimport { CEREBRAS_MODELS } from \"./providers/cerebras.models.ts\";\nimport { CLOUDFLARE_AI_GATEWAY_MODELS } from \"./providers/cloudflare-ai-gateway.models.ts\";\nimport { CLOUDFLARE_WORKERS_AI_MODELS } from \"./providers/cloudflare-workers-ai.models.ts\";\nimport { DEEPSEEK_MODELS } from \"./providers/deepseek.models.ts\";\nimport { FIREWORKS_MODELS } from \"./providers/fireworks.models.ts\";\nimport { GITHUB_COPILOT_MODELS } from \"./providers/github-copilot.models.ts\";\nimport { GOOGLE_MODELS } from \"./providers/google.models.ts\";\nimport { GOOGLE_VERTEX_MODELS } from \"./providers/google-vertex.models.ts\";\nimport { GROQ_MODELS } from \"./providers/groq.models.ts\";\nimport { HUGGINGFACE_MODELS } from \"./providers/huggingface.models.ts\";\nimport { KIMI_CODING_MODELS } from \"./providers/kimi-coding.models.ts\";\nimport { MINIMAX_MODELS } from \"./providers/minimax.models.ts\";\nimport { MINIMAX_CN_MODELS } from \"./providers/minimax-cn.models.ts\";\nimport { MISTRAL_MODELS } from \"./providers/mistral.models.ts\";\nimport { MOONSHOTAI_MODELS } from \"./providers/moonshotai.models.ts\";\nimport { MOONSHOTAI_CN_MODELS } from \"./providers/moonshotai-cn.models.ts\";\nimport { NVIDIA_MODELS } from \"./providers/nvidia.models.ts\";\nimport { OPENAI_MODELS } from \"./providers/openai.models.ts\";\nimport { OPENAI_CODEX_MODELS } from \"./providers/openai-codex.models.ts\";\nimport { OPENCODE_MODELS } from \"./providers/opencode.models.ts\";\nimport { OPENCODE_GO_MODELS } from \"./providers/opencode-go.models.ts\";\nimport { OPENROUTER_MODELS } from \"./providers/openrouter.models.ts\";\nimport { QWEN_TOKEN_PLAN_MODELS } from \"./providers/qwen-token-plan.models.ts\";\nimport { QWEN_TOKEN_PLAN_CN_MODELS } from \"./providers/qwen-token-plan-cn.models.ts\";\nimport { TOGETHER_MODELS } from \"./providers/together.models.ts\";\nimport { VERCEL_AI_GATEWAY_MODELS } from \"./providers/vercel-ai-gateway.models.ts\";\nimport { XAI_MODELS } from \"./providers/xai.models.ts\";\nimport { XIAOMI_MODELS } from \"./providers/xiaomi.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_AMS_MODELS } from \"./providers/xiaomi-token-plan-ams.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_CN_MODELS } from \"./providers/xiaomi-token-plan-cn.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_SGP_MODELS } from \"./providers/xiaomi-token-plan-sgp.models.ts\";\nimport { ZAI_MODELS } from \"./providers/zai.models.ts\";\nimport { ZAI_CODING_CN_MODELS } from \"./providers/zai-coding-cn.models.ts\";\n\nexport const MODELS: {\n\treadonly \"amazon-bedrock\": typeof AMAZON_BEDROCK_MODELS;\n\treadonly \"ant-ling\": typeof ANT_LING_MODELS;\n\treadonly \"anthropic\": typeof ANTHROPIC_MODELS;\n\treadonly \"azure-openai-responses\": typeof AZURE_OPENAI_RESPONSES_MODELS;\n\treadonly \"baseten\": typeof BASETEN_MODELS;\n\treadonly \"cerebras\": typeof CEREBRAS_MODELS;\n\treadonly \"cloudflare-ai-gateway\": typeof CLOUDFLARE_AI_GATEWAY_MODELS;\n\treadonly \"cloudflare-workers-ai\": typeof CLOUDFLARE_WORKERS_AI_MODELS;\n\treadonly \"deepseek\": typeof DEEPSEEK_MODELS;\n\treadonly \"fireworks\": typeof FIREWORKS_MODELS;\n\treadonly \"github-copilot\": typeof GITHUB_COPILOT_MODELS;\n\treadonly \"google\": typeof GOOGLE_MODELS;\n\treadonly \"google-vertex\": typeof GOOGLE_VERTEX_MODELS;\n\treadonly \"groq\": typeof GROQ_MODELS;\n\treadonly \"huggingface\": typeof HUGGINGFACE_MODELS;\n\treadonly \"kimi-coding\": typeof KIMI_CODING_MODELS;\n\treadonly \"minimax\": typeof MINIMAX_MODELS;\n\treadonly \"minimax-cn\": typeof MINIMAX_CN_MODELS;\n\treadonly \"mistral\": typeof MISTRAL_MODELS;\n\treadonly \"moonshotai\": typeof MOONSHOTAI_MODELS;\n\treadonly \"moonshotai-cn\": typeof MOONSHOTAI_CN_MODELS;\n\treadonly \"nvidia\": typeof NVIDIA_MODELS;\n\treadonly \"openai\": typeof OPENAI_MODELS;\n\treadonly \"openai-codex\": typeof OPENAI_CODEX_MODELS;\n\treadonly \"opencode\": typeof OPENCODE_MODELS;\n\treadonly \"opencode-go\": typeof OPENCODE_GO_MODELS;\n\treadonly \"openrouter\": typeof OPENROUTER_MODELS;\n\treadonly \"qwen-token-plan\": typeof QWEN_TOKEN_PLAN_MODELS;\n\treadonly \"qwen-token-plan-cn\": typeof QWEN_TOKEN_PLAN_CN_MODELS;\n\treadonly \"together\": typeof TOGETHER_MODELS;\n\treadonly \"vercel-ai-gateway\": typeof VERCEL_AI_GATEWAY_MODELS;\n\treadonly \"xai\": typeof XAI_MODELS;\n\treadonly \"xiaomi\": typeof XIAOMI_MODELS;\n\treadonly \"xiaomi-token-plan-ams\": typeof XIAOMI_TOKEN_PLAN_AMS_MODELS;\n\treadonly \"xiaomi-token-plan-cn\": typeof XIAOMI_TOKEN_PLAN_CN_MODELS;\n\treadonly \"xiaomi-token-plan-sgp\": typeof XIAOMI_TOKEN_PLAN_SGP_MODELS;\n\treadonly \"zai\": typeof ZAI_MODELS;\n\treadonly \"zai-coding-cn\": typeof ZAI_CODING_CN_MODELS;\n} = {\n\t\"amazon-bedrock\": AMAZON_BEDROCK_MODELS,\n\t\"ant-ling\": ANT_LING_MODELS,\n\t\"anthropic\": ANTHROPIC_MODELS,\n\t\"azure-openai-responses\": AZURE_OPENAI_RESPONSES_MODELS,\n\t\"baseten\": BASETEN_MODELS,\n\t\"cerebras\": CEREBRAS_MODELS,\n\t\"cloudflare-ai-gateway\": CLOUDFLARE_AI_GATEWAY_MODELS,\n\t\"cloudflare-workers-ai\": CLOUDFLARE_WORKERS_AI_MODELS,\n\t\"deepseek\": DEEPSEEK_MODELS,\n\t\"fireworks\": FIREWORKS_MODELS,\n\t\"github-copilot\": GITHUB_COPILOT_MODELS,\n\t\"google\": GOOGLE_MODELS,\n\t\"google-vertex\": GOOGLE_VERTEX_MODELS,\n\t\"groq\": GROQ_MODELS,\n\t\"huggingface\": HUGGINGFACE_MODELS,\n\t\"kimi-coding\": KIMI_CODING_MODELS,\n\t\"minimax\": MINIMAX_MODELS,\n\t\"minimax-cn\": MINIMAX_CN_MODELS,\n\t\"mistral\": MISTRAL_MODELS,\n\t\"moonshotai\": MOONSHOTAI_MODELS,\n\t\"moonshotai-cn\": MOONSHOTAI_CN_MODELS,\n\t\"nvidia\": NVIDIA_MODELS,\n\t\"openai\": OPENAI_MODELS,\n\t\"openai-codex\": OPENAI_CODEX_MODELS,\n\t\"opencode\": OPENCODE_MODELS,\n\t\"opencode-go\": OPENCODE_GO_MODELS,\n\t\"openrouter\": OPENROUTER_MODELS,\n\t\"qwen-token-plan\": QWEN_TOKEN_PLAN_MODELS,\n\t\"qwen-token-plan-cn\": QWEN_TOKEN_PLAN_CN_MODELS,\n\t\"together\": TOGETHER_MODELS,\n\t\"vercel-ai-gateway\": VERCEL_AI_GATEWAY_MODELS,\n\t\"xai\": XAI_MODELS,\n\t\"xiaomi\": XIAOMI_MODELS,\n\t\"xiaomi-token-plan-ams\": XIAOMI_TOKEN_PLAN_AMS_MODELS,\n\t\"xiaomi-token-plan-cn\": XIAOMI_TOKEN_PLAN_CN_MODELS,\n\t\"xiaomi-token-plan-sgp\": XIAOMI_TOKEN_PLAN_SGP_MODELS,\n\t\"zai\": ZAI_MODELS,\n\t\"zai-coding-cn\": ZAI_CODING_CN_MODELS,\n};\n"]}
package/dist/models.js CHANGED
@@ -3,6 +3,7 @@ import { defaultProviderAuthContext as defaultAuthContext } from "./auth/context
3
3
  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
+ import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
6
7
  export { ModelsError } from "./auth/resolve.js";
7
8
  function mergeHeaders(base, override) {
8
9
  if (!base && !override)
@@ -23,18 +24,26 @@ class ModelsImpl {
23
24
  credentials;
24
25
  modelsStore;
25
26
  authContext;
27
+ refreshGenerations = new Map();
28
+ refreshControllers = new Map();
29
+ publicationChains = new Map();
26
30
  constructor(options) {
27
31
  this.credentials = options?.credentials ?? new InMemoryCredentialStore();
28
32
  this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore();
29
33
  this.authContext = options?.authContext ?? defaultAuthContext();
30
34
  }
31
35
  setProvider(provider) {
36
+ this.supersedeProviderRefresh(provider.id);
32
37
  this.providers.set(provider.id, provider);
33
38
  }
34
39
  deleteProvider(id) {
40
+ this.supersedeProviderRefresh(id);
35
41
  this.providers.delete(id);
36
42
  }
37
43
  clearProviders() {
44
+ for (const id of new Set([...this.providers.keys(), ...this.refreshControllers.keys()])) {
45
+ this.supersedeProviderRefresh(id);
46
+ }
38
47
  this.providers.clear();
39
48
  }
40
49
  getProviders() {
@@ -69,87 +78,148 @@ class ModelsImpl {
69
78
  getModel(provider, id) {
70
79
  return this.getModels(provider).find((model) => model.id === id);
71
80
  }
81
+ supersedeProviderRefresh(providerId) {
82
+ const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
83
+ this.refreshGenerations.set(providerId, generation);
84
+ const previous = this.refreshControllers.get(providerId);
85
+ if (previous) {
86
+ this.refreshControllers.delete(providerId);
87
+ previous.abort();
88
+ }
89
+ return generation;
90
+ }
91
+ beginProviderRefresh(providerId) {
92
+ const generation = this.supersedeProviderRefresh(providerId);
93
+ const controller = new AbortController();
94
+ this.refreshControllers.set(providerId, controller);
95
+ return { generation, controller };
96
+ }
97
+ publishProviderModels(providerId, generation, signal, publication) {
98
+ const previous = this.publicationChains.get(providerId) ?? Promise.resolve();
99
+ const queued = (async () => {
100
+ await previous.catch(() => { });
101
+ if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
102
+ return false;
103
+ if (publication.persist === null) {
104
+ await this.modelsStore.delete(providerId, { signal });
105
+ }
106
+ else if (publication.persist !== undefined) {
107
+ await this.modelsStore.write(providerId, structuredClone(publication.persist), { signal });
108
+ }
109
+ if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
110
+ return false;
111
+ publication.update?.();
112
+ return true;
113
+ })();
114
+ const tail = queued.catch(() => { });
115
+ this.publicationChains.set(providerId, tail);
116
+ void tail.then(() => {
117
+ if (this.publicationChains.get(providerId) === tail)
118
+ this.publicationChains.delete(providerId);
119
+ });
120
+ return raceWithAbortSignal(queued, signal);
121
+ }
122
+ async runProviderRefreshPhase(provider, credential, allowNetwork, force, generation, signal) {
123
+ const stored = await this.modelsStore.read(provider.id, { signal });
124
+ await provider.refreshModels({
125
+ credential,
126
+ stored: stored ? structuredClone(stored) : undefined,
127
+ publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
128
+ allowNetwork,
129
+ force: allowNetwork ? force : undefined,
130
+ signal,
131
+ });
132
+ }
72
133
  async refresh(options = {}) {
73
134
  const allowNetwork = options.allowNetwork ?? true;
135
+ const callerSignal = operationSignal(options.signal);
74
136
  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);
137
+ if (callerSignal.aborted)
138
+ return { aborted: true, errors };
139
+ const selected = options.providers ? new Set(options.providers) : undefined;
140
+ const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined && (!selected || selected.has(provider.id)));
141
+ const refresh = Promise.all(refreshable.map(async (provider) => {
142
+ const { generation, controller } = this.beginProviderRefresh(provider.id);
143
+ const signal = AbortSignal.any([callerSignal, controller.signal]);
144
+ const operation = (async () => {
145
+ let storedCredential;
146
+ let credentialError;
147
+ try {
148
+ storedCredential = await this.readCredential(provider.id, signal);
149
+ }
150
+ catch (error) {
151
+ credentialError = error;
152
+ }
153
+ // Restore cached provider state before auth resolution or network access.
154
+ await this.runProviderRefreshPhase(provider, storedCredential, false, undefined, generation, signal);
155
+ if (credentialError !== undefined)
156
+ throw credentialError;
157
+ if (!allowNetwork || signal.aborted)
158
+ return;
159
+ const credential = await this.resolveRefreshCredential(provider, storedCredential, signal);
88
160
  if (!credential)
89
161
  return;
90
- await provider.refreshModels({
91
- credential,
92
- store,
93
- allowNetwork,
94
- force: options.force,
95
- signal: options.signal,
96
- });
162
+ await this.runProviderRefreshPhase(provider, credential, true, options.force, generation, signal);
163
+ })();
164
+ try {
165
+ await raceWithAbortSignal(operation, signal);
97
166
  }
98
167
  catch (error) {
99
- if (!options.signal?.aborted) {
168
+ if (!signal.aborted) {
100
169
  errors.set(provider.id, error instanceof Error
101
170
  ? error
102
171
  : new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
103
172
  }
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.
173
+ }
174
+ finally {
175
+ if (this.refreshControllers.get(provider.id) === controller) {
176
+ this.refreshControllers.delete(provider.id);
114
177
  }
115
178
  }
116
179
  }));
117
- return { aborted: options.signal?.aborted ?? false, errors };
180
+ try {
181
+ await raceWithAbortSignal(refresh, callerSignal);
182
+ }
183
+ catch (error) {
184
+ if (!callerSignal.aborted)
185
+ throw error;
186
+ }
187
+ return { aborted: callerSignal.aborted, errors: new Map(errors) };
118
188
  }
119
- async resolveRefreshCredential(provider, stored, allowNetwork, signal) {
189
+ async resolveRefreshCredential(provider, stored, signal) {
120
190
  if (stored?.type === "oauth") {
121
191
  const oauth = provider.auth.oauth;
122
192
  if (!oauth)
123
193
  return undefined;
124
- if (!allowNetwork || Date.now() < stored.expires)
194
+ if (Date.now() < stored.expires)
125
195
  return stored;
126
- if (signal?.aborted)
196
+ if (signal.aborted)
127
197
  return undefined;
128
198
  const post = await this.credentials.modify(provider.id, async (current) => {
129
199
  if (current?.type !== "oauth" || Date.now() < current.expires)
130
200
  return undefined;
131
201
  return oauth.refresh(current, signal);
132
- });
202
+ }, { signal });
133
203
  return post?.type === "oauth" ? post : undefined;
134
204
  }
135
205
  const apiKey = provider.auth.apiKey;
136
206
  if (!apiKey)
137
207
  return undefined;
138
208
  const credential = stored?.type === "api_key" ? stored : undefined;
139
- const result = await apiKey.resolve({ ctx: this.authContext, credential });
209
+ const result = await apiKey.resolve({ ctx: this.authContext, credential, signal });
140
210
  if (!result)
141
211
  return undefined;
142
212
  return { type: "api_key", key: result.auth.apiKey, env: result.env };
143
213
  }
144
- async readCredential(providerId) {
214
+ async readCredential(providerId, signal) {
145
215
  try {
146
- return await this.credentials.read(providerId);
216
+ return await this.credentials.read(providerId, { signal });
147
217
  }
148
218
  catch (error) {
149
219
  throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
150
220
  }
151
221
  }
152
- async checkProviderAuth(provider, credential) {
222
+ async checkProviderAuth(provider, credential, signal) {
153
223
  if (credential?.type === "oauth") {
154
224
  return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : undefined;
155
225
  }
@@ -161,42 +231,54 @@ class ModelsImpl {
161
231
  return await apiKey.check({
162
232
  ctx: this.authContext,
163
233
  credential: credential?.type === "api_key" ? credential : undefined,
234
+ signal,
164
235
  });
165
236
  }
166
237
  catch (error) {
167
238
  throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
168
239
  }
169
240
  }
170
- const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
241
+ const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext, { signal });
171
242
  return resolution ? { source: resolution.source, type: "api_key" } : undefined;
172
243
  }
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));
178
- }
179
- async getAvailable(providerId) {
180
- const providers = providerId
181
- ? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
182
- : this.getProviders();
183
- 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) };
186
- }));
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
- });
244
+ checkAuth(providerId, options) {
245
+ const signal = operationSignal(options?.signal);
246
+ const check = (async () => {
247
+ signal.throwIfAborted();
248
+ const provider = this.providers.get(providerId);
249
+ if (!provider)
250
+ return undefined;
251
+ return this.checkProviderAuth(provider, await this.readCredential(providerId, signal), signal);
252
+ })();
253
+ return raceWithAbortSignal(check, signal);
254
+ }
255
+ getAvailable(providerId, options) {
256
+ const signal = operationSignal(options?.signal);
257
+ const available = (async () => {
258
+ signal.throwIfAborted();
259
+ const providers = providerId
260
+ ? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
261
+ : this.getProviders();
262
+ const checks = await Promise.all(providers.map(async (provider) => {
263
+ const credential = await this.readCredential(provider.id, signal);
264
+ return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
265
+ }));
266
+ return checks.flatMap(({ provider, credential, auth }) => {
267
+ if (!auth)
268
+ return [];
269
+ const models = provider.getModels();
270
+ return provider.filterModels?.(models, credential) ?? models;
271
+ });
272
+ })();
273
+ return raceWithAbortSignal(available, signal);
193
274
  }
194
275
  async getAuth(providerOrModel, overrides) {
276
+ const signal = operationSignal(overrides?.signal);
195
277
  const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
196
278
  const provider = this.providers.get(providerId);
197
279
  if (!provider)
198
280
  return undefined;
199
- const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
281
+ const result = await resolveProviderAuth(provider, this.credentials, this.authContext, { ...overrides, signal });
200
282
  if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
201
283
  return result;
202
284
  return {
@@ -208,6 +290,8 @@ class ModelsImpl {
208
290
  };
209
291
  }
210
292
  async login(providerId, type, interaction) {
293
+ const signal = operationSignal(interaction.signal);
294
+ signal.throwIfAborted();
211
295
  const provider = this.providers.get(providerId);
212
296
  if (!provider)
213
297
  throw new ModelsError("provider", `Unknown provider: ${providerId}`);
@@ -215,20 +299,52 @@ class ModelsImpl {
215
299
  if (!method?.login) {
216
300
  throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
217
301
  }
218
- const credential = await method.login(interaction);
302
+ const loginOperation = method.login({ ...interaction, signal });
303
+ const credential = await raceWithAbortSignal(loginOperation, signal);
304
+ let mutationStarted = false;
305
+ let markMutationStarted;
306
+ const started = new Promise((resolve) => {
307
+ markMutationStarted = resolve;
308
+ });
309
+ const mutation = this.credentials.modify(providerId, async () => {
310
+ mutationStarted = true;
311
+ markMutationStarted?.();
312
+ return credential;
313
+ }, { signal });
314
+ void mutation.catch(() => { });
219
315
  try {
220
- await this.credentials.modify(providerId, async () => credential);
316
+ await new Promise((resolve, reject) => {
317
+ const onAbort = () => {
318
+ if (!mutationStarted)
319
+ reject(signal.reason);
320
+ };
321
+ signal.addEventListener("abort", onAbort, { once: true });
322
+ void Promise.race([started, mutation]).then(() => {
323
+ signal.removeEventListener("abort", onAbort);
324
+ resolve();
325
+ }, (error) => {
326
+ signal.removeEventListener("abort", onAbort);
327
+ reject(error);
328
+ });
329
+ if (signal.aborted)
330
+ onAbort();
331
+ });
332
+ await mutation;
221
333
  }
222
334
  catch (error) {
335
+ signal.throwIfAborted();
223
336
  throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
224
337
  }
225
338
  return credential;
226
339
  }
227
- async logout(providerId) {
340
+ async logout(providerId, options) {
341
+ const signal = operationSignal(options?.signal);
342
+ signal.throwIfAborted();
228
343
  try {
229
- await this.credentials.delete(providerId);
344
+ await this.credentials.delete(providerId, { signal });
230
345
  }
231
346
  catch (error) {
347
+ signal.throwIfAborted();
232
348
  throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
233
349
  }
234
350
  }
@@ -244,6 +360,7 @@ class ModelsImpl {
244
360
  const resolution = await this.getAuth(model, {
245
361
  apiKey: options?.apiKey,
246
362
  env: options?.env,
363
+ signal: options?.signal,
247
364
  });
248
365
  if (!resolution) {
249
366
  throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
@@ -280,6 +397,24 @@ class ModelsImpl {
280
397
  async completeSimple(model, context, options) {
281
398
  return this.streamSimple(model, context, options).result();
282
399
  }
400
+ async fetchDeferred(model, handle, options) {
401
+ return lazyStream(model, async () => {
402
+ const provider = this.requireProvider(model);
403
+ if (!provider.fetchDeferred) {
404
+ throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
405
+ }
406
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
407
+ return provider.fetchDeferred(requestModel, handle, requestOptions);
408
+ }).result();
409
+ }
410
+ async cancelDeferred(model, handle, options) {
411
+ const provider = this.requireProvider(model);
412
+ if (!provider.cancelDeferred) {
413
+ throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
414
+ }
415
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
416
+ await provider.cancelDeferred(requestModel, handle, requestOptions);
417
+ }
283
418
  }
284
419
  export function createModels(options) {
285
420
  return new ModelsImpl(options);
@@ -293,7 +428,6 @@ export function createModels(options) {
293
428
  export function createProvider(input) {
294
429
  const baselineModels = input.models;
295
430
  let dynamicModels = [];
296
- let inflightRefresh;
297
431
  const fetchModels = input.fetchModels;
298
432
  const currentModels = () => {
299
433
  const merged = [...baselineModels];
@@ -318,7 +452,7 @@ export function createProvider(input) {
318
452
  }
319
453
  return run(streams);
320
454
  };
321
- return {
455
+ const provider = {
322
456
  id: input.id,
323
457
  name: input.name ?? input.id,
324
458
  baseUrl: input.baseUrl,
@@ -326,34 +460,56 @@ export function createProvider(input) {
326
460
  auth: input.auth,
327
461
  getModels: currentModels,
328
462
  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() });
463
+ ? async (context) => {
464
+ if (context.stored) {
465
+ const restored = context.stored.models
466
+ .filter((model) => model.provider === input.id)
467
+ .map((model) => model);
468
+ if (!(await context.publish({
469
+ update: () => {
470
+ dynamicModels = restored;
471
+ },
472
+ }))) {
473
+ return;
345
474
  }
346
- finally {
347
- inflightRefresh = undefined;
348
- }
349
- })();
350
- return inflightRefresh;
475
+ }
476
+ if (!context.allowNetwork || context.signal.aborted)
477
+ return;
478
+ const refreshed = await fetchModels(context);
479
+ if (context.signal.aborted)
480
+ return;
481
+ await context.publish({
482
+ persist: { models: refreshed, checkedAt: Date.now() },
483
+ update: () => {
484
+ dynamicModels = refreshed;
485
+ },
486
+ });
351
487
  }
352
488
  : undefined,
353
489
  filterModels: input.filterModels,
354
490
  stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
355
491
  streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
356
492
  };
493
+ const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
494
+ if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
495
+ provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
496
+ const implementation = apiFor(model);
497
+ if (!implementation?.fetchDeferred) {
498
+ throw new ModelsError("provider", `Provider ${input.id} does not support deferred responses for "${model.api}"`);
499
+ }
500
+ return implementation.fetchDeferred(model, handle, options);
501
+ });
502
+ }
503
+ if (streams.some((entry) => entry.cancelDeferred !== undefined)) {
504
+ provider.cancelDeferred = async (model, handle, options) => {
505
+ const implementation = apiFor(model);
506
+ if (!implementation?.cancelDeferred) {
507
+ throw new ModelsError("provider", `Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);
508
+ }
509
+ await implementation.cancelDeferred(model, handle, options);
510
+ };
511
+ }
512
+ return provider;
357
513
  }
358
514
  /**
359
515
  * Runtime-checked narrowing for dynamically looked-up models: