@node-llm/core 1.17.1 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/dist/agent/Agent.d.ts +41 -14
- package/dist/agent/Agent.d.ts.map +1 -1
- package/dist/agent/Agent.js +12 -3
- package/dist/aliases.d.ts +477 -283
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +546 -352
- package/dist/chat/Chat.d.ts +23 -13
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +59 -16
- package/dist/chat/ChatOptions.d.ts +28 -11
- 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 -4
- package/dist/chat/ChatStream.d.ts.map +1 -1
- package/dist/chat/ChatStream.js +20 -10
- package/dist/chat/PromptCache.d.ts +7 -0
- package/dist/chat/PromptCache.d.ts.map +1 -0
- package/dist/chat/PromptCache.js +7 -0
- package/dist/chat/Temperature.d.ts +7 -0
- package/dist/chat/Temperature.d.ts.map +1 -0
- package/dist/chat/Temperature.js +17 -0
- package/dist/chat/Tool.d.ts +52 -8
- package/dist/chat/Tool.d.ts.map +1 -1
- package/dist/chat/Tool.js +53 -5
- package/dist/chat/ToolCallOutcome.d.ts +18 -6
- package/dist/chat/ToolCallOutcome.d.ts.map +1 -1
- package/dist/chat/ToolCallOutcome.js +14 -0
- package/dist/chat/ToolHandler.d.ts +2 -2
- package/dist/chat/ToolHandler.d.ts.map +1 -1
- package/dist/chat/ToolResultWindow.d.ts +16 -0
- package/dist/chat/ToolResultWindow.d.ts.map +1 -0
- package/dist/chat/ToolResultWindow.js +25 -0
- package/dist/config.d.ts +42 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -27
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -1
- package/dist/errors/billing.d.ts +7 -0
- package/dist/errors/billing.d.ts.map +1 -0
- package/dist/errors/billing.js +24 -0
- package/dist/errors/index.d.ts +28 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +32 -0
- package/dist/executor/Executor.d.ts.map +1 -1
- package/dist/executor/Executor.js +5 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/judge/Judge.d.ts +107 -0
- package/dist/judge/Judge.d.ts.map +1 -0
- package/dist/judge/Judge.js +104 -0
- package/dist/judge/Judgment.d.ts +116 -0
- package/dist/judge/Judgment.d.ts.map +1 -0
- package/dist/judge/Judgment.js +159 -0
- package/dist/judge/Question.d.ts +91 -0
- package/dist/judge/Question.d.ts.map +1 -0
- package/dist/judge/Question.js +180 -0
- package/dist/llm.d.ts +48 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +111 -5
- package/dist/models/ModelRegistry.d.ts +23 -19
- package/dist/models/ModelRegistry.d.ts.map +1 -1
- package/dist/models/ModelRegistry.js +28 -2
- package/dist/models/models.json +15154 -4786
- package/dist/models/types.d.ts +14 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/providers/BaseProvider.d.ts +2 -1
- package/dist/providers/BaseProvider.d.ts.map +1 -1
- package/dist/providers/BaseProvider.js +3 -0
- package/dist/providers/Provider.d.ts +60 -1
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.d.ts +2 -0
- package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.js +2 -0
- package/dist/providers/anthropic/Capabilities.d.ts +1 -0
- package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
- package/dist/providers/anthropic/Capabilities.js +3 -0
- package/dist/providers/anthropic/Chat.d.ts.map +1 -1
- package/dist/providers/anthropic/Chat.js +7 -75
- package/dist/providers/anthropic/Errors.d.ts.map +1 -1
- package/dist/providers/anthropic/Errors.js +4 -3
- package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
- package/dist/providers/anthropic/Streaming.js +4 -66
- package/dist/providers/anthropic/Utils.d.ts +33 -1
- package/dist/providers/anthropic/Utils.d.ts.map +1 -1
- package/dist/providers/anthropic/Utils.js +114 -0
- package/dist/providers/anthropic/types.d.ts +17 -3
- package/dist/providers/anthropic/types.d.ts.map +1 -1
- package/dist/providers/azure/AzureProvider.d.ts +54 -0
- package/dist/providers/azure/AzureProvider.d.ts.map +1 -0
- package/dist/providers/azure/AzureProvider.js +110 -0
- package/dist/providers/azure/Capabilities.d.ts +16 -0
- package/dist/providers/azure/Capabilities.d.ts.map +1 -0
- package/dist/providers/azure/Capabilities.js +36 -0
- package/dist/providers/azure/Embedding.d.ts +11 -0
- package/dist/providers/azure/Embedding.d.ts.map +1 -0
- package/dist/providers/azure/Embedding.js +23 -0
- package/dist/providers/azure/Models.d.ts +18 -0
- package/dist/providers/azure/Models.d.ts.map +1 -0
- package/dist/providers/azure/Models.js +29 -0
- package/dist/providers/azure/index.d.ts +5 -0
- package/dist/providers/azure/index.d.ts.map +1 -0
- package/dist/providers/azure/index.js +28 -0
- package/dist/providers/bedrock/BedrockProvider.d.ts.map +1 -1
- package/dist/providers/bedrock/BedrockProvider.js +1 -0
- package/dist/providers/bedrock/Capabilities.d.ts +1 -0
- package/dist/providers/bedrock/Capabilities.d.ts.map +1 -1
- package/dist/providers/bedrock/Capabilities.js +3 -0
- package/dist/providers/bedrock/Chat.d.ts.map +1 -1
- package/dist/providers/bedrock/Chat.js +6 -2
- package/dist/providers/bedrock/Errors.d.ts.map +1 -1
- package/dist/providers/bedrock/Errors.js +4 -0
- package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
- package/dist/providers/bedrock/Streaming.js +4 -1
- package/dist/providers/deepseek/Capabilities.d.ts +1 -0
- package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
- package/dist/providers/deepseek/Capabilities.js +3 -0
- package/dist/providers/deepseek/Chat.d.ts.map +1 -1
- package/dist/providers/deepseek/Chat.js +3 -2
- package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
- package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.js +1 -0
- package/dist/providers/deepseek/Errors.d.ts.map +1 -1
- package/dist/providers/deepseek/Errors.js +5 -4
- package/dist/providers/gemini/Capabilities.d.ts +1 -0
- package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
- package/dist/providers/gemini/Capabilities.js +3 -0
- package/dist/providers/gemini/Chat.d.ts.map +1 -1
- package/dist/providers/gemini/Chat.js +3 -2
- package/dist/providers/gemini/Errors.d.ts.map +1 -1
- package/dist/providers/gemini/Errors.js +4 -3
- package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/gemini/GeminiProvider.js +1 -0
- package/dist/providers/mistral/Capabilities.d.ts +1 -0
- package/dist/providers/mistral/Capabilities.d.ts.map +1 -1
- package/dist/providers/mistral/Capabilities.js +3 -0
- package/dist/providers/mistral/Chat.d.ts.map +1 -1
- package/dist/providers/mistral/Chat.js +3 -2
- package/dist/providers/mistral/Errors.d.ts.map +1 -1
- package/dist/providers/mistral/Errors.js +4 -3
- package/dist/providers/mistral/MistralProvider.d.ts +1 -0
- package/dist/providers/mistral/MistralProvider.d.ts.map +1 -1
- package/dist/providers/mistral/MistralProvider.js +1 -0
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/ollama/OllamaProvider.js +1 -0
- package/dist/providers/openai/Capabilities.d.ts +6 -0
- package/dist/providers/openai/Capabilities.d.ts.map +1 -1
- package/dist/providers/openai/Capabilities.js +10 -0
- package/dist/providers/openai/Chat.d.ts +3 -0
- package/dist/providers/openai/Chat.d.ts.map +1 -1
- package/dist/providers/openai/Chat.js +26 -7
- package/dist/providers/openai/Embedding.d.ts +2 -0
- package/dist/providers/openai/Embedding.d.ts.map +1 -1
- package/dist/providers/openai/Embedding.js +8 -5
- package/dist/providers/openai/Errors.d.ts.map +1 -1
- package/dist/providers/openai/Errors.js +4 -3
- package/dist/providers/openai/Models.d.ts +10 -0
- package/dist/providers/openai/Models.d.ts.map +1 -1
- package/dist/providers/openai/Models.js +12 -8
- package/dist/providers/openai/OpenAIProvider.d.ts +11 -1
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +36 -0
- package/dist/providers/openai/Responses.d.ts +30 -0
- package/dist/providers/openai/Responses.d.ts.map +1 -0
- package/dist/providers/openai/Responses.js +176 -0
- package/dist/providers/openai/Streaming.d.ts +2 -0
- package/dist/providers/openai/Streaming.d.ts.map +1 -1
- package/dist/providers/openai/Streaming.js +19 -5
- package/dist/providers/openrouter/Capabilities.d.ts +1 -0
- package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
- package/dist/providers/openrouter/Capabilities.js +3 -0
- package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
- package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
- package/dist/providers/registry.d.ts +3 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +3 -1
- package/dist/providers/typesafe/SystemOne.d.ts +11 -0
- package/dist/providers/typesafe/SystemOne.d.ts.map +1 -0
- package/dist/providers/typesafe/SystemOne.js +171 -0
- package/dist/providers/typesafe/TypeSafeProvider.d.ts +27 -0
- package/dist/providers/typesafe/TypeSafeProvider.d.ts.map +1 -0
- package/dist/providers/typesafe/TypeSafeProvider.js +76 -0
- package/dist/providers/typesafe/index.d.ts +4 -0
- package/dist/providers/typesafe/index.d.ts.map +1 -0
- package/dist/providers/typesafe/index.js +19 -0
- package/dist/providers/xai/Capabilities.d.ts +1 -0
- package/dist/providers/xai/Capabilities.d.ts.map +1 -1
- package/dist/providers/xai/Capabilities.js +3 -0
- package/dist/providers/xai/Chat.d.ts.map +1 -1
- package/dist/providers/xai/Chat.js +3 -2
- package/dist/providers/xai/Errors.d.ts.map +1 -1
- package/dist/providers/xai/Errors.js +5 -2
- package/dist/providers/xai/XAIProvider.d.ts +1 -0
- package/dist/providers/xai/XAIProvider.d.ts.map +1 -1
- package/dist/providers/xai/XAIProvider.js +1 -0
- package/dist/schema/Schema.d.ts +3 -3
- package/dist/schema/Schema.d.ts.map +1 -1
- package/dist/schema/to-json-schema.d.ts +2 -2
- package/dist/schema/to-json-schema.d.ts.map +1 -1
- package/dist/schema/to-json-schema.js +3 -8
- package/dist/schema/zod.d.ts +32 -0
- package/dist/schema/zod.d.ts.map +1 -0
- package/dist/schema/zod.js +31 -0
- package/dist/types/Middleware.d.ts +9 -0
- package/dist/types/Middleware.d.ts.map +1 -1
- package/package.json +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,qBAAa,YAAY;IAErB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMpD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;;;;IAKvC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKpD,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,qBAAa,YAAY;IAErB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMpD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;;;;IAKvC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKpD,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;IAKpC,SAAS,CAAC,QAAQ,IAAI,MAAM;IAI5B,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlD,wDAAwD;IACxD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAI9C,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAsDrC,IAAI,CAAC,OAAO,EAAE,MAAM;CAGrB"}
|
|
@@ -41,19 +41,23 @@ export class OpenAIModels {
|
|
|
41
41
|
const model = ModelRegistry.find(modelId, this.getProviderName());
|
|
42
42
|
return model?.pricing || Capabilities.getPricing(modelId);
|
|
43
43
|
}
|
|
44
|
+
endpoint() {
|
|
45
|
+
return buildUrl(this.baseUrl, "/models");
|
|
46
|
+
}
|
|
47
|
+
requestHeaders() {
|
|
48
|
+
return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" };
|
|
49
|
+
}
|
|
50
|
+
/** The models the API lists that are worth returning */
|
|
51
|
+
listed(data) {
|
|
52
|
+
return data;
|
|
53
|
+
}
|
|
44
54
|
async execute() {
|
|
45
55
|
const provider = this.getProviderName();
|
|
46
56
|
try {
|
|
47
|
-
const response = await fetchWithTimeout(
|
|
48
|
-
method: "GET",
|
|
49
|
-
headers: {
|
|
50
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
51
|
-
"Content-Type": "application/json"
|
|
52
|
-
}
|
|
53
|
-
}, config.requestTimeout);
|
|
57
|
+
const response = await fetchWithTimeout(this.endpoint(), { method: "GET", headers: this.requestHeaders() }, config.requestTimeout);
|
|
54
58
|
if (response.ok) {
|
|
55
59
|
const { data } = (await response.json());
|
|
56
|
-
return data.map((m) => {
|
|
60
|
+
return this.listed(data).map((m) => {
|
|
57
61
|
const modelId = m.id;
|
|
58
62
|
const registryModel = ModelRegistry.find(modelId, provider);
|
|
59
63
|
return {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { OpenAIResponses, type ResponsesTarget } from "./Responses.js";
|
|
1
2
|
import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, ModerationRequest, ModerationResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
|
|
2
3
|
import { BaseProvider } from "../BaseProvider.js";
|
|
3
4
|
import { OpenAIChat } from "./Chat.js";
|
|
@@ -11,11 +12,12 @@ export interface OpenAIProviderOptions {
|
|
|
11
12
|
apiKey: string;
|
|
12
13
|
baseUrl?: string;
|
|
13
14
|
}
|
|
14
|
-
export declare class OpenAIProvider extends BaseProvider implements Provider {
|
|
15
|
+
export declare class OpenAIProvider extends BaseProvider implements Provider, ResponsesTarget {
|
|
15
16
|
protected readonly options: OpenAIProviderOptions;
|
|
16
17
|
protected baseUrl: string;
|
|
17
18
|
protected chatHandler: OpenAIChat;
|
|
18
19
|
protected streamingHandler: OpenAIStreaming;
|
|
20
|
+
protected responsesHandler: OpenAIResponses;
|
|
19
21
|
protected modelsHandler: OpenAIModels;
|
|
20
22
|
protected imageHandler: OpenAIImage;
|
|
21
23
|
protected transcriptionHandler: OpenAITranscription;
|
|
@@ -32,11 +34,19 @@ export declare class OpenAIProvider extends BaseProvider implements Provider {
|
|
|
32
34
|
supportsReasoning: (model: string) => boolean;
|
|
33
35
|
supportsDeveloperRole: (model: string) => boolean;
|
|
34
36
|
supportsPrediction: (model: string) => boolean;
|
|
37
|
+
supportsTemperature: (model: string) => boolean;
|
|
35
38
|
getContextWindow: (model: string) => number | null;
|
|
36
39
|
};
|
|
37
40
|
constructor(options: OpenAIProviderOptions);
|
|
38
41
|
apiBase(): string;
|
|
39
42
|
headers(): Record<string, string>;
|
|
43
|
+
/** Where an endpoint such as /chat/completions is served */
|
|
44
|
+
url(path: string): string;
|
|
45
|
+
registryModel(model: string): string;
|
|
46
|
+
responsesBase(): string;
|
|
47
|
+
responsesModel(model: string): string;
|
|
48
|
+
/** Whether a request goes to the Responses API rather than Chat Completions. */
|
|
49
|
+
protected usesResponsesApi(request: ChatRequest): boolean;
|
|
40
50
|
protected providerName(): string;
|
|
41
51
|
defaultModel(feature?: string): string;
|
|
42
52
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAqB,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ,EAAE,eAAe;IA0BvE,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IAzB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;uCACF,MAAM;oCACT,MAAM;qCACL,MAAM;kCACT,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAatD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,4DAA4D;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIzB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,aAAa,IAAI,MAAM;IAIvB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI5C,gFAAgF;IAChF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;IAIzD,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAehD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAgBxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { OpenAIResponses, needsResponsesApi } from "./Responses.js";
|
|
1
2
|
import { BaseProvider } from "../BaseProvider.js";
|
|
2
3
|
import { DEFAULT_OPENAI_BASE_URL } from "../../constants.js";
|
|
3
4
|
import { Capabilities } from "./Capabilities.js";
|
|
@@ -8,11 +9,13 @@ import { OpenAIImage } from "./Image.js";
|
|
|
8
9
|
import { OpenAITranscription } from "./Transcription.js";
|
|
9
10
|
import { OpenAIModeration } from "./Moderation.js";
|
|
10
11
|
import { OpenAIEmbedding } from "./Embedding.js";
|
|
12
|
+
import { buildUrl } from "./utils.js";
|
|
11
13
|
export class OpenAIProvider extends BaseProvider {
|
|
12
14
|
options;
|
|
13
15
|
baseUrl;
|
|
14
16
|
chatHandler;
|
|
15
17
|
streamingHandler;
|
|
18
|
+
responsesHandler;
|
|
16
19
|
modelsHandler;
|
|
17
20
|
imageHandler;
|
|
18
21
|
transcriptionHandler;
|
|
@@ -29,6 +32,7 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
29
32
|
supportsReasoning: (model) => Capabilities.supportsReasoning(model),
|
|
30
33
|
supportsDeveloperRole: (model) => Capabilities.supportsDeveloperRole(model),
|
|
31
34
|
supportsPrediction: (model) => Capabilities.supportsPrediction(model),
|
|
35
|
+
supportsTemperature: (model) => Capabilities.supportsTemperature(model),
|
|
32
36
|
getContextWindow: (model) => Capabilities.getContextWindow(model) || null
|
|
33
37
|
};
|
|
34
38
|
constructor(options) {
|
|
@@ -37,6 +41,7 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
37
41
|
this.baseUrl = options.baseUrl ?? DEFAULT_OPENAI_BASE_URL;
|
|
38
42
|
this.chatHandler = new OpenAIChat(this, options.apiKey);
|
|
39
43
|
this.streamingHandler = new OpenAIStreaming(this, options.apiKey);
|
|
44
|
+
this.responsesHandler = new OpenAIResponses(this);
|
|
40
45
|
this.modelsHandler = new OpenAIModels(this.baseUrl, options.apiKey);
|
|
41
46
|
this.imageHandler = new OpenAIImage(this.baseUrl, options.apiKey);
|
|
42
47
|
this.transcriptionHandler = new OpenAITranscription(this.baseUrl, options.apiKey);
|
|
@@ -52,6 +57,23 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
52
57
|
"Content-Type": "application/json"
|
|
53
58
|
};
|
|
54
59
|
}
|
|
60
|
+
/** Where an endpoint such as /chat/completions is served */
|
|
61
|
+
url(path) {
|
|
62
|
+
return buildUrl(this.apiBase(), path);
|
|
63
|
+
}
|
|
64
|
+
registryModel(model) {
|
|
65
|
+
return model;
|
|
66
|
+
}
|
|
67
|
+
responsesBase() {
|
|
68
|
+
return this.apiBase();
|
|
69
|
+
}
|
|
70
|
+
responsesModel(model) {
|
|
71
|
+
return model;
|
|
72
|
+
}
|
|
73
|
+
/** Whether a request goes to the Responses API rather than Chat Completions. */
|
|
74
|
+
usesResponsesApi(request) {
|
|
75
|
+
return needsResponsesApi(request, this.apiBase());
|
|
76
|
+
}
|
|
55
77
|
providerName() {
|
|
56
78
|
return "OpenAI";
|
|
57
79
|
}
|
|
@@ -70,9 +92,23 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
70
92
|
}
|
|
71
93
|
}
|
|
72
94
|
async chat(request) {
|
|
95
|
+
if (this.usesResponsesApi(request))
|
|
96
|
+
return this.responsesHandler.execute(request);
|
|
73
97
|
return this.chatHandler.execute(request);
|
|
74
98
|
}
|
|
75
99
|
async *stream(request) {
|
|
100
|
+
// Requests only the Responses API serves arrive whole, as one chunk, for now.
|
|
101
|
+
if (this.usesResponsesApi(request)) {
|
|
102
|
+
const response = await this.responsesHandler.execute(request);
|
|
103
|
+
yield {
|
|
104
|
+
content: response.content ?? "",
|
|
105
|
+
tool_calls: response.tool_calls,
|
|
106
|
+
usage: response.usage,
|
|
107
|
+
thinking: response.thinking,
|
|
108
|
+
done: true
|
|
109
|
+
};
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
76
112
|
yield* this.streamingHandler.execute(request);
|
|
77
113
|
}
|
|
78
114
|
async listModels() {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ChatRequest, ChatResponse } from "../Provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Some OpenAI models only accept function tools through the Responses API: Chat Completions
|
|
4
|
+
* rejects them ("use /v1/responses"). Requests that would fail that way go here; everything else
|
|
5
|
+
* keeps using Chat Completions.
|
|
6
|
+
*/
|
|
7
|
+
export declare function needsResponsesApi(request: ChatRequest, baseUrl: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Where Responses requests go and how they are signed: OpenAI's own API, or a provider serving
|
|
10
|
+
* the same API under another address, such as an Azure resource.
|
|
11
|
+
*/
|
|
12
|
+
export interface ResponsesTarget {
|
|
13
|
+
id: string;
|
|
14
|
+
responsesBase(): string;
|
|
15
|
+
/** The model the registry prices the request's model as */
|
|
16
|
+
registryModel(model: string): string;
|
|
17
|
+
headers(): Record<string, string>;
|
|
18
|
+
/** The name the API knows the model by, such as an Azure deployment's name */
|
|
19
|
+
responsesModel(model: string): string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Chat through OpenAI's Responses API, for requests Chat Completions can't serve. Nothing is
|
|
23
|
+
* stored on OpenAI's side: like every other NodeLLM chat, each request carries the conversation.
|
|
24
|
+
*/
|
|
25
|
+
export declare class OpenAIResponses {
|
|
26
|
+
private readonly target;
|
|
27
|
+
constructor(target: ResponsesTarget);
|
|
28
|
+
execute(request: ChatRequest): Promise<ChatResponse>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Responses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Responses.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiC3D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAMhF;AAkED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,IAAI,MAAM,CAAC;IACxB,2DAA2D;IAC3D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,8EAA8E;IAC9E,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAED;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE9C,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAmH3D"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Capabilities } from "./Capabilities.js";
|
|
2
|
+
import { handleOpenAIError } from "./Errors.js";
|
|
3
|
+
import { ModelRegistry } from "../../models/ModelRegistry.js";
|
|
4
|
+
import { buildUrl } from "./utils.js";
|
|
5
|
+
import { logger } from "../../utils/logger.js";
|
|
6
|
+
import { fetchWithTimeout } from "../../utils/fetch.js";
|
|
7
|
+
import { enforceStrictSchema } from "../../schema/strict.js";
|
|
8
|
+
/**
|
|
9
|
+
* Some OpenAI models only accept function tools through the Responses API: Chat Completions
|
|
10
|
+
* rejects them ("use /v1/responses"). Requests that would fail that way go here; everything else
|
|
11
|
+
* keeps using Chat Completions.
|
|
12
|
+
*/
|
|
13
|
+
export function needsResponsesApi(request, baseUrl) {
|
|
14
|
+
return (baseUrl.includes("api.openai.com") &&
|
|
15
|
+
!!request.tools?.length &&
|
|
16
|
+
Capabilities.needsResponsesForTools(request.model));
|
|
17
|
+
}
|
|
18
|
+
function contentParts(content, role) {
|
|
19
|
+
if (content === null || content === undefined)
|
|
20
|
+
return "";
|
|
21
|
+
if (typeof content === "string")
|
|
22
|
+
return content;
|
|
23
|
+
const textType = role === "assistant" ? "output_text" : "input_text";
|
|
24
|
+
return content.flatMap((part) => {
|
|
25
|
+
if (part.type === "text")
|
|
26
|
+
return [{ type: textType, text: part.text }];
|
|
27
|
+
if (part.type === "image_url")
|
|
28
|
+
return [{ type: "input_image", image_url: part.image_url.url }];
|
|
29
|
+
return [];
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Chat Completions messages as Responses input items: tool calls and results become items. */
|
|
33
|
+
function inputItems(messages) {
|
|
34
|
+
return messages.flatMap((message) => {
|
|
35
|
+
if (message.role === "tool") {
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
type: "function_call_output",
|
|
39
|
+
call_id: message.tool_call_id,
|
|
40
|
+
output: typeof message.content === "string" ? message.content : JSON.stringify(message.content)
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
const items = [];
|
|
45
|
+
const content = contentParts(message.content, message.role);
|
|
46
|
+
if (content !== "" && !(Array.isArray(content) && content.length === 0)) {
|
|
47
|
+
items.push({ role: message.role, content });
|
|
48
|
+
}
|
|
49
|
+
for (const call of message.tool_calls ?? []) {
|
|
50
|
+
items.push({
|
|
51
|
+
type: "function_call",
|
|
52
|
+
call_id: call.id,
|
|
53
|
+
name: call.function.name,
|
|
54
|
+
arguments: call.function.arguments
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return items;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function toolChoice(choice) {
|
|
61
|
+
if (choice === undefined)
|
|
62
|
+
return undefined;
|
|
63
|
+
if (typeof choice === "string")
|
|
64
|
+
return choice;
|
|
65
|
+
const name = choice.function?.name;
|
|
66
|
+
return name ? { type: "function", name } : choice;
|
|
67
|
+
}
|
|
68
|
+
function textFormat(format) {
|
|
69
|
+
if (!format)
|
|
70
|
+
return undefined;
|
|
71
|
+
if (format.type === "json_schema" && format.json_schema) {
|
|
72
|
+
const { name, schema, strict } = format.json_schema;
|
|
73
|
+
return {
|
|
74
|
+
type: "json_schema",
|
|
75
|
+
name: name ?? "response",
|
|
76
|
+
schema: strict === true ? enforceStrictSchema(schema) : schema,
|
|
77
|
+
strict
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { type: format.type };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Chat through OpenAI's Responses API, for requests Chat Completions can't serve. Nothing is
|
|
84
|
+
* stored on OpenAI's side: like every other NodeLLM chat, each request carries the conversation.
|
|
85
|
+
*/
|
|
86
|
+
export class OpenAIResponses {
|
|
87
|
+
target;
|
|
88
|
+
constructor(target) {
|
|
89
|
+
this.target = target;
|
|
90
|
+
}
|
|
91
|
+
async execute(request) {
|
|
92
|
+
const { model, messages, tools, temperature: _temperature, max_tokens, response_format, thinking, headers: _headers, requestTimeout: _requestTimeout, signal, prediction: _prediction, tool_choice, parallel_tool_calls, ...rest } = request;
|
|
93
|
+
const body = {
|
|
94
|
+
model: this.target.responsesModel(model),
|
|
95
|
+
input: inputItems(messages),
|
|
96
|
+
store: false,
|
|
97
|
+
...rest
|
|
98
|
+
};
|
|
99
|
+
const knownModel = this.target.registryModel(model);
|
|
100
|
+
const temperature = Capabilities.normalizeTemperature(request.temperature, knownModel);
|
|
101
|
+
if (temperature !== undefined && temperature !== null)
|
|
102
|
+
body.temperature = temperature;
|
|
103
|
+
if (max_tokens)
|
|
104
|
+
body.max_output_tokens = max_tokens;
|
|
105
|
+
if (parallel_tool_calls !== undefined)
|
|
106
|
+
body.parallel_tool_calls = parallel_tool_calls;
|
|
107
|
+
if (thinking?.effort && thinking.effort !== "none")
|
|
108
|
+
body.reasoning = { effort: thinking.effort };
|
|
109
|
+
if (tools?.length) {
|
|
110
|
+
body.tools = tools.map((tool) => ({
|
|
111
|
+
type: "function",
|
|
112
|
+
name: tool.function.name,
|
|
113
|
+
description: tool.function.description,
|
|
114
|
+
parameters: tool.function.strict === true
|
|
115
|
+
? enforceStrictSchema(tool.function.parameters)
|
|
116
|
+
: tool.function.parameters,
|
|
117
|
+
...(tool.function.strict !== undefined ? { strict: tool.function.strict } : {})
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
const choice = toolChoice(tool_choice);
|
|
121
|
+
if (choice !== undefined)
|
|
122
|
+
body.tool_choice = choice;
|
|
123
|
+
const format = textFormat(response_format);
|
|
124
|
+
if (format)
|
|
125
|
+
body.text = { format };
|
|
126
|
+
const url = buildUrl(this.target.responsesBase(), "/responses");
|
|
127
|
+
logger.logRequest("OpenAI", "POST", url, body);
|
|
128
|
+
const response = await fetchWithTimeout(url, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers: {
|
|
131
|
+
...this.target.headers(),
|
|
132
|
+
...request.headers
|
|
133
|
+
},
|
|
134
|
+
body: JSON.stringify(body),
|
|
135
|
+
signal
|
|
136
|
+
}, request.requestTimeout);
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
await handleOpenAIError(response, model);
|
|
139
|
+
}
|
|
140
|
+
const json = (await response.json());
|
|
141
|
+
logger.logResponse("OpenAI", response.status, response.statusText, json);
|
|
142
|
+
const output = json.output ?? [];
|
|
143
|
+
const text = output
|
|
144
|
+
.filter((item) => item.type === "message")
|
|
145
|
+
.flatMap((item) => item.content ?? [])
|
|
146
|
+
.filter((part) => part.type === "output_text")
|
|
147
|
+
.map((part) => part.text ?? "")
|
|
148
|
+
.join("");
|
|
149
|
+
const toolCalls = output
|
|
150
|
+
.filter((item) => item.type === "function_call")
|
|
151
|
+
.map((item) => ({
|
|
152
|
+
id: item.call_id ?? "",
|
|
153
|
+
type: "function",
|
|
154
|
+
function: { name: item.name ?? "", arguments: item.arguments ?? "{}" }
|
|
155
|
+
}));
|
|
156
|
+
if (!text && toolCalls.length === 0) {
|
|
157
|
+
throw new Error("OpenAI returned empty response");
|
|
158
|
+
}
|
|
159
|
+
const usage = json.usage
|
|
160
|
+
? ModelRegistry.calculateCost({
|
|
161
|
+
input_tokens: json.usage.input_tokens,
|
|
162
|
+
output_tokens: json.usage.output_tokens,
|
|
163
|
+
total_tokens: json.usage.total_tokens,
|
|
164
|
+
cached_tokens: json.usage.input_tokens_details?.cached_tokens,
|
|
165
|
+
reasoning_tokens: json.usage.output_tokens_details?.reasoning_tokens
|
|
166
|
+
}, knownModel, this.target.id)
|
|
167
|
+
: undefined;
|
|
168
|
+
const reasoningTokens = json.usage?.output_tokens_details?.reasoning_tokens;
|
|
169
|
+
return {
|
|
170
|
+
content: text || null,
|
|
171
|
+
tool_calls: toolCalls.length ? toolCalls : undefined,
|
|
172
|
+
usage,
|
|
173
|
+
thinking: reasoningTokens ? { tokens: reasoningTokens } : undefined
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -5,6 +5,8 @@ export declare class OpenAIStreaming {
|
|
|
5
5
|
private readonly apiKey;
|
|
6
6
|
private readonly baseUrl;
|
|
7
7
|
constructor(providerOrUrl: OpenAIProvider | string, apiKey: string);
|
|
8
|
+
private url;
|
|
9
|
+
private authHeaders;
|
|
8
10
|
execute(request: ChatRequest, controller?: AbortController): AsyncGenerator<ChatChunk>;
|
|
9
11
|
}
|
|
10
12
|
//# sourceMappingURL=Streaming.d.ts.map
|
|
@@ -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;AAIrD,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;
|
|
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;AAIrD,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;IAOjC,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,WAAW;IAKZ,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;CA4P9F"}
|
|
@@ -15,11 +15,26 @@ export class OpenAIStreaming {
|
|
|
15
15
|
this.apiKey = apiKey;
|
|
16
16
|
this.baseUrl = typeof providerOrUrl === "string" ? providerOrUrl : providerOrUrl.apiBase();
|
|
17
17
|
}
|
|
18
|
+
// A provider decides where its requests go and signs them; Azure, for one, routes by deployment
|
|
19
|
+
// and wants an api-key header, not a bearer token.
|
|
20
|
+
url() {
|
|
21
|
+
if (typeof this.providerOrUrl === "string")
|
|
22
|
+
return buildUrl(this.baseUrl, "/chat/completions");
|
|
23
|
+
return this.providerOrUrl.url("/chat/completions");
|
|
24
|
+
}
|
|
25
|
+
authHeaders() {
|
|
26
|
+
if (typeof this.providerOrUrl !== "string")
|
|
27
|
+
return this.providerOrUrl.headers();
|
|
28
|
+
return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" };
|
|
29
|
+
}
|
|
18
30
|
async *execute(request, controller) {
|
|
19
31
|
const internalController = new AbortController();
|
|
20
32
|
const abortController = controller || internalController;
|
|
21
33
|
const signal = request.signal ? request.signal : abortController.signal;
|
|
22
|
-
const
|
|
34
|
+
const knownModel = typeof this.providerOrUrl === "string"
|
|
35
|
+
? request.model
|
|
36
|
+
: this.providerOrUrl.registryModel(request.model);
|
|
37
|
+
const temperature = Capabilities.normalizeTemperature(request.temperature, knownModel);
|
|
23
38
|
const isMainOpenAI = this.baseUrl.includes("api.openai.com");
|
|
24
39
|
const supportsDeveloperRole = isMainOpenAI &&
|
|
25
40
|
(typeof this.providerOrUrl === "string"
|
|
@@ -35,7 +50,7 @@ export class OpenAIStreaming {
|
|
|
35
50
|
body.temperature = temperature;
|
|
36
51
|
}
|
|
37
52
|
if (request.max_tokens) {
|
|
38
|
-
if (Capabilities.needsMaxCompletionTokens(
|
|
53
|
+
if (Capabilities.needsMaxCompletionTokens(knownModel)) {
|
|
39
54
|
body.max_completion_tokens = request.max_tokens;
|
|
40
55
|
}
|
|
41
56
|
else {
|
|
@@ -92,13 +107,12 @@ export class OpenAIStreaming {
|
|
|
92
107
|
// Track tool calls being built across chunks
|
|
93
108
|
const toolCallsMap = new Map();
|
|
94
109
|
try {
|
|
95
|
-
const url =
|
|
110
|
+
const url = this.url();
|
|
96
111
|
logger.logRequest("OpenAI", "POST", url, body);
|
|
97
112
|
const response = await fetchWithTimeout(url, {
|
|
98
113
|
method: "POST",
|
|
99
114
|
headers: {
|
|
100
|
-
|
|
101
|
-
"Content-Type": "application/json",
|
|
115
|
+
...this.authHeaders(),
|
|
102
116
|
...request.headers
|
|
103
117
|
},
|
|
104
118
|
body: JSON.stringify(body),
|
|
@@ -9,6 +9,7 @@ export declare class OpenRouterCapabilities {
|
|
|
9
9
|
static supportsModeration(_modelId: string): boolean;
|
|
10
10
|
static supportsReasoning(modelId: string): boolean;
|
|
11
11
|
static supportsToolChoice(_modelId: string): boolean;
|
|
12
|
+
static supportsTemperature(modelId: string): boolean;
|
|
12
13
|
static getContextWindow(modelId: string): number | null;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=Capabilities.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS;IAIxB,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,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGxD"}
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS;IAIxB,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,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGxD"}
|
|
@@ -35,6 +35,9 @@ export class OpenRouterCapabilities {
|
|
|
35
35
|
static supportsToolChoice(_modelId) {
|
|
36
36
|
return true;
|
|
37
37
|
}
|
|
38
|
+
static supportsTemperature(modelId) {
|
|
39
|
+
return ModelRegistry.supportsTemperature(modelId, "openrouter");
|
|
40
|
+
}
|
|
38
41
|
static getContextWindow(modelId) {
|
|
39
42
|
return ModelRegistry.getContextWindow(modelId, "openrouter") ?? null;
|
|
40
43
|
}
|
|
@@ -15,6 +15,7 @@ export declare class OpenRouterProvider extends OpenAIProvider {
|
|
|
15
15
|
supportsReasoning: (model: string) => boolean;
|
|
16
16
|
supportsDeveloperRole: (_model: string) => boolean;
|
|
17
17
|
supportsPrediction: (_model: string) => boolean;
|
|
18
|
+
supportsTemperature: (model: string) => boolean;
|
|
18
19
|
getContextWindow: (model: string) => number | null;
|
|
19
20
|
};
|
|
20
21
|
constructor(options: OpenRouterProviderOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IAC7C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;yCACD,MAAM;uCAER,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;qCACT,MAAM;kCACT,MAAM;MAChC;gBAEU,OAAO,EAAE,yBAAyB;IAO9C,SAAS,CAAC,YAAY,IAAI,MAAM;CAGjC"}
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IAC7C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;yCACD,MAAM;uCAER,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;qCACT,MAAM;qCACN,MAAM;kCACT,MAAM;MAChC;gBAEU,OAAO,EAAE,yBAAyB;IAO9C,SAAS,CAAC,YAAY,IAAI,MAAM;CAGjC"}
|
|
@@ -13,6 +13,7 @@ export class OpenRouterProvider extends OpenAIProvider {
|
|
|
13
13
|
supportsReasoning: (model) => OpenRouterCapabilities.supportsReasoning(model),
|
|
14
14
|
supportsDeveloperRole: (_model) => true,
|
|
15
15
|
supportsPrediction: (_model) => false,
|
|
16
|
+
supportsTemperature: (model) => OpenRouterCapabilities.supportsTemperature(model),
|
|
16
17
|
getContextWindow: (model) => OpenRouterCapabilities.getContextWindow(model) || null
|
|
17
18
|
};
|
|
18
19
|
constructor(options) {
|
|
@@ -8,6 +8,8 @@ import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
|
8
8
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
9
9
|
import { registerXAIProvider } from "./xai/index.js";
|
|
10
10
|
import { registerMistralProvider } from "./mistral/index.js";
|
|
11
|
+
import { registerTypeSafeProvider } from "./typesafe/index.js";
|
|
12
|
+
import { registerAzureProvider } from "./azure/index.js";
|
|
11
13
|
import { NodeLLMConfig } from "../config.js";
|
|
12
14
|
type ProviderFactory = (config?: NodeLLMConfig) => Provider;
|
|
13
15
|
export type ProviderInterceptor = (provider: Provider) => Provider;
|
|
@@ -48,5 +50,5 @@ declare class ProviderRegistry {
|
|
|
48
50
|
* ```
|
|
49
51
|
*/
|
|
50
52
|
export declare const providerRegistry: ProviderRegistry;
|
|
51
|
-
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider };
|
|
53
|
+
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider, registerTypeSafeProvider, registerAzureProvider };
|
|
52
54
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,eAAe,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEnE,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAEzC,cAAc,CAAC,WAAW,EAAE,mBAAmB,GAAG,SAAS;IAIlE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAO/C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ;IAgBvD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,IAAI,sBAAsB,EAChD,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACtB,CAAC"}
|
|
@@ -7,6 +7,8 @@ import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
|
7
7
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
8
8
|
import { registerXAIProvider } from "./xai/index.js";
|
|
9
9
|
import { registerMistralProvider } from "./mistral/index.js";
|
|
10
|
+
import { registerTypeSafeProvider } from "./typesafe/index.js";
|
|
11
|
+
import { registerAzureProvider } from "./azure/index.js";
|
|
10
12
|
class ProviderRegistry {
|
|
11
13
|
providers = new Map();
|
|
12
14
|
globalInterceptor;
|
|
@@ -66,4 +68,4 @@ class ProviderRegistry {
|
|
|
66
68
|
*/
|
|
67
69
|
export const providerRegistry = new ProviderRegistry();
|
|
68
70
|
// Exported registration functions (delegates to provider-specific index files)
|
|
69
|
-
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider };
|
|
71
|
+
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider, registerTypeSafeProvider, registerAzureProvider };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { JudgmentRequest, JudgmentResponse } from "../Provider.js";
|
|
2
|
+
import { NamedQuestion } from "../../judge/Question.js";
|
|
3
|
+
export declare function renderJudgmentPayload(request: JudgmentRequest): Record<string, unknown>;
|
|
4
|
+
export declare function parseJudgmentResponse(json: unknown, questions: NamedQuestion[]): JudgmentResponse;
|
|
5
|
+
/**
|
|
6
|
+
* Turns an error response into the matching NodeLLM error. System One reports
|
|
7
|
+
* errors FastAPI-style: `detail` is a string, an object with a `message`, or a
|
|
8
|
+
* list of validation errors each with a location and message.
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleTypeSafeError(response: Response, model?: string): Promise<never>;
|
|
11
|
+
//# sourceMappingURL=SystemOne.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemOne.d.ts","sourceRoot":"","sources":["../../../src/providers/typesafe/SystemOne.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAwDxD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAevF;AAoED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAejG;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CA+C5F"}
|