@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.
- package/README.md +84 -110
- package/dist/aliases.js +239 -239
- package/dist/chat/Chat.d.ts +18 -17
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +63 -42
- package/dist/chat/ChatOptions.d.ts +8 -9
- package/dist/chat/ChatOptions.d.ts.map +1 -1
- package/dist/chat/ChatResponse.d.ts +1 -1
- package/dist/chat/ChatResponse.d.ts.map +1 -1
- package/dist/chat/ChatResponse.js +22 -8
- package/dist/chat/ChatStream.d.ts.map +1 -1
- package/dist/chat/ChatStream.js +16 -22
- package/dist/chat/Content.d.ts +3 -3
- package/dist/chat/Content.d.ts.map +1 -1
- package/dist/chat/Content.js +3 -6
- package/dist/chat/Message.d.ts +3 -1
- package/dist/chat/Message.d.ts.map +1 -1
- package/dist/chat/Role.d.ts.map +1 -1
- package/dist/chat/Tool.d.ts +15 -15
- package/dist/chat/Tool.d.ts.map +1 -1
- package/dist/chat/Tool.js +9 -7
- package/dist/chat/ToolHandler.d.ts +4 -3
- package/dist/chat/ToolHandler.d.ts.map +1 -1
- package/dist/chat/ToolHandler.js +10 -14
- package/dist/chat/Validation.d.ts.map +1 -1
- package/dist/chat/Validation.js +13 -6
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -25
- package/dist/constants.js +1 -1
- package/dist/errors/index.d.ts +21 -7
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +14 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/llm.d.ts +44 -46
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +206 -134
- package/dist/model_aliases.d.ts.map +1 -1
- package/dist/models/ModelRegistry.d.ts.map +1 -1
- package/dist/models/ModelRegistry.js +12 -10
- package/dist/models/PricingRegistry.d.ts +31 -0
- package/dist/models/PricingRegistry.d.ts.map +1 -0
- package/dist/models/PricingRegistry.js +101 -0
- package/dist/models/models.d.ts.map +1 -1
- package/dist/models/models.js +5954 -7352
- package/dist/models/types.d.ts +37 -34
- package/dist/models/types.d.ts.map +1 -1
- package/dist/moderation/Moderation.d.ts.map +1 -1
- package/dist/moderation/Moderation.js +15 -5
- package/dist/providers/BaseProvider.d.ts +12 -8
- package/dist/providers/BaseProvider.d.ts.map +1 -1
- package/dist/providers/BaseProvider.js +17 -7
- package/dist/providers/Provider.d.ts +20 -5
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.d.ts +1 -1
- package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.js +3 -3
- package/dist/providers/anthropic/Capabilities.d.ts +2 -1
- package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
- package/dist/providers/anthropic/Capabilities.js +3 -20
- package/dist/providers/anthropic/Chat.d.ts.map +1 -1
- package/dist/providers/anthropic/Chat.js +27 -17
- package/dist/providers/anthropic/Errors.d.ts.map +1 -1
- package/dist/providers/anthropic/Errors.js +5 -2
- package/dist/providers/anthropic/Models.d.ts.map +1 -1
- package/dist/providers/anthropic/Models.js +6 -6
- package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
- package/dist/providers/anthropic/Streaming.js +17 -12
- package/dist/providers/anthropic/Utils.js +8 -5
- package/dist/providers/anthropic/index.d.ts.map +1 -1
- package/dist/providers/anthropic/index.js +4 -3
- package/dist/providers/anthropic/types.d.ts +11 -4
- package/dist/providers/anthropic/types.d.ts.map +1 -1
- package/dist/providers/deepseek/Capabilities.d.ts +7 -5
- package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
- package/dist/providers/deepseek/Capabilities.js +9 -5
- package/dist/providers/deepseek/Chat.d.ts.map +1 -1
- package/dist/providers/deepseek/Chat.js +10 -9
- package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.js +4 -4
- package/dist/providers/deepseek/Models.d.ts.map +1 -1
- package/dist/providers/deepseek/Models.js +7 -7
- package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
- package/dist/providers/deepseek/Streaming.js +11 -8
- package/dist/providers/deepseek/index.d.ts.map +1 -1
- package/dist/providers/deepseek/index.js +5 -4
- package/dist/providers/gemini/Capabilities.d.ts +5 -33
- package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
- package/dist/providers/gemini/Capabilities.js +7 -30
- package/dist/providers/gemini/Chat.d.ts.map +1 -1
- package/dist/providers/gemini/Chat.js +24 -19
- package/dist/providers/gemini/ChatUtils.d.ts.map +1 -1
- package/dist/providers/gemini/ChatUtils.js +10 -10
- package/dist/providers/gemini/Embeddings.d.ts.map +1 -1
- package/dist/providers/gemini/Embeddings.js +2 -2
- package/dist/providers/gemini/Errors.d.ts.map +1 -1
- package/dist/providers/gemini/Errors.js +5 -2
- package/dist/providers/gemini/GeminiProvider.d.ts +1 -1
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/gemini/GeminiProvider.js +3 -3
- package/dist/providers/gemini/Image.d.ts.map +1 -1
- package/dist/providers/gemini/Image.js +8 -8
- package/dist/providers/gemini/Models.d.ts.map +1 -1
- package/dist/providers/gemini/Models.js +6 -6
- package/dist/providers/gemini/Streaming.d.ts.map +1 -1
- package/dist/providers/gemini/Streaming.js +18 -14
- package/dist/providers/gemini/Transcription.d.ts.map +1 -1
- package/dist/providers/gemini/Transcription.js +11 -11
- package/dist/providers/gemini/index.d.ts +1 -1
- package/dist/providers/gemini/index.d.ts.map +1 -1
- package/dist/providers/gemini/index.js +5 -4
- package/dist/providers/gemini/types.d.ts +4 -4
- package/dist/providers/gemini/types.d.ts.map +1 -1
- package/dist/providers/ollama/Capabilities.d.ts.map +1 -1
- package/dist/providers/ollama/Capabilities.js +6 -2
- package/dist/providers/ollama/Models.js +1 -1
- package/dist/providers/ollama/OllamaProvider.d.ts +1 -1
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/ollama/OllamaProvider.js +2 -2
- package/dist/providers/ollama/index.d.ts +1 -1
- package/dist/providers/ollama/index.d.ts.map +1 -1
- package/dist/providers/ollama/index.js +7 -3
- package/dist/providers/openai/Capabilities.d.ts +2 -1
- package/dist/providers/openai/Capabilities.d.ts.map +1 -1
- package/dist/providers/openai/Capabilities.js +9 -21
- package/dist/providers/openai/Chat.d.ts.map +1 -1
- package/dist/providers/openai/Chat.js +18 -14
- package/dist/providers/openai/Embedding.d.ts.map +1 -1
- package/dist/providers/openai/Embedding.js +11 -7
- package/dist/providers/openai/Errors.d.ts.map +1 -1
- package/dist/providers/openai/Errors.js +5 -2
- package/dist/providers/openai/Image.d.ts.map +1 -1
- package/dist/providers/openai/Image.js +6 -6
- package/dist/providers/openai/Models.d.ts +1 -1
- package/dist/providers/openai/Models.d.ts.map +1 -1
- package/dist/providers/openai/Models.js +12 -8
- package/dist/providers/openai/Moderation.d.ts.map +1 -1
- package/dist/providers/openai/Moderation.js +6 -6
- package/dist/providers/openai/OpenAIProvider.d.ts +2 -3
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +4 -4
- package/dist/providers/openai/Streaming.d.ts.map +1 -1
- package/dist/providers/openai/Streaming.js +18 -13
- package/dist/providers/openai/Transcription.d.ts.map +1 -1
- package/dist/providers/openai/Transcription.js +15 -12
- package/dist/providers/openai/index.d.ts +1 -1
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +6 -5
- package/dist/providers/openai/types.d.ts +1 -1
- package/dist/providers/openai/utils.js +2 -2
- package/dist/providers/openrouter/Capabilities.d.ts +3 -3
- package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
- package/dist/providers/openrouter/Capabilities.js +21 -24
- package/dist/providers/openrouter/Models.d.ts.map +1 -1
- package/dist/providers/openrouter/Models.js +20 -16
- package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/openrouter/OpenRouterProvider.js +1 -1
- package/dist/providers/openrouter/index.d.ts +1 -1
- package/dist/providers/openrouter/index.d.ts.map +1 -1
- package/dist/providers/openrouter/index.js +6 -5
- package/dist/providers/registry.d.ts +18 -2
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +17 -2
- package/dist/providers/utils.js +1 -1
- package/dist/schema/Schema.d.ts +3 -3
- package/dist/schema/Schema.d.ts.map +1 -1
- package/dist/schema/Schema.js +2 -2
- package/dist/schema/to-json-schema.d.ts +1 -1
- package/dist/schema/to-json-schema.d.ts.map +1 -1
- package/dist/streaming/Stream.d.ts.map +1 -1
- package/dist/streaming/Stream.js +3 -3
- package/dist/utils/Binary.d.ts.map +1 -1
- package/dist/utils/Binary.js +32 -23
- package/dist/utils/FileLoader.d.ts.map +1 -1
- package/dist/utils/FileLoader.js +25 -4
- package/dist/utils/audio.js +2 -2
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +14 -4
- package/dist/utils/logger.d.ts +3 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- 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") ||
|
|
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") ||
|
|
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(
|
|
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;
|
|
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(
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
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):
|
|
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;
|
|
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") ||
|
|
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 => {
|
|
122
|
-
caps.
|
|
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
|
-
|
|
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,
|
|
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 &&
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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, {
|
|
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,
|
|
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
|
|
9
|
-
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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):
|
|
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;
|
|
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()) ||
|
|
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()) ||
|
|
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,
|
|
45
|
+
const response = await fetch(buildUrl(this.baseUrl, "/models"), {
|
|
42
46
|
method: "GET",
|
|
43
47
|
headers: {
|
|
44
|
-
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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;
|
|
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 ||
|
|
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 &&
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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
|
-
|
|
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", {
|
|
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(
|
|
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 ===
|
|
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,
|
|
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"}
|