@node-llm/core 1.18.0 → 1.19.1

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 (189) 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 +28 -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 +6 -4
  116. package/dist/providers/gemini/ChatUtils.d.ts.map +1 -1
  117. package/dist/providers/gemini/ChatUtils.js +2 -1
  118. package/dist/providers/gemini/Errors.d.ts.map +1 -1
  119. package/dist/providers/gemini/Errors.js +4 -3
  120. package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
  121. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  122. package/dist/providers/gemini/GeminiProvider.js +1 -0
  123. package/dist/providers/gemini/Streaming.d.ts.map +1 -1
  124. package/dist/providers/gemini/Streaming.js +3 -2
  125. package/dist/providers/gemini/types.d.ts +2 -0
  126. package/dist/providers/gemini/types.d.ts.map +1 -1
  127. package/dist/providers/mistral/Capabilities.d.ts +1 -0
  128. package/dist/providers/mistral/Capabilities.d.ts.map +1 -1
  129. package/dist/providers/mistral/Capabilities.js +3 -0
  130. package/dist/providers/mistral/Chat.d.ts.map +1 -1
  131. package/dist/providers/mistral/Chat.js +3 -2
  132. package/dist/providers/mistral/Errors.d.ts.map +1 -1
  133. package/dist/providers/mistral/Errors.js +4 -3
  134. package/dist/providers/mistral/MistralProvider.d.ts +1 -0
  135. package/dist/providers/mistral/MistralProvider.d.ts.map +1 -1
  136. package/dist/providers/mistral/MistralProvider.js +1 -0
  137. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  138. package/dist/providers/ollama/OllamaProvider.js +1 -0
  139. package/dist/providers/openai/Capabilities.d.ts +6 -0
  140. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  141. package/dist/providers/openai/Capabilities.js +10 -0
  142. package/dist/providers/openai/Chat.d.ts +3 -0
  143. package/dist/providers/openai/Chat.d.ts.map +1 -1
  144. package/dist/providers/openai/Chat.js +26 -7
  145. package/dist/providers/openai/Embedding.d.ts +2 -0
  146. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  147. package/dist/providers/openai/Embedding.js +8 -5
  148. package/dist/providers/openai/Errors.d.ts.map +1 -1
  149. package/dist/providers/openai/Errors.js +4 -3
  150. package/dist/providers/openai/Models.d.ts +10 -0
  151. package/dist/providers/openai/Models.d.ts.map +1 -1
  152. package/dist/providers/openai/Models.js +12 -8
  153. package/dist/providers/openai/OpenAIProvider.d.ts +11 -1
  154. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  155. package/dist/providers/openai/OpenAIProvider.js +36 -0
  156. package/dist/providers/openai/Responses.d.ts +30 -0
  157. package/dist/providers/openai/Responses.d.ts.map +1 -0
  158. package/dist/providers/openai/Responses.js +176 -0
  159. package/dist/providers/openai/Streaming.d.ts +2 -0
  160. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  161. package/dist/providers/openai/Streaming.js +19 -5
  162. package/dist/providers/openrouter/Capabilities.d.ts +1 -0
  163. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
  164. package/dist/providers/openrouter/Capabilities.js +3 -0
  165. package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
  166. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  167. package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
  168. package/dist/providers/registry.d.ts +2 -1
  169. package/dist/providers/registry.d.ts.map +1 -1
  170. package/dist/providers/registry.js +2 -1
  171. package/dist/providers/xai/Capabilities.d.ts +1 -0
  172. package/dist/providers/xai/Capabilities.d.ts.map +1 -1
  173. package/dist/providers/xai/Capabilities.js +3 -0
  174. package/dist/providers/xai/Chat.d.ts.map +1 -1
  175. package/dist/providers/xai/Chat.js +3 -2
  176. package/dist/providers/xai/Errors.d.ts.map +1 -1
  177. package/dist/providers/xai/Errors.js +5 -2
  178. package/dist/providers/xai/XAIProvider.d.ts +1 -0
  179. package/dist/providers/xai/XAIProvider.d.ts.map +1 -1
  180. package/dist/providers/xai/XAIProvider.js +1 -0
  181. package/dist/schema/Schema.d.ts +3 -3
  182. package/dist/schema/Schema.d.ts.map +1 -1
  183. package/dist/schema/to-json-schema.d.ts +2 -2
  184. package/dist/schema/to-json-schema.d.ts.map +1 -1
  185. package/dist/schema/to-json-schema.js +3 -8
  186. package/dist/schema/zod.d.ts +33 -0
  187. package/dist/schema/zod.d.ts.map +1 -0
  188. package/dist/schema/zod.js +33 -0
  189. 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;IA8J1D,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: {
@@ -46,7 +46,7 @@ export class GeminiChat {
46
46
  functionDeclarations: request.tools.map((t) => ({
47
47
  name: t.function.name,
48
48
  description: t.function.description,
49
- parameters: t.function.parameters
49
+ parametersJsonSchema: t.function.parameters
50
50
  }))
51
51
  }
52
52
  ];
@@ -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);
@@ -106,7 +107,8 @@ export class GeminiChat {
106
107
  function: {
107
108
  name: p.functionCall.name,
108
109
  arguments: JSON.stringify(p.functionCall.args)
109
- }
110
+ },
111
+ ...(p.thoughtSignature && { thought_signature: p.thoughtSignature })
110
112
  }));
111
113
  const attachments = contentParts
112
114
  .filter((p) => p.inlineData)
@@ -1 +1 @@
1
- {"version":3,"file":"ChatUtils.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/ChatUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,qBAAa,eAAe;WACb,eAAe,CAC1B,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,sBAAsB,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;CAyFhF"}
1
+ {"version":3,"file":"ChatUtils.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/ChatUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,qBAAa,eAAe;WACb,eAAe,CAC1B,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,sBAAsB,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;CA0FhF"}
@@ -79,7 +79,8 @@ export class GeminiChatUtils {
79
79
  functionCall: {
80
80
  name: call.function.name,
81
81
  args: JSON.parse(call.function.arguments)
82
- }
82
+ },
83
+ ...(call.thought_signature && { thoughtSignature: call.thought_signature })
83
84
  });
84
85
  }
85
86
  }
@@ -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 +1 @@
1
- {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAUxD,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;IAyN7F,OAAO,CAAC,cAAc;CAyBvB"}
1
+ {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAUxD,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;IA0N7F,OAAO,CAAC,cAAc;CAyBvB"}
@@ -52,7 +52,7 @@ export class GeminiStreaming {
52
52
  functionDeclarations: request.tools.map((t) => ({
53
53
  name: t.function.name,
54
54
  description: t.function.description,
55
- parameters: t.function.parameters
55
+ parametersJsonSchema: t.function.parameters
56
56
  }))
57
57
  }
58
58
  ];
@@ -152,7 +152,8 @@ export class GeminiStreaming {
152
152
  function: {
153
153
  name: part.functionCall.name,
154
154
  arguments: JSON.stringify(part.functionCall.args || {})
155
- }
155
+ },
156
+ ...(part.thoughtSignature && { thought_signature: part.thoughtSignature })
156
157
  });
157
158
  }
158
159
  }
@@ -13,6 +13,7 @@ export interface GeminiPart {
13
13
  response: Record<string, unknown>;
14
14
  };
15
15
  thought?: boolean;
16
+ thoughtSignature?: string;
16
17
  }
17
18
  export interface GeminiContent {
18
19
  role?: "user" | "model";
@@ -28,6 +29,7 @@ export interface GeminiGenerateContentRequest {
28
29
  name: string;
29
30
  description?: string;
30
31
  parameters?: Record<string, unknown>;
32
+ parametersJsonSchema?: Record<string, unknown>;
31
33
  }>;
32
34
  }[];
33
35
  generationConfig?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/types.ts"],"names":[],"mappings":"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"}
@@ -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"}