@node-llm/core 0.3.0 → 0.4.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 +176 -25
- package/dist/chat/Chat.d.ts +26 -1
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +83 -1
- package/dist/chat/ChatOptions.d.ts +5 -0
- package/dist/chat/ChatOptions.d.ts.map +1 -1
- package/dist/chat/ChatResponse.d.ts +5 -0
- package/dist/chat/ChatResponse.d.ts.map +1 -1
- package/dist/chat/ChatResponse.js +12 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/embedding/Embedding.d.ts +17 -0
- package/dist/embedding/Embedding.d.ts.map +1 -0
- package/dist/embedding/Embedding.js +24 -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 +11 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +55 -28
- package/dist/providers/Embedding.d.ts +20 -0
- package/dist/providers/Embedding.d.ts.map +1 -0
- package/dist/providers/Embedding.js +1 -0
- package/dist/providers/Provider.d.ts +11 -4
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/gemini/Capabilities.d.ts +30 -0
- package/dist/providers/gemini/Capabilities.d.ts.map +1 -0
- package/dist/providers/gemini/Capabilities.js +148 -0
- package/dist/providers/gemini/Chat.d.ts +8 -0
- package/dist/providers/gemini/Chat.d.ts.map +1 -0
- package/dist/providers/gemini/Chat.js +69 -0
- package/dist/providers/gemini/ChatUtils.d.ts +9 -0
- package/dist/providers/gemini/ChatUtils.d.ts.map +1 -0
- package/dist/providers/gemini/ChatUtils.js +83 -0
- package/dist/providers/gemini/Embeddings.d.ts +8 -0
- package/dist/providers/gemini/Embeddings.d.ts.map +1 -0
- package/dist/providers/gemini/Embeddings.js +44 -0
- package/dist/providers/gemini/Errors.d.ts +2 -0
- package/dist/providers/gemini/Errors.d.ts.map +1 -0
- package/dist/providers/gemini/Errors.js +34 -0
- package/dist/providers/gemini/GeminiProvider.d.ts +34 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiProvider.js +55 -0
- package/dist/providers/gemini/Image.d.ts +8 -0
- package/dist/providers/gemini/Image.d.ts.map +1 -0
- package/dist/providers/gemini/Image.js +47 -0
- package/dist/providers/gemini/Models.d.ts +8 -0
- package/dist/providers/gemini/Models.d.ts.map +1 -0
- package/dist/providers/gemini/Models.js +38 -0
- package/dist/providers/gemini/Streaming.d.ts +8 -0
- package/dist/providers/gemini/Streaming.d.ts.map +1 -0
- package/dist/providers/gemini/Streaming.js +70 -0
- package/dist/providers/gemini/Transcription.d.ts +9 -0
- package/dist/providers/gemini/Transcription.d.ts.map +1 -0
- package/dist/providers/gemini/Transcription.js +63 -0
- package/dist/providers/gemini/index.d.ts +11 -0
- package/dist/providers/gemini/index.d.ts.map +1 -0
- package/dist/providers/gemini/index.js +24 -0
- package/dist/providers/gemini/types.d.ts +118 -0
- package/dist/providers/gemini/types.d.ts.map +1 -0
- package/dist/providers/gemini/types.js +1 -0
- package/dist/providers/openai/Capabilities.d.ts +7 -2
- package/dist/providers/openai/Capabilities.d.ts.map +1 -1
- package/dist/providers/openai/Capabilities.js +52 -214
- package/dist/providers/openai/Chat.d.ts.map +1 -1
- package/dist/providers/openai/Chat.js +3 -0
- package/dist/providers/openai/Embedding.d.ts +8 -0
- package/dist/providers/openai/Embedding.d.ts.map +1 -0
- package/dist/providers/openai/Embedding.js +48 -0
- package/dist/providers/openai/ModelDefinitions.d.ts +25 -0
- package/dist/providers/openai/ModelDefinitions.d.ts.map +1 -0
- package/dist/providers/openai/ModelDefinitions.js +211 -0
- package/dist/providers/openai/Moderation.d.ts.map +1 -1
- package/dist/providers/openai/Moderation.js +3 -2
- package/dist/providers/openai/OpenAIProvider.d.ts +7 -0
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +10 -0
- package/dist/providers/openai/Transcription.d.ts.map +1 -1
- package/dist/providers/openai/Transcription.js +5 -4
- package/dist/schema/Schema.d.ts +20 -0
- package/dist/schema/Schema.d.ts.map +1 -0
- package/dist/schema/Schema.js +22 -0
- package/dist/schema/to-json-schema.d.ts +3 -0
- package/dist/schema/to-json-schema.d.ts.map +1 -0
- package/dist/schema/to-json-schema.js +10 -0
- package/dist/utils/Binary.d.ts +12 -0
- package/dist/utils/Binary.d.ts.map +1 -0
- package/dist/utils/Binary.js +71 -0
- package/package.json +3 -2
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export interface GeminiPart {
|
|
2
|
+
text?: string;
|
|
3
|
+
inlineData?: {
|
|
4
|
+
mimeType: string;
|
|
5
|
+
data: string;
|
|
6
|
+
};
|
|
7
|
+
functionCall?: {
|
|
8
|
+
name: string;
|
|
9
|
+
args: Record<string, any>;
|
|
10
|
+
};
|
|
11
|
+
functionResponse?: {
|
|
12
|
+
name: string;
|
|
13
|
+
response: Record<string, any>;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface GeminiContent {
|
|
17
|
+
role?: "user" | "model";
|
|
18
|
+
parts: GeminiPart[];
|
|
19
|
+
}
|
|
20
|
+
export interface GeminiGenerateContentRequest {
|
|
21
|
+
contents: GeminiContent[];
|
|
22
|
+
systemInstruction?: {
|
|
23
|
+
parts: GeminiPart[];
|
|
24
|
+
};
|
|
25
|
+
tools?: {
|
|
26
|
+
functionDeclarations: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
parameters?: Record<string, any>;
|
|
30
|
+
}>;
|
|
31
|
+
}[];
|
|
32
|
+
generationConfig?: {
|
|
33
|
+
temperature?: number;
|
|
34
|
+
maxOutputTokens?: number;
|
|
35
|
+
stopSequences?: string[];
|
|
36
|
+
topP?: number;
|
|
37
|
+
topK?: number;
|
|
38
|
+
responseMimeType?: string;
|
|
39
|
+
responseSchema?: Record<string, any>;
|
|
40
|
+
};
|
|
41
|
+
safetySettings?: Array<{
|
|
42
|
+
category: string;
|
|
43
|
+
threshold: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
export interface GeminiGenerateContentResponse {
|
|
47
|
+
candidates?: Array<{
|
|
48
|
+
content: GeminiContent;
|
|
49
|
+
finishReason?: string;
|
|
50
|
+
index?: number;
|
|
51
|
+
safetyRatings?: Array<{
|
|
52
|
+
category: string;
|
|
53
|
+
probability: string;
|
|
54
|
+
}>;
|
|
55
|
+
}>;
|
|
56
|
+
usageMetadata?: {
|
|
57
|
+
promptTokenCount: number;
|
|
58
|
+
candidatesTokenCount: number;
|
|
59
|
+
totalTokenCount: number;
|
|
60
|
+
};
|
|
61
|
+
modelVersion?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface GeminiModel {
|
|
64
|
+
name: string;
|
|
65
|
+
version: string;
|
|
66
|
+
displayName: string;
|
|
67
|
+
description: string;
|
|
68
|
+
inputTokenLimit: number;
|
|
69
|
+
outputTokenLimit: number;
|
|
70
|
+
supportedGenerationMethods: string[];
|
|
71
|
+
temperature?: number;
|
|
72
|
+
topP?: number;
|
|
73
|
+
topK?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface GeminiListModelsResponse {
|
|
76
|
+
models: GeminiModel[];
|
|
77
|
+
nextPageToken?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface GeminiImageRequest {
|
|
80
|
+
prompt: string;
|
|
81
|
+
numberOfImages?: number;
|
|
82
|
+
aspectRatio?: string;
|
|
83
|
+
safetySetting?: Array<{
|
|
84
|
+
category: string;
|
|
85
|
+
threshold: string;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
export interface GeminiImageResponse {
|
|
89
|
+
images: Array<{
|
|
90
|
+
image: {
|
|
91
|
+
mimeType: string;
|
|
92
|
+
data: string;
|
|
93
|
+
};
|
|
94
|
+
}>;
|
|
95
|
+
}
|
|
96
|
+
export interface GeminiEmbedRequest {
|
|
97
|
+
model: string;
|
|
98
|
+
content: {
|
|
99
|
+
parts: Array<{
|
|
100
|
+
text: string;
|
|
101
|
+
}>;
|
|
102
|
+
};
|
|
103
|
+
outputDimensionality?: number;
|
|
104
|
+
}
|
|
105
|
+
export interface GeminiEmbedResponse {
|
|
106
|
+
embedding: {
|
|
107
|
+
values: number[];
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export interface GeminiBatchEmbedRequest {
|
|
111
|
+
requests: GeminiEmbedRequest[];
|
|
112
|
+
}
|
|
113
|
+
export interface GeminiBatchEmbedResponse {
|
|
114
|
+
embeddings: Array<{
|
|
115
|
+
values: number[];
|
|
116
|
+
}>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import { ModelFamilyDefinition } from "./ModelDefinitions.js";
|
|
2
2
|
export declare class Capabilities {
|
|
3
|
-
static getFamily(modelId: string):
|
|
3
|
+
static getFamily(modelId: string): string;
|
|
4
|
+
static getDefinition(modelId: string): ModelFamilyDefinition;
|
|
4
5
|
static getContextWindow(modelId: string): number | null;
|
|
5
6
|
static getMaxOutputTokens(modelId: string): number | null;
|
|
6
7
|
static supportsVision(modelId: string): boolean;
|
|
7
8
|
static supportsTools(modelId: string): boolean;
|
|
8
9
|
static supportsStructuredOutput(modelId: string): boolean;
|
|
9
10
|
static supportsJsonMode(modelId: string): boolean;
|
|
11
|
+
static supportsEmbeddings(modelId: string): boolean;
|
|
12
|
+
static supportsImageGeneration(modelId: string): boolean;
|
|
13
|
+
static supportsTranscription(modelId: string): boolean;
|
|
14
|
+
static supportsModeration(modelId: string): boolean;
|
|
10
15
|
static getInputPrice(modelId: string): number;
|
|
11
16
|
static getCachedInputPrice(modelId: string): number | undefined;
|
|
12
17
|
static getOutputPrice(modelId: string): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Capabilities.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,qBAAa,YAAY;IACvB,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAUzC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAK5D,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;IAI9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK7C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK9C,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM;IAI7F,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKjD,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAUlC,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAUxG,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAqB5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;CAyBlC"}
|
|
@@ -1,227 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
dall_e: /^dall-e/,
|
|
3
|
-
chatgpt4o: /^chatgpt-4o/,
|
|
4
|
-
gpt41: /^gpt-4\.1(?!-(?:mini|nano))/,
|
|
5
|
-
gpt41_mini: /^gpt-4\.1-mini/,
|
|
6
|
-
gpt41_nano: /^gpt-4\.1-nano/,
|
|
7
|
-
gpt4: /^gpt-4(?:-\d{6})?$/,
|
|
8
|
-
gpt4_turbo: /^gpt-4(?:\.5)?-(?:\d{6}-)?(preview|turbo)/,
|
|
9
|
-
gpt35_turbo: /^gpt-3\.5-turbo/,
|
|
10
|
-
gpt4o: /^gpt-4o(?!-(?:mini|audio|realtime|transcribe|tts|search))/,
|
|
11
|
-
gpt4o_audio: /^gpt-4o-(?:audio)/,
|
|
12
|
-
gpt4o_mini: /^gpt-4o-mini(?!-(?:audio|realtime|transcribe|tts|search))/,
|
|
13
|
-
gpt4o_mini_audio: /^gpt-4o-mini-audio/,
|
|
14
|
-
gpt4o_mini_realtime: /^gpt-4o-mini-realtime/,
|
|
15
|
-
gpt4o_mini_transcribe: /^gpt-4o-mini-transcribe/,
|
|
16
|
-
gpt4o_mini_tts: /^gpt-4o-mini-tts/,
|
|
17
|
-
gpt4o_realtime: /^gpt-4o-realtime/,
|
|
18
|
-
gpt4o_search: /^gpt-4o-search/,
|
|
19
|
-
gpt4o_transcribe: /^gpt-4o-transcribe/,
|
|
20
|
-
gpt5: /^gpt-5/,
|
|
21
|
-
gpt5_mini: /^gpt-5-mini/,
|
|
22
|
-
gpt5_nano: /^gpt-5-nano/,
|
|
23
|
-
o1: /^o1(?!-(?:mini|pro))/,
|
|
24
|
-
o1_mini: /^o1-mini/,
|
|
25
|
-
o1_pro: /^o1-pro/,
|
|
26
|
-
o3_mini: /^o3-mini/,
|
|
27
|
-
babbage: /^babbage/,
|
|
28
|
-
davinci: /^davinci/,
|
|
29
|
-
embedding3_large: /^text-embedding-3-large/,
|
|
30
|
-
embedding3_small: /^text-embedding-3-small/,
|
|
31
|
-
embedding_ada: /^text-embedding-ada/,
|
|
32
|
-
tts1: /^tts-1(?!-hd)/,
|
|
33
|
-
tts1_hd: /^tts-1-hd/,
|
|
34
|
-
whisper: /^whisper/,
|
|
35
|
-
moderation: /^(?:omni|text)-moderation/,
|
|
36
|
-
};
|
|
37
|
-
const PRICES = {
|
|
38
|
-
gpt5: { input: 1.25, output: 10.0, cached_input: 0.125 },
|
|
39
|
-
gpt5_mini: { input: 0.25, output: 2.0, cached_input: 0.025 },
|
|
40
|
-
gpt5_nano: { input: 0.05, output: 0.4, cached_input: 0.005 },
|
|
41
|
-
gpt41: { input: 2.0, output: 8.0, cached_input: 0.5 },
|
|
42
|
-
gpt41_mini: { input: 0.4, output: 1.6, cached_input: 0.1 },
|
|
43
|
-
gpt41_nano: { input: 0.1, output: 0.4 },
|
|
44
|
-
chatgpt4o: { input: 5.0, output: 15.0 },
|
|
45
|
-
gpt4: { input: 10.0, output: 30.0 },
|
|
46
|
-
gpt4_turbo: { input: 10.0, output: 30.0 },
|
|
47
|
-
gpt45: { input: 75.0, output: 150.0 },
|
|
48
|
-
gpt35_turbo: { input: 0.5, output: 1.5 },
|
|
49
|
-
gpt4o: { input: 2.5, output: 10.0 },
|
|
50
|
-
gpt4o_audio: { input: 2.5, output: 10.0, audio_input: 40.0, audio_output: 80.0 },
|
|
51
|
-
gpt4o_mini: { input: 0.15, output: 0.6 },
|
|
52
|
-
gpt4o_mini_audio: { input: 0.15, output: 0.6, audio_input: 10.0, audio_output: 20.0 },
|
|
53
|
-
gpt4o_mini_realtime: { input: 0.6, output: 2.4 },
|
|
54
|
-
gpt4o_mini_transcribe: { input: 1.25, output: 5.0, audio_input: 3.0 },
|
|
55
|
-
gpt4o_mini_tts: { input: 0.6, output: 12.0 },
|
|
56
|
-
gpt4o_realtime: { input: 5.0, output: 20.0 },
|
|
57
|
-
gpt4o_search: { input: 2.5, output: 10.0 },
|
|
58
|
-
gpt4o_transcribe: { input: 2.5, output: 10.0, audio_input: 6.0 },
|
|
59
|
-
o1: { input: 15.0, output: 60.0 },
|
|
60
|
-
o1_mini: { input: 1.1, output: 4.4 },
|
|
61
|
-
o1_pro: { input: 150.0, output: 600.0 },
|
|
62
|
-
o3_mini: { input: 1.1, output: 4.4 },
|
|
63
|
-
babbage: { input: 0.4, output: 0.4 },
|
|
64
|
-
davinci: { input: 2.0, output: 2.0 },
|
|
65
|
-
embedding3_large: { price: 0.13 },
|
|
66
|
-
embedding3_small: { price: 0.02 },
|
|
67
|
-
embedding_ada: { price: 0.10 },
|
|
68
|
-
tts1: { price: 15.0 },
|
|
69
|
-
tts1_hd: { price: 30.0 },
|
|
70
|
-
whisper: { price: 0.006 },
|
|
71
|
-
moderation: { price: 0.0 }
|
|
72
|
-
};
|
|
1
|
+
import { OPENAI_MODELS } from "./ModelDefinitions.js";
|
|
73
2
|
export class Capabilities {
|
|
74
3
|
static getFamily(modelId) {
|
|
75
|
-
for (const [
|
|
76
|
-
if (
|
|
77
|
-
|
|
4
|
+
for (const [key, def] of Object.entries(OPENAI_MODELS)) {
|
|
5
|
+
if (key === "other")
|
|
6
|
+
continue;
|
|
7
|
+
if (def.pattern.test(modelId)) {
|
|
8
|
+
return key;
|
|
78
9
|
}
|
|
79
10
|
}
|
|
80
11
|
return "other";
|
|
81
12
|
}
|
|
82
|
-
static
|
|
13
|
+
static getDefinition(modelId) {
|
|
83
14
|
const family = this.getFamily(modelId);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return 1_047_576;
|
|
89
|
-
case "gpt5":
|
|
90
|
-
case "gpt5_mini":
|
|
91
|
-
case "gpt5_nano":
|
|
92
|
-
case "chatgpt4o":
|
|
93
|
-
case "gpt4_turbo":
|
|
94
|
-
case "gpt4o":
|
|
95
|
-
case "gpt4o_audio":
|
|
96
|
-
case "gpt4o_mini":
|
|
97
|
-
case "gpt4o_mini_audio":
|
|
98
|
-
case "gpt4o_mini_realtime":
|
|
99
|
-
case "gpt4o_realtime":
|
|
100
|
-
case "gpt4o_search":
|
|
101
|
-
case "gpt4o_transcribe":
|
|
102
|
-
case "o1_mini":
|
|
103
|
-
return 128_000;
|
|
104
|
-
case "gpt4":
|
|
105
|
-
return 8_192;
|
|
106
|
-
case "gpt4o_mini_transcribe":
|
|
107
|
-
return 16_000;
|
|
108
|
-
case "o1":
|
|
109
|
-
case "o1_pro":
|
|
110
|
-
case "o3_mini":
|
|
111
|
-
return 200_000;
|
|
112
|
-
case "gpt35_turbo":
|
|
113
|
-
return 16_385;
|
|
114
|
-
case "gpt4o_mini_tts":
|
|
115
|
-
case "tts1":
|
|
116
|
-
case "tts1_hd":
|
|
117
|
-
case "whisper":
|
|
118
|
-
case "moderation":
|
|
119
|
-
case "embedding3_large":
|
|
120
|
-
case "embedding3_small":
|
|
121
|
-
case "embedding_ada":
|
|
122
|
-
return null;
|
|
123
|
-
default:
|
|
124
|
-
return 4_096;
|
|
125
|
-
}
|
|
15
|
+
return OPENAI_MODELS[family];
|
|
16
|
+
}
|
|
17
|
+
static getContextWindow(modelId) {
|
|
18
|
+
return this.getDefinition(modelId).contextWindow;
|
|
126
19
|
}
|
|
127
20
|
static getMaxOutputTokens(modelId) {
|
|
128
|
-
|
|
129
|
-
switch (family) {
|
|
130
|
-
case "gpt5":
|
|
131
|
-
case "gpt5_mini":
|
|
132
|
-
case "gpt5_nano":
|
|
133
|
-
return 400_000;
|
|
134
|
-
case "gpt41":
|
|
135
|
-
case "gpt41_mini":
|
|
136
|
-
case "gpt41_nano":
|
|
137
|
-
return 32_768;
|
|
138
|
-
case "chatgpt4o":
|
|
139
|
-
case "gpt4o":
|
|
140
|
-
case "gpt4o_mini":
|
|
141
|
-
return 16_384;
|
|
142
|
-
case "babbage":
|
|
143
|
-
case "davinci":
|
|
144
|
-
return 16_384;
|
|
145
|
-
case "gpt4":
|
|
146
|
-
return 8_192;
|
|
147
|
-
case "gpt35_turbo":
|
|
148
|
-
return 4_096;
|
|
149
|
-
case "gpt4_turbo":
|
|
150
|
-
case "gpt4o_realtime":
|
|
151
|
-
case "gpt4o_mini_realtime":
|
|
152
|
-
return 4_096;
|
|
153
|
-
case "gpt4o_mini_transcribe":
|
|
154
|
-
return 2_000;
|
|
155
|
-
case "o1":
|
|
156
|
-
case "o1_pro":
|
|
157
|
-
case "o3_mini":
|
|
158
|
-
return 100_000;
|
|
159
|
-
case "o1_mini":
|
|
160
|
-
return 65_536;
|
|
161
|
-
case "gpt4o_mini_tts":
|
|
162
|
-
case "tts1":
|
|
163
|
-
case "tts1_hd":
|
|
164
|
-
case "whisper":
|
|
165
|
-
case "moderation":
|
|
166
|
-
case "embedding3_large":
|
|
167
|
-
case "embedding3_small":
|
|
168
|
-
case "embedding_ada":
|
|
169
|
-
return null;
|
|
170
|
-
default:
|
|
171
|
-
return 16_384;
|
|
172
|
-
}
|
|
21
|
+
return this.getDefinition(modelId).maxOutputTokens;
|
|
173
22
|
}
|
|
174
23
|
static supportsVision(modelId) {
|
|
175
|
-
|
|
176
|
-
return [
|
|
177
|
-
"gpt5", "gpt5_mini", "gpt5_nano", "gpt41", "gpt41_mini", "gpt41_nano",
|
|
178
|
-
"chatgpt4o", "gpt4", "gpt4_turbo", "gpt4o", "gpt4o_mini", "o1", "o1_pro",
|
|
179
|
-
"moderation", "gpt4o_search", "gpt4o_mini_search"
|
|
180
|
-
].includes(family);
|
|
24
|
+
return !!this.getDefinition(modelId).features.vision;
|
|
181
25
|
}
|
|
182
26
|
static supportsTools(modelId) {
|
|
183
|
-
|
|
184
|
-
return [
|
|
185
|
-
"gpt5", "gpt5_mini", "gpt5_nano", "gpt41", "gpt41_mini", "gpt41_nano",
|
|
186
|
-
"gpt4", "gpt4_turbo", "gpt4o", "gpt4o_mini", "o1", "o1_pro", "o3_mini"
|
|
187
|
-
].includes(family);
|
|
27
|
+
return !!this.getDefinition(modelId).features.tools;
|
|
188
28
|
}
|
|
189
29
|
static supportsStructuredOutput(modelId) {
|
|
190
|
-
|
|
191
|
-
return [
|
|
192
|
-
"gpt5", "gpt5_mini", "gpt5_nano", "gpt41", "gpt41_mini", "gpt41_nano",
|
|
193
|
-
"chatgpt4o", "gpt4o", "gpt4o_mini", "o1", "o1_pro", "o3_mini"
|
|
194
|
-
].includes(family);
|
|
30
|
+
return !!this.getDefinition(modelId).features.structuredOutput;
|
|
195
31
|
}
|
|
196
32
|
static supportsJsonMode(modelId) {
|
|
197
33
|
return this.supportsStructuredOutput(modelId);
|
|
198
34
|
}
|
|
35
|
+
static supportsEmbeddings(modelId) {
|
|
36
|
+
return this.getDefinition(modelId).type === "embedding";
|
|
37
|
+
}
|
|
38
|
+
static supportsImageGeneration(modelId) {
|
|
39
|
+
return this.getDefinition(modelId).type === "image";
|
|
40
|
+
}
|
|
41
|
+
static supportsTranscription(modelId) {
|
|
42
|
+
// Transcription is supported by audio models or specific models like gpt-4o-audio
|
|
43
|
+
const def = this.getDefinition(modelId);
|
|
44
|
+
return def.type === "audio" || (def.type === "chat" && /audio|transcribe/.test(modelId));
|
|
45
|
+
}
|
|
46
|
+
static supportsModeration(modelId) {
|
|
47
|
+
return this.getDefinition(modelId).type === "moderation";
|
|
48
|
+
}
|
|
199
49
|
static getInputPrice(modelId) {
|
|
200
|
-
const
|
|
201
|
-
const prices = PRICES[family] || { input: 0.5 };
|
|
50
|
+
const prices = this.getDefinition(modelId).pricing;
|
|
202
51
|
return prices.input || prices.price || 0.5;
|
|
203
52
|
}
|
|
204
53
|
static getCachedInputPrice(modelId) {
|
|
205
|
-
|
|
206
|
-
const prices = PRICES[family] || {};
|
|
207
|
-
return prices.cached_input;
|
|
54
|
+
return this.getDefinition(modelId).pricing.cached_input;
|
|
208
55
|
}
|
|
209
56
|
static getOutputPrice(modelId) {
|
|
210
|
-
const
|
|
211
|
-
const prices = PRICES[family] || { output: 1.5 };
|
|
57
|
+
const prices = this.getDefinition(modelId).pricing;
|
|
212
58
|
return prices.output || prices.price || 1.5;
|
|
213
59
|
}
|
|
214
60
|
static getModelType(modelId) {
|
|
215
|
-
|
|
216
|
-
if (/embedding/.test(family))
|
|
217
|
-
return "embedding";
|
|
218
|
-
if (/^tts|whisper|gpt4o_(?:mini_)?(?:transcribe|tts)$/.test(family))
|
|
219
|
-
return "audio";
|
|
220
|
-
if (family === "moderation")
|
|
221
|
-
return "moderation";
|
|
222
|
-
if (/dall/.test(family))
|
|
223
|
-
return "image";
|
|
224
|
-
return "chat";
|
|
61
|
+
return this.getDefinition(modelId).type;
|
|
225
62
|
}
|
|
226
63
|
static formatDisplayName(modelId) {
|
|
227
64
|
const humanized = modelId.replace(/-/g, " ").split(" ").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(" ");
|
|
@@ -258,43 +95,44 @@ export class Capabilities {
|
|
|
258
95
|
return temperature;
|
|
259
96
|
}
|
|
260
97
|
static getModalities(modelId) {
|
|
98
|
+
const type = this.getModelType(modelId);
|
|
99
|
+
const features = this.getDefinition(modelId).features;
|
|
261
100
|
const modalities = {
|
|
262
101
|
input: ["text"],
|
|
263
102
|
output: ["text"]
|
|
264
103
|
};
|
|
265
|
-
if (
|
|
104
|
+
if (features.vision)
|
|
266
105
|
modalities.input.push("image", "pdf");
|
|
267
|
-
if (
|
|
106
|
+
if (type === "audio") {
|
|
268
107
|
modalities.input.push("audio");
|
|
269
|
-
if (/tts|audio/.test(modelId))
|
|
270
108
|
modalities.output.push("audio");
|
|
271
|
-
|
|
109
|
+
}
|
|
110
|
+
if (type === "image")
|
|
272
111
|
modalities.output.push("image");
|
|
273
|
-
if (
|
|
112
|
+
if (type === "embedding")
|
|
274
113
|
modalities.output.push("embeddings");
|
|
275
|
-
if (
|
|
114
|
+
if (type === "moderation")
|
|
276
115
|
modalities.output.push("moderation");
|
|
277
116
|
return modalities;
|
|
278
117
|
}
|
|
279
118
|
static getCapabilities(modelId) {
|
|
280
119
|
const capabilities = [];
|
|
281
|
-
|
|
120
|
+
const type = this.getModelType(modelId);
|
|
121
|
+
const features = this.getDefinition(modelId).features;
|
|
122
|
+
if (type !== "moderation" && type !== "embedding")
|
|
282
123
|
capabilities.push("streaming");
|
|
283
|
-
if (
|
|
124
|
+
if (features.tools)
|
|
284
125
|
capabilities.push("function_calling");
|
|
285
|
-
if (
|
|
126
|
+
if (features.structuredOutput)
|
|
286
127
|
capabilities.push("structured_output");
|
|
287
|
-
if (
|
|
128
|
+
if (type === "embedding")
|
|
288
129
|
capabilities.push("batch");
|
|
289
130
|
if (/o\d|gpt-5|codex/.test(modelId))
|
|
290
131
|
capabilities.push("reasoning");
|
|
291
|
-
if (
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
capabilities.push("speech_generation", "transcription");
|
|
296
|
-
}
|
|
297
|
-
}
|
|
132
|
+
if (type === "image")
|
|
133
|
+
capabilities.push("image_generation");
|
|
134
|
+
if (type === "audio")
|
|
135
|
+
capabilities.push("speech_generation", "transcription");
|
|
298
136
|
return capabilities;
|
|
299
137
|
}
|
|
300
138
|
static getPricing(modelId) {
|
|
@@ -311,7 +149,7 @@ export class Capabilities {
|
|
|
311
149
|
}
|
|
312
150
|
}
|
|
313
151
|
};
|
|
314
|
-
if (
|
|
152
|
+
if (this.getModelType(modelId) === "embedding") {
|
|
315
153
|
pricing.text_tokens.batch = {
|
|
316
154
|
input_per_million: standardPricing.input_per_million * 0.5,
|
|
317
155
|
output_per_million: standardPricing.output_per_million * 0.5
|
|
@@ -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;AAK3D,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
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;AAK3D,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA0D3D"}
|
|
@@ -24,6 +24,9 @@ export class OpenAIChat {
|
|
|
24
24
|
if (request.tools) {
|
|
25
25
|
body.tools = request.tools;
|
|
26
26
|
}
|
|
27
|
+
if (request.response_format) {
|
|
28
|
+
body.response_format = request.response_format;
|
|
29
|
+
}
|
|
27
30
|
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
28
31
|
method: "POST",
|
|
29
32
|
headers: {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
|
|
2
|
+
export declare class OpenAIEmbedding {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Embedding.d.ts.map
|
|
@@ -0,0 +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,iBAAiB,CAAC;AAKtE,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8CrE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { handleOpenAIError } from "./Errors.js";
|
|
2
|
+
import { Capabilities } from "./Capabilities.js";
|
|
3
|
+
import { DEFAULT_MODELS } from "../../constants.js";
|
|
4
|
+
export class OpenAIEmbedding {
|
|
5
|
+
baseUrl;
|
|
6
|
+
apiKey;
|
|
7
|
+
constructor(baseUrl, apiKey) {
|
|
8
|
+
this.baseUrl = baseUrl;
|
|
9
|
+
this.apiKey = apiKey;
|
|
10
|
+
}
|
|
11
|
+
async execute(request) {
|
|
12
|
+
const model = request.model || DEFAULT_MODELS.EMBEDDING;
|
|
13
|
+
// Validate that the model is an embedding model
|
|
14
|
+
if (Capabilities.getModelType(model) !== "embedding") {
|
|
15
|
+
throw new Error(`Model ${model} does not support embeddings.`);
|
|
16
|
+
}
|
|
17
|
+
const body = {
|
|
18
|
+
input: request.input,
|
|
19
|
+
model,
|
|
20
|
+
};
|
|
21
|
+
if (request.dimensions) {
|
|
22
|
+
body.dimensions = request.dimensions;
|
|
23
|
+
}
|
|
24
|
+
if (request.user) {
|
|
25
|
+
body.user = request.user;
|
|
26
|
+
}
|
|
27
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: {
|
|
30
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify(body),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
await handleOpenAIError(response, request.model || DEFAULT_MODELS.EMBEDDING);
|
|
37
|
+
}
|
|
38
|
+
const json = await response.json();
|
|
39
|
+
// Extract vectors from the response
|
|
40
|
+
const vectors = json.data.map((item) => item.embedding);
|
|
41
|
+
return {
|
|
42
|
+
vectors,
|
|
43
|
+
model: json.model,
|
|
44
|
+
input_tokens: json.usage.prompt_tokens,
|
|
45
|
+
dimensions: vectors[0]?.length || 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ModelPricing {
|
|
2
|
+
input?: number;
|
|
3
|
+
output?: number;
|
|
4
|
+
price?: number;
|
|
5
|
+
cached_input?: number;
|
|
6
|
+
audio_input?: number;
|
|
7
|
+
audio_output?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ModelFeatures {
|
|
10
|
+
vision?: boolean;
|
|
11
|
+
tools?: boolean;
|
|
12
|
+
structuredOutput?: boolean;
|
|
13
|
+
jsonMode?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type ModelType = "chat" | "embedding" | "audio" | "image" | "moderation";
|
|
16
|
+
export interface ModelFamilyDefinition {
|
|
17
|
+
pattern: RegExp;
|
|
18
|
+
contextWindow: number | null;
|
|
19
|
+
maxOutputTokens: number | null;
|
|
20
|
+
pricing: ModelPricing;
|
|
21
|
+
features: ModelFeatures;
|
|
22
|
+
type: ModelType;
|
|
23
|
+
}
|
|
24
|
+
export declare const OPENAI_MODELS: Record<string, ModelFamilyDefinition>;
|
|
25
|
+
//# sourceMappingURL=ModelDefinitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelDefinitions.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/ModelDefinitions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAkN/D,CAAC"}
|