@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,3 +1,6 @@
|
|
|
1
|
+
import { ModelRegistry } from "../../models/ModelRegistry.js";
|
|
2
|
+
import { Capabilities } from "./Capabilities.js";
|
|
3
|
+
import { DEFAULT_MAX_TOKENS } from "../../constants.js";
|
|
1
4
|
export function formatSystemPrompt(messages) {
|
|
2
5
|
let systemPrompt;
|
|
3
6
|
for (const msg of messages) {
|
|
@@ -126,3 +129,114 @@ function formatSingleMessage(msg) {
|
|
|
126
129
|
}
|
|
127
130
|
return { role, content: blocks };
|
|
128
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Add the thinking fields for a ThinkingConfig to a request body.
|
|
134
|
+
* Call after tool_choice is set.
|
|
135
|
+
*
|
|
136
|
+
* - `budget` is sent as a fixed thinking budget, exactly as given.
|
|
137
|
+
* - On generations that only think adaptively (no budget option in the registry:
|
|
138
|
+
* Opus 4.7+, Sonnet 5+, Fable), `effort` turns on adaptive thinking and is sent
|
|
139
|
+
* as `output_config.effort`. Forced tool choice skips the thinking block, which
|
|
140
|
+
* the API rejects alongside it.
|
|
141
|
+
* - On generations that take a budget, `effort` alone is not sent, so calls that
|
|
142
|
+
* worked before keep the same request.
|
|
143
|
+
* - `display` is forwarded on the thinking block, and alone turns on adaptive thinking.
|
|
144
|
+
*/
|
|
145
|
+
export function applyThinking(body, thinking, maxTokensSet) {
|
|
146
|
+
if (!thinking)
|
|
147
|
+
return;
|
|
148
|
+
const options = ModelRegistry.getReasoningOptions(body.model, "anthropic");
|
|
149
|
+
const takesEffort = options.some((option) => option.type === "effort");
|
|
150
|
+
const adaptiveOnly = takesEffort && !options.some((option) => option.type === "budget_tokens");
|
|
151
|
+
const effort = thinking.effort && thinking.effort !== "none" ? thinking.effort : undefined;
|
|
152
|
+
const display = thinking.display ? { display: thinking.display } : {};
|
|
153
|
+
const forcedTool = body.tool_choice?.type === "any" || body.tool_choice?.type === "tool";
|
|
154
|
+
if (thinking.budget) {
|
|
155
|
+
body.thinking = { type: "enabled", budget_tokens: thinking.budget, ...display };
|
|
156
|
+
// Extended thinking models require a larger max_tokens
|
|
157
|
+
if (!maxTokensSet) {
|
|
158
|
+
body.max_tokens = Math.max(body.max_tokens, thinking.budget + 1024);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (thinking.display || (effort && adaptiveOnly && !forcedTool)) {
|
|
162
|
+
body.thinking = { type: "adaptive", ...display };
|
|
163
|
+
}
|
|
164
|
+
if (effort && takesEffort && (thinking.budget || adaptiveOnly)) {
|
|
165
|
+
body.output_config = { ...body.output_config, effort };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The Messages API request body for a chat request, shared by streaming and non-streaming calls.
|
|
170
|
+
* Fields NodeLLM doesn't map itself, such as those from `withParams()`, are sent as they are.
|
|
171
|
+
*/
|
|
172
|
+
export function buildMessageRequest(request, stream) {
|
|
173
|
+
const { model, messages: _messages, tools, temperature, max_tokens, response_format, thinking, headers: _headers, tool_choice, parallel_tool_calls: _parallel, requestTimeout: _timeout, signal: _signal, promptCache, ...params } = request;
|
|
174
|
+
let system = formatSystemPrompt(request.messages);
|
|
175
|
+
if (response_format) {
|
|
176
|
+
let schemaText = "";
|
|
177
|
+
if (response_format.type === "json_schema" && response_format.json_schema?.schema) {
|
|
178
|
+
schemaText = "\nSchema:\n" + JSON.stringify(response_format.json_schema.schema, null, 2);
|
|
179
|
+
}
|
|
180
|
+
const instruction = `CRITICAL: Respond ONLY with a valid JSON object matching the requested schema.${schemaText}\n\nDo not include any other text or explanation.`;
|
|
181
|
+
system = system ? `${system}\n\n${instruction}` : instruction;
|
|
182
|
+
}
|
|
183
|
+
const body = {
|
|
184
|
+
model,
|
|
185
|
+
messages: formatMessages(request.messages),
|
|
186
|
+
max_tokens: max_tokens || Capabilities.getMaxOutputTokens(model) || DEFAULT_MAX_TOKENS,
|
|
187
|
+
system,
|
|
188
|
+
...params,
|
|
189
|
+
stream
|
|
190
|
+
};
|
|
191
|
+
if (temperature !== undefined) {
|
|
192
|
+
body.temperature = temperature;
|
|
193
|
+
}
|
|
194
|
+
if (tools && tools.length > 0 && tool_choice !== "none") {
|
|
195
|
+
body.tools = tools.map((tool) => ({
|
|
196
|
+
name: tool.function.name,
|
|
197
|
+
description: tool.function.description,
|
|
198
|
+
input_schema: tool.function.parameters
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
if (tool_choice && tool_choice !== "none") {
|
|
202
|
+
if (tool_choice === "auto") {
|
|
203
|
+
body.tool_choice = { type: "auto" };
|
|
204
|
+
}
|
|
205
|
+
else if (tool_choice === "required") {
|
|
206
|
+
body.tool_choice = { type: "any" };
|
|
207
|
+
}
|
|
208
|
+
else if (typeof tool_choice === "string") {
|
|
209
|
+
body.tool_choice = { type: "tool", name: tool_choice };
|
|
210
|
+
}
|
|
211
|
+
else if (typeof tool_choice === "object" && "function" in tool_choice) {
|
|
212
|
+
body.tool_choice = { type: "tool", name: tool_choice.function.name };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Top-level cache_control caches everything up to the last cacheable block, and moves the
|
|
216
|
+
// breakpoint forward as the conversation grows.
|
|
217
|
+
if (promptCache) {
|
|
218
|
+
body.cache_control = { type: "ephemeral" };
|
|
219
|
+
}
|
|
220
|
+
applyThinking(body, thinking, Boolean(max_tokens));
|
|
221
|
+
return body;
|
|
222
|
+
}
|
|
223
|
+
/** Whether the request sends a PDF, which needs the PDF beta header. */
|
|
224
|
+
export function hasPdf(body) {
|
|
225
|
+
return body.messages.some((msg) => Array.isArray(msg.content) && msg.content.some((block) => block.type === "document"));
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* NodeLLM usage from Anthropic's. Anthropic's input_tokens leave out cache reads and writes;
|
|
229
|
+
* NodeLLM's input_tokens count every input token, so costs and totals include cached input.
|
|
230
|
+
*/
|
|
231
|
+
export function toUsage(usage) {
|
|
232
|
+
const cached = usage.cache_read_input_tokens || 0;
|
|
233
|
+
const written = usage.cache_creation_input_tokens || 0;
|
|
234
|
+
const input = usage.input_tokens + cached + written;
|
|
235
|
+
return {
|
|
236
|
+
input_tokens: input,
|
|
237
|
+
output_tokens: usage.output_tokens,
|
|
238
|
+
total_tokens: input + usage.output_tokens,
|
|
239
|
+
cached_tokens: usage.cache_read_input_tokens,
|
|
240
|
+
cache_creation_tokens: usage.cache_creation_input_tokens
|
|
241
|
+
};
|
|
242
|
+
}
|
|
@@ -39,11 +39,25 @@ export interface AnthropicMessageRequest {
|
|
|
39
39
|
type: string;
|
|
40
40
|
name?: string;
|
|
41
41
|
};
|
|
42
|
-
|
|
43
|
-
type: "
|
|
44
|
-
|
|
42
|
+
cache_control?: {
|
|
43
|
+
type: "ephemeral";
|
|
44
|
+
};
|
|
45
|
+
thinking?: AnthropicThinking;
|
|
46
|
+
output_config?: {
|
|
47
|
+
effort?: string;
|
|
48
|
+
[key: string]: unknown;
|
|
45
49
|
};
|
|
46
50
|
}
|
|
51
|
+
export type AnthropicThinking = {
|
|
52
|
+
type: "enabled";
|
|
53
|
+
budget_tokens: number;
|
|
54
|
+
display?: "summarized" | "omitted";
|
|
55
|
+
} | {
|
|
56
|
+
type: "adaptive";
|
|
57
|
+
display?: "summarized" | "omitted";
|
|
58
|
+
} | {
|
|
59
|
+
type: "disabled";
|
|
60
|
+
};
|
|
47
61
|
export interface AnthropicUsage {
|
|
48
62
|
input_tokens: number;
|
|
49
63
|
output_tokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EACA,MAAM,GACN,OAAO,GACP,UAAU,GACV,aAAa,GACb,UAAU,GACV,UAAU,GACV,mBAAmB,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACxC,CAAC,CAAC;IACH,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { OpenAIProvider } from "../openai/OpenAIProvider.js";
|
|
2
|
+
import { ChatRequest, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, ModerationRequest, ModerationResponse } from "../Provider.js";
|
|
3
|
+
export interface AzureProviderOptions {
|
|
4
|
+
/** The resource's key. Leave it out to sign with authToken instead. */
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
/** A Microsoft Entra ID access token, for resources that sign in without keys */
|
|
7
|
+
authToken?: string;
|
|
8
|
+
/**
|
|
9
|
+
* The address the Azure portal shows for a deployment or resource:
|
|
10
|
+
* - a deployment's, https://my-resource.openai.azure.com/openai/deployments/my-gpt?api-version=…
|
|
11
|
+
* - a model endpoint's, https://my-resource.services.ai.azure.com/models/chat/completions?api-version=…
|
|
12
|
+
* - the resource's v1 address, https://my-resource.services.ai.azure.com/openai/v1
|
|
13
|
+
* - the resource itself, https://my-resource.services.ai.azure.com
|
|
14
|
+
*/
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
/** Deployment names mapped to the models they run, so capabilities and pricing are known */
|
|
17
|
+
deployments?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Azure AI Foundry: the models deployed on an Azure resource, OpenAI's and others' such as Llama,
|
|
21
|
+
* DeepSeek, Mistral and Grok, through its OpenAI-compatible APIs. The model is the deployment's
|
|
22
|
+
* name; `deployments` says which model each one runs when the names differ.
|
|
23
|
+
*/
|
|
24
|
+
export declare class AzureProvider extends OpenAIProvider {
|
|
25
|
+
private readonly azure;
|
|
26
|
+
private readonly address;
|
|
27
|
+
private readonly deployments;
|
|
28
|
+
capabilities: {
|
|
29
|
+
supportsVision: (model: string) => boolean;
|
|
30
|
+
supportsTools: (model: string) => boolean;
|
|
31
|
+
supportsStructuredOutput: (model: string) => boolean;
|
|
32
|
+
supportsEmbeddings: (model: string) => boolean;
|
|
33
|
+
supportsImageGeneration: (_model: string) => boolean;
|
|
34
|
+
supportsTranscription: (_model: string) => boolean;
|
|
35
|
+
supportsModeration: (_model: string) => boolean;
|
|
36
|
+
supportsReasoning: (model: string) => boolean;
|
|
37
|
+
supportsDeveloperRole: (_model: string) => boolean;
|
|
38
|
+
supportsPrediction: (_model: string) => boolean;
|
|
39
|
+
supportsTemperature: (model: string) => boolean;
|
|
40
|
+
getContextWindow: (model: string) => number | null;
|
|
41
|
+
};
|
|
42
|
+
constructor(azure: AzureProviderOptions);
|
|
43
|
+
headers(): Record<string, string>;
|
|
44
|
+
url(path: string): string;
|
|
45
|
+
registryModel(model: string): string;
|
|
46
|
+
responsesBase(): string;
|
|
47
|
+
responsesModel(model: string): string;
|
|
48
|
+
protected usesResponsesApi(request: ChatRequest): boolean;
|
|
49
|
+
protected providerName(): string;
|
|
50
|
+
paint(_request: ImageRequest): Promise<ImageResponse>;
|
|
51
|
+
transcribe(_request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
52
|
+
moderate(_request: ModerationRequest): Promise<ModerationResponse>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=AzureProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/AzureProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAKxB,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAgCD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAwBnC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAvBlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IAE9C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;0CAEA,MAAM;wCACR,MAAM;qCACT,MAAM;mCACR,MAAM;wCAED,MAAM;qCACT,MAAM;qCACN,MAAM;kCAET,MAAM;MAEhC;gBAE2B,KAAK,EAAE,oBAAoB;IASxC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgBzB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKpC,aAAa,IAAI,MAAM;IAKvB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;cAKlC,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;cAO/C,YAAY,IAAI,MAAM;IAI1B,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIrD,UAAU,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAI1E,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAGlF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { OpenAIProvider } from "../openai/OpenAIProvider.js";
|
|
2
|
+
import { Capabilities } from "../openai/Capabilities.js";
|
|
3
|
+
import { AzureCapabilities } from "./Capabilities.js";
|
|
4
|
+
import { AzureEmbedding } from "./Embedding.js";
|
|
5
|
+
import { AzureModels } from "./Models.js";
|
|
6
|
+
// The versions Azure documents, for addresses that don't name one.
|
|
7
|
+
const CHAT_API_VERSION = "2024-05-01-preview";
|
|
8
|
+
const MODELS_API_VERSION = "preview";
|
|
9
|
+
const parseAddress = (baseUrl) => {
|
|
10
|
+
const url = new URL(baseUrl);
|
|
11
|
+
const path = `${url.origin}${url.pathname}`.replace(/\/+$/, "");
|
|
12
|
+
const shape = path.endsWith("/chat/completions")
|
|
13
|
+
? "endpoint"
|
|
14
|
+
: path.includes("/openai/deployments/")
|
|
15
|
+
? "deployment"
|
|
16
|
+
: path.endsWith("/openai/v1")
|
|
17
|
+
? "v1"
|
|
18
|
+
: "resource";
|
|
19
|
+
const root = path.replace(/\/chat\/completions$/, "").replace(/\/(models|openai)(\/.*)?$/, "");
|
|
20
|
+
return { path, root, version: url.searchParams.get("api-version") ?? undefined, shape };
|
|
21
|
+
};
|
|
22
|
+
const withVersion = (url, version) => version ? `${url}?api-version=${version}` : url;
|
|
23
|
+
/**
|
|
24
|
+
* Azure AI Foundry: the models deployed on an Azure resource, OpenAI's and others' such as Llama,
|
|
25
|
+
* DeepSeek, Mistral and Grok, through its OpenAI-compatible APIs. The model is the deployment's
|
|
26
|
+
* name; `deployments` says which model each one runs when the names differ.
|
|
27
|
+
*/
|
|
28
|
+
export class AzureProvider extends OpenAIProvider {
|
|
29
|
+
azure;
|
|
30
|
+
address;
|
|
31
|
+
deployments;
|
|
32
|
+
capabilities = {
|
|
33
|
+
supportsVision: (model) => AzureCapabilities.supportsVision(this.registryModel(model)),
|
|
34
|
+
supportsTools: (model) => AzureCapabilities.supportsTools(this.registryModel(model)),
|
|
35
|
+
supportsStructuredOutput: (model) => AzureCapabilities.supportsStructuredOutput(this.registryModel(model)),
|
|
36
|
+
supportsEmbeddings: (model) => AzureCapabilities.supportsEmbeddings(this.registryModel(model)),
|
|
37
|
+
supportsImageGeneration: (_model) => false,
|
|
38
|
+
supportsTranscription: (_model) => false,
|
|
39
|
+
supportsModeration: (_model) => false,
|
|
40
|
+
supportsReasoning: (model) => AzureCapabilities.supportsReasoning(this.registryModel(model)),
|
|
41
|
+
supportsDeveloperRole: (_model) => false,
|
|
42
|
+
supportsPrediction: (_model) => false,
|
|
43
|
+
supportsTemperature: (model) => AzureCapabilities.supportsTemperature(this.registryModel(model)),
|
|
44
|
+
getContextWindow: (model) => AzureCapabilities.getContextWindow(this.registryModel(model))
|
|
45
|
+
};
|
|
46
|
+
constructor(azure) {
|
|
47
|
+
super({ apiKey: azure.apiKey ?? "", baseUrl: azure.baseUrl });
|
|
48
|
+
this.azure = azure;
|
|
49
|
+
this.address = parseAddress(azure.baseUrl);
|
|
50
|
+
this.deployments = azure.deployments ?? {};
|
|
51
|
+
this.embeddingHandler = new AzureEmbedding(this);
|
|
52
|
+
this.modelsHandler = new AzureModels(this);
|
|
53
|
+
}
|
|
54
|
+
// Serverless endpoints take the key as a bearer token; resources take it as api-key.
|
|
55
|
+
headers() {
|
|
56
|
+
const serverless = new URL(this.address.root).hostname.endsWith(".models.ai.azure.com");
|
|
57
|
+
const auth = !this.azure.apiKey
|
|
58
|
+
? { Authorization: `Bearer ${this.azure.authToken}` }
|
|
59
|
+
: serverless
|
|
60
|
+
? { Authorization: `Bearer ${this.azure.apiKey}` }
|
|
61
|
+
: { "api-key": this.azure.apiKey };
|
|
62
|
+
return { ...auth, "Content-Type": "application/json" };
|
|
63
|
+
}
|
|
64
|
+
url(path) {
|
|
65
|
+
const { shape, path: base, root, version } = this.address;
|
|
66
|
+
if (path === "/chat/completions") {
|
|
67
|
+
if (shape === "endpoint")
|
|
68
|
+
return this.azure.baseUrl;
|
|
69
|
+
if (shape === "deployment")
|
|
70
|
+
return withVersion(`${base}${path}`, version ?? CHAT_API_VERSION);
|
|
71
|
+
if (shape === "v1")
|
|
72
|
+
return withVersion(`${base}${path}`, version);
|
|
73
|
+
return withVersion(`${root}/models${path}`, version ?? CHAT_API_VERSION);
|
|
74
|
+
}
|
|
75
|
+
if (path === "/embeddings" && shape === "deployment") {
|
|
76
|
+
return withVersion(`${base}${path}`, version ?? CHAT_API_VERSION);
|
|
77
|
+
}
|
|
78
|
+
if (path === "/models")
|
|
79
|
+
return withVersion(`${this.responsesBase()}${path}`, MODELS_API_VERSION);
|
|
80
|
+
return withVersion(`${this.responsesBase()}${path}`, shape === "v1" ? version : undefined);
|
|
81
|
+
}
|
|
82
|
+
registryModel(model) {
|
|
83
|
+
return this.deployments[model] ?? model;
|
|
84
|
+
}
|
|
85
|
+
// The Responses API is served from the resource's v1 address, never under a deployment.
|
|
86
|
+
responsesBase() {
|
|
87
|
+
const { shape, path, root } = this.address;
|
|
88
|
+
return shape === "v1" ? path : `${root}/openai/v1`;
|
|
89
|
+
}
|
|
90
|
+
responsesModel(model) {
|
|
91
|
+
return this.address.path.match(/\/openai\/deployments\/([^/]+)/)?.[1] ?? model;
|
|
92
|
+
}
|
|
93
|
+
// Unlike OpenAI's own API, the address says nothing about the model, so only the model decides.
|
|
94
|
+
usesResponsesApi(request) {
|
|
95
|
+
return (!!request.tools?.length &&
|
|
96
|
+
Capabilities.needsResponsesForTools(this.registryModel(request.model)));
|
|
97
|
+
}
|
|
98
|
+
providerName() {
|
|
99
|
+
return "Azure";
|
|
100
|
+
}
|
|
101
|
+
async paint(_request) {
|
|
102
|
+
return this.throwUnsupportedError("paint");
|
|
103
|
+
}
|
|
104
|
+
async transcribe(_request) {
|
|
105
|
+
return this.throwUnsupportedError("transcribe");
|
|
106
|
+
}
|
|
107
|
+
async moderate(_request) {
|
|
108
|
+
return this.throwUnsupportedError("moderate");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a model can do on Azure, from the registry. A deployment the registry doesn't know, such
|
|
3
|
+
* as one with its own name and no entry in `deployments`, is assumed able: Azure decides.
|
|
4
|
+
*/
|
|
5
|
+
export declare class AzureCapabilities {
|
|
6
|
+
static findModel(modelId: string): import("../../models/types.js").Model | undefined;
|
|
7
|
+
private static supports;
|
|
8
|
+
static supportsVision(modelId: string): boolean;
|
|
9
|
+
static supportsTools(modelId: string): boolean;
|
|
10
|
+
static supportsStructuredOutput(modelId: string): boolean;
|
|
11
|
+
static supportsEmbeddings(modelId: string): boolean;
|
|
12
|
+
static supportsReasoning(modelId: string): boolean;
|
|
13
|
+
static supportsTemperature(modelId: string): boolean;
|
|
14
|
+
static getContextWindow(modelId: string): number | null;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/Capabilities.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;IAIhC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAKvB,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,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGxD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ModelRegistry } from "../../models/ModelRegistry.js";
|
|
2
|
+
/**
|
|
3
|
+
* What a model can do on Azure, from the registry. A deployment the registry doesn't know, such
|
|
4
|
+
* as one with its own name and no entry in `deployments`, is assumed able: Azure decides.
|
|
5
|
+
*/
|
|
6
|
+
export class AzureCapabilities {
|
|
7
|
+
static findModel(modelId) {
|
|
8
|
+
return ModelRegistry.find(modelId, "azure");
|
|
9
|
+
}
|
|
10
|
+
static supports(modelId, ...capabilities) {
|
|
11
|
+
if (!this.findModel(modelId))
|
|
12
|
+
return true;
|
|
13
|
+
return capabilities.some((capability) => ModelRegistry.supports(modelId, capability, "azure"));
|
|
14
|
+
}
|
|
15
|
+
static supportsVision(modelId) {
|
|
16
|
+
return this.supports(modelId, "vision");
|
|
17
|
+
}
|
|
18
|
+
static supportsTools(modelId) {
|
|
19
|
+
return this.supports(modelId, "tools", "function_calling");
|
|
20
|
+
}
|
|
21
|
+
static supportsStructuredOutput(modelId) {
|
|
22
|
+
return this.supports(modelId, "structured_output", "json_mode");
|
|
23
|
+
}
|
|
24
|
+
static supportsEmbeddings(modelId) {
|
|
25
|
+
return this.supports(modelId, "embeddings");
|
|
26
|
+
}
|
|
27
|
+
static supportsReasoning(modelId) {
|
|
28
|
+
return !!this.findModel(modelId) && ModelRegistry.supports(modelId, "reasoning", "azure");
|
|
29
|
+
}
|
|
30
|
+
static supportsTemperature(modelId) {
|
|
31
|
+
return ModelRegistry.supportsTemperature(modelId, "azure");
|
|
32
|
+
}
|
|
33
|
+
static getContextWindow(modelId) {
|
|
34
|
+
return ModelRegistry.getContextWindow(modelId, "azure") ?? null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OpenAIEmbedding } from "../openai/Embedding.js";
|
|
2
|
+
import type { AzureProvider } from "./AzureProvider.js";
|
|
3
|
+
export declare class AzureEmbedding extends OpenAIEmbedding {
|
|
4
|
+
private readonly provider;
|
|
5
|
+
constructor(provider: AzureProvider);
|
|
6
|
+
protected getProviderName(): string;
|
|
7
|
+
protected validateModel(model: string): void;
|
|
8
|
+
protected endpoint(): string;
|
|
9
|
+
protected requestHeaders(): Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/Embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,qBAAa,cAAe,SAAQ,eAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;cAIjC,eAAe,IAAI,MAAM;cAIzB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;cAMlC,QAAQ,IAAI,MAAM;cAIlB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAG5D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OpenAIEmbedding } from "../openai/Embedding.js";
|
|
2
|
+
import { AzureCapabilities } from "./Capabilities.js";
|
|
3
|
+
export class AzureEmbedding extends OpenAIEmbedding {
|
|
4
|
+
provider;
|
|
5
|
+
constructor(provider) {
|
|
6
|
+
super(provider.apiBase(), "");
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
}
|
|
9
|
+
getProviderName() {
|
|
10
|
+
return "azure";
|
|
11
|
+
}
|
|
12
|
+
validateModel(model) {
|
|
13
|
+
if (!AzureCapabilities.supportsEmbeddings(this.provider.registryModel(model))) {
|
|
14
|
+
throw new Error(`Model ${model} does not support embeddings.`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
endpoint() {
|
|
18
|
+
return this.provider.url("/embeddings");
|
|
19
|
+
}
|
|
20
|
+
requestHeaders() {
|
|
21
|
+
return this.provider.headers();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ListedModel, OpenAIModels } from "../openai/Models.js";
|
|
2
|
+
import type { AzureProvider } from "./AzureProvider.js";
|
|
3
|
+
type AzureListedModel = ListedModel & {
|
|
4
|
+
deprecation?: {
|
|
5
|
+
inference?: number;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
/** The models the resource's region offers, which can be deployed; not the deployments. */
|
|
9
|
+
export declare class AzureModels extends OpenAIModels {
|
|
10
|
+
private readonly provider;
|
|
11
|
+
constructor(provider: AzureProvider);
|
|
12
|
+
protected getProviderName(): string;
|
|
13
|
+
protected endpoint(): string;
|
|
14
|
+
protected requestHeaders(): Record<string, string>;
|
|
15
|
+
protected listed(data: AzureListedModel[]): AzureListedModel[];
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,KAAK,gBAAgB,GAAG,WAAW,GAAG;IAAE,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE/E,2FAA2F;AAC3F,qBAAa,WAAY,SAAQ,YAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;cAIjC,eAAe,IAAI,MAAM;cAIzB,QAAQ,IAAI,MAAM;cAIlB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;cAKxC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE;CASxE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { OpenAIModels } from "../openai/Models.js";
|
|
2
|
+
/** The models the resource's region offers, which can be deployed; not the deployments. */
|
|
3
|
+
export class AzureModels extends OpenAIModels {
|
|
4
|
+
provider;
|
|
5
|
+
constructor(provider) {
|
|
6
|
+
super(provider.apiBase(), "");
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
}
|
|
9
|
+
getProviderName() {
|
|
10
|
+
return "azure";
|
|
11
|
+
}
|
|
12
|
+
endpoint() {
|
|
13
|
+
return this.provider.url("/models");
|
|
14
|
+
}
|
|
15
|
+
requestHeaders() {
|
|
16
|
+
return this.provider.headers();
|
|
17
|
+
}
|
|
18
|
+
// Azure lists a model once for each region it is offered in, and keeps listing retired ones.
|
|
19
|
+
listed(data) {
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
return data.filter((model) => {
|
|
22
|
+
if (seen.has(model.id))
|
|
23
|
+
return false;
|
|
24
|
+
seen.add(model.id);
|
|
25
|
+
const retiresAt = model.deprecation?.inference;
|
|
26
|
+
return !(typeof retiresAt === "number" && retiresAt * 1000 < Date.now());
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/index.ts"],"names":[],"mappings":"AAIA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAIlC,wBAAgB,qBAAqB,SA2BpC;AAED,eAAO,MAAM,qBAAqB,8BAAwB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { config as globalConfig } from "../../config.js";
|
|
2
|
+
import { providerRegistry } from "../registry.js";
|
|
3
|
+
import { AzureProvider } from "./AzureProvider.js";
|
|
4
|
+
export * from "./AzureProvider.js";
|
|
5
|
+
export * from "./Capabilities.js";
|
|
6
|
+
let registered = false;
|
|
7
|
+
export function registerAzureProvider() {
|
|
8
|
+
if (registered)
|
|
9
|
+
return;
|
|
10
|
+
providerRegistry.register("azure", (config) => {
|
|
11
|
+
const cfg = config || globalConfig;
|
|
12
|
+
const baseUrl = cfg.azureApiBase;
|
|
13
|
+
if (!baseUrl) {
|
|
14
|
+
throw new Error("azureApiBase is not set in config or AZURE_API_BASE environment variable: give the address the Azure portal shows for your deployment or resource");
|
|
15
|
+
}
|
|
16
|
+
if (!cfg.azureApiKey && !cfg.azureAuthToken) {
|
|
17
|
+
throw new Error("azureApiKey or azureAuthToken is not set in config or AZURE_API_KEY / AZURE_AUTH_TOKEN environment variables");
|
|
18
|
+
}
|
|
19
|
+
return new AzureProvider({
|
|
20
|
+
apiKey: cfg.azureApiKey,
|
|
21
|
+
authToken: cfg.azureAuthToken,
|
|
22
|
+
baseUrl,
|
|
23
|
+
deployments: cfg.azureDeployments
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
registered = true;
|
|
27
|
+
}
|
|
28
|
+
export const ensureAzureRegistered = registerAzureProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BedrockProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/BedrockProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAShE,qBAAa,eAAgB,SAAQ,YAAa,YAAW,QAAQ;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAE/C,YAAY,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"BedrockProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/BedrockProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAShE,qBAAa,eAAgB,SAAQ,YAAa,YAAW,QAAQ;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAE/C,YAAY,EAAE,oBAAoB,CAavC;gBAEU,MAAM,EAAE,aAAa;IAW1B,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAI1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvD,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;CAOvD;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -52,6 +52,7 @@ export class BedrockProvider extends BaseProvider {
|
|
|
52
52
|
supportsModeration: (_model) => !!(this.config.guardrailIdentifier && this.config.guardrailVersion),
|
|
53
53
|
supportsReasoning: (model) => Capabilities.supportsExtendedThinking(model),
|
|
54
54
|
supportsDeveloperRole: (_model) => true,
|
|
55
|
+
supportsTemperature: (model) => Capabilities.supportsTemperature(model),
|
|
55
56
|
getContextWindow: (model) => Capabilities.getContextWindow(model)
|
|
56
57
|
};
|
|
57
58
|
constructor(config) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { ModelPricing } from "../../models/types.js";
|
|
5
5
|
export declare class Capabilities {
|
|
6
|
+
static supportsTemperature(modelId: string): boolean;
|
|
6
7
|
static getContextWindow(modelId: string): number | null;
|
|
7
8
|
static getMaxOutputTokens(modelId: string): number | null;
|
|
8
9
|
static supportsChat(modelId: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Capabilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMrD,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMlD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAWpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrD,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAejD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAa9C,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAWjD,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Capabilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMrD,qBAAa,YAAY;IACvB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMlD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAWpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrD,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAejD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAa9C,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAWjD,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
|
|
@@ -7,6 +7,9 @@ import { PricingRegistry } from "../../models/PricingRegistry.js";
|
|
|
7
7
|
// Model Family Patterns
|
|
8
8
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
9
|
export class Capabilities {
|
|
10
|
+
static supportsTemperature(modelId) {
|
|
11
|
+
return ModelRegistry.supportsTemperature(modelId, "bedrock");
|
|
12
|
+
}
|
|
10
13
|
static getContextWindow(modelId) {
|
|
11
14
|
return ModelRegistry.getContextWindow(modelId, "bedrock") ?? 128_000;
|
|
12
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAE,aAAa,EAA6C,MAAM,aAAa,CAAC;AAavF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAMjC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAE,aAAa,EAA6C,MAAM,aAAa,CAAC;AAavF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAMjC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0D1D;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;OAEG;IACH,OAAO,CAAC,aAAa;CAqDtB"}
|
|
@@ -51,7 +51,8 @@ export class BedrockChat {
|
|
|
51
51
|
const response = await fetchWithTimeout(url, {
|
|
52
52
|
method: "POST",
|
|
53
53
|
headers,
|
|
54
|
-
body: bodyJson
|
|
54
|
+
body: bodyJson,
|
|
55
|
+
signal: request.signal
|
|
55
56
|
}, request.requestTimeout ?? this.config.requestTimeout);
|
|
56
57
|
if (!response.ok) {
|
|
57
58
|
await handleBedrockError(response, modelId);
|
|
@@ -134,7 +135,10 @@ export class BedrockChat {
|
|
|
134
135
|
}
|
|
135
136
|
// Build usage info
|
|
136
137
|
const usage = {
|
|
137
|
-
|
|
138
|
+
// Bedrock's inputTokens leave out cache reads and writes; NodeLLM's count them.
|
|
139
|
+
input_tokens: response.usage.inputTokens +
|
|
140
|
+
(response.usage.cacheReadInputTokens || 0) +
|
|
141
|
+
(response.usage.cacheWriteInputTokens || 0),
|
|
138
142
|
output_tokens: response.usage.outputTokens,
|
|
139
143
|
total_tokens: response.usage.totalTokens,
|
|
140
144
|
cached_tokens: response.usage.cacheReadInputTokens,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Errors.ts"],"names":[],"mappings":"AAeA,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAuE5F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BadRequestError, ContextWindowExceededError, InsufficientQuotaError, InvalidModelError, AuthenticationError, RateLimitError, ServerError, ServiceUnavailableError, APIError, ForbiddenError } from "../../errors/index.js";
|
|
2
|
+
import { isBillingProblem } from "../../errors/billing.js";
|
|
2
3
|
export async function handleBedrockError(response, modelId) {
|
|
3
4
|
const status = response.status;
|
|
4
5
|
const errorText = await response.text();
|
|
@@ -12,6 +13,9 @@ export async function handleBedrockError(response, modelId) {
|
|
|
12
13
|
body = errorText;
|
|
13
14
|
}
|
|
14
15
|
const provider = "bedrock";
|
|
16
|
+
if (isBillingProblem(status, message)) {
|
|
17
|
+
throw new InsufficientQuotaError(message, body, provider, modelId);
|
|
18
|
+
}
|
|
15
19
|
// Throttling
|
|
16
20
|
if (status === 429 || message.includes("ThrottlingException")) {
|
|
17
21
|
throw new RateLimitError(message, body, provider, modelId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Streaming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAS,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAA6C,MAAM,aAAa,CAAC;AAQvF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAM1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;IA6H7F;;OAEG;IACH,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/bedrock/Streaming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAS,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAA6C,MAAM,aAAa,CAAC;AAQvF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAM1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;IA6H7F;;OAEG;IACH,OAAO,CAAC,UAAU;IA6GlB,OAAO,CAAC,YAAY;CAsCrB"}
|