@node-llm/core 1.18.0 → 1.19.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 (183) hide show
  1. package/README.md +14 -12
  2. package/dist/agent/Agent.d.ts +17 -3
  3. package/dist/agent/Agent.d.ts.map +1 -1
  4. package/dist/agent/Agent.js +11 -0
  5. package/dist/aliases.d.ts +341 -316
  6. package/dist/aliases.d.ts.map +1 -1
  7. package/dist/aliases.js +467 -442
  8. package/dist/chat/Chat.d.ts +12 -5
  9. package/dist/chat/Chat.d.ts.map +1 -1
  10. package/dist/chat/Chat.js +45 -13
  11. package/dist/chat/ChatOptions.d.ts +17 -0
  12. package/dist/chat/ChatOptions.d.ts.map +1 -1
  13. package/dist/chat/ChatResponse.d.ts +5 -0
  14. package/dist/chat/ChatResponse.d.ts.map +1 -1
  15. package/dist/chat/ChatResponse.js +12 -4
  16. package/dist/chat/ChatStream.d.ts.map +1 -1
  17. package/dist/chat/ChatStream.js +20 -10
  18. package/dist/chat/PromptCache.d.ts +7 -0
  19. package/dist/chat/PromptCache.d.ts.map +1 -0
  20. package/dist/chat/PromptCache.js +7 -0
  21. package/dist/chat/Temperature.d.ts +7 -0
  22. package/dist/chat/Temperature.d.ts.map +1 -0
  23. package/dist/chat/Temperature.js +17 -0
  24. package/dist/chat/Tool.d.ts +26 -3
  25. package/dist/chat/Tool.d.ts.map +1 -1
  26. package/dist/chat/Tool.js +28 -2
  27. package/dist/chat/ToolCallOutcome.d.ts +12 -0
  28. package/dist/chat/ToolCallOutcome.d.ts.map +1 -1
  29. package/dist/chat/ToolCallOutcome.js +14 -0
  30. package/dist/chat/ToolResultWindow.d.ts +16 -0
  31. package/dist/chat/ToolResultWindow.d.ts.map +1 -0
  32. package/dist/chat/ToolResultWindow.js +25 -0
  33. package/dist/config.d.ts +30 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +66 -30
  36. package/dist/errors/billing.d.ts +7 -0
  37. package/dist/errors/billing.d.ts.map +1 -0
  38. package/dist/errors/billing.js +24 -0
  39. package/dist/errors/index.d.ts +28 -0
  40. package/dist/errors/index.d.ts.map +1 -1
  41. package/dist/errors/index.js +32 -0
  42. package/dist/executor/Executor.d.ts.map +1 -1
  43. package/dist/executor/Executor.js +5 -3
  44. package/dist/index.d.ts +4 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/llm.d.ts +2 -1
  48. package/dist/llm.d.ts.map +1 -1
  49. package/dist/llm.js +8 -2
  50. package/dist/models/ModelRegistry.d.ts +12 -1
  51. package/dist/models/ModelRegistry.d.ts.map +1 -1
  52. package/dist/models/ModelRegistry.js +22 -2
  53. package/dist/models/models.json +11900 -4568
  54. package/dist/models/types.d.ts +14 -1
  55. package/dist/models/types.d.ts.map +1 -1
  56. package/dist/providers/Provider.d.ts +23 -1
  57. package/dist/providers/Provider.d.ts.map +1 -1
  58. package/dist/providers/anthropic/AnthropicProvider.d.ts +2 -0
  59. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  60. package/dist/providers/anthropic/AnthropicProvider.js +2 -0
  61. package/dist/providers/anthropic/Capabilities.d.ts +1 -0
  62. package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
  63. package/dist/providers/anthropic/Capabilities.js +3 -0
  64. package/dist/providers/anthropic/Chat.d.ts.map +1 -1
  65. package/dist/providers/anthropic/Chat.js +7 -75
  66. package/dist/providers/anthropic/Errors.d.ts.map +1 -1
  67. package/dist/providers/anthropic/Errors.js +4 -3
  68. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  69. package/dist/providers/anthropic/Streaming.js +4 -66
  70. package/dist/providers/anthropic/Utils.d.ts +33 -1
  71. package/dist/providers/anthropic/Utils.d.ts.map +1 -1
  72. package/dist/providers/anthropic/Utils.js +114 -0
  73. package/dist/providers/anthropic/types.d.ts +17 -3
  74. package/dist/providers/anthropic/types.d.ts.map +1 -1
  75. package/dist/providers/azure/AzureProvider.d.ts +54 -0
  76. package/dist/providers/azure/AzureProvider.d.ts.map +1 -0
  77. package/dist/providers/azure/AzureProvider.js +110 -0
  78. package/dist/providers/azure/Capabilities.d.ts +16 -0
  79. package/dist/providers/azure/Capabilities.d.ts.map +1 -0
  80. package/dist/providers/azure/Capabilities.js +36 -0
  81. package/dist/providers/azure/Embedding.d.ts +11 -0
  82. package/dist/providers/azure/Embedding.d.ts.map +1 -0
  83. package/dist/providers/azure/Embedding.js +23 -0
  84. package/dist/providers/azure/Models.d.ts +18 -0
  85. package/dist/providers/azure/Models.d.ts.map +1 -0
  86. package/dist/providers/azure/Models.js +29 -0
  87. package/dist/providers/azure/index.d.ts +5 -0
  88. package/dist/providers/azure/index.d.ts.map +1 -0
  89. package/dist/providers/azure/index.js +28 -0
  90. package/dist/providers/bedrock/BedrockProvider.d.ts.map +1 -1
  91. package/dist/providers/bedrock/BedrockProvider.js +1 -0
  92. package/dist/providers/bedrock/Capabilities.d.ts +1 -0
  93. package/dist/providers/bedrock/Capabilities.d.ts.map +1 -1
  94. package/dist/providers/bedrock/Capabilities.js +3 -0
  95. package/dist/providers/bedrock/Chat.d.ts.map +1 -1
  96. package/dist/providers/bedrock/Chat.js +6 -2
  97. package/dist/providers/bedrock/Errors.d.ts.map +1 -1
  98. package/dist/providers/bedrock/Errors.js +4 -0
  99. package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
  100. package/dist/providers/bedrock/Streaming.js +4 -1
  101. package/dist/providers/deepseek/Capabilities.d.ts +1 -0
  102. package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
  103. package/dist/providers/deepseek/Capabilities.js +3 -0
  104. package/dist/providers/deepseek/Chat.d.ts.map +1 -1
  105. package/dist/providers/deepseek/Chat.js +3 -2
  106. package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
  107. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  108. package/dist/providers/deepseek/DeepSeekProvider.js +1 -0
  109. package/dist/providers/deepseek/Errors.d.ts.map +1 -1
  110. package/dist/providers/deepseek/Errors.js +5 -4
  111. package/dist/providers/gemini/Capabilities.d.ts +1 -0
  112. package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
  113. package/dist/providers/gemini/Capabilities.js +3 -0
  114. package/dist/providers/gemini/Chat.d.ts.map +1 -1
  115. package/dist/providers/gemini/Chat.js +3 -2
  116. package/dist/providers/gemini/Errors.d.ts.map +1 -1
  117. package/dist/providers/gemini/Errors.js +4 -3
  118. package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
  119. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  120. package/dist/providers/gemini/GeminiProvider.js +1 -0
  121. package/dist/providers/mistral/Capabilities.d.ts +1 -0
  122. package/dist/providers/mistral/Capabilities.d.ts.map +1 -1
  123. package/dist/providers/mistral/Capabilities.js +3 -0
  124. package/dist/providers/mistral/Chat.d.ts.map +1 -1
  125. package/dist/providers/mistral/Chat.js +3 -2
  126. package/dist/providers/mistral/Errors.d.ts.map +1 -1
  127. package/dist/providers/mistral/Errors.js +4 -3
  128. package/dist/providers/mistral/MistralProvider.d.ts +1 -0
  129. package/dist/providers/mistral/MistralProvider.d.ts.map +1 -1
  130. package/dist/providers/mistral/MistralProvider.js +1 -0
  131. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  132. package/dist/providers/ollama/OllamaProvider.js +1 -0
  133. package/dist/providers/openai/Capabilities.d.ts +6 -0
  134. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  135. package/dist/providers/openai/Capabilities.js +10 -0
  136. package/dist/providers/openai/Chat.d.ts +3 -0
  137. package/dist/providers/openai/Chat.d.ts.map +1 -1
  138. package/dist/providers/openai/Chat.js +26 -7
  139. package/dist/providers/openai/Embedding.d.ts +2 -0
  140. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  141. package/dist/providers/openai/Embedding.js +8 -5
  142. package/dist/providers/openai/Errors.d.ts.map +1 -1
  143. package/dist/providers/openai/Errors.js +4 -3
  144. package/dist/providers/openai/Models.d.ts +10 -0
  145. package/dist/providers/openai/Models.d.ts.map +1 -1
  146. package/dist/providers/openai/Models.js +12 -8
  147. package/dist/providers/openai/OpenAIProvider.d.ts +11 -1
  148. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  149. package/dist/providers/openai/OpenAIProvider.js +36 -0
  150. package/dist/providers/openai/Responses.d.ts +30 -0
  151. package/dist/providers/openai/Responses.d.ts.map +1 -0
  152. package/dist/providers/openai/Responses.js +176 -0
  153. package/dist/providers/openai/Streaming.d.ts +2 -0
  154. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  155. package/dist/providers/openai/Streaming.js +19 -5
  156. package/dist/providers/openrouter/Capabilities.d.ts +1 -0
  157. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
  158. package/dist/providers/openrouter/Capabilities.js +3 -0
  159. package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
  160. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  161. package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
  162. package/dist/providers/registry.d.ts +2 -1
  163. package/dist/providers/registry.d.ts.map +1 -1
  164. package/dist/providers/registry.js +2 -1
  165. package/dist/providers/xai/Capabilities.d.ts +1 -0
  166. package/dist/providers/xai/Capabilities.d.ts.map +1 -1
  167. package/dist/providers/xai/Capabilities.js +3 -0
  168. package/dist/providers/xai/Chat.d.ts.map +1 -1
  169. package/dist/providers/xai/Chat.js +3 -2
  170. package/dist/providers/xai/Errors.d.ts.map +1 -1
  171. package/dist/providers/xai/Errors.js +5 -2
  172. package/dist/providers/xai/XAIProvider.d.ts +1 -0
  173. package/dist/providers/xai/XAIProvider.d.ts.map +1 -1
  174. package/dist/providers/xai/XAIProvider.js +1 -0
  175. package/dist/schema/Schema.d.ts +3 -3
  176. package/dist/schema/Schema.d.ts.map +1 -1
  177. package/dist/schema/to-json-schema.d.ts +2 -2
  178. package/dist/schema/to-json-schema.d.ts.map +1 -1
  179. package/dist/schema/to-json-schema.js +3 -8
  180. package/dist/schema/zod.d.ts +32 -0
  181. package/dist/schema/zod.d.ts.map +1 -0
  182. package/dist/schema/zod.js +31 -0
  183. package/package.json +14 -15
@@ -1,4 +1,5 @@
1
1
  import { BadRequestError, ContextWindowExceededError, InsufficientQuotaError, InvalidModelError, NotFoundError, AuthenticationError, RateLimitError, ServerError, APIError } from "../../errors/index.js";
2
+ import { isBillingProblem } from "../../errors/billing.js";
2
3
  export async function handleDeepSeekError(response, model) {
3
4
  const status = response.status;
4
5
  let body;
@@ -17,6 +18,9 @@ export async function handleDeepSeekError(response, model) {
17
18
  message = `DeepSeek error (${status}): ${body}`;
18
19
  }
19
20
  const provider = "deepseek";
21
+ if (isBillingProblem(status, message)) {
22
+ throw new InsufficientQuotaError(message, body, provider, model);
23
+ }
20
24
  if (status === 400) {
21
25
  if (message.includes("context") || message.includes("length") || message.includes("tokens")) {
22
26
  throw new ContextWindowExceededError(message, body, provider, model);
@@ -32,10 +36,7 @@ export async function handleDeepSeekError(response, model) {
32
36
  }
33
37
  throw new NotFoundError(message, status, body, provider, model);
34
38
  }
35
- if (status === 402 || status === 429) {
36
- if (message.includes("quota") || message.includes("balance") || message.includes("credit")) {
37
- throw new InsufficientQuotaError(message, body, provider, model);
38
- }
39
+ if (status === 429) {
39
40
  throw new RateLimitError(message, body, provider, model);
40
41
  }
41
42
  if (status >= 500) {
@@ -1,5 +1,6 @@
1
1
  import { ModelPricing } from "../../models/types.js";
2
2
  export declare class Capabilities {
3
+ static supportsTemperature(modelId: string): boolean;
3
4
  static getContextWindow(modelId: string): number | null;
4
5
  static getMaxOutputTokens(modelId: string): number | null;
5
6
  static supportsVision(modelId: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhG,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAc5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhG,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAc5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
@@ -1,6 +1,9 @@
1
1
  import { ModelRegistry } from "../../models/ModelRegistry.js";
2
2
  import { PricingRegistry } from "../../models/PricingRegistry.js";
3
3
  export class Capabilities {
4
+ static supportsTemperature(modelId) {
5
+ return ModelRegistry.supportsTemperature(modelId, "gemini");
6
+ }
4
7
  static getContextWindow(modelId) {
5
8
  return ModelRegistry.getContextWindow(modelId, "gemini") ?? 32_768;
6
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAS3D,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA2J1D,OAAO,CAAC,cAAc;CAuBvB"}
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAS3D,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA6J1D,OAAO,CAAC,cAAc;CAuBvB"}
@@ -28,7 +28,7 @@ export class GeminiChat {
28
28
  generationConfig.responseJsonSchema = this.sanitizeSchema(request.response_format.json_schema.schema);
29
29
  }
30
30
  }
31
- const { model: _model, messages: _messages, tools: _tools, temperature: _temp, max_tokens: _max, response_format: _format, headers: _headers, tool_choice: _choice, parallel_tool_calls: _parallel, requestTimeout, ...rest } = request;
31
+ const { model: _model, messages: _messages, tools: _tools, temperature: _temp, max_tokens: _max, response_format: _format, headers: _headers, tool_choice: _choice, parallel_tool_calls: _parallel, requestTimeout, signal, ...rest } = request;
32
32
  const payload = {
33
33
  contents,
34
34
  generationConfig: {
@@ -85,7 +85,8 @@ export class GeminiChat {
85
85
  headers: {
86
86
  "Content-Type": "application/json"
87
87
  },
88
- body: JSON.stringify(payload)
88
+ body: JSON.stringify(payload),
89
+ signal
89
90
  }, requestTimeout);
90
91
  if (!response.ok) {
91
92
  await handleGeminiError(response, request.model);
@@ -1 +1 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Errors.ts"],"names":[],"mappings":"AAaA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAuD1F"}
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Errors.ts"],"names":[],"mappings":"AAcA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAwD1F"}
@@ -1,4 +1,5 @@
1
1
  import { BadRequestError, ContextWindowExceededError, InsufficientQuotaError, InvalidModelError, NotFoundError, AuthenticationError, RateLimitError, ServerError, ServiceUnavailableError, APIError } from "../../errors/index.js";
2
+ import { isBillingProblem } from "../../errors/billing.js";
2
3
  export async function handleGeminiError(response, model) {
3
4
  const status = response.status;
4
5
  let body;
@@ -18,6 +19,9 @@ export async function handleGeminiError(response, model) {
18
19
  message = `Gemini error (${status}): ${body}`;
19
20
  }
20
21
  const provider = "gemini";
22
+ if (isBillingProblem(status, message)) {
23
+ throw new InsufficientQuotaError(message, body, provider, model);
24
+ }
21
25
  if (status === 400) {
22
26
  if (message.includes("limit") || message.includes("context") || message.includes("token")) {
23
27
  throw new ContextWindowExceededError(message, body, provider, model);
@@ -34,9 +38,6 @@ export async function handleGeminiError(response, model) {
34
38
  throw new NotFoundError(message, status, body, provider, model);
35
39
  }
36
40
  if (status === 429) {
37
- if (message.includes("quota")) {
38
- throw new InsufficientQuotaError(message, body, provider, model);
39
- }
40
41
  throw new RateLimitError(message, body, provider, model);
41
42
  }
42
43
  if (status === 502 || status === 503 || status === 504) {
@@ -23,6 +23,7 @@ export declare class GeminiProvider extends BaseProvider implements Provider {
23
23
  supportsModeration: (model: string) => boolean;
24
24
  supportsReasoning: (_model: string) => boolean;
25
25
  supportsDeveloperRole: (_model: string) => boolean;
26
+ supportsTemperature: (model: string) => boolean;
26
27
  getContextWindow: (model: string) => number | null;
27
28
  };
28
29
  constructor(options: GeminiProviderOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAsBtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IArBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;wCACF,MAAM;kCACZ,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWpD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAKhF"}
1
+ {"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAuBtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAtBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;wCACF,MAAM;qCACT,MAAM;kCACT,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWpD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAKhF"}
@@ -26,6 +26,7 @@ export class GeminiProvider extends BaseProvider {
26
26
  supportsModeration: (model) => Capabilities.supportsModeration(model),
27
27
  supportsReasoning: (_model) => false,
28
28
  supportsDeveloperRole: (_model) => true,
29
+ supportsTemperature: (model) => Capabilities.supportsTemperature(model),
29
30
  getContextWindow: (model) => Capabilities.getContextWindow(model)
30
31
  };
31
32
  constructor(options) {
@@ -1,6 +1,7 @@
1
1
  import { ModelPricing } from "../../models/types.js";
2
2
  export declare class MistralCapabilities {
3
3
  static getCapabilities(modelId: string): string[];
4
+ static supportsTemperature(modelId: string): boolean;
4
5
  static getContextWindow(modelId: string): number | null;
5
6
  static getMaxOutputTokens(modelId: string): number | null;
6
7
  static supportsVision(modelId: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBjD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;IAIhC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IASpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAOtD"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBjD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;IAIhC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IASpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAOtD"}
@@ -20,6 +20,9 @@ export class MistralCapabilities {
20
20
  caps.push("structured_output");
21
21
  return caps;
22
22
  }
23
+ static supportsTemperature(modelId) {
24
+ return ModelRegistry.supportsTemperature(modelId, "mistral");
25
+ }
23
26
  static getContextWindow(modelId) {
24
27
  return ModelRegistry.getContextWindow(modelId, "mistral") ?? 32_768;
25
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAgDlE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAkL3D"}
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAgDlE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAmL3D"}
@@ -11,7 +11,7 @@ export class MistralChat {
11
11
  this.apiKey = apiKey;
12
12
  }
13
13
  async execute(request) {
14
- const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, tool_choice: _choice, parallel_tool_calls: _parallel, requestTimeout, signal: _signal, ...rest } = request;
14
+ const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, tool_choice: _choice, parallel_tool_calls: _parallel, requestTimeout, signal, ...rest } = request;
15
15
  const mappedMessages = mapSystemMessages(messages, false);
16
16
  // Sanitize messages - remove internal properties that Mistral API doesn't accept
17
17
  const sanitizedMessages = mappedMessages.map((msg) => {
@@ -82,7 +82,8 @@ export class MistralChat {
82
82
  Accept: "application/json",
83
83
  ...request.headers
84
84
  },
85
- body: JSON.stringify(body)
85
+ body: JSON.stringify(body),
86
+ signal
86
87
  }, requestTimeout);
87
88
  if (!response.ok) {
88
89
  await handleMistralError(response, model);
@@ -1 +1 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Errors.ts"],"names":[],"mappings":"AAaA,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CA6D3F"}
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Errors.ts"],"names":[],"mappings":"AAcA,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CA8D3F"}
@@ -1,4 +1,5 @@
1
1
  import { BadRequestError, ContextWindowExceededError, InsufficientQuotaError, InvalidModelError, NotFoundError, AuthenticationError, RateLimitError, ServerError, ServiceUnavailableError, APIError } from "../../errors/index.js";
2
+ import { isBillingProblem } from "../../errors/billing.js";
2
3
  export async function handleMistralError(response, model) {
3
4
  const status = response.status;
4
5
  let body;
@@ -23,6 +24,9 @@ export async function handleMistralError(response, model) {
23
24
  message = `Mistral error (${status}): ${body}`;
24
25
  }
25
26
  const provider = "mistral";
27
+ if (isBillingProblem(status, message)) {
28
+ throw new InsufficientQuotaError(message, body, provider);
29
+ }
26
30
  if (status === 400) {
27
31
  if (message.includes("context") || message.includes("length") || message.includes("tokens")) {
28
32
  throw new ContextWindowExceededError(message, body, provider, model);
@@ -42,9 +46,6 @@ export async function handleMistralError(response, model) {
42
46
  throw new BadRequestError(message, body, provider, model);
43
47
  }
44
48
  if (status === 429) {
45
- if (message.includes("quota") || message.includes("billing")) {
46
- throw new InsufficientQuotaError(message, body, provider);
47
- }
48
49
  throw new RateLimitError(message, status, body, provider);
49
50
  }
50
51
  if (status >= 500 && status < 600) {
@@ -23,6 +23,7 @@ export declare class MistralProvider extends BaseProvider implements Provider {
23
23
  supportsModeration: (model: string) => boolean;
24
24
  supportsReasoning: (model: string) => boolean;
25
25
  supportsDeveloperRole: (_model: string) => boolean;
26
+ supportsTemperature: (model: string) => boolean;
26
27
  getContextWindow: (model: string) => number | null;
27
28
  };
28
29
  constructor(options: MistralProviderOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"MistralProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/MistralProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,YAAa,YAAW,QAAQ;IAuBvD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAtBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAE/C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;kCACZ,MAAM;MAChC;gBAE2B,OAAO,EAAE,sBAAsB;IAWrD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAGxE"}
1
+ {"version":3,"file":"MistralProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/MistralProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,YAAa,YAAW,QAAQ;IAwBvD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAvBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAE/C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;qCACT,MAAM;kCACT,MAAM;MAChC;gBAE2B,OAAO,EAAE,sBAAsB;IAWrD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAGxE"}
@@ -26,6 +26,7 @@ export class MistralProvider extends BaseProvider {
26
26
  supportsModeration: (model) => MistralCapabilities.supportsModeration(model),
27
27
  supportsReasoning: (model) => MistralCapabilities.supportsReasoning(model),
28
28
  supportsDeveloperRole: (_model) => false,
29
+ supportsTemperature: (model) => MistralCapabilities.supportsTemperature(model),
29
30
  getContextWindow: (model) => MistralCapabilities.getContextWindow(model)
30
31
  };
31
32
  constructor(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAO7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IA4B/C,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;CAGxD"}
1
+ {"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAO7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IA6B/C,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;CAGxD"}
@@ -24,6 +24,7 @@ export class OllamaProvider extends OpenAIProvider {
24
24
  supportsReasoning: (modelId) => OllamaCapabilities.supportsReasoning(modelId),
25
25
  supportsDeveloperRole: (_modelId) => false,
26
26
  supportsPrediction: (_modelId) => false,
27
+ supportsTemperature: (_modelId) => true,
27
28
  getContextWindow: (modelId) => OllamaCapabilities.getContextWindow(modelId)
28
29
  };
29
30
  }
@@ -1,5 +1,6 @@
1
1
  import { ModelPricing } from "../../models/types.js";
2
2
  export declare class Capabilities {
3
+ static supportsTemperature(modelId: string): boolean;
3
4
  static getContextWindow(modelId: string): number | null;
4
5
  static getMaxOutputTokens(modelId: string): number | null;
5
6
  static supportsVision(modelId: string): boolean;
@@ -14,6 +15,11 @@ export declare class Capabilities {
14
15
  static supportsDeveloperRole(modelId: string): boolean;
15
16
  static supportsToolChoice(_modelId: string): boolean;
16
17
  static supportsPrediction(modelId: string): boolean;
18
+ /**
19
+ * Models that take function tools only through the Responses API; Chat Completions rejects them
20
+ * with "use /v1/responses" while reasoning is on, which it is by default.
21
+ */
22
+ static needsResponsesForTools(modelId: string): boolean;
17
23
  static needsMaxCompletionTokens(modelId: string): boolean;
18
24
  static getModelType(modelId: string): string;
19
25
  static getModalities(modelId: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU5C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAgB5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBjD,MAAM,CAAC,oBAAoB,CACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,GAAG,IAAI;IAM5B,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIvD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU5C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAgB5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBjD,MAAM,CAAC,oBAAoB,CACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,GAAG,IAAI;IAM5B,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
@@ -1,6 +1,9 @@
1
1
  import { ModelRegistry } from "../../models/ModelRegistry.js";
2
2
  import { PricingRegistry } from "../../models/PricingRegistry.js";
3
3
  export class Capabilities {
4
+ static supportsTemperature(modelId) {
5
+ return ModelRegistry.supportsTemperature(modelId, "openai");
6
+ }
4
7
  static getContextWindow(modelId) {
5
8
  return ModelRegistry.getContextWindow(modelId, "openai") ?? 128_000;
6
9
  }
@@ -50,6 +53,13 @@ export class Capabilities {
50
53
  static supportsPrediction(modelId) {
51
54
  return /gpt-4o|gpt-4-/.test(modelId);
52
55
  }
56
+ /**
57
+ * Models that take function tools only through the Responses API; Chat Completions rejects them
58
+ * with "use /v1/responses" while reasoning is on, which it is by default.
59
+ */
60
+ static needsResponsesForTools(modelId) {
61
+ return /^gpt-(5\.6|6)/.test(modelId);
62
+ }
53
63
  static needsMaxCompletionTokens(modelId) {
54
64
  return this.supportsReasoning(modelId);
55
65
  }
@@ -5,6 +5,9 @@ export declare class OpenAIChat {
5
5
  private readonly apiKey;
6
6
  private readonly baseUrl;
7
7
  constructor(providerOrUrl: OpenAIProvider | string, apiKey: string);
8
+ private url;
9
+ private authHeaders;
10
+ private registry;
8
11
  execute(request: ChatRequest): Promise<ChatResponse>;
9
12
  }
10
13
  //# sourceMappingURL=Chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAS3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,aAAa,EAAE,cAAc,GAAG,MAAM,EACtC,MAAM,EAAE,MAAM;IAK3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA2J3D"}
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAS3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,aAAa,EAAE,cAAc,GAAG,MAAM,EACtC,MAAM,EAAE,MAAM;IAOjC,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,QAAQ;IAKV,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA6J3D"}
@@ -15,8 +15,26 @@ export class OpenAIChat {
15
15
  this.apiKey = apiKey;
16
16
  this.baseUrl = typeof providerOrUrl === "string" ? providerOrUrl : providerOrUrl.apiBase();
17
17
  }
18
+ // A provider decides where its requests go, signs them and names the model they are priced as;
19
+ // Azure, for one, routes by deployment and wants an api-key header, not a bearer token.
20
+ url() {
21
+ if (typeof this.providerOrUrl === "string")
22
+ return buildUrl(this.baseUrl, "/chat/completions");
23
+ return this.providerOrUrl.url("/chat/completions");
24
+ }
25
+ authHeaders() {
26
+ if (typeof this.providerOrUrl !== "string")
27
+ return this.providerOrUrl.headers();
28
+ return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" };
29
+ }
30
+ registry(model) {
31
+ if (typeof this.providerOrUrl === "string")
32
+ return { model, provider: "openai" };
33
+ return { model: this.providerOrUrl.registryModel(model), provider: this.providerOrUrl.id };
34
+ }
18
35
  async execute(request) {
19
- const temperature = Capabilities.normalizeTemperature(request.temperature, request.model);
36
+ const known = this.registry(request.model);
37
+ const temperature = Capabilities.normalizeTemperature(request.temperature, known.model);
20
38
  const isMainOpenAI = this.baseUrl.includes("api.openai.com");
21
39
  const supportsDeveloperRole = isMainOpenAI &&
22
40
  (typeof this.providerOrUrl === "string"
@@ -32,7 +50,7 @@ export class OpenAIChat {
32
50
  if (temperature !== undefined && temperature !== null)
33
51
  body.temperature = temperature;
34
52
  if (max_tokens) {
35
- if (Capabilities.needsMaxCompletionTokens(request.model)) {
53
+ if (Capabilities.needsMaxCompletionTokens(known.model)) {
36
54
  body.max_completion_tokens = max_tokens;
37
55
  }
38
56
  else {
@@ -81,17 +99,16 @@ export class OpenAIChat {
81
99
  if (thinking?.effort && thinking.effort !== "none") {
82
100
  body.reasoning_effort = thinking.effort;
83
101
  }
84
- const url = buildUrl(this.baseUrl, "/chat/completions");
102
+ const url = this.url();
85
103
  logger.logRequest("OpenAI", "POST", url, body);
86
104
  const response = await fetchWithTimeout(url, {
87
105
  method: "POST",
88
106
  headers: {
89
- Authorization: `Bearer ${this.apiKey}`,
90
- "Content-Type": "application/json",
107
+ ...this.authHeaders(),
91
108
  ...request.headers
92
109
  },
93
110
  body: JSON.stringify(body),
94
- signal: signal
111
+ signal
95
112
  }, request.requestTimeout);
96
113
  if (!response.ok) {
97
114
  await handleOpenAIError(response, request.model);
@@ -120,7 +137,9 @@ export class OpenAIChat {
120
137
  if (!content && !tool_calls) {
121
138
  throw new Error("OpenAI returned empty response");
122
139
  }
123
- const calculatedUsage = usage ? ModelRegistry.calculateCost(usage, model, "openai") : undefined;
140
+ const calculatedUsage = usage
141
+ ? ModelRegistry.calculateCost(usage, known.model, known.provider)
142
+ : undefined;
124
143
  return {
125
144
  content,
126
145
  tool_calls,
@@ -5,6 +5,8 @@ export declare class OpenAIEmbedding {
5
5
  constructor(baseUrl: string, apiKey: string);
6
6
  protected getProviderName(): string;
7
7
  protected validateModel(model: string): void;
8
+ protected endpoint(): string;
9
+ protected requestHeaders(): Record<string, string>;
8
10
  execute(request: EmbeddingRequest): Promise<EmbeddingResponse>;
9
11
  }
10
12
  //# sourceMappingURL=Embedding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQrE,qBAAa,eAAe;IAExB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuDrE"}
1
+ {"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQrE,qBAAa,eAAe;IAExB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM5C,SAAS,CAAC,QAAQ,IAAI,MAAM;IAI5B,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI5C,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAoDrE"}
@@ -19,6 +19,12 @@ export class OpenAIEmbedding {
19
19
  throw new Error(`Model ${model} does not support embeddings.`);
20
20
  }
21
21
  }
22
+ endpoint() {
23
+ return buildUrl(this.baseUrl, "/embeddings");
24
+ }
25
+ requestHeaders() {
26
+ return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" };
27
+ }
22
28
  async execute(request) {
23
29
  const model = request.model || DEFAULT_MODELS.EMBEDDING;
24
30
  this.validateModel(model);
@@ -32,14 +38,11 @@ export class OpenAIEmbedding {
32
38
  if (request.user) {
33
39
  body.user = request.user;
34
40
  }
35
- const url = buildUrl(this.baseUrl, "/embeddings");
41
+ const url = this.endpoint();
36
42
  logger.logRequest("OpenAI", "POST", url, body);
37
43
  const response = await fetchWithTimeout(url, {
38
44
  method: "POST",
39
- headers: {
40
- Authorization: `Bearer ${this.apiKey}`,
41
- "Content-Type": "application/json"
42
- },
45
+ headers: this.requestHeaders(),
43
46
  body: JSON.stringify(body)
44
47
  }, request.requestTimeout);
45
48
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Errors.ts"],"names":[],"mappings":"AAaA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAmE1F"}
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Errors.ts"],"names":[],"mappings":"AAcA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAoE1F"}
@@ -1,4 +1,5 @@
1
1
  import { BadRequestError, ContextWindowExceededError, InsufficientQuotaError, InvalidModelError, NotFoundError, AuthenticationError, RateLimitError, ServerError, ServiceUnavailableError, APIError } from "../../errors/index.js";
2
+ import { isBillingProblem } from "../../errors/billing.js";
2
3
  export async function handleOpenAIError(response, model) {
3
4
  const status = response.status;
4
5
  let body;
@@ -30,6 +31,9 @@ export async function handleOpenAIError(response, model) {
30
31
  message = `OpenAI error (${status}): ${body}`;
31
32
  }
32
33
  const provider = "openai";
34
+ if (isBillingProblem(status, message, code)) {
35
+ throw new InsufficientQuotaError(message, body, provider, model);
36
+ }
33
37
  if (status === 400) {
34
38
  if (code === "context_length_exceeded" ||
35
39
  message.includes("context length") ||
@@ -48,9 +52,6 @@ export async function handleOpenAIError(response, model) {
48
52
  throw new NotFoundError(message, status, body, provider, model);
49
53
  }
50
54
  if (status === 429) {
51
- if (code === "insufficient_quota") {
52
- throw new InsufficientQuotaError(message, body, provider, model);
53
- }
54
55
  throw new RateLimitError(message, body, provider, model);
55
56
  }
56
57
  if (status === 502 || status === 503) {
@@ -1,4 +1,10 @@
1
1
  import { ModelInfo } from "../Provider.js";
2
+ /** A model as an OpenAI-compatible /models endpoint lists it */
3
+ export type ListedModel = {
4
+ id: string;
5
+ created: number;
6
+ owned_by: string;
7
+ };
2
8
  export declare class OpenAIModels {
3
9
  protected readonly baseUrl: string;
4
10
  protected readonly apiKey: string;
@@ -13,6 +19,10 @@ export declare class OpenAIModels {
13
19
  };
14
20
  protected getCapabilities(modelId: string): string[];
15
21
  protected getPricing(modelId: string): import("../../models/types.js").ModelPricing | undefined;
22
+ protected endpoint(): string;
23
+ protected requestHeaders(): Record<string, string>;
24
+ /** The models the API lists that are worth returning */
25
+ protected listed(data: ListedModel[]): ListedModel[];
16
26
  execute(): Promise<ModelInfo[]>;
17
27
  find(modelId: string): import("../../models/types.js").Model | undefined;
18
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,qBAAa,YAAY;IAErB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMpD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;;;;IAKvC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKpD,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;IAK9B,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA8DrC,IAAI,CAAC,OAAO,EAAE,MAAM;CAGrB"}
1
+ {"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,qBAAa,YAAY;IAErB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMpD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;;;;IAKvC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKpD,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;IAKpC,SAAS,CAAC,QAAQ,IAAI,MAAM;IAI5B,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlD,wDAAwD;IACxD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAI9C,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAsDrC,IAAI,CAAC,OAAO,EAAE,MAAM;CAGrB"}
@@ -41,19 +41,23 @@ export class OpenAIModels {
41
41
  const model = ModelRegistry.find(modelId, this.getProviderName());
42
42
  return model?.pricing || Capabilities.getPricing(modelId);
43
43
  }
44
+ endpoint() {
45
+ return buildUrl(this.baseUrl, "/models");
46
+ }
47
+ requestHeaders() {
48
+ return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" };
49
+ }
50
+ /** The models the API lists that are worth returning */
51
+ listed(data) {
52
+ return data;
53
+ }
44
54
  async execute() {
45
55
  const provider = this.getProviderName();
46
56
  try {
47
- const response = await fetchWithTimeout(buildUrl(this.baseUrl, "/models"), {
48
- method: "GET",
49
- headers: {
50
- Authorization: `Bearer ${this.apiKey}`,
51
- "Content-Type": "application/json"
52
- }
53
- }, config.requestTimeout);
57
+ const response = await fetchWithTimeout(this.endpoint(), { method: "GET", headers: this.requestHeaders() }, config.requestTimeout);
54
58
  if (response.ok) {
55
59
  const { data } = (await response.json());
56
- return data.map((m) => {
60
+ return this.listed(data).map((m) => {
57
61
  const modelId = m.id;
58
62
  const registryModel = ModelRegistry.find(modelId, provider);
59
63
  return {
@@ -1,3 +1,4 @@
1
+ import { OpenAIResponses, type ResponsesTarget } from "./Responses.js";
1
2
  import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, ModerationRequest, ModerationResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
3
  import { BaseProvider } from "../BaseProvider.js";
3
4
  import { OpenAIChat } from "./Chat.js";
@@ -11,11 +12,12 @@ export interface OpenAIProviderOptions {
11
12
  apiKey: string;
12
13
  baseUrl?: string;
13
14
  }
14
- export declare class OpenAIProvider extends BaseProvider implements Provider {
15
+ export declare class OpenAIProvider extends BaseProvider implements Provider, ResponsesTarget {
15
16
  protected readonly options: OpenAIProviderOptions;
16
17
  protected baseUrl: string;
17
18
  protected chatHandler: OpenAIChat;
18
19
  protected streamingHandler: OpenAIStreaming;
20
+ protected responsesHandler: OpenAIResponses;
19
21
  protected modelsHandler: OpenAIModels;
20
22
  protected imageHandler: OpenAIImage;
21
23
  protected transcriptionHandler: OpenAITranscription;
@@ -32,11 +34,19 @@ export declare class OpenAIProvider extends BaseProvider implements Provider {
32
34
  supportsReasoning: (model: string) => boolean;
33
35
  supportsDeveloperRole: (model: string) => boolean;
34
36
  supportsPrediction: (model: string) => boolean;
37
+ supportsTemperature: (model: string) => boolean;
35
38
  getContextWindow: (model: string) => number | null;
36
39
  };
37
40
  constructor(options: OpenAIProviderOptions);
38
41
  apiBase(): string;
39
42
  headers(): Record<string, string>;
43
+ /** Where an endpoint such as /chat/completions is served */
44
+ url(path: string): string;
45
+ registryModel(model: string): string;
46
+ responsesBase(): string;
47
+ responsesModel(model: string): string;
48
+ /** Whether a request goes to the Responses API rather than Chat Completions. */
49
+ protected usesResponsesApi(request: ChatRequest): boolean;
40
50
  protected providerName(): string;
41
51
  defaultModel(feature?: string): string;
42
52
  chat(request: ChatRequest): Promise<ChatResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAwBtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IAvB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;uCACF,MAAM;oCACT,MAAM;kCACR,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAYtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAehD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
1
+ {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAqB,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ,EAAE,eAAe;IA0BvE,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IAzB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;uCACF,MAAM;oCACT,MAAM;qCACL,MAAM;kCACT,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAatD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,4DAA4D;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIzB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,aAAa,IAAI,MAAM;IAIvB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI5C,gFAAgF;IAChF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;IAIzD,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAehD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAgBxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}