@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.
Files changed (52) hide show
  1. package/README.md +19 -1
  2. package/dist/adapters/index.d.mts +4 -4
  3. package/dist/adapters/index.d.ts +4 -4
  4. package/dist/adapters/index.js +139 -12
  5. package/dist/adapters/index.mjs +139 -12
  6. package/dist/{base-tNgbBaSo.d.mts → base-BYQKp9TW.d.mts} +5 -1
  7. package/dist/{base-C58Dsr9p.d.ts → base-Cxq3ni0t.d.ts} +5 -1
  8. package/dist/fallback/index.d.mts +4 -4
  9. package/dist/fallback/index.d.ts +4 -4
  10. package/dist/index.d.mts +60 -8
  11. package/dist/index.d.ts +60 -8
  12. package/dist/index.js +59 -0
  13. package/dist/index.mjs +59 -0
  14. package/dist/providers/anthropic/index.d.mts +3 -3
  15. package/dist/providers/anthropic/index.d.ts +3 -3
  16. package/dist/providers/anthropic/index.js +91 -10
  17. package/dist/providers/anthropic/index.mjs +91 -10
  18. package/dist/providers/azure/index.d.mts +3 -3
  19. package/dist/providers/azure/index.d.ts +3 -3
  20. package/dist/providers/fireworks/index.d.mts +1 -1
  21. package/dist/providers/fireworks/index.d.ts +1 -1
  22. package/dist/providers/google/index.d.mts +3 -3
  23. package/dist/providers/google/index.d.ts +3 -3
  24. package/dist/providers/google/index.js +51 -2
  25. package/dist/providers/google/index.mjs +51 -2
  26. package/dist/providers/ollama/index.d.mts +4 -4
  27. package/dist/providers/ollama/index.d.ts +4 -4
  28. package/dist/providers/openai/index.d.mts +3 -3
  29. package/dist/providers/openai/index.d.ts +3 -3
  30. package/dist/providers/openai/index.js +51 -2
  31. package/dist/providers/openai/index.mjs +51 -2
  32. package/dist/providers/openrouter/index.d.mts +3 -3
  33. package/dist/providers/openrouter/index.d.ts +3 -3
  34. package/dist/providers/openrouter/index.js +51 -2
  35. package/dist/providers/openrouter/index.mjs +51 -2
  36. package/dist/providers/togetherai/index.d.mts +3 -3
  37. package/dist/providers/togetherai/index.d.ts +3 -3
  38. package/dist/providers/togetherai/index.js +51 -2
  39. package/dist/providers/togetherai/index.mjs +51 -2
  40. package/dist/providers/xai/index.d.mts +3 -3
  41. package/dist/providers/xai/index.d.ts +3 -3
  42. package/dist/providers/xai/index.js +51 -2
  43. package/dist/providers/xai/index.mjs +51 -2
  44. package/dist/{types-BSSiJW2o.d.mts → types-BvkiJ1dd.d.mts} +2 -2
  45. package/dist/{types-CCxPmkmK.d.ts → types-ChORafYS.d.ts} +1 -1
  46. package/dist/{types-BkQCSiIt.d.mts → types-D774b0dg.d.mts} +57 -2
  47. package/dist/{types-BkQCSiIt.d.ts → types-D774b0dg.d.ts} +57 -2
  48. package/dist/{types-BQ31QIsA.d.ts → types-TMilS-Dz.d.ts} +2 -2
  49. package/dist/{types-B6dhnguR.d.mts → types-mwMhCwOq.d.mts} +1 -1
  50. package/dist/yourgpt/index.d.mts +1 -1
  51. package/dist/yourgpt/index.d.ts +1 -1
  52. 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 = outputConfig;
988
+ if (outputConfig || thinkingTranslation.outputConfigEffort) {
989
+ options.output_config = {
990
+ ...outputConfig ?? {},
991
+ ...thinkingTranslation.outputConfigEffort ? { effort: thinkingTranslation.outputConfigEffort } : {}
992
+ };
928
993
  }
929
- if (this.config.thinking?.type === "enabled") {
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
- return { options, messages };
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
- nonStreamingOptions,
1030
+ finalOptions,
952
1031
  request.debug
953
1032
  );
954
- const response = await client.messages.create(nonStreamingOptions);
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
- options,
1077
+ finalOptions,
997
1078
  request.debug
998
1079
  );
999
- const stream = await client.messages.stream(options);
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-BSSiJW2o.mjs';
2
- import '../../types-BkQCSiIt.mjs';
1
+ import { b as AzureProviderConfig, A as AIProvider } from '../../types-BvkiJ1dd.mjs';
2
+ import '../../types-D774b0dg.mjs';
3
3
  import 'zod';
4
- import '../../base-tNgbBaSo.mjs';
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-BQ31QIsA.js';
2
- import '../../types-BkQCSiIt.js';
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-C58Dsr9p.js';
4
+ import '../../base-Cxq3ni0t.js';
5
5
 
6
6
  /**
7
7
  * Azure OpenAI Provider
@@ -1,4 +1,4 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.mjs';
1
+ import { L as LanguageModel } from '../../types-D774b0dg.mjs';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.js';
1
+ import { L as LanguageModel } from '../../types-D774b0dg.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -1,7 +1,7 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.mjs';
2
- import { G as GoogleProviderConfig, A as AIProvider } from '../../types-BSSiJW2o.mjs';
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-tNgbBaSo.mjs';
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-BkQCSiIt.js';
2
- import { G as GoogleProviderConfig, A as AIProvider } from '../../types-BQ31QIsA.js';
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-C58Dsr9p.js';
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: this.buildResponsesTools(request.toolDefinitions ?? []),
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: this.buildResponsesTools(request.toolDefinitions ?? []),
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-BSSiJW2o.mjs';
2
- export { d as OllamaModelOptions } from '../../types-BSSiJW2o.mjs';
3
- import '../../types-BkQCSiIt.mjs';
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-tNgbBaSo.mjs';
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-BQ31QIsA.js';
2
- export { d as OllamaModelOptions } from '../../types-BQ31QIsA.js';
3
- import '../../types-BkQCSiIt.js';
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-C58Dsr9p.js';
5
+ import '../../base-Cxq3ni0t.js';
6
6
 
7
7
  /**
8
8
  * Ollama Provider
@@ -1,7 +1,7 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.mjs';
2
- import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-BSSiJW2o.mjs';
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-tNgbBaSo.mjs';
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-BkQCSiIt.js';
2
- import { O as OpenAIProviderConfig, A as AIProvider } from '../../types-BQ31QIsA.js';
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-C58Dsr9p.js';
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: this.buildResponsesTools(request.toolDefinitions ?? []),
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: this.buildResponsesTools(request.toolDefinitions ?? []),
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-BkQCSiIt.mjs';
2
- import { A as AIProvider } from '../../types-BSSiJW2o.mjs';
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-tNgbBaSo.mjs';
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-BkQCSiIt.js';
2
- import { A as AIProvider } from '../../types-BQ31QIsA.js';
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-C58Dsr9p.js';
4
+ import '../../base-Cxq3ni0t.js';
5
5
 
6
6
  /**
7
7
  * OpenRouter Provider - Modern Pattern