@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
@@ -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",
@@ -525,6 +552,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
525
552
  return this.client;
526
553
  }
527
554
  shouldUseResponsesApi(request) {
555
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
556
+ if (this.provider !== "openai" && this.provider !== "azure") {
557
+ throw new Error(
558
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
559
+ );
560
+ }
561
+ return true;
562
+ }
528
563
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
529
564
  }
530
565
  buildResponsesInput(request) {
@@ -585,7 +620,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
585
620
  strict: true,
586
621
  defer_loading: tool.deferLoading === true
587
622
  }));
588
- return [{ type: "tool_search" }, ...nativeTools];
623
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
589
624
  }
590
625
  parseResponsesResult(response) {
591
626
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -617,16 +652,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
617
652
  const responsesTextFormat = toOpenAIResponsesTextFormat(
618
653
  request.config?.responseFormat
619
654
  );
655
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
656
+ const modelId = request.config?.model || this.model;
657
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
658
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
659
+ console.warn(
660
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
661
+ );
662
+ }
663
+ const functionTools = this.buildResponsesTools(
664
+ request.toolDefinitions ?? []
665
+ );
666
+ const tools = [...functionTools, ...mcpTools];
620
667
  const payload = {
621
668
  model: request.config?.model || this.model,
622
669
  instructions: request.systemPrompt,
623
670
  input: this.buildResponsesInput(request),
624
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
671
+ tools: tools.length > 0 ? tools : void 0,
625
672
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
626
673
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
627
674
  temperature: request.config?.temperature ?? this.config.temperature,
628
675
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
629
676
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
677
+ ...reasoning ? { reasoning } : {},
678
+ store: false,
630
679
  stream: false
631
680
  };
632
681
  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",
@@ -523,6 +550,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
523
550
  return this.client;
524
551
  }
525
552
  shouldUseResponsesApi(request) {
553
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
554
+ if (this.provider !== "openai" && this.provider !== "azure") {
555
+ throw new Error(
556
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
557
+ );
558
+ }
559
+ return true;
560
+ }
526
561
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
527
562
  }
528
563
  buildResponsesInput(request) {
@@ -583,7 +618,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
583
618
  strict: true,
584
619
  defer_loading: tool.deferLoading === true
585
620
  }));
586
- return [{ type: "tool_search" }, ...nativeTools];
621
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
587
622
  }
588
623
  parseResponsesResult(response) {
589
624
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -615,16 +650,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
615
650
  const responsesTextFormat = toOpenAIResponsesTextFormat(
616
651
  request.config?.responseFormat
617
652
  );
653
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
654
+ const modelId = request.config?.model || this.model;
655
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
656
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
657
+ console.warn(
658
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
659
+ );
660
+ }
661
+ const functionTools = this.buildResponsesTools(
662
+ request.toolDefinitions ?? []
663
+ );
664
+ const tools = [...functionTools, ...mcpTools];
618
665
  const payload = {
619
666
  model: request.config?.model || this.model,
620
667
  instructions: request.systemPrompt,
621
668
  input: this.buildResponsesInput(request),
622
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
669
+ tools: tools.length > 0 ? tools : void 0,
623
670
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
624
671
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
625
672
  temperature: request.config?.temperature ?? this.config.temperature,
626
673
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
627
674
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
675
+ ...reasoning ? { reasoning } : {},
676
+ store: false,
628
677
  stream: false
629
678
  };
630
679
  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
  * Together AI Provider
@@ -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
  * Together AI Provider
@@ -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",
@@ -477,6 +504,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
477
504
  return this.client;
478
505
  }
479
506
  shouldUseResponsesApi(request) {
507
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
508
+ if (this.provider !== "openai" && this.provider !== "azure") {
509
+ throw new Error(
510
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
511
+ );
512
+ }
513
+ return true;
514
+ }
480
515
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
481
516
  }
482
517
  buildResponsesInput(request) {
@@ -537,7 +572,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
537
572
  strict: true,
538
573
  defer_loading: tool.deferLoading === true
539
574
  }));
540
- return [{ type: "tool_search" }, ...nativeTools];
575
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
541
576
  }
542
577
  parseResponsesResult(response) {
543
578
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -569,16 +604,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
569
604
  const responsesTextFormat = toOpenAIResponsesTextFormat(
570
605
  request.config?.responseFormat
571
606
  );
607
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
608
+ const modelId = request.config?.model || this.model;
609
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
610
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
611
+ console.warn(
612
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
613
+ );
614
+ }
615
+ const functionTools = this.buildResponsesTools(
616
+ request.toolDefinitions ?? []
617
+ );
618
+ const tools = [...functionTools, ...mcpTools];
572
619
  const payload = {
573
620
  model: request.config?.model || this.model,
574
621
  instructions: request.systemPrompt,
575
622
  input: this.buildResponsesInput(request),
576
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
623
+ tools: tools.length > 0 ? tools : void 0,
577
624
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
578
625
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
579
626
  temperature: request.config?.temperature ?? this.config.temperature,
580
627
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
581
628
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
629
+ ...reasoning ? { reasoning } : {},
630
+ store: false,
582
631
  stream: false
583
632
  };
584
633
  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",
@@ -475,6 +502,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
475
502
  return this.client;
476
503
  }
477
504
  shouldUseResponsesApi(request) {
505
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
506
+ if (this.provider !== "openai" && this.provider !== "azure") {
507
+ throw new Error(
508
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
509
+ );
510
+ }
511
+ return true;
512
+ }
478
513
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
479
514
  }
480
515
  buildResponsesInput(request) {
@@ -535,7 +570,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
535
570
  strict: true,
536
571
  defer_loading: tool.deferLoading === true
537
572
  }));
538
- return [{ type: "tool_search" }, ...nativeTools];
573
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
539
574
  }
540
575
  parseResponsesResult(response) {
541
576
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -567,16 +602,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
567
602
  const responsesTextFormat = toOpenAIResponsesTextFormat(
568
603
  request.config?.responseFormat
569
604
  );
605
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
606
+ const modelId = request.config?.model || this.model;
607
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
608
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
609
+ console.warn(
610
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
611
+ );
612
+ }
613
+ const functionTools = this.buildResponsesTools(
614
+ request.toolDefinitions ?? []
615
+ );
616
+ const tools = [...functionTools, ...mcpTools];
570
617
  const payload = {
571
618
  model: request.config?.model || this.model,
572
619
  instructions: request.systemPrompt,
573
620
  input: this.buildResponsesInput(request),
574
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
621
+ tools: tools.length > 0 ? tools : void 0,
575
622
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
576
623
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
577
624
  temperature: request.config?.temperature ?? this.config.temperature,
578
625
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
579
626
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
627
+ ...reasoning ? { reasoning } : {},
628
+ store: false,
580
629
  stream: false
581
630
  };
582
631
  logProviderPayload("openai", "request payload", payload, request.debug);
@@ -1,7 +1,7 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.mjs';
2
- import { X as XAIProviderConfig, A as AIProvider } from '../../types-BSSiJW2o.mjs';
1
+ import { L as LanguageModel } from '../../types-D774b0dg.mjs';
2
+ import { X as XAIProviderConfig, 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
  * xAI Provider - Modern Pattern
@@ -1,7 +1,7 @@
1
- import { L as LanguageModel } from '../../types-BkQCSiIt.js';
2
- import { X as XAIProviderConfig, A as AIProvider } from '../../types-BQ31QIsA.js';
1
+ import { L as LanguageModel } from '../../types-D774b0dg.js';
2
+ import { X as XAIProviderConfig, 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
  * xAI 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",
@@ -501,6 +528,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
501
528
  return this.client;
502
529
  }
503
530
  shouldUseResponsesApi(request) {
531
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
532
+ if (this.provider !== "openai" && this.provider !== "azure") {
533
+ throw new Error(
534
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
535
+ );
536
+ }
537
+ return true;
538
+ }
504
539
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
505
540
  }
506
541
  buildResponsesInput(request) {
@@ -561,7 +596,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
561
596
  strict: true,
562
597
  defer_loading: tool.deferLoading === true
563
598
  }));
564
- return [{ type: "tool_search" }, ...nativeTools];
599
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
565
600
  }
566
601
  parseResponsesResult(response) {
567
602
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -593,16 +628,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
593
628
  const responsesTextFormat = toOpenAIResponsesTextFormat(
594
629
  request.config?.responseFormat
595
630
  );
631
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
632
+ const modelId = request.config?.model || this.model;
633
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
634
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
635
+ console.warn(
636
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
637
+ );
638
+ }
639
+ const functionTools = this.buildResponsesTools(
640
+ request.toolDefinitions ?? []
641
+ );
642
+ const tools = [...functionTools, ...mcpTools];
596
643
  const payload = {
597
644
  model: request.config?.model || this.model,
598
645
  instructions: request.systemPrompt,
599
646
  input: this.buildResponsesInput(request),
600
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
647
+ tools: tools.length > 0 ? tools : void 0,
601
648
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
602
649
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
603
650
  temperature: request.config?.temperature ?? this.config.temperature,
604
651
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
605
652
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
653
+ ...reasoning ? { reasoning } : {},
654
+ store: false,
606
655
  stream: false
607
656
  };
608
657
  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",
@@ -499,6 +526,14 @@ var OpenAIAdapter = class _OpenAIAdapter {
499
526
  return this.client;
500
527
  }
501
528
  shouldUseResponsesApi(request) {
529
+ if (request.config?.mcpServers && request.config.mcpServers.length > 0 || request.config?.reasoningEffort !== void 0) {
530
+ if (this.provider !== "openai" && this.provider !== "azure") {
531
+ throw new Error(
532
+ `[llm-sdk] Provider "${this.provider}" does not support MCP servers or per-request reasoning effort. Use OpenAI or Anthropic for these features.`
533
+ );
534
+ }
535
+ return true;
536
+ }
502
537
  return request.providerToolOptions?.openai?.nativeToolSearch?.enabled === true && request.providerToolOptions.openai.nativeToolSearch.useResponsesApi !== false && Array.isArray(request.toolDefinitions) && request.toolDefinitions.length > 0;
503
538
  }
504
539
  buildResponsesInput(request) {
@@ -559,7 +594,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
559
594
  strict: true,
560
595
  defer_loading: tool.deferLoading === true
561
596
  }));
562
- return [{ type: "tool_search" }, ...nativeTools];
597
+ return nativeTools.length > 0 ? [{ type: "tool_search" }, ...nativeTools] : [];
563
598
  }
564
599
  parseResponsesResult(response) {
565
600
  const content = typeof response?.output_text === "string" ? response.output_text : "";
@@ -591,16 +626,30 @@ var OpenAIAdapter = class _OpenAIAdapter {
591
626
  const responsesTextFormat = toOpenAIResponsesTextFormat(
592
627
  request.config?.responseFormat
593
628
  );
629
+ const mcpTools = toOpenAIResponsesMcpTools(request.config?.mcpServers);
630
+ const modelId = request.config?.model || this.model;
631
+ const reasoning = isOpenAIReasoningModel(modelId) ? toOpenAIReasoning(request.config?.reasoningEffort) : void 0;
632
+ if (request.config?.reasoningEffort && !isOpenAIReasoningModel(modelId)) {
633
+ console.warn(
634
+ `[llm-sdk] openai/${modelId} is not a reasoning model; \`reasoningEffort\` is ignored. Use o1/o3/o4/gpt-5.x for reasoning.`
635
+ );
636
+ }
637
+ const functionTools = this.buildResponsesTools(
638
+ request.toolDefinitions ?? []
639
+ );
640
+ const tools = [...functionTools, ...mcpTools];
594
641
  const payload = {
595
642
  model: request.config?.model || this.model,
596
643
  instructions: request.systemPrompt,
597
644
  input: this.buildResponsesInput(request),
598
- tools: this.buildResponsesTools(request.toolDefinitions ?? []),
645
+ tools: tools.length > 0 ? tools : void 0,
599
646
  tool_choice: openaiToolOptions?.toolChoice === "required" ? "required" : openaiToolOptions?.toolChoice === "auto" ? "auto" : void 0,
600
647
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
601
648
  temperature: request.config?.temperature ?? this.config.temperature,
602
649
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
603
650
  ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
651
+ ...reasoning ? { reasoning } : {},
652
+ store: false,
604
653
  stream: false
605
654
  };
606
655
  logProviderPayload("openai", "request payload", payload, request.debug);
@@ -1,5 +1,5 @@
1
- import { d as ToolDefinition, Z as UnifiedToolCall, _ as UnifiedToolResult } from './types-BkQCSiIt.mjs';
2
- import { L as LLMAdapter } from './base-tNgbBaSo.mjs';
1
+ import { d as ToolDefinition, $ as UnifiedToolCall, a0 as UnifiedToolResult } from './types-D774b0dg.mjs';
2
+ import { L as LLMAdapter } from './base-BYQKp9TW.mjs';
3
3
 
4
4
  /**
5
5
  * Provider Types
@@ -1,4 +1,4 @@
1
- import { L as LLMAdapter } from './base-C58Dsr9p.js';
1
+ import { L as LLMAdapter } from './base-Cxq3ni0t.js';
2
2
 
3
3
  /**
4
4
  * Fallback Chain & Routing Strategy Types