@yourgpt/llm-sdk 2.5.1-beta.0 → 2.5.1-beta.1
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 +19 -1
- package/dist/adapters/index.d.mts +4 -4
- package/dist/adapters/index.d.ts +4 -4
- package/dist/adapters/index.js +139 -12
- package/dist/adapters/index.mjs +139 -12
- package/dist/{base-tNgbBaSo.d.mts → base-BYQKp9TW.d.mts} +5 -1
- package/dist/{base-C58Dsr9p.d.ts → base-Cxq3ni0t.d.ts} +5 -1
- package/dist/fallback/index.d.mts +4 -4
- package/dist/fallback/index.d.ts +4 -4
- package/dist/index.d.mts +60 -8
- package/dist/index.d.ts +60 -8
- package/dist/index.js +59 -0
- package/dist/index.mjs +59 -0
- package/dist/providers/anthropic/index.d.mts +3 -3
- package/dist/providers/anthropic/index.d.ts +3 -3
- package/dist/providers/anthropic/index.js +91 -10
- package/dist/providers/anthropic/index.mjs +91 -10
- package/dist/providers/azure/index.d.mts +3 -3
- package/dist/providers/azure/index.d.ts +3 -3
- package/dist/providers/fireworks/index.d.mts +1 -1
- package/dist/providers/fireworks/index.d.ts +1 -1
- package/dist/providers/google/index.d.mts +3 -3
- package/dist/providers/google/index.d.ts +3 -3
- package/dist/providers/google/index.js +51 -2
- package/dist/providers/google/index.mjs +51 -2
- package/dist/providers/ollama/index.d.mts +4 -4
- package/dist/providers/ollama/index.d.ts +4 -4
- package/dist/providers/openai/index.d.mts +3 -3
- package/dist/providers/openai/index.d.ts +3 -3
- package/dist/providers/openai/index.js +51 -2
- package/dist/providers/openai/index.mjs +51 -2
- package/dist/providers/openrouter/index.d.mts +3 -3
- package/dist/providers/openrouter/index.d.ts +3 -3
- package/dist/providers/openrouter/index.js +51 -2
- package/dist/providers/openrouter/index.mjs +51 -2
- package/dist/providers/togetherai/index.d.mts +3 -3
- package/dist/providers/togetherai/index.d.ts +3 -3
- package/dist/providers/togetherai/index.js +51 -2
- package/dist/providers/togetherai/index.mjs +51 -2
- package/dist/providers/xai/index.d.mts +3 -3
- package/dist/providers/xai/index.d.ts +3 -3
- package/dist/providers/xai/index.js +51 -2
- package/dist/providers/xai/index.mjs +51 -2
- package/dist/{types-BSSiJW2o.d.mts → types-BvkiJ1dd.d.mts} +2 -2
- package/dist/{types-CCxPmkmK.d.ts → types-ChORafYS.d.ts} +1 -1
- package/dist/{types-BkQCSiIt.d.mts → types-D774b0dg.d.mts} +57 -2
- package/dist/{types-BkQCSiIt.d.ts → types-D774b0dg.d.ts} +57 -2
- package/dist/{types-BQ31QIsA.d.ts → types-TMilS-Dz.d.ts} +2 -2
- package/dist/{types-B6dhnguR.d.mts → types-mwMhCwOq.d.mts} +1 -1
- package/dist/yourgpt/index.d.mts +1 -1
- package/dist/yourgpt/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -87,6 +87,63 @@ function toAnthropicOutputConfig(rf) {
|
|
|
87
87
|
}
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
|
+
function toAnthropicMcp(mcpServers) {
|
|
91
|
+
if (!mcpServers || mcpServers.length === 0) {
|
|
92
|
+
return { mcpServers: [], tools: [], betas: [] };
|
|
93
|
+
}
|
|
94
|
+
const serverEntries = [];
|
|
95
|
+
const toolEntries = [];
|
|
96
|
+
for (const mcp of mcpServers) {
|
|
97
|
+
const authHeader = mcp.headers?.Authorization ?? mcp.headers?.authorization;
|
|
98
|
+
const token = authHeader?.replace(/^Bearer\s+/i, "");
|
|
99
|
+
serverEntries.push({
|
|
100
|
+
type: "url",
|
|
101
|
+
url: mcp.url,
|
|
102
|
+
name: mcp.label,
|
|
103
|
+
...token ? { authorization_token: token } : {}
|
|
104
|
+
});
|
|
105
|
+
if (mcp.allowedTools && mcp.allowedTools.length > 0) {
|
|
106
|
+
toolEntries.push({
|
|
107
|
+
type: "mcp_toolset",
|
|
108
|
+
mcp_server_name: mcp.label,
|
|
109
|
+
configs: Object.fromEntries(
|
|
110
|
+
mcp.allowedTools.map((toolName) => [toolName, {}])
|
|
111
|
+
)
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
mcpServers: serverEntries,
|
|
117
|
+
tools: toolEntries,
|
|
118
|
+
betas: ["mcp-client-2025-11-20"]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function isStringEffort(effort) {
|
|
122
|
+
return typeof effort === "string" && (effort === "minimal" || effort === "low" || effort === "medium" || effort === "high");
|
|
123
|
+
}
|
|
124
|
+
var ANTHROPIC_ADAPTIVE_MODELS = /(claude-opus-4-7|claude-opus-4-6|claude-sonnet-4-6)/i;
|
|
125
|
+
function toAnthropicThinking(effort, modelId) {
|
|
126
|
+
if (!effort) return {};
|
|
127
|
+
if (typeof effort === "object" && "raw" in effort) {
|
|
128
|
+
return { thinking: effort.raw };
|
|
129
|
+
}
|
|
130
|
+
const isAdaptive = !!modelId && ANTHROPIC_ADAPTIVE_MODELS.test(modelId);
|
|
131
|
+
if (typeof effort === "object" && "budgetTokens" in effort) {
|
|
132
|
+
return {
|
|
133
|
+
thinking: { type: "enabled", budget_tokens: effort.budgetTokens }
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (!isStringEffort(effort)) return {};
|
|
137
|
+
if (isAdaptive) {
|
|
138
|
+
const mapped = effort === "minimal" ? "low" : effort;
|
|
139
|
+
return {
|
|
140
|
+
thinking: { type: "adaptive" },
|
|
141
|
+
outputConfigEffort: mapped
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const budget = effort === "high" ? 16e3 : effort === "medium" ? 8e3 : effort === "low" ? 4e3 : 2048;
|
|
145
|
+
return { thinking: { type: "enabled", budget_tokens: budget } };
|
|
146
|
+
}
|
|
90
147
|
function hasMediaAttachments(message) {
|
|
91
148
|
const attachments = message.metadata?.attachments;
|
|
92
149
|
return attachments?.some(
|
|
@@ -922,36 +979,58 @@ var AnthropicAdapter = class {
|
|
|
922
979
|
if (serverToolConfiguration) {
|
|
923
980
|
options.server_tool_configuration = serverToolConfiguration;
|
|
924
981
|
}
|
|
982
|
+
const modelForThinking = request.config?.model || this.model;
|
|
983
|
+
const thinkingTranslation = toAnthropicThinking(
|
|
984
|
+
request.config?.reasoningEffort,
|
|
985
|
+
modelForThinking
|
|
986
|
+
);
|
|
925
987
|
const outputConfig = toAnthropicOutputConfig(responseFormat);
|
|
926
|
-
if (outputConfig) {
|
|
927
|
-
options.output_config =
|
|
988
|
+
if (outputConfig || thinkingTranslation.outputConfigEffort) {
|
|
989
|
+
options.output_config = {
|
|
990
|
+
...outputConfig ?? {},
|
|
991
|
+
...thinkingTranslation.outputConfigEffort ? { effort: thinkingTranslation.outputConfigEffort } : {}
|
|
992
|
+
};
|
|
928
993
|
}
|
|
929
|
-
if (
|
|
994
|
+
if (thinkingTranslation.thinking) {
|
|
995
|
+
options.thinking = thinkingTranslation.thinking;
|
|
996
|
+
} else if (this.config.thinking?.type === "enabled") {
|
|
930
997
|
options.thinking = {
|
|
931
998
|
type: "enabled",
|
|
932
999
|
budget_tokens: this.config.thinking.budgetTokens || 1e4
|
|
933
1000
|
};
|
|
934
1001
|
}
|
|
935
|
-
|
|
1002
|
+
const mcp = toAnthropicMcp(request.config?.mcpServers);
|
|
1003
|
+
const betas = [];
|
|
1004
|
+
if (mcp.mcpServers.length > 0) {
|
|
1005
|
+
options.mcp_servers = mcp.mcpServers;
|
|
1006
|
+
betas.push(...mcp.betas);
|
|
1007
|
+
if (mcp.tools.length > 0) {
|
|
1008
|
+
const existingTools = Array.isArray(options.tools) ? options.tools : [];
|
|
1009
|
+
options.tools = [...existingTools, ...mcp.tools];
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
return { options, messages, betas };
|
|
936
1013
|
}
|
|
937
1014
|
/**
|
|
938
1015
|
* Non-streaming completion (for debugging/comparison with original studio-ai)
|
|
939
1016
|
*/
|
|
940
1017
|
async complete(request) {
|
|
941
1018
|
const client = await this.getClient();
|
|
942
|
-
const { options } = this.buildRequestOptions(request);
|
|
1019
|
+
const { options, betas } = this.buildRequestOptions(request);
|
|
943
1020
|
const nonStreamingOptions = {
|
|
944
1021
|
...options,
|
|
945
1022
|
stream: false
|
|
946
1023
|
};
|
|
947
1024
|
try {
|
|
1025
|
+
const finalOptions = betas.length > 0 ? { ...nonStreamingOptions, betas } : nonStreamingOptions;
|
|
1026
|
+
const messagesApi = betas.length > 0 ? client.beta.messages : client.messages;
|
|
948
1027
|
logProviderPayload(
|
|
949
1028
|
"anthropic",
|
|
950
1029
|
"request payload",
|
|
951
|
-
|
|
1030
|
+
finalOptions,
|
|
952
1031
|
request.debug
|
|
953
1032
|
);
|
|
954
|
-
const response = await
|
|
1033
|
+
const response = await messagesApi.create(finalOptions);
|
|
955
1034
|
logProviderPayload(
|
|
956
1035
|
"anthropic",
|
|
957
1036
|
"response payload",
|
|
@@ -986,17 +1065,19 @@ var AnthropicAdapter = class {
|
|
|
986
1065
|
}
|
|
987
1066
|
async *stream(request) {
|
|
988
1067
|
const client = await this.getClient();
|
|
989
|
-
const { options } = this.buildRequestOptions(request);
|
|
1068
|
+
const { options, betas } = this.buildRequestOptions(request);
|
|
990
1069
|
const messageId = generateMessageId();
|
|
991
1070
|
yield { type: "message:start", id: messageId };
|
|
992
1071
|
try {
|
|
1072
|
+
const finalOptions = betas.length > 0 ? { ...options, betas } : options;
|
|
1073
|
+
const streamApi = betas.length > 0 ? client.beta.messages : client.messages;
|
|
993
1074
|
logProviderPayload(
|
|
994
1075
|
"anthropic",
|
|
995
1076
|
"request payload",
|
|
996
|
-
|
|
1077
|
+
finalOptions,
|
|
997
1078
|
request.debug
|
|
998
1079
|
);
|
|
999
|
-
const stream = await
|
|
1080
|
+
const stream = await streamApi.stream(finalOptions);
|
|
1000
1081
|
let currentToolUse = null;
|
|
1001
1082
|
let isInThinkingBlock = false;
|
|
1002
1083
|
const collectedCitations = [];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { b as AzureProviderConfig, A as AIProvider } from '../../types-
|
|
2
|
-
import '../../types-
|
|
1
|
+
import { b as AzureProviderConfig, A as AIProvider } from '../../types-BvkiJ1dd.mjs';
|
|
2
|
+
import '../../types-D774b0dg.mjs';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-BYQKp9TW.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Azure OpenAI Provider
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { b as AzureProviderConfig, A as AIProvider } from '../../types-
|
|
2
|
-
import '../../types-
|
|
1
|
+
import { b as AzureProviderConfig, A as AIProvider } from '../../types-TMilS-Dz.js';
|
|
2
|
+
import '../../types-D774b0dg.js';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-Cxq3ni0t.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Azure OpenAI Provider
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { G as GoogleProviderConfig, A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.mjs';
|
|
2
|
+
import { G as GoogleProviderConfig, A as AIProvider } from '../../types-BvkiJ1dd.mjs';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-BYQKp9TW.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Google Provider - OpenAI-Compatible
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { G as GoogleProviderConfig, A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.js';
|
|
2
|
+
import { G as GoogleProviderConfig, A as AIProvider } from '../../types-TMilS-Dz.js';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-Cxq3ni0t.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Google Provider - OpenAI-Compatible
|
|
@@ -132,6 +132,33 @@ function toOpenAIResponsesTextFormat(rf) {
|
|
|
132
132
|
strict: rf.json_schema.strict ?? true
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
|
+
function toOpenAIResponsesMcpTools(mcpServers) {
|
|
136
|
+
if (!mcpServers || mcpServers.length === 0) return [];
|
|
137
|
+
return mcpServers.map((mcp) => ({
|
|
138
|
+
type: "mcp",
|
|
139
|
+
server_label: mcp.label,
|
|
140
|
+
server_url: mcp.url,
|
|
141
|
+
...mcp.headers ? { headers: mcp.headers } : {},
|
|
142
|
+
...mcp.allowedTools ? { allowed_tools: mcp.allowedTools } : {},
|
|
143
|
+
require_approval: mcp.requireApproval ?? "never"
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
function isStringEffort(effort) {
|
|
147
|
+
return typeof effort === "string" && (effort === "minimal" || effort === "low" || effort === "medium" || effort === "high");
|
|
148
|
+
}
|
|
149
|
+
function toOpenAIReasoning(effort) {
|
|
150
|
+
if (!effort) return void 0;
|
|
151
|
+
if (typeof effort === "object" && "raw" in effort) return effort.raw;
|
|
152
|
+
if (typeof effort === "object" && "budgetTokens" in effort) {
|
|
153
|
+
const budget = effort.budgetTokens;
|
|
154
|
+
const mapped = budget >= 16e3 ? "high" : budget >= 8e3 ? "medium" : "low";
|
|
155
|
+
return { effort: mapped, summary: "auto" };
|
|
156
|
+
}
|
|
157
|
+
if (isStringEffort(effort)) {
|
|
158
|
+
return { effort, summary: "auto" };
|
|
159
|
+
}
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
135
162
|
function formatTools(actions) {
|
|
136
163
|
return actions.map((action) => ({
|
|
137
164
|
type: "function",
|
|
@@ -552,6 +579,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
552
579
|
return this.client;
|
|
553
580
|
}
|
|
554
581
|
shouldUseResponsesApi(request) {
|
|
582
|
+
if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
|
|
583
|
+
if (this.provider !== "openai" && this.provider !== "azure") {
|
|
584
|
+
throw new Error(
|
|
585
|
+
`[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
|
|
586
|
+
);
|
|
587
|
+
}
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
555
590
|
return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
|
|
556
591
|
}
|
|
557
592
|
buildResponsesInput(request) {
|
|
@@ -612,7 +647,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
612
647
|
strict: true,
|
|
613
648
|
defer_loading: tool.deferLoading === true
|
|
614
649
|
}));
|
|
615
|
-
return [{ type: "tool_search" }, ...nativeTools];
|
|
650
|
+
return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
|
|
616
651
|
}
|
|
617
652
|
parseResponsesResult(response) {
|
|
618
653
|
const content = typeof response?.output_text === "string" ? response.output_text : "";
|
|
@@ -644,16 +679,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
644
679
|
const responsesTextFormat = toOpenAIResponsesTextFormat(
|
|
645
680
|
request.config?.responseFormat
|
|
646
681
|
);
|
|
682
|
+
const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
|
|
683
|
+
const modelId = request.config?.model || this.model;
|
|
684
|
+
const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
|
|
685
|
+
if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
|
|
686
|
+
console.warn(
|
|
687
|
+
`[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
const functionTools = this.buildResponsesTools(
|
|
691
|
+
request.toolDefinitions ?? []
|
|
692
|
+
);
|
|
693
|
+
const tools = [...functionTools, ...mcpTools];
|
|
647
694
|
const payload = {
|
|
648
695
|
model: request.config?.model || this.model,
|
|
649
696
|
instructions: request.systemPrompt,
|
|
650
697
|
input: this.buildResponsesInput(request),
|
|
651
|
-
tools:
|
|
698
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
652
699
|
tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
|
|
653
700
|
parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
|
|
654
701
|
temperature: request.config?.temperature ?? this.config.temperature,
|
|
655
702
|
max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
|
|
656
703
|
...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
|
|
704
|
+
...reasoning ? { reasoning } : {},
|
|
705
|
+
store: false,
|
|
657
706
|
stream: false
|
|
658
707
|
};
|
|
659
708
|
logProviderPayload("openai", "request payload", payload, request.debug);
|
|
@@ -130,6 +130,33 @@ function toOpenAIResponsesTextFormat(rf) {
|
|
|
130
130
|
strict: rf.json_schema.strict ?? true
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
+
function toOpenAIResponsesMcpTools(mcpServers) {
|
|
134
|
+
if (!mcpServers || mcpServers.length === 0) return [];
|
|
135
|
+
return mcpServers.map((mcp) => ({
|
|
136
|
+
type: "mcp",
|
|
137
|
+
server_label: mcp.label,
|
|
138
|
+
server_url: mcp.url,
|
|
139
|
+
...mcp.headers ? { headers: mcp.headers } : {},
|
|
140
|
+
...mcp.allowedTools ? { allowed_tools: mcp.allowedTools } : {},
|
|
141
|
+
require_approval: mcp.requireApproval ?? "never"
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
function isStringEffort(effort) {
|
|
145
|
+
return typeof effort === "string" && (effort === "minimal" || effort === "low" || effort === "medium" || effort === "high");
|
|
146
|
+
}
|
|
147
|
+
function toOpenAIReasoning(effort) {
|
|
148
|
+
if (!effort) return void 0;
|
|
149
|
+
if (typeof effort === "object" && "raw" in effort) return effort.raw;
|
|
150
|
+
if (typeof effort === "object" && "budgetTokens" in effort) {
|
|
151
|
+
const budget = effort.budgetTokens;
|
|
152
|
+
const mapped = budget >= 16e3 ? "high" : budget >= 8e3 ? "medium" : "low";
|
|
153
|
+
return { effort: mapped, summary: "auto" };
|
|
154
|
+
}
|
|
155
|
+
if (isStringEffort(effort)) {
|
|
156
|
+
return { effort, summary: "auto" };
|
|
157
|
+
}
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
133
160
|
function formatTools(actions) {
|
|
134
161
|
return actions.map((action) => ({
|
|
135
162
|
type: "function",
|
|
@@ -550,6 +577,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
550
577
|
return this.client;
|
|
551
578
|
}
|
|
552
579
|
shouldUseResponsesApi(request) {
|
|
580
|
+
if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
|
|
581
|
+
if (this.provider !== "openai" && this.provider !== "azure") {
|
|
582
|
+
throw new Error(
|
|
583
|
+
`[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
return true;
|
|
587
|
+
}
|
|
553
588
|
return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
|
|
554
589
|
}
|
|
555
590
|
buildResponsesInput(request) {
|
|
@@ -610,7 +645,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
610
645
|
strict: true,
|
|
611
646
|
defer_loading: tool.deferLoading === true
|
|
612
647
|
}));
|
|
613
|
-
return [{ type: "tool_search" }, ...nativeTools];
|
|
648
|
+
return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
|
|
614
649
|
}
|
|
615
650
|
parseResponsesResult(response) {
|
|
616
651
|
const content = typeof response?.output_text === "string" ? response.output_text : "";
|
|
@@ -642,16 +677,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
642
677
|
const responsesTextFormat = toOpenAIResponsesTextFormat(
|
|
643
678
|
request.config?.responseFormat
|
|
644
679
|
);
|
|
680
|
+
const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
|
|
681
|
+
const modelId = request.config?.model || this.model;
|
|
682
|
+
const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
|
|
683
|
+
if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
|
|
684
|
+
console.warn(
|
|
685
|
+
`[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
const functionTools = this.buildResponsesTools(
|
|
689
|
+
request.toolDefinitions ?? []
|
|
690
|
+
);
|
|
691
|
+
const tools = [...functionTools, ...mcpTools];
|
|
645
692
|
const payload = {
|
|
646
693
|
model: request.config?.model || this.model,
|
|
647
694
|
instructions: request.systemPrompt,
|
|
648
695
|
input: this.buildResponsesInput(request),
|
|
649
|
-
tools:
|
|
696
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
650
697
|
tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
|
|
651
698
|
parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
|
|
652
699
|
temperature: request.config?.temperature ?? this.config.temperature,
|
|
653
700
|
max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
|
|
654
701
|
...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
|
|
702
|
+
...reasoning ? { reasoning } : {},
|
|
703
|
+
store: false,
|
|
655
704
|
stream: false
|
|
656
705
|
};
|
|
657
706
|
logProviderPayload("openai", "request payload", payload, request.debug);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { c as OllamaProviderConfig, A as AIProvider } from '../../types-
|
|
2
|
-
export { d as OllamaModelOptions } from '../../types-
|
|
3
|
-
import '../../types-
|
|
1
|
+
import { c as OllamaProviderConfig, A as AIProvider } from '../../types-BvkiJ1dd.mjs';
|
|
2
|
+
export { d as OllamaModelOptions } from '../../types-BvkiJ1dd.mjs';
|
|
3
|
+
import '../../types-D774b0dg.mjs';
|
|
4
4
|
import 'zod';
|
|
5
|
-
import '../../base-
|
|
5
|
+
import '../../base-BYQKp9TW.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Ollama Provider
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { c as OllamaProviderConfig, A as AIProvider } from '../../types-
|
|
2
|
-
export { d as OllamaModelOptions } from '../../types-
|
|
3
|
-
import '../../types-
|
|
1
|
+
import { c as OllamaProviderConfig, A as AIProvider } from '../../types-TMilS-Dz.js';
|
|
2
|
+
export { d as OllamaModelOptions } from '../../types-TMilS-Dz.js';
|
|
3
|
+
import '../../types-D774b0dg.js';
|
|
4
4
|
import 'zod';
|
|
5
|
-
import '../../base-
|
|
5
|
+
import '../../base-Cxq3ni0t.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Ollama Provider
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.mjs';
|
|
2
|
+
import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-BvkiJ1dd.mjs';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-BYQKp9TW.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* OpenAI Provider - Modern Pattern
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.js';
|
|
2
|
+
import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-TMilS-Dz.js';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-Cxq3ni0t.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* OpenAI Provider - Modern Pattern
|
|
@@ -132,6 +132,33 @@ function toOpenAIResponsesTextFormat(rf) {
|
|
|
132
132
|
strict: rf.json_schema.strict ?? true
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
|
+
function toOpenAIResponsesMcpTools(mcpServers) {
|
|
136
|
+
if (!mcpServers || mcpServers.length === 0) return [];
|
|
137
|
+
return mcpServers.map((mcp) => ({
|
|
138
|
+
type: "mcp",
|
|
139
|
+
server_label: mcp.label,
|
|
140
|
+
server_url: mcp.url,
|
|
141
|
+
...mcp.headers ? { headers: mcp.headers } : {},
|
|
142
|
+
...mcp.allowedTools ? { allowed_tools: mcp.allowedTools } : {},
|
|
143
|
+
require_approval: mcp.requireApproval ?? "never"
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
function isStringEffort(effort) {
|
|
147
|
+
return typeof effort === "string" && (effort === "minimal" || effort === "low" || effort === "medium" || effort === "high");
|
|
148
|
+
}
|
|
149
|
+
function toOpenAIReasoning(effort) {
|
|
150
|
+
if (!effort) return void 0;
|
|
151
|
+
if (typeof effort === "object" && "raw" in effort) return effort.raw;
|
|
152
|
+
if (typeof effort === "object" && "budgetTokens" in effort) {
|
|
153
|
+
const budget = effort.budgetTokens;
|
|
154
|
+
const mapped = budget >= 16e3 ? "high" : budget >= 8e3 ? "medium" : "low";
|
|
155
|
+
return { effort: mapped, summary: "auto" };
|
|
156
|
+
}
|
|
157
|
+
if (isStringEffort(effort)) {
|
|
158
|
+
return { effort, summary: "auto" };
|
|
159
|
+
}
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
135
162
|
function formatTools(actions) {
|
|
136
163
|
return actions.map((action) => ({
|
|
137
164
|
type: "function",
|
|
@@ -539,6 +566,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
539
566
|
return this.client;
|
|
540
567
|
}
|
|
541
568
|
shouldUseResponsesApi(request) {
|
|
569
|
+
if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
|
|
570
|
+
if (this.provider !== "openai" && this.provider !== "azure") {
|
|
571
|
+
throw new Error(
|
|
572
|
+
`[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
542
577
|
return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
|
|
543
578
|
}
|
|
544
579
|
buildResponsesInput(request) {
|
|
@@ -599,7 +634,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
599
634
|
strict: true,
|
|
600
635
|
defer_loading: tool.deferLoading === true
|
|
601
636
|
}));
|
|
602
|
-
return [{ type: "tool_search" }, ...nativeTools];
|
|
637
|
+
return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
|
|
603
638
|
}
|
|
604
639
|
parseResponsesResult(response) {
|
|
605
640
|
const content = typeof response?.output_text === "string" ? response.output_text : "";
|
|
@@ -631,16 +666,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
631
666
|
const responsesTextFormat = toOpenAIResponsesTextFormat(
|
|
632
667
|
request.config?.responseFormat
|
|
633
668
|
);
|
|
669
|
+
const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
|
|
670
|
+
const modelId = request.config?.model || this.model;
|
|
671
|
+
const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
|
|
672
|
+
if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
|
|
673
|
+
console.warn(
|
|
674
|
+
`[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
const functionTools = this.buildResponsesTools(
|
|
678
|
+
request.toolDefinitions ?? []
|
|
679
|
+
);
|
|
680
|
+
const tools = [...functionTools, ...mcpTools];
|
|
634
681
|
const payload = {
|
|
635
682
|
model: request.config?.model || this.model,
|
|
636
683
|
instructions: request.systemPrompt,
|
|
637
684
|
input: this.buildResponsesInput(request),
|
|
638
|
-
tools:
|
|
685
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
639
686
|
tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
|
|
640
687
|
parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
|
|
641
688
|
temperature: request.config?.temperature ?? this.config.temperature,
|
|
642
689
|
max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
|
|
643
690
|
...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
|
|
691
|
+
...reasoning ? { reasoning } : {},
|
|
692
|
+
store: false,
|
|
644
693
|
stream: false
|
|
645
694
|
};
|
|
646
695
|
logProviderPayload("openai", "request payload", payload, request.debug);
|
|
@@ -130,6 +130,33 @@ function toOpenAIResponsesTextFormat(rf) {
|
|
|
130
130
|
strict: rf.json_schema.strict ?? true
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
+
function toOpenAIResponsesMcpTools(mcpServers) {
|
|
134
|
+
if (!mcpServers || mcpServers.length === 0) return [];
|
|
135
|
+
return mcpServers.map((mcp) => ({
|
|
136
|
+
type: "mcp",
|
|
137
|
+
server_label: mcp.label,
|
|
138
|
+
server_url: mcp.url,
|
|
139
|
+
...mcp.headers ? { headers: mcp.headers } : {},
|
|
140
|
+
...mcp.allowedTools ? { allowed_tools: mcp.allowedTools } : {},
|
|
141
|
+
require_approval: mcp.requireApproval ?? "never"
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
function isStringEffort(effort) {
|
|
145
|
+
return typeof effort === "string" && (effort === "minimal" || effort === "low" || effort === "medium" || effort === "high");
|
|
146
|
+
}
|
|
147
|
+
function toOpenAIReasoning(effort) {
|
|
148
|
+
if (!effort) return void 0;
|
|
149
|
+
if (typeof effort === "object" && "raw" in effort) return effort.raw;
|
|
150
|
+
if (typeof effort === "object" && "budgetTokens" in effort) {
|
|
151
|
+
const budget = effort.budgetTokens;
|
|
152
|
+
const mapped = budget >= 16e3 ? "high" : budget >= 8e3 ? "medium" : "low";
|
|
153
|
+
return { effort: mapped, summary: "auto" };
|
|
154
|
+
}
|
|
155
|
+
if (isStringEffort(effort)) {
|
|
156
|
+
return { effort, summary: "auto" };
|
|
157
|
+
}
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
133
160
|
function formatTools(actions) {
|
|
134
161
|
return actions.map((action) => ({
|
|
135
162
|
type: "function",
|
|
@@ -537,6 +564,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
537
564
|
return this.client;
|
|
538
565
|
}
|
|
539
566
|
shouldUseResponsesApi(request) {
|
|
567
|
+
if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
|
|
568
|
+
if (this.provider !== "openai" && this.provider !== "azure") {
|
|
569
|
+
throw new Error(
|
|
570
|
+
`[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
return true;
|
|
574
|
+
}
|
|
540
575
|
return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
|
|
541
576
|
}
|
|
542
577
|
buildResponsesInput(request) {
|
|
@@ -597,7 +632,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
597
632
|
strict: true,
|
|
598
633
|
defer_loading: tool.deferLoading === true
|
|
599
634
|
}));
|
|
600
|
-
return [{ type: "tool_search" }, ...nativeTools];
|
|
635
|
+
return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
|
|
601
636
|
}
|
|
602
637
|
parseResponsesResult(response) {
|
|
603
638
|
const content = typeof response?.output_text === "string" ? response.output_text : "";
|
|
@@ -629,16 +664,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
629
664
|
const responsesTextFormat = toOpenAIResponsesTextFormat(
|
|
630
665
|
request.config?.responseFormat
|
|
631
666
|
);
|
|
667
|
+
const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
|
|
668
|
+
const modelId = request.config?.model || this.model;
|
|
669
|
+
const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
|
|
670
|
+
if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
|
|
671
|
+
console.warn(
|
|
672
|
+
`[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
|
|
673
|
+
);
|
|
674
|
+
}
|
|
675
|
+
const functionTools = this.buildResponsesTools(
|
|
676
|
+
request.toolDefinitions ?? []
|
|
677
|
+
);
|
|
678
|
+
const tools = [...functionTools, ...mcpTools];
|
|
632
679
|
const payload = {
|
|
633
680
|
model: request.config?.model || this.model,
|
|
634
681
|
instructions: request.systemPrompt,
|
|
635
682
|
input: this.buildResponsesInput(request),
|
|
636
|
-
tools:
|
|
683
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
637
684
|
tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
|
|
638
685
|
parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
|
|
639
686
|
temperature: request.config?.temperature ?? this.config.temperature,
|
|
640
687
|
max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
|
|
641
688
|
...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
|
|
689
|
+
...reasoning ? { reasoning } : {},
|
|
690
|
+
store: false,
|
|
642
691
|
stream: false
|
|
643
692
|
};
|
|
644
693
|
logProviderPayload("openai", "request payload", payload, request.debug);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.mjs';
|
|
2
|
+
import { A as AIProvider } from '../../types-BvkiJ1dd.mjs';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-BYQKp9TW.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* OpenRouter Provider - Modern Pattern
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LanguageModel } from '../../types-
|
|
2
|
-
import { A as AIProvider } from '../../types-
|
|
1
|
+
import { L as LanguageModel } from '../../types-D774b0dg.js';
|
|
2
|
+
import { A as AIProvider } from '../../types-TMilS-Dz.js';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import '../../base-
|
|
4
|
+
import '../../base-Cxq3ni0t.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* OpenRouter Provider - Modern Pattern
|