@node-llm/core 1.5.2 → 1.6.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 (185) hide show
  1. package/README.md +84 -110
  2. package/dist/aliases.js +239 -239
  3. package/dist/chat/Chat.d.ts +18 -17
  4. package/dist/chat/Chat.d.ts.map +1 -1
  5. package/dist/chat/Chat.js +63 -42
  6. package/dist/chat/ChatOptions.d.ts +8 -9
  7. package/dist/chat/ChatOptions.d.ts.map +1 -1
  8. package/dist/chat/ChatResponse.d.ts +1 -1
  9. package/dist/chat/ChatResponse.d.ts.map +1 -1
  10. package/dist/chat/ChatResponse.js +22 -8
  11. package/dist/chat/ChatStream.d.ts.map +1 -1
  12. package/dist/chat/ChatStream.js +16 -22
  13. package/dist/chat/Content.d.ts +3 -3
  14. package/dist/chat/Content.d.ts.map +1 -1
  15. package/dist/chat/Content.js +3 -6
  16. package/dist/chat/Message.d.ts +3 -1
  17. package/dist/chat/Message.d.ts.map +1 -1
  18. package/dist/chat/Role.d.ts.map +1 -1
  19. package/dist/chat/Tool.d.ts +15 -15
  20. package/dist/chat/Tool.d.ts.map +1 -1
  21. package/dist/chat/Tool.js +9 -7
  22. package/dist/chat/ToolHandler.d.ts +4 -3
  23. package/dist/chat/ToolHandler.d.ts.map +1 -1
  24. package/dist/chat/ToolHandler.js +10 -14
  25. package/dist/chat/Validation.d.ts.map +1 -1
  26. package/dist/chat/Validation.js +13 -6
  27. package/dist/config.d.ts +4 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +80 -25
  30. package/dist/constants.js +1 -1
  31. package/dist/errors/index.d.ts +21 -7
  32. package/dist/errors/index.d.ts.map +1 -1
  33. package/dist/errors/index.js +14 -0
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -1
  37. package/dist/llm.d.ts +44 -46
  38. package/dist/llm.d.ts.map +1 -1
  39. package/dist/llm.js +206 -134
  40. package/dist/model_aliases.d.ts.map +1 -1
  41. package/dist/models/ModelRegistry.d.ts.map +1 -1
  42. package/dist/models/ModelRegistry.js +12 -10
  43. package/dist/models/PricingRegistry.d.ts +31 -0
  44. package/dist/models/PricingRegistry.d.ts.map +1 -0
  45. package/dist/models/PricingRegistry.js +101 -0
  46. package/dist/models/models.d.ts.map +1 -1
  47. package/dist/models/models.js +5954 -7352
  48. package/dist/models/types.d.ts +37 -34
  49. package/dist/models/types.d.ts.map +1 -1
  50. package/dist/moderation/Moderation.d.ts.map +1 -1
  51. package/dist/moderation/Moderation.js +15 -5
  52. package/dist/providers/BaseProvider.d.ts +12 -8
  53. package/dist/providers/BaseProvider.d.ts.map +1 -1
  54. package/dist/providers/BaseProvider.js +17 -7
  55. package/dist/providers/Provider.d.ts +20 -5
  56. package/dist/providers/Provider.d.ts.map +1 -1
  57. package/dist/providers/anthropic/AnthropicProvider.d.ts +1 -1
  58. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  59. package/dist/providers/anthropic/AnthropicProvider.js +3 -3
  60. package/dist/providers/anthropic/Capabilities.d.ts +2 -1
  61. package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
  62. package/dist/providers/anthropic/Capabilities.js +3 -20
  63. package/dist/providers/anthropic/Chat.d.ts.map +1 -1
  64. package/dist/providers/anthropic/Chat.js +27 -17
  65. package/dist/providers/anthropic/Errors.d.ts.map +1 -1
  66. package/dist/providers/anthropic/Errors.js +5 -2
  67. package/dist/providers/anthropic/Models.d.ts.map +1 -1
  68. package/dist/providers/anthropic/Models.js +6 -6
  69. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  70. package/dist/providers/anthropic/Streaming.js +17 -12
  71. package/dist/providers/anthropic/Utils.js +8 -5
  72. package/dist/providers/anthropic/index.d.ts.map +1 -1
  73. package/dist/providers/anthropic/index.js +4 -3
  74. package/dist/providers/anthropic/types.d.ts +11 -4
  75. package/dist/providers/anthropic/types.d.ts.map +1 -1
  76. package/dist/providers/deepseek/Capabilities.d.ts +7 -5
  77. package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
  78. package/dist/providers/deepseek/Capabilities.js +9 -5
  79. package/dist/providers/deepseek/Chat.d.ts.map +1 -1
  80. package/dist/providers/deepseek/Chat.js +10 -9
  81. package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -1
  82. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  83. package/dist/providers/deepseek/DeepSeekProvider.js +4 -4
  84. package/dist/providers/deepseek/Models.d.ts.map +1 -1
  85. package/dist/providers/deepseek/Models.js +7 -7
  86. package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
  87. package/dist/providers/deepseek/Streaming.js +11 -8
  88. package/dist/providers/deepseek/index.d.ts.map +1 -1
  89. package/dist/providers/deepseek/index.js +5 -4
  90. package/dist/providers/gemini/Capabilities.d.ts +5 -33
  91. package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
  92. package/dist/providers/gemini/Capabilities.js +7 -30
  93. package/dist/providers/gemini/Chat.d.ts.map +1 -1
  94. package/dist/providers/gemini/Chat.js +24 -19
  95. package/dist/providers/gemini/ChatUtils.d.ts.map +1 -1
  96. package/dist/providers/gemini/ChatUtils.js +10 -10
  97. package/dist/providers/gemini/Embeddings.d.ts.map +1 -1
  98. package/dist/providers/gemini/Embeddings.js +2 -2
  99. package/dist/providers/gemini/Errors.d.ts.map +1 -1
  100. package/dist/providers/gemini/Errors.js +5 -2
  101. package/dist/providers/gemini/GeminiProvider.d.ts +1 -1
  102. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  103. package/dist/providers/gemini/GeminiProvider.js +3 -3
  104. package/dist/providers/gemini/Image.d.ts.map +1 -1
  105. package/dist/providers/gemini/Image.js +8 -8
  106. package/dist/providers/gemini/Models.d.ts.map +1 -1
  107. package/dist/providers/gemini/Models.js +6 -6
  108. package/dist/providers/gemini/Streaming.d.ts.map +1 -1
  109. package/dist/providers/gemini/Streaming.js +18 -14
  110. package/dist/providers/gemini/Transcription.d.ts.map +1 -1
  111. package/dist/providers/gemini/Transcription.js +11 -11
  112. package/dist/providers/gemini/index.d.ts +1 -1
  113. package/dist/providers/gemini/index.d.ts.map +1 -1
  114. package/dist/providers/gemini/index.js +5 -4
  115. package/dist/providers/gemini/types.d.ts +4 -4
  116. package/dist/providers/gemini/types.d.ts.map +1 -1
  117. package/dist/providers/ollama/Capabilities.d.ts.map +1 -1
  118. package/dist/providers/ollama/Capabilities.js +6 -2
  119. package/dist/providers/ollama/Models.js +1 -1
  120. package/dist/providers/ollama/OllamaProvider.d.ts +1 -1
  121. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  122. package/dist/providers/ollama/OllamaProvider.js +2 -2
  123. package/dist/providers/ollama/index.d.ts +1 -1
  124. package/dist/providers/ollama/index.d.ts.map +1 -1
  125. package/dist/providers/ollama/index.js +7 -3
  126. package/dist/providers/openai/Capabilities.d.ts +2 -1
  127. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  128. package/dist/providers/openai/Capabilities.js +9 -21
  129. package/dist/providers/openai/Chat.d.ts.map +1 -1
  130. package/dist/providers/openai/Chat.js +18 -14
  131. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  132. package/dist/providers/openai/Embedding.js +11 -7
  133. package/dist/providers/openai/Errors.d.ts.map +1 -1
  134. package/dist/providers/openai/Errors.js +5 -2
  135. package/dist/providers/openai/Image.d.ts.map +1 -1
  136. package/dist/providers/openai/Image.js +6 -6
  137. package/dist/providers/openai/Models.d.ts +1 -1
  138. package/dist/providers/openai/Models.d.ts.map +1 -1
  139. package/dist/providers/openai/Models.js +12 -8
  140. package/dist/providers/openai/Moderation.d.ts.map +1 -1
  141. package/dist/providers/openai/Moderation.js +6 -6
  142. package/dist/providers/openai/OpenAIProvider.d.ts +2 -3
  143. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  144. package/dist/providers/openai/OpenAIProvider.js +4 -4
  145. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  146. package/dist/providers/openai/Streaming.js +18 -13
  147. package/dist/providers/openai/Transcription.d.ts.map +1 -1
  148. package/dist/providers/openai/Transcription.js +15 -12
  149. package/dist/providers/openai/index.d.ts +1 -1
  150. package/dist/providers/openai/index.d.ts.map +1 -1
  151. package/dist/providers/openai/index.js +6 -5
  152. package/dist/providers/openai/types.d.ts +1 -1
  153. package/dist/providers/openai/utils.js +2 -2
  154. package/dist/providers/openrouter/Capabilities.d.ts +3 -3
  155. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
  156. package/dist/providers/openrouter/Capabilities.js +21 -24
  157. package/dist/providers/openrouter/Models.d.ts.map +1 -1
  158. package/dist/providers/openrouter/Models.js +20 -16
  159. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  160. package/dist/providers/openrouter/OpenRouterProvider.js +1 -1
  161. package/dist/providers/openrouter/index.d.ts +1 -1
  162. package/dist/providers/openrouter/index.d.ts.map +1 -1
  163. package/dist/providers/openrouter/index.js +6 -5
  164. package/dist/providers/registry.d.ts +18 -2
  165. package/dist/providers/registry.d.ts.map +1 -1
  166. package/dist/providers/registry.js +17 -2
  167. package/dist/providers/utils.js +1 -1
  168. package/dist/schema/Schema.d.ts +3 -3
  169. package/dist/schema/Schema.d.ts.map +1 -1
  170. package/dist/schema/Schema.js +2 -2
  171. package/dist/schema/to-json-schema.d.ts +1 -1
  172. package/dist/schema/to-json-schema.d.ts.map +1 -1
  173. package/dist/streaming/Stream.d.ts.map +1 -1
  174. package/dist/streaming/Stream.js +3 -3
  175. package/dist/utils/Binary.d.ts.map +1 -1
  176. package/dist/utils/Binary.js +32 -23
  177. package/dist/utils/FileLoader.d.ts.map +1 -1
  178. package/dist/utils/FileLoader.js +25 -4
  179. package/dist/utils/audio.js +2 -2
  180. package/dist/utils/fetch.d.ts.map +1 -1
  181. package/dist/utils/fetch.js +14 -4
  182. package/dist/utils/logger.d.ts +3 -3
  183. package/dist/utils/logger.d.ts.map +1 -1
  184. package/dist/utils/logger.js +2 -2
  185. package/package.json +1 -1
@@ -18,7 +18,9 @@ export class OllamaCapabilities {
18
18
  static supportsVision(modelId) {
19
19
  const model = this.findModel(modelId);
20
20
  if (model) {
21
- return model.modalities?.input?.includes("image") || model.capabilities?.includes("vision") || false;
21
+ return (model.modalities?.input?.includes("image") ||
22
+ model.capabilities?.includes("vision") ||
23
+ false);
22
24
  }
23
25
  // Fallback for custom models not in registry
24
26
  return /vision|llava|moondream|bakllava/.test(modelId.toLowerCase());
@@ -33,7 +35,9 @@ export class OllamaCapabilities {
33
35
  }
34
36
  static supportsEmbeddings(modelId) {
35
37
  const model = this.findModel(modelId);
36
- return model?.modalities?.output?.includes("embeddings") || model?.capabilities?.includes("embeddings") || false;
38
+ return (model?.modalities?.output?.includes("embeddings") ||
39
+ model?.capabilities?.includes("embeddings") ||
40
+ false);
37
41
  }
38
42
  static supportsReasoning(modelId) {
39
43
  const model = this.findModel(modelId);
@@ -9,7 +9,7 @@ export class OllamaModels extends OpenAIModels {
9
9
  if (model?.name && model.name !== modelId)
10
10
  return model.name;
11
11
  const baseId = modelId.split(":")[0] || modelId;
12
- return baseId.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase());
12
+ return baseId.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
13
13
  }
14
14
  getContextWindow(modelId) {
15
15
  return OllamaCapabilities.getContextWindow(modelId);
@@ -5,6 +5,6 @@ export interface OllamaProviderOptions {
5
5
  export declare class OllamaProvider extends OpenAIProvider {
6
6
  constructor(options?: OllamaProviderOptions);
7
7
  protected providerName(): string;
8
- defaultModel(feature?: string): string;
8
+ defaultModel(_feature?: string): string;
9
9
  }
10
10
  //# sourceMappingURL=OllamaProvider.d.ts.map
@@ -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;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IAyB/C,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;CAGvD"}
1
+ {"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IA2B/C,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;CAGxD"}
@@ -23,13 +23,13 @@ export class OllamaProvider extends OpenAIProvider {
23
23
  supportsModeration: (modelId) => OllamaCapabilities.supportsModeration(modelId),
24
24
  supportsReasoning: (modelId) => OllamaCapabilities.supportsReasoning(modelId),
25
25
  supportsDeveloperRole: (_modelId) => false,
26
- getContextWindow: (modelId) => OllamaCapabilities.getContextWindow(modelId),
26
+ getContextWindow: (modelId) => OllamaCapabilities.getContextWindow(modelId)
27
27
  };
28
28
  }
29
29
  providerName() {
30
30
  return "Ollama";
31
31
  }
32
- defaultModel(feature) {
32
+ defaultModel(_feature) {
33
33
  return "llama3";
34
34
  }
35
35
  }
@@ -2,7 +2,7 @@ import { OllamaProvider } from "./OllamaProvider.js";
2
2
  export { OllamaProvider };
3
3
  /**
4
4
  * Idempotent registration of the Ollama provider.
5
- * Automatically called by NodeLLM.configure({ provider: 'ollama' })
5
+ * Automatically called when using createLLM({ provider: 'ollama' })
6
6
  */
7
7
  export declare function registerOllamaProvider(): void;
8
8
  export declare const ensureOllamaRegistered: typeof registerOllamaProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B;;;GAGG;AACH,wBAAgB,sBAAsB,SAQrC;AAED,eAAO,MAAM,sBAAsB,+BAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B;;;GAGG;AACH,wBAAgB,sBAAsB,SAWrC;AAED,eAAO,MAAM,sBAAsB,+BAAyB,CAAC"}
@@ -1,16 +1,20 @@
1
+ import { config as globalConfig } from "../../config.js";
1
2
  import { providerRegistry } from "../registry.js";
2
3
  import { OllamaProvider } from "./OllamaProvider.js";
3
4
  export { OllamaProvider };
4
5
  let registered = false;
5
6
  /**
6
7
  * Idempotent registration of the Ollama provider.
7
- * Automatically called by NodeLLM.configure({ provider: 'ollama' })
8
+ * Automatically called when using createLLM({ provider: 'ollama' })
8
9
  */
9
10
  export function registerOllamaProvider() {
10
11
  if (registered)
11
12
  return;
12
- providerRegistry.register("ollama", () => {
13
- return new OllamaProvider();
13
+ providerRegistry.register("ollama", (config) => {
14
+ const cfg = config || globalConfig;
15
+ return new OllamaProvider({
16
+ baseUrl: cfg.ollamaApiBase
17
+ });
14
18
  });
15
19
  registered = true;
16
20
  }
@@ -1,3 +1,4 @@
1
+ import { ModelPricing } from "../../models/types.js";
1
2
  export declare class Capabilities {
2
3
  static getContextWindow(modelId: string): number | null;
3
4
  static getMaxOutputTokens(modelId: string): number | null;
@@ -20,6 +21,6 @@ export declare class Capabilities {
20
21
  static getCapabilities(modelId: string): string[];
21
22
  static normalizeTemperature(temperature: number | undefined, modelId: string): number | undefined | null;
22
23
  static formatDisplayName(modelId: string): string;
23
- static getPricing(modelId: string): any;
24
+ static getPricing(modelId: string): ModelPricing | undefined;
24
25
  }
25
26
  //# sourceMappingURL=Capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOlD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,qBAAqB,GAAG,cAAc;IAWvI,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAiB5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAoBjD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAMxG,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAOjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG;CAcxC"}
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;IAUvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOlD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,YAAY,CACjB,OAAO,EAAE,MAAM,GAEb,YAAY,GACZ,OAAO,GACP,YAAY,GACZ,OAAO,GACP,MAAM,GACN,qBAAqB,GACrB,cAAc;IAWlB,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAiB5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAsBjD,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;IAOjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;CAG7D"}
@@ -1,4 +1,5 @@
1
1
  import { ModelRegistry } from "../../models/ModelRegistry.js";
2
+ import { PricingRegistry } from "../../models/PricingRegistry.js";
2
3
  export class Capabilities {
3
4
  static getContextWindow(modelId) {
4
5
  const val = ModelRegistry.getContextWindow(modelId, "openai");
@@ -51,7 +52,8 @@ export class Capabilities {
51
52
  }
52
53
  static supportsImageGeneration(modelId) {
53
54
  const model = ModelRegistry.find(modelId, "openai");
54
- if (model?.capabilities?.includes("image_generation") || model?.modalities?.output?.includes("image"))
55
+ if (model?.capabilities?.includes("image_generation") ||
56
+ model?.modalities?.output?.includes("image"))
55
57
  return true;
56
58
  return /dall-e|image/.test(modelId);
57
59
  }
@@ -118,8 +120,10 @@ export class Capabilities {
118
120
  const caps = ["streaming"];
119
121
  const model = ModelRegistry.find(modelId, "openai");
120
122
  if (model) {
121
- model.capabilities.forEach(c => { if (!caps.includes(c))
122
- caps.push(c); });
123
+ model.capabilities.forEach((c) => {
124
+ if (!caps.includes(c))
125
+ caps.push(c);
126
+ });
123
127
  return caps;
124
128
  }
125
129
  if (this.supportsTools(modelId))
@@ -147,25 +151,9 @@ export class Capabilities {
147
151
  const model = ModelRegistry.find(modelId, "openai");
148
152
  if (model?.name && model.name !== modelId)
149
153
  return model.name;
150
- return modelId.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase());
154
+ return modelId.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
151
155
  }
152
156
  static getPricing(modelId) {
153
- const model = ModelRegistry.find(modelId, "openai");
154
- if (model?.pricing)
155
- return model.pricing;
156
- let input = 2.5, output = 10.0;
157
- if (/gpt-3/.test(modelId)) {
158
- input = 0.5;
159
- output = 1.5;
160
- }
161
- if (/mini/.test(modelId)) {
162
- input = 0.15;
163
- output = 0.6;
164
- }
165
- return {
166
- text_tokens: {
167
- standard: { input_per_million: input, output_per_million: output }
168
- }
169
- };
157
+ return PricingRegistry.getPricing(modelId, "openai");
170
158
  }
171
159
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AASlE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,aAAa;IAA2B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAF5F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,aAAa,EAAE,cAAc,GAAG,MAAM,EAAmB,MAAM,EAAE,MAAM;IAI9F,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA0E3D"}
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;AAGrD,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;CA4F3D"}
@@ -17,10 +17,11 @@ export class OpenAIChat {
17
17
  async execute(request) {
18
18
  const temperature = Capabilities.normalizeTemperature(request.temperature, request.model);
19
19
  const isMainOpenAI = this.baseUrl.includes("api.openai.com");
20
- const supportsDeveloperRole = isMainOpenAI && (typeof this.providerOrUrl === "string"
21
- ? Capabilities.supportsDeveloperRole(request.model)
22
- : this.providerOrUrl.capabilities?.supportsDeveloperRole(request.model));
23
- const { model, messages, tools, temperature: _, max_tokens, response_format, headers, requestTimeout, ...rest } = request;
20
+ const supportsDeveloperRole = isMainOpenAI &&
21
+ (typeof this.providerOrUrl === "string"
22
+ ? Capabilities.supportsDeveloperRole(request.model)
23
+ : this.providerOrUrl.capabilities?.supportsDeveloperRole(request.model));
24
+ const { model, messages, tools, temperature: _, max_tokens, response_format, headers: _headers, requestTimeout: _requestTimeout, signal, ...rest } = request;
24
25
  const mappedMessages = mapSystemMessages(messages, !!supportsDeveloperRole);
25
26
  const body = {
26
27
  model,
@@ -41,16 +42,17 @@ export class OpenAIChat {
41
42
  body.tools = tools;
42
43
  if (response_format)
43
44
  body.response_format = response_format;
44
- const url = buildUrl(this.baseUrl, '/chat/completions');
45
+ const url = buildUrl(this.baseUrl, "/chat/completions");
45
46
  logger.logRequest("OpenAI", "POST", url, body);
46
47
  const response = await fetchWithTimeout(url, {
47
48
  method: "POST",
48
49
  headers: {
49
- "Authorization": `Bearer ${this.apiKey}`,
50
+ Authorization: `Bearer ${this.apiKey}`,
50
51
  "Content-Type": "application/json",
51
- ...request.headers,
52
+ ...request.headers
52
53
  },
53
54
  body: JSON.stringify(body),
55
+ signal: signal
54
56
  }, request.requestTimeout);
55
57
  if (!response.ok) {
56
58
  await handleOpenAIError(response, request.model);
@@ -61,13 +63,15 @@ export class OpenAIChat {
61
63
  const content = message?.content ?? null;
62
64
  const tool_calls = message?.tool_calls;
63
65
  const reasoning = message?.reasoning_content || null;
64
- const usage = json.usage ? {
65
- input_tokens: json.usage.prompt_tokens,
66
- output_tokens: json.usage.completion_tokens,
67
- total_tokens: json.usage.total_tokens,
68
- cached_tokens: json.usage.prompt_tokens_details?.cached_tokens,
69
- reasoning_tokens: json.usage.completion_tokens_details?.reasoning_tokens,
70
- } : undefined;
66
+ const usage = json.usage
67
+ ? {
68
+ input_tokens: json.usage.prompt_tokens,
69
+ output_tokens: json.usage.completion_tokens,
70
+ total_tokens: json.usage.total_tokens,
71
+ cached_tokens: json.usage.prompt_tokens_details?.cached_tokens,
72
+ reasoning_tokens: json.usage.completion_tokens_details?.reasoning_tokens
73
+ }
74
+ : undefined;
71
75
  if (!content && !tool_calls) {
72
76
  throw new Error("OpenAI returned empty response");
73
77
  }
@@ -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;CA+CrE"}
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"}
@@ -24,7 +24,7 @@ export class OpenAIEmbedding {
24
24
  this.validateModel(model);
25
25
  const body = {
26
26
  input: request.input,
27
- model,
27
+ model
28
28
  };
29
29
  if (request.dimensions) {
30
30
  body.dimensions = request.dimensions;
@@ -32,28 +32,32 @@ export class OpenAIEmbedding {
32
32
  if (request.user) {
33
33
  body.user = request.user;
34
34
  }
35
- const url = buildUrl(this.baseUrl, '/embeddings');
35
+ const url = buildUrl(this.baseUrl, "/embeddings");
36
36
  logger.logRequest("OpenAI", "POST", url, body);
37
37
  const response = await fetchWithTimeout(url, {
38
38
  method: "POST",
39
39
  headers: {
40
- "Authorization": `Bearer ${this.apiKey}`,
41
- "Content-Type": "application/json",
40
+ Authorization: `Bearer ${this.apiKey}`,
41
+ "Content-Type": "application/json"
42
42
  },
43
- body: JSON.stringify(body),
43
+ body: JSON.stringify(body)
44
44
  }, request.requestTimeout);
45
45
  if (!response.ok) {
46
46
  await handleOpenAIError(response, request.model || DEFAULT_MODELS.EMBEDDING);
47
47
  }
48
48
  const { data, model: responseModel, usage } = await response.json();
49
- logger.logResponse("OpenAI", response.status, response.statusText, { data, model: responseModel, usage });
49
+ logger.logResponse("OpenAI", response.status, response.statusText, {
50
+ data,
51
+ model: responseModel,
52
+ usage
53
+ });
50
54
  // Extract vectors from the response
51
55
  const vectors = data.map((item) => item.embedding);
52
56
  return {
53
57
  vectors,
54
58
  model: responseModel,
55
59
  input_tokens: usage.prompt_tokens,
56
- dimensions: vectors[0]?.length || 0,
60
+ dimensions: vectors[0]?.length || 0
57
61
  };
58
62
  }
59
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Errors.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAuC1F"}
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Errors.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CA0C1F"}
@@ -5,8 +5,11 @@ export async function handleOpenAIError(response, model) {
5
5
  let message = `OpenAI error (${status})`;
6
6
  try {
7
7
  body = await response.json();
8
- if (body?.error?.message) {
9
- message = body.error.message;
8
+ if (body && typeof body === "object" && "error" in body) {
9
+ const err = body.error;
10
+ if (err && err.message) {
11
+ message = err.message;
12
+ }
10
13
  }
11
14
  }
12
15
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM7D,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAuC7D"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM7D,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,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CA2C7D"}
@@ -15,17 +15,17 @@ export class OpenAIImage {
15
15
  prompt: request.prompt,
16
16
  size: request.size || "1024x1024",
17
17
  quality: request.quality || "standard",
18
- n: request.n || 1,
18
+ n: request.n || 1
19
19
  };
20
- const url = buildUrl(this.baseUrl, '/images/generations');
20
+ const url = buildUrl(this.baseUrl, "/images/generations");
21
21
  logger.logRequest("OpenAI", "POST", url, body);
22
22
  const response = await fetchWithTimeout(url, {
23
23
  method: "POST",
24
24
  headers: {
25
- "Authorization": `Bearer ${this.apiKey}`,
26
- "Content-Type": "application/json",
25
+ Authorization: `Bearer ${this.apiKey}`,
26
+ "Content-Type": "application/json"
27
27
  },
28
- body: JSON.stringify(body),
28
+ body: JSON.stringify(body)
29
29
  }, request.requestTimeout);
30
30
  if (!response.ok) {
31
31
  await handleOpenAIError(response, request.model);
@@ -39,7 +39,7 @@ export class OpenAIImage {
39
39
  return {
40
40
  url: data.url,
41
41
  revised_prompt: data.revised_prompt,
42
- mime_type: "image/png",
42
+ mime_type: "image/png"
43
43
  };
44
44
  }
45
45
  }
@@ -12,7 +12,7 @@ export declare class OpenAIModels {
12
12
  output: string[];
13
13
  };
14
14
  protected getCapabilities(modelId: string): string[];
15
- protected getPricing(modelId: string): any;
15
+ protected getPricing(modelId: string): import("../../models/types.js").ModelPricing | undefined;
16
16
  execute(): Promise<ModelInfo[]>;
17
17
  find(modelId: string): import("../../models/types.js").Model | undefined;
18
18
  }
@@ -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;AAK3C,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;IAI1D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI5D,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;IAwDrC,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;AAK3C,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;IAwDrC,IAAI,CAAC,OAAO,EAAE,MAAM;CAGrB"}
@@ -18,10 +18,14 @@ export class OpenAIModels {
18
18
  return Capabilities.formatDisplayName(modelId);
19
19
  }
20
20
  getContextWindow(modelId) {
21
- return ModelRegistry.getContextWindow(modelId, this.getProviderName()) || Capabilities.getContextWindow(modelId) || null;
21
+ return (ModelRegistry.getContextWindow(modelId, this.getProviderName()) ||
22
+ Capabilities.getContextWindow(modelId) ||
23
+ null);
22
24
  }
23
25
  getMaxOutputTokens(modelId) {
24
- return ModelRegistry.getMaxOutputTokens(modelId, this.getProviderName()) || Capabilities.getMaxOutputTokens(modelId) || null;
26
+ return (ModelRegistry.getMaxOutputTokens(modelId, this.getProviderName()) ||
27
+ Capabilities.getMaxOutputTokens(modelId) ||
28
+ null);
25
29
  }
26
30
  getModalities(modelId) {
27
31
  const model = ModelRegistry.find(modelId, this.getProviderName());
@@ -38,16 +42,16 @@ export class OpenAIModels {
38
42
  async execute() {
39
43
  const provider = this.getProviderName();
40
44
  try {
41
- const response = await fetch(buildUrl(this.baseUrl, '/models'), {
45
+ const response = await fetch(buildUrl(this.baseUrl, "/models"), {
42
46
  method: "GET",
43
47
  headers: {
44
- "Authorization": `Bearer ${this.apiKey}`,
45
- "Content-Type": "application/json",
46
- },
48
+ Authorization: `Bearer ${this.apiKey}`,
49
+ "Content-Type": "application/json"
50
+ }
47
51
  });
48
52
  if (response.ok) {
49
- const { data } = await response.json();
50
- return data.map(m => {
53
+ const { data } = (await response.json());
54
+ return data.map((m) => {
51
55
  const modelId = m.id;
52
56
  const registryModel = ModelRegistry.find(modelId, provider);
53
57
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"Moderation.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Moderation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAOvE,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0BvE"}
1
+ {"version":3,"file":"Moderation.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Moderation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAOvE,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA8BvE"}
@@ -13,22 +13,22 @@ export class OpenAIModeration {
13
13
  async execute(request) {
14
14
  const body = {
15
15
  input: request.input,
16
- model: request.model || DEFAULT_MODELS.MODERATION,
16
+ model: request.model || DEFAULT_MODELS.MODERATION
17
17
  };
18
- const url = buildUrl(this.baseUrl, '/moderations');
18
+ const url = buildUrl(this.baseUrl, "/moderations");
19
19
  logger.logRequest("OpenAI", "POST", url, body);
20
20
  const response = await fetchWithTimeout(url, {
21
21
  method: "POST",
22
22
  headers: {
23
- "Authorization": `Bearer ${this.apiKey}`,
24
- "Content-Type": "application/json",
23
+ Authorization: `Bearer ${this.apiKey}`,
24
+ "Content-Type": "application/json"
25
25
  },
26
- body: JSON.stringify(body),
26
+ body: JSON.stringify(body)
27
27
  }, request.requestTimeout);
28
28
  if (!response.ok) {
29
29
  await handleOpenAIError(response, request.model || DEFAULT_MODELS.MODERATION);
30
30
  }
31
- const json = await response.json();
31
+ const json = (await response.json());
32
32
  logger.logResponse("OpenAI", response.status, response.statusText, json);
33
33
  return json;
34
34
  }
@@ -1,4 +1,4 @@
1
- import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, ModerationRequest, ModerationResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
1
+ import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, ModerationRequest, ModerationResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
2
  import { BaseProvider } from "../BaseProvider.js";
3
3
  import { OpenAIChat } from "./Chat.js";
4
4
  import { OpenAIStreaming } from "./Streaming.js";
@@ -7,7 +7,6 @@ import { OpenAIImage } from "./Image.js";
7
7
  import { OpenAITranscription } from "./Transcription.js";
8
8
  import { OpenAIModeration } from "./Moderation.js";
9
9
  import { OpenAIEmbedding } from "./Embedding.js";
10
- import { TranscriptionRequest, TranscriptionResponse } from "../Provider.js";
11
10
  export interface OpenAIProviderOptions {
12
11
  apiKey: string;
13
12
  baseUrl?: string;
@@ -38,7 +37,7 @@ export declare class OpenAIProvider extends BaseProvider implements Provider {
38
37
  apiBase(): string;
39
38
  headers(): Record<string, string>;
40
39
  protected providerName(): string;
41
- defaultModel(feature?: string): string;
40
+ defaultModel(_feature?: string): string;
42
41
  chat(request: ChatRequest): Promise<ChatResponse>;
43
42
  stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
44
43
  listModels(): Promise<ModelInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpM,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,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;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAuBtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IAtB7D,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;yCACA,MAAM;kCACb,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;IAIhD,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,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;AAElD,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;yCACA,MAAM;kCAEb,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,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,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"}
@@ -27,7 +27,7 @@ export class OpenAIProvider extends BaseProvider {
27
27
  supportsModeration: (model) => Capabilities.supportsModeration(model),
28
28
  supportsReasoning: (model) => Capabilities.supportsReasoning(model),
29
29
  supportsDeveloperRole: (modelId) => this.baseUrl.includes("api.openai.com") && Capabilities.supportsDeveloperRole(modelId),
30
- getContextWindow: (model) => Capabilities.getContextWindow(model) || null,
30
+ getContextWindow: (model) => Capabilities.getContextWindow(model) || null
31
31
  };
32
32
  constructor(options) {
33
33
  super();
@@ -46,14 +46,14 @@ export class OpenAIProvider extends BaseProvider {
46
46
  }
47
47
  headers() {
48
48
  return {
49
- "Authorization": `Bearer ${this.options.apiKey}`,
50
- "Content-Type": "application/json",
49
+ Authorization: `Bearer ${this.options.apiKey}`,
50
+ "Content-Type": "application/json"
51
51
  };
52
52
  }
53
53
  providerName() {
54
54
  return "OpenAI";
55
55
  }
56
- defaultModel(feature) {
56
+ defaultModel(_feature) {
57
57
  return "gpt-4o";
58
58
  }
59
59
  async chat(request) {
@@ -1 +1 @@
1
- {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,aAAa;IAA2B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAF5F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,aAAa,EAAE,cAAc,GAAG,MAAM,EAAmB,MAAM,EAAE,MAAM;IAI7F,OAAO,CACZ,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,eAAe,GAC3B,cAAc,CAAC,SAAS,CAAC;CAkL7B"}
1
+ {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,qBAAa,eAAe;IAIxB,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;IAK1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;CA0L9F"}
@@ -15,17 +15,19 @@ export class OpenAIStreaming {
15
15
  this.baseUrl = typeof providerOrUrl === "string" ? providerOrUrl : providerOrUrl.apiBase();
16
16
  }
17
17
  async *execute(request, controller) {
18
- const abortController = controller || new AbortController();
18
+ const abortController = controller ||
19
+ (request.signal ? { signal: request.signal } : new AbortController());
19
20
  const temperature = Capabilities.normalizeTemperature(request.temperature, request.model);
20
21
  const isMainOpenAI = this.baseUrl.includes("api.openai.com");
21
- const supportsDeveloperRole = isMainOpenAI && (typeof this.providerOrUrl === "string"
22
- ? Capabilities.supportsDeveloperRole(request.model)
23
- : this.providerOrUrl.capabilities?.supportsDeveloperRole(request.model));
22
+ const supportsDeveloperRole = isMainOpenAI &&
23
+ (typeof this.providerOrUrl === "string"
24
+ ? Capabilities.supportsDeveloperRole(request.model)
25
+ : this.providerOrUrl.capabilities?.supportsDeveloperRole(request.model));
24
26
  const mappedMessages = mapSystemMessages(request.messages, !!supportsDeveloperRole);
25
27
  const body = {
26
28
  model: request.model,
27
29
  messages: mappedMessages,
28
- stream: true,
30
+ stream: true
29
31
  };
30
32
  if (temperature !== undefined && temperature !== null) {
31
33
  body.temperature = temperature;
@@ -48,22 +50,25 @@ export class OpenAIStreaming {
48
50
  // Track tool calls being built across chunks
49
51
  const toolCallsMap = new Map();
50
52
  try {
51
- const url = buildUrl(this.baseUrl, '/chat/completions');
53
+ const url = buildUrl(this.baseUrl, "/chat/completions");
52
54
  logger.logRequest("OpenAI", "POST", url, body);
53
55
  const response = await fetchWithTimeout(url, {
54
56
  method: "POST",
55
57
  headers: {
56
- "Authorization": `Bearer ${this.apiKey}`,
58
+ Authorization: `Bearer ${this.apiKey}`,
57
59
  "Content-Type": "application/json",
58
- ...request.headers,
60
+ ...request.headers
59
61
  },
60
62
  body: JSON.stringify(body),
61
- signal: abortController.signal,
63
+ signal: abortController.signal
62
64
  }, request.requestTimeout);
63
65
  if (!response.ok) {
64
66
  await handleOpenAIError(response, request.model);
65
67
  }
66
- logger.debug("OpenAI streaming started", { status: response.status, statusText: response.statusText });
68
+ logger.debug("OpenAI streaming started", {
69
+ status: response.status,
70
+ statusText: response.statusText
71
+ });
67
72
  if (!response.body) {
68
73
  throw new Error("No response body for streaming");
69
74
  }
@@ -81,7 +86,7 @@ export class OpenAIStreaming {
81
86
  for (const line of lines) {
82
87
  let trimmed = line.trim();
83
88
  // Handle carriage returns
84
- if (trimmed.endsWith('\r')) {
89
+ if (trimmed.endsWith("\r")) {
85
90
  trimmed = trimmed.substring(0, trimmed.length - 1);
86
91
  }
87
92
  if (!trimmed.startsWith("data: "))
@@ -91,7 +96,7 @@ export class OpenAIStreaming {
91
96
  done = true;
92
97
  // Yield final tool calls if any were accumulated
93
98
  if (toolCallsMap.size > 0) {
94
- const toolCalls = Array.from(toolCallsMap.values()).map(tc => ({
99
+ const toolCalls = Array.from(toolCallsMap.values()).map((tc) => ({
95
100
  id: tc.id,
96
101
  type: "function",
97
102
  function: {
@@ -154,7 +159,7 @@ export class OpenAIStreaming {
154
159
  }
155
160
  catch (e) {
156
161
  // Graceful exit on abort
157
- if (e instanceof Error && e.name === 'AbortError') {
162
+ if (e instanceof Error && e.name === "AbortError") {
158
163
  return;
159
164
  }
160
165
  throw e;
@@ -1 +1 @@
1
- {"version":3,"file":"Transcription.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAQ7E,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAU9D,oBAAoB;YAgDpB,iBAAiB;CA4HhC"}
1
+ {"version":3,"file":"Transcription.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AAQnG,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAU9D,oBAAoB;YA8DpB,iBAAiB;CAgIhC"}