@aituber-onair/chat 0.49.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.ja.md +42 -15
  2. package/README.md +42 -15
  3. package/dist/cjs/backend.d.ts +20 -0
  4. package/dist/cjs/backend.d.ts.map +1 -0
  5. package/dist/cjs/backend.js +115 -0
  6. package/dist/cjs/backend.js.map +1 -0
  7. package/dist/cjs/constants/deepseek.d.ts +6 -0
  8. package/dist/cjs/constants/deepseek.d.ts.map +1 -1
  9. package/dist/cjs/constants/deepseek.js +47 -0
  10. package/dist/cjs/constants/deepseek.js.map +1 -1
  11. package/dist/cjs/constants/openrouter.d.ts +6 -0
  12. package/dist/cjs/constants/openrouter.d.ts.map +1 -1
  13. package/dist/cjs/constants/openrouter.js +66 -2
  14. package/dist/cjs/constants/openrouter.js.map +1 -1
  15. package/dist/cjs/constants/xai.d.ts +6 -1
  16. package/dist/cjs/constants/xai.d.ts.map +1 -1
  17. package/dist/cjs/constants/xai.js +29 -7
  18. package/dist/cjs/constants/xai.js.map +1 -1
  19. package/dist/cjs/index.d.ts +1 -0
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js +1 -0
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  24. package/dist/cjs/services/ChatServiceFactory.js +17 -19
  25. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  26. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +7 -2
  27. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  28. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
  29. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
  30. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js +9 -2
  31. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
  32. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
  33. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
  34. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
  35. package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
  36. package/dist/cjs/services/providers/gemini/GeminiChatService.js +3 -0
  37. package/dist/cjs/services/providers/gemini/GeminiChatService.js.map +1 -1
  38. package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts +5 -0
  39. package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
  40. package/dist/cjs/services/providers/gemini/geminiMessageConverter.js +16 -0
  41. package/dist/cjs/services/providers/gemini/geminiMessageConverter.js.map +1 -1
  42. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts +1 -1
  43. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +2 -2
  44. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  45. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  46. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +35 -5
  47. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  48. package/dist/cjs/services/providers/openai/responsesParser.d.ts.map +1 -1
  49. package/dist/cjs/services/providers/openai/responsesParser.js +71 -6
  50. package/dist/cjs/services/providers/openai/responsesParser.js.map +1 -1
  51. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
  52. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  53. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +7 -8
  54. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  55. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  56. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +3 -0
  57. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  58. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  59. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js +1 -0
  60. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  61. package/dist/esm/backend.d.ts +20 -0
  62. package/dist/esm/backend.d.ts.map +1 -0
  63. package/dist/esm/backend.js +111 -0
  64. package/dist/esm/backend.js.map +1 -0
  65. package/dist/esm/constants/deepseek.d.ts +6 -0
  66. package/dist/esm/constants/deepseek.d.ts.map +1 -1
  67. package/dist/esm/constants/deepseek.js +43 -0
  68. package/dist/esm/constants/deepseek.js.map +1 -1
  69. package/dist/esm/constants/openrouter.d.ts +6 -0
  70. package/dist/esm/constants/openrouter.d.ts.map +1 -1
  71. package/dist/esm/constants/openrouter.js +61 -0
  72. package/dist/esm/constants/openrouter.js.map +1 -1
  73. package/dist/esm/constants/xai.d.ts +6 -1
  74. package/dist/esm/constants/xai.d.ts.map +1 -1
  75. package/dist/esm/constants/xai.js +27 -6
  76. package/dist/esm/constants/xai.js.map +1 -1
  77. package/dist/esm/index.d.ts +1 -0
  78. package/dist/esm/index.d.ts.map +1 -1
  79. package/dist/esm/index.js +1 -0
  80. package/dist/esm/index.js.map +1 -1
  81. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  82. package/dist/esm/services/ChatServiceFactory.js +17 -19
  83. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  84. package/dist/esm/services/providers/ChatServiceProvider.d.ts +7 -2
  85. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  86. package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
  87. package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
  88. package/dist/esm/services/providers/deepseek/DeepSeekChatService.js +10 -3
  89. package/dist/esm/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
  90. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
  91. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
  92. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
  93. package/dist/esm/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
  94. package/dist/esm/services/providers/gemini/GeminiChatService.js +4 -1
  95. package/dist/esm/services/providers/gemini/GeminiChatService.js.map +1 -1
  96. package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts +5 -0
  97. package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
  98. package/dist/esm/services/providers/gemini/geminiMessageConverter.js +15 -0
  99. package/dist/esm/services/providers/gemini/geminiMessageConverter.js.map +1 -1
  100. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts +1 -1
  101. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +2 -2
  102. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  103. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  104. package/dist/esm/services/providers/openai/openaiRequestBuilder.js +35 -5
  105. package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  106. package/dist/esm/services/providers/openai/responsesParser.d.ts.map +1 -1
  107. package/dist/esm/services/providers/openai/responsesParser.js +71 -6
  108. package/dist/esm/services/providers/openai/responsesParser.js.map +1 -1
  109. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
  110. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  111. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +8 -9
  112. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  113. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  114. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +4 -1
  115. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  116. package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  117. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js +2 -1
  118. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  119. package/dist/umd/aituber-onair-chat.js +392 -44
  120. package/dist/umd/aituber-onair-chat.min.js +9 -9
  121. package/package.json +6 -1
@@ -159,6 +159,7 @@ var AITuberOnAirChat = (() => {
159
159
  MODEL_GROK_4_20_REASONING: () => MODEL_GROK_4_20_REASONING,
160
160
  MODEL_GROK_4_3: () => MODEL_GROK_4_3,
161
161
  MODEL_GROK_4_5: () => MODEL_GROK_4_5,
162
+ MODEL_GROK_4_6: () => MODEL_GROK_4_6,
162
163
  MODEL_KIMI_K2_5: () => MODEL_KIMI_K2_5,
163
164
  MODEL_KIMI_K2_6: () => MODEL_KIMI_K2_6,
164
165
  MODEL_KIMI_K2_7_CODE: () => MODEL_KIMI_K2_7_CODE,
@@ -198,6 +199,8 @@ var AITuberOnAirChat = (() => {
198
199
  MODEL_OPENAI_GPT_MINI_LATEST: () => MODEL_OPENAI_GPT_MINI_LATEST,
199
200
  MODEL_OPENROUTER_AUTO: () => MODEL_OPENROUTER_AUTO,
200
201
  MODEL_OPENROUTER_AUTO_BETA: () => MODEL_OPENROUTER_AUTO_BETA,
202
+ MODEL_OPENROUTER_DEEPSEEK_V4_FLASH: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH,
203
+ MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731,
201
204
  MODEL_OPENROUTER_FUSION: () => MODEL_OPENROUTER_FUSION,
202
205
  MODEL_PLAMO_2_2_PRIME: () => MODEL_PLAMO_2_2_PRIME,
203
206
  MODEL_PLAMO_3_0_PRIME: () => MODEL_PLAMO_3_0_PRIME,
@@ -242,17 +245,25 @@ var AITuberOnAirChat = (() => {
242
245
  allowsReasoningNone: () => allowsReasoningNone,
243
246
  allowsReasoningXHigh: () => allowsReasoningXHigh,
244
247
  buildOpenAICompatibleTools: () => buildOpenAICompatibleTools,
248
+ buildToolContinuationMessages: () => buildToolContinuationMessages,
249
+ getChatBackendProviderCapabilities: () => getChatBackendProviderCapabilities,
245
250
  getClaudeSupportedReasoningEfforts: () => getClaudeSupportedReasoningEfforts,
251
+ getDeepSeekSupportedReasoningEfforts: () => getDeepSeekSupportedReasoningEfforts,
246
252
  getDefaultClaudeReasoningEffort: () => getDefaultClaudeReasoningEffort,
253
+ getDefaultDeepSeekReasoningEffort: () => getDefaultDeepSeekReasoningEffort,
247
254
  getDefaultGeminiReasoningEffort: () => getDefaultGeminiReasoningEffort,
248
255
  getDefaultKimiReasoningEffort: () => getDefaultKimiReasoningEffort,
256
+ getDefaultOpenRouterReasoningEffort: () => getDefaultOpenRouterReasoningEffort,
249
257
  getDefaultReasoningEffortForGPT5Model: () => getDefaultReasoningEffortForGPT5Model,
250
258
  getDefaultXaiReasoningEffort: () => getDefaultXaiReasoningEffort,
251
259
  getGeminiSupportedReasoningEfforts: () => getGeminiSupportedReasoningEfforts,
252
260
  getKimiSupportedReasoningEfforts: () => getKimiSupportedReasoningEfforts,
253
261
  getMaxTokensForResponseLength: () => getMaxTokensForResponseLength,
262
+ getOpenRouterSupportedReasoningEfforts: () => getOpenRouterSupportedReasoningEfforts,
263
+ getXaiSupportedReasoningEfforts: () => getXaiSupportedReasoningEfforts,
254
264
  installGASFetch: () => installGASFetch,
255
265
  isClaudeReasoningEffortModel: () => isClaudeReasoningEffortModel,
266
+ isDeepSeekReasoningEffortModel: () => isDeepSeekReasoningEffortModel,
256
267
  isGPT5Model: () => isGPT5Model,
257
268
  isGeminiReasoningEffortModel: () => isGeminiReasoningEffortModel,
258
269
  isKimiReasoningEffortModel: () => isKimiReasoningEffortModel,
@@ -270,7 +281,9 @@ var AITuberOnAirChat = (() => {
270
281
  isZaiToolStreamModel: () => isZaiToolStreamModel,
271
282
  isZaiVisionModel: () => isZaiVisionModel,
272
283
  normalizeClaudeReasoningEffort: () => normalizeClaudeReasoningEffort,
284
+ normalizeDeepSeekReasoningEffort: () => normalizeDeepSeekReasoningEffort,
273
285
  normalizeGeminiReasoningEffort: () => normalizeGeminiReasoningEffort,
286
+ normalizeOpenRouterReasoningEffort: () => normalizeOpenRouterReasoningEffort,
274
287
  normalizeXaiReasoningEffort: () => normalizeXaiReasoningEffort,
275
288
  parseOpenAICompatibleOneShot: () => parseOpenAICompatibleOneShot,
276
289
  parseOpenAICompatibleTextStream: () => parseOpenAICompatibleTextStream,
@@ -589,6 +602,26 @@ var AITuberOnAirChat = (() => {
589
602
  var MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5 = "kwaipilot/kat-coder-pro-v2.5";
590
603
  var MODEL_XAI_GROK_LATEST = "~x-ai/grok-latest";
591
604
  var MODEL_XAI_GROK_4_5 = "x-ai/grok-4.5";
605
+ var MODEL_OPENROUTER_DEEPSEEK_V4_FLASH = "deepseek/deepseek-v4-flash";
606
+ var MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731 = "deepseek/deepseek-v4-flash-0731";
607
+ var DEFAULT_OPENROUTER_REASONING_EFFORTS = [
608
+ "none",
609
+ "minimal",
610
+ "low",
611
+ "medium",
612
+ "high"
613
+ ];
614
+ var OPENROUTER_DEEPSEEK_V4_FLASH_REASONING_EFFORTS = [
615
+ "none",
616
+ "high",
617
+ "xhigh"
618
+ ];
619
+ var OPENROUTER_DEEPSEEK_V4_FLASH_0731_REASONING_EFFORTS = [
620
+ "none",
621
+ "low",
622
+ "high",
623
+ "max"
624
+ ];
592
625
  var OPENROUTER_FREE_MODELS = [
593
626
  MODEL_GPT_OSS_20B_FREE,
594
627
  MODEL_ZAI_GLM_4_5_AIR_FREE
@@ -642,6 +675,43 @@ var AITuberOnAirChat = (() => {
642
675
  (visionModel) => model.includes(visionModel)
643
676
  );
644
677
  }
678
+ function getOpenRouterSupportedReasoningEfforts(model) {
679
+ const normalizedModel = model.trim();
680
+ if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH) {
681
+ return OPENROUTER_DEEPSEEK_V4_FLASH_REASONING_EFFORTS;
682
+ }
683
+ if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731) {
684
+ return OPENROUTER_DEEPSEEK_V4_FLASH_0731_REASONING_EFFORTS;
685
+ }
686
+ return DEFAULT_OPENROUTER_REASONING_EFFORTS;
687
+ }
688
+ function getDefaultOpenRouterReasoningEffort(model) {
689
+ const normalizedModel = model.trim();
690
+ return normalizedModel === MODEL_ZAI_GLM_5_2 || normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH || normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731 ? "none" : void 0;
691
+ }
692
+ function normalizeOpenRouterReasoningEffort(model, effort) {
693
+ const normalizedModel = model.trim();
694
+ const requested = effort ?? getDefaultOpenRouterReasoningEffort(model);
695
+ if (!requested) {
696
+ return void 0;
697
+ }
698
+ const supported = getOpenRouterSupportedReasoningEfforts(model);
699
+ if (supported.includes(requested)) {
700
+ return requested;
701
+ }
702
+ if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH) {
703
+ return requested === "max" ? "xhigh" : "none";
704
+ }
705
+ if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731) {
706
+ if (requested === "minimal" || requested === "medium") {
707
+ return "low";
708
+ }
709
+ if (requested === "xhigh") {
710
+ return "high";
711
+ }
712
+ }
713
+ return requested;
714
+ }
645
715
 
646
716
  // src/constants/zai.ts
647
717
  var ENDPOINT_ZAI_CHAT_COMPLETIONS_API = "https://api.z.ai/api/paas/v4/chat/completions";
@@ -672,6 +742,7 @@ var AITuberOnAirChat = (() => {
672
742
 
673
743
  // src/constants/xai.ts
674
744
  var ENDPOINT_XAI_CHAT_COMPLETIONS_API = "https://api.x.ai/v1/chat/completions";
745
+ var MODEL_GROK_4_6 = "grok-4.6";
675
746
  var MODEL_GROK_4_5 = "grok-4.5";
676
747
  var MODEL_GROK_4_3 = "grok-4.3";
677
748
  var MODEL_GROK_4_20_REASONING = "grok-4.20-0309-reasoning";
@@ -679,6 +750,7 @@ var AITuberOnAirChat = (() => {
679
750
  var MODEL_GROK_4_1_FAST_REASONING = "grok-4-1-fast-reasoning";
680
751
  var MODEL_GROK_4_1_FAST_NON_REASONING = "grok-4-1-fast-non-reasoning";
681
752
  var XAI_VISION_SUPPORTED_MODELS = [
753
+ MODEL_GROK_4_6,
682
754
  MODEL_GROK_4_5,
683
755
  MODEL_GROK_4_3,
684
756
  MODEL_GROK_4_20_REASONING,
@@ -690,13 +762,25 @@ var AITuberOnAirChat = (() => {
690
762
  return XAI_VISION_SUPPORTED_MODELS.includes(model);
691
763
  }
692
764
  function isXaiReasoningEffortModel(model) {
693
- return model === MODEL_GROK_4_5 || model === MODEL_GROK_4_3;
765
+ return getXaiSupportedReasoningEfforts(model).length > 0;
766
+ }
767
+ function getXaiSupportedReasoningEfforts(model) {
768
+ if (model === MODEL_GROK_4_6) {
769
+ return ["low", "medium", "high", "xhigh"];
770
+ }
771
+ if (model === MODEL_GROK_4_5) {
772
+ return ["low", "medium", "high"];
773
+ }
774
+ if (model === MODEL_GROK_4_3) {
775
+ return ["none", "low", "medium", "high"];
776
+ }
777
+ return [];
694
778
  }
695
779
  function isXaiReasoningEffortNoneModel(model) {
696
- return model === MODEL_GROK_4_3;
780
+ return getXaiSupportedReasoningEfforts(model).includes("none");
697
781
  }
698
782
  function getDefaultXaiReasoningEffort(model) {
699
- if (model === MODEL_GROK_4_5) {
783
+ if (model === MODEL_GROK_4_6 || model === MODEL_GROK_4_5) {
700
784
  return "low";
701
785
  }
702
786
  return isXaiReasoningEffortNoneModel(model) ? "none" : void 0;
@@ -705,10 +789,14 @@ var AITuberOnAirChat = (() => {
705
789
  if (!isXaiReasoningEffortModel(model)) {
706
790
  return void 0;
707
791
  }
708
- if (reasoningEffort === "none" && !isXaiReasoningEffortNoneModel(model)) {
709
- return "low";
792
+ if (reasoningEffort === void 0) {
793
+ return getDefaultXaiReasoningEffort(model);
794
+ }
795
+ const supported = getXaiSupportedReasoningEfforts(model);
796
+ if (supported.includes(reasoningEffort)) {
797
+ return reasoningEffort;
710
798
  }
711
- return reasoningEffort ?? getDefaultXaiReasoningEffort(model);
799
+ return reasoningEffort === "none" ? "low" : "high";
712
800
  }
713
801
 
714
802
  // src/constants/kimi.ts
@@ -753,6 +841,17 @@ var AITuberOnAirChat = (() => {
753
841
  var ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API = `${DEEPSEEK_API_BASE_URL}/chat/completions`;
754
842
  var MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash";
755
843
  var MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro";
844
+ var DEEPSEEK_V4_FLASH_REASONING_EFFORTS = [
845
+ "none",
846
+ "low",
847
+ "high",
848
+ "max"
849
+ ];
850
+ var DEEPSEEK_V4_PRO_REASONING_EFFORTS = [
851
+ "none",
852
+ "high",
853
+ "max"
854
+ ];
756
855
  var MODEL_DEEPSEEK_CHAT = "deepseek-chat";
757
856
  var MODEL_DEEPSEEK_REASONER = "deepseek-reasoner";
758
857
  var DEEPSEEK_SUPPORTED_MODELS = [
@@ -763,6 +862,35 @@ var AITuberOnAirChat = (() => {
763
862
  MODEL_DEEPSEEK_CHAT,
764
863
  MODEL_DEEPSEEK_REASONER
765
864
  ];
865
+ function getDeepSeekSupportedReasoningEfforts(model) {
866
+ if (model === MODEL_DEEPSEEK_V4_FLASH) {
867
+ return DEEPSEEK_V4_FLASH_REASONING_EFFORTS;
868
+ }
869
+ if (model === MODEL_DEEPSEEK_V4_PRO) {
870
+ return DEEPSEEK_V4_PRO_REASONING_EFFORTS;
871
+ }
872
+ return [];
873
+ }
874
+ function isDeepSeekReasoningEffortModel(model) {
875
+ return getDeepSeekSupportedReasoningEfforts(model).length > 0;
876
+ }
877
+ function getDefaultDeepSeekReasoningEffort(model) {
878
+ return isDeepSeekReasoningEffortModel(model) ? "none" : void 0;
879
+ }
880
+ function normalizeDeepSeekReasoningEffort(model, effort) {
881
+ const supported = getDeepSeekSupportedReasoningEfforts(model);
882
+ if (supported.length === 0) {
883
+ return void 0;
884
+ }
885
+ const requested = effort ?? getDefaultDeepSeekReasoningEffort(model);
886
+ if (requested && supported.includes(requested)) {
887
+ return requested;
888
+ }
889
+ if (model === MODEL_DEEPSEEK_V4_PRO && requested === "low") {
890
+ return "high";
891
+ }
892
+ return getDefaultDeepSeekReasoningEffort(model);
893
+ }
766
894
 
767
895
  // src/constants/mistral.ts
768
896
  var MISTRAL_API_BASE_URL = "https://api.mistral.ai/v1";
@@ -2188,6 +2316,7 @@ If it's in another language, summarize in that language.
2188
2316
  const dec = new TextDecoder();
2189
2317
  const textBlocks = [];
2190
2318
  const toolCallsMap = /* @__PURE__ */ new Map();
2319
+ const providerItems = /* @__PURE__ */ new Map();
2191
2320
  let responseStatus;
2192
2321
  let incompleteDetails;
2193
2322
  let usage;
@@ -2215,7 +2344,7 @@ If it's in another language, summarize in that language.
2215
2344
  onPartial,
2216
2345
  textBlocks,
2217
2346
  toolCallsMap,
2218
- options,
2347
+ providerItems,
2219
2348
  (metadata) => {
2220
2349
  if (metadata.responseStatus !== void 0) {
2221
2350
  responseStatus = metadata.responseStatus;
@@ -2242,21 +2371,31 @@ If it's in another language, summarize in that language.
2242
2371
  type: "tool_use",
2243
2372
  id: tool.id,
2244
2373
  name: tool.name,
2245
- input: tool.input || {}
2374
+ input: safeParseToolCallInput(tool.arguments, options.onJsonError)
2246
2375
  })
2247
2376
  );
2377
+ const providerContent = Array.from(providerItems.values());
2378
+ const text = StreamTextAccumulator.getFullText(textBlocks);
2248
2379
  return {
2249
2380
  blocks: [...textBlocks, ...toolBlocks],
2250
2381
  stop_reason: toolBlocks.length ? "tool_use" : "end",
2251
2382
  truncated: responseStatus === "incomplete",
2252
2383
  response_status: responseStatus,
2253
2384
  incomplete_details: incompleteDetails,
2254
- usage
2385
+ usage,
2386
+ ...providerContent.length > 0 ? {
2387
+ assistant_message: {
2388
+ role: "assistant",
2389
+ content: text,
2390
+ provider_content: providerContent
2391
+ }
2392
+ } : {}
2255
2393
  };
2256
2394
  }
2257
- function handleResponsesSSEEvent(eventType, data, onPartial, textBlocks, toolCallsMap, options, onMetadata) {
2395
+ function handleResponsesSSEEvent(eventType, data, onPartial, textBlocks, toolCallsMap, providerItems, onMetadata) {
2258
2396
  switch (eventType) {
2259
2397
  case "response.output_item.added":
2398
+ rememberProviderItem(providerItems, data.item);
2260
2399
  if (data.item?.type === "message" && Array.isArray(data.item.content)) {
2261
2400
  data.item.content.forEach((c) => {
2262
2401
  if (c.type === "output_text" && c.text) {
@@ -2266,12 +2405,41 @@ If it's in another language, summarize in that language.
2266
2405
  });
2267
2406
  } else if (data.item?.type === "function_call") {
2268
2407
  toolCallsMap.set(data.item.id, {
2269
- id: data.item.id,
2408
+ id: data.item.call_id ?? data.item.id,
2270
2409
  name: data.item.name,
2271
- input: safeParseToolCallInput(
2272
- data.item.arguments,
2273
- options.onJsonError
2274
- )
2410
+ arguments: data.item.arguments ?? ""
2411
+ });
2412
+ }
2413
+ break;
2414
+ case "response.function_call_arguments.delta": {
2415
+ const tool = toolCallsMap.get(data.item_id);
2416
+ if (tool && typeof data.delta === "string") {
2417
+ tool.arguments += data.delta;
2418
+ }
2419
+ const item = providerItems.get(data.item_id);
2420
+ if (item && typeof data.delta === "string") {
2421
+ item.arguments = `${item.arguments ?? ""}${data.delta}`;
2422
+ }
2423
+ break;
2424
+ }
2425
+ case "response.function_call_arguments.done": {
2426
+ const tool = toolCallsMap.get(data.item_id);
2427
+ if (tool && typeof data.arguments === "string") {
2428
+ tool.arguments = data.arguments;
2429
+ }
2430
+ const item = providerItems.get(data.item_id);
2431
+ if (item && typeof data.arguments === "string") {
2432
+ item.arguments = data.arguments;
2433
+ }
2434
+ break;
2435
+ }
2436
+ case "response.output_item.done":
2437
+ rememberProviderItem(providerItems, data.item);
2438
+ if (data.item?.type === "function_call") {
2439
+ toolCallsMap.set(data.item.id, {
2440
+ id: data.item.call_id ?? data.item.id,
2441
+ name: data.item.name,
2442
+ arguments: data.item.arguments ?? ""
2275
2443
  });
2276
2444
  }
2277
2445
  break;
@@ -2306,6 +2474,11 @@ If it's in another language, summarize in that language.
2306
2474
  break;
2307
2475
  }
2308
2476
  }
2477
+ function rememberProviderItem(items, item) {
2478
+ if (!item || typeof item !== "object") return;
2479
+ const key = typeof item.id === "string" && item.id ? item.id : `output-item-${items.size}`;
2480
+ items.set(key, { ...item });
2481
+ }
2309
2482
  function extractResponsesMetadata(data, fallbackStatus) {
2310
2483
  const response = data?.response ?? data;
2311
2484
  return {
@@ -2328,7 +2501,7 @@ If it's in another language, summarize in that language.
2328
2501
  if (outputItem.type === "function_call") {
2329
2502
  blocks.push({
2330
2503
  type: "tool_use",
2331
- id: outputItem.id,
2504
+ id: outputItem.call_id ?? outputItem.id,
2332
2505
  name: outputItem.name,
2333
2506
  input: safeParseToolCallInput(
2334
2507
  outputItem.arguments,
@@ -2344,7 +2517,16 @@ If it's in another language, summarize in that language.
2344
2517
  truncated: data?.status === "incomplete",
2345
2518
  response_status: data?.status,
2346
2519
  incomplete_details: data?.incomplete_details ?? null,
2347
- usage: data?.usage
2520
+ usage: data?.usage,
2521
+ ...Array.isArray(data?.output) && data.output.length > 0 ? {
2522
+ assistant_message: {
2523
+ role: "assistant",
2524
+ content: blocks.filter(
2525
+ (block) => block.type === "text"
2526
+ ).map((block) => block.text).join(""),
2527
+ provider_content: data.output
2528
+ }
2529
+ } : {}
2348
2530
  };
2349
2531
  }
2350
2532
 
@@ -2513,6 +2695,14 @@ If it's in another language, summarize in that language.
2513
2695
  if (provider === "plamo" && reasoning_effort) {
2514
2696
  body.reasoning_effort = reasoning_effort;
2515
2697
  }
2698
+ if (provider === "deepseek" && reasoning_effort) {
2699
+ body.thinking = {
2700
+ type: reasoning_effort === "none" ? "disabled" : "enabled"
2701
+ };
2702
+ if (reasoning_effort !== "none") {
2703
+ body.reasoning_effort = reasoning_effort;
2704
+ }
2705
+ }
2516
2706
  const toolDefinitions = buildOpenAIToolsDefinition({
2517
2707
  tools,
2518
2708
  mcpServers,
@@ -2555,10 +2745,22 @@ If it's in another language, summarize in that language.
2555
2745
  }
2556
2746
  }
2557
2747
  function cleanMessagesForResponsesAPI(messages) {
2558
- return messages.map((msg) => {
2559
- const role = msg.role === "tool" ? "user" : msg.role;
2748
+ return messages.flatMap((msg) => {
2749
+ if (msg.role === "assistant" && msg.provider_content?.length) {
2750
+ return msg.provider_content;
2751
+ }
2752
+ if (msg.role === "tool" && msg.tool_call_id) {
2753
+ return [
2754
+ {
2755
+ type: "function_call_output",
2756
+ call_id: msg.tool_call_id,
2757
+ output: msg.content
2758
+ }
2759
+ ];
2760
+ }
2761
+ const items = [];
2560
2762
  const cleanMsg = {
2561
- role
2763
+ role: msg.role === "tool" ? "user" : msg.role
2562
2764
  };
2563
2765
  if (typeof msg.content === "string") {
2564
2766
  cleanMsg.content = msg.content;
@@ -2580,7 +2782,19 @@ If it's in another language, summarize in that language.
2580
2782
  } else {
2581
2783
  cleanMsg.content = msg.content;
2582
2784
  }
2583
- return cleanMsg;
2785
+ const hasContent = typeof cleanMsg.content !== "string" || cleanMsg.content.length > 0;
2786
+ if (hasContent) items.push(cleanMsg);
2787
+ if (msg.role === "assistant" && msg.tool_calls) {
2788
+ items.push(
2789
+ ...msg.tool_calls.map((call) => ({
2790
+ type: "function_call",
2791
+ call_id: call.id,
2792
+ name: call.function.name,
2793
+ arguments: call.function.arguments
2794
+ }))
2795
+ );
2796
+ }
2797
+ return items;
2584
2798
  });
2585
2799
  }
2586
2800
  function cleanMessagesForMistralChatCompletions(messages) {
@@ -2800,7 +3014,11 @@ If it's in another language, summarize in that language.
2800
3014
 
2801
3015
  // src/services/providers/deepseek/DeepSeekChatService.ts
2802
3016
  var DeepSeekChatService = class extends OpenAIChatService {
2803
- constructor(apiKey, model = MODEL_DEEPSEEK_V4_FLASH, visionModel = model, tools, endpoint = ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API, responseLength) {
3017
+ constructor(apiKey, model = MODEL_DEEPSEEK_V4_FLASH, visionModel = model, tools, endpoint = ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API, responseLength, reasoningEffort) {
3018
+ const normalizedReasoningEffort = normalizeDeepSeekReasoningEffort(
3019
+ model,
3020
+ reasoningEffort
3021
+ );
2804
3022
  super(
2805
3023
  apiKey,
2806
3024
  model,
@@ -2810,11 +3028,16 @@ If it's in another language, summarize in that language.
2810
3028
  [],
2811
3029
  responseLength,
2812
3030
  void 0,
2813
- void 0,
3031
+ normalizedReasoningEffort,
2814
3032
  false,
2815
3033
  "deepseek",
2816
3034
  false
2817
3035
  );
3036
+ if (tools?.length && normalizedReasoningEffort !== void 0 && normalizedReasoningEffort !== "none") {
3037
+ throw new Error(
3038
+ "DeepSeek thinking with tools is not supported yet. Use reasoning_effort: 'none' for tool calling."
3039
+ );
3040
+ }
2818
3041
  }
2819
3042
  };
2820
3043
 
@@ -2830,7 +3053,8 @@ If it's in another language, summarize in that language.
2830
3053
  options.visionModel ?? model,
2831
3054
  tools,
2832
3055
  this.resolveEndpoint(options),
2833
- options.responseLength
3056
+ options.responseLength,
3057
+ options.reasoning_effort
2834
3058
  );
2835
3059
  }
2836
3060
  getProviderName() {
@@ -3006,6 +3230,7 @@ If it's in another language, summarize in that language.
3006
3230
  currentRole = null;
3007
3231
  };
3008
3232
  for (const msg of messages) {
3233
+ if (msg.role === "system") continue;
3009
3234
  const role = mapRoleToGemini(msg.role);
3010
3235
  if (msg.tool_calls) {
3011
3236
  pushCurrent();
@@ -3049,6 +3274,7 @@ If it's in another language, summarize in that language.
3049
3274
  currentRole = null;
3050
3275
  };
3051
3276
  for (const msg of messages) {
3277
+ if (msg.role === "system") continue;
3052
3278
  const role = mapRoleToGemini(msg.role);
3053
3279
  if (msg.tool_calls) {
3054
3280
  pushCurrent();
@@ -3103,6 +3329,18 @@ If it's in another language, summarize in that language.
3103
3329
  pushCurrent();
3104
3330
  return geminiMessages;
3105
3331
  }
3332
+ function extractGeminiSystemInstruction(messages) {
3333
+ const parts = messages.flatMap((message) => {
3334
+ if (message.role !== "system") return [];
3335
+ if (typeof message.content === "string") {
3336
+ return message.content ? [{ text: message.content }] : [];
3337
+ }
3338
+ return message.content.flatMap(
3339
+ (block) => block.type === "text" && block.text ? [{ text: block.text }] : []
3340
+ );
3341
+ });
3342
+ return parts.length > 0 ? { parts } : void 0;
3343
+ }
3106
3344
  function createFunctionCallPart(call, options) {
3107
3345
  options.callIdMap?.set(call.id, call.function.name);
3108
3346
  const context = options.functionCallContextMap?.get(call.id);
@@ -3445,6 +3683,8 @@ If it's in another language, summarize in that language.
3445
3683
  maxOutputTokens: maxTokens !== void 0 ? maxTokens : getMaxTokensForResponseLength(this.responseLength)
3446
3684
  }
3447
3685
  };
3686
+ const systemInstruction = extractGeminiSystemInstruction(messages);
3687
+ if (systemInstruction) body.systemInstruction = systemInstruction;
3448
3688
  const thinkingConfig = this.resolveThinkingConfig(model);
3449
3689
  if (thinkingConfig) {
3450
3690
  body.generationConfig.thinkingConfig = thinkingConfig;
@@ -3776,7 +4016,7 @@ If it's in another language, summarize in that language.
3776
4016
  const api = getLanguageModelAPI();
3777
4017
  if (!api) {
3778
4018
  throw new Error(
3779
- "Gemini Nano is not available in this environment. Chrome 138+ with Prompt API enabled is required."
4019
+ "Gemini Nano is not available in this environment. Chrome 148+ on a supported desktop device is required for web pages."
3780
4020
  );
3781
4021
  }
3782
4022
  const modelOptions = this.getModelOptions();
@@ -4606,7 +4846,6 @@ If it's in another language, summarize in that language.
4606
4846
  // src/services/providers/openrouter/OpenRouterChatService.ts
4607
4847
  var isOpenRouterAutoModel = (model) => [MODEL_OPENROUTER_AUTO, MODEL_OPENROUTER_AUTO_BETA].includes(model.trim());
4608
4848
  var isTokenLimitUnsupportedModel = (model) => [MODEL_GPT_OSS_20B_FREE, MODEL_ZAI_GLM_5_2].includes(model.trim());
4609
- var getDefaultReasoningEffort = (model) => model.trim() === MODEL_ZAI_GLM_5_2 ? "none" : void 0;
4610
4849
  var ensureAutoRouterOutput = (model, hasVisibleOutput) => {
4611
4850
  if (isOpenRouterAutoModel(model) && !hasVisibleOutput) {
4612
4851
  throw new Error(
@@ -4818,16 +5057,20 @@ If it's in another language, summarize in that language.
4818
5057
  } else if (tokenLimit) {
4819
5058
  body.max_tokens = tokenLimit;
4820
5059
  }
4821
- const defaultReasoningEffort = getDefaultReasoningEffort(model);
4822
- if (this.reasoning_effort !== void 0 || this.includeReasoning !== void 0 || this.reasoningMaxTokens || defaultReasoningEffort) {
5060
+ const defaultReasoningEffort = getDefaultOpenRouterReasoningEffort(model);
5061
+ const reasoningEffort = normalizeOpenRouterReasoningEffort(
5062
+ model,
5063
+ this.reasoning_effort
5064
+ );
5065
+ if (reasoningEffort !== void 0 || this.includeReasoning !== void 0 || this.reasoningMaxTokens || defaultReasoningEffort) {
4823
5066
  body.reasoning = {};
4824
- if (this.reasoning_effort && this.reasoning_effort !== "none") {
4825
- const effort = this.reasoning_effort === "minimal" ? "low" : this.reasoning_effort;
5067
+ if (reasoningEffort) {
5068
+ const effort = reasoningEffort === "minimal" ? "low" : reasoningEffort;
4826
5069
  body.reasoning.effort = effort;
4827
- } else if (this.reasoning_effort === void 0 && defaultReasoningEffort) {
5070
+ } else if (defaultReasoningEffort) {
4828
5071
  body.reasoning.effort = defaultReasoningEffort;
4829
5072
  }
4830
- if (this.reasoning_effort === "none" || this.includeReasoning !== true) {
5073
+ if (reasoningEffort === "none" || this.includeReasoning !== true) {
4831
5074
  body.reasoning.exclude = true;
4832
5075
  }
4833
5076
  if (this.reasoningMaxTokens) {
@@ -4970,6 +5213,9 @@ If it's in another language, summarize in that language.
4970
5213
  // xAI models
4971
5214
  MODEL_XAI_GROK_LATEST,
4972
5215
  MODEL_XAI_GROK_4_5,
5216
+ // DeepSeek models
5217
+ MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731,
5218
+ MODEL_OPENROUTER_DEEPSEEK_V4_FLASH,
4973
5219
  // Other models
4974
5220
  MODEL_MOONSHOTAI_KIMI_LATEST,
4975
5221
  MODEL_MOONSHOTAI_KIMI_K3,
@@ -5377,6 +5623,7 @@ If it's in another language, summarize in that language.
5377
5623
  */
5378
5624
  getSupportedModels() {
5379
5625
  return [
5626
+ MODEL_GROK_4_6,
5380
5627
  MODEL_GROK_4_5,
5381
5628
  MODEL_GROK_4_3,
5382
5629
  MODEL_GROK_4_20_REASONING,
@@ -5675,21 +5922,120 @@ If it's in another language, summarize in that language.
5675
5922
  new PlamoChatServiceProvider()
5676
5923
  ];
5677
5924
 
5678
- // src/services/ChatServiceFactory.ts
5679
- var TOOL_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set([
5925
+ // src/backend.ts
5926
+ var KNOWN_CHAT_PROVIDERS = /* @__PURE__ */ new Set([
5927
+ "claude",
5928
+ "claude-agent-sdk",
5929
+ "codex-sdk",
5930
+ "copilot-sdk",
5931
+ "deepseek",
5932
+ "gemini",
5933
+ "gemini-nano",
5934
+ "kimi",
5935
+ "mistral",
5680
5936
  "openai",
5681
5937
  "openai-compatible",
5682
5938
  "openrouter",
5683
- "gemini",
5684
- "claude",
5685
- "zai",
5939
+ "plamo",
5940
+ "sakana",
5686
5941
  "xai",
5687
- "kimi",
5942
+ "zai"
5943
+ ]);
5944
+ var TOOL_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set([
5945
+ "claude",
5688
5946
  "deepseek",
5947
+ "gemini",
5948
+ "kimi",
5689
5949
  "mistral",
5950
+ "openai",
5951
+ "openai-compatible",
5952
+ "openrouter",
5953
+ "plamo",
5690
5954
  "sakana",
5691
- "plamo"
5955
+ "xai",
5956
+ "zai"
5692
5957
  ]);
5958
+ var NON_STREAMING_PROVIDERS = /* @__PURE__ */ new Set(["codex-sdk"]);
5959
+ function getChatBackendProviderCapabilities(provider) {
5960
+ if (!KNOWN_CHAT_PROVIDERS.has(provider)) return void 0;
5961
+ return {
5962
+ text: true,
5963
+ streaming: !NON_STREAMING_PROVIDERS.has(provider),
5964
+ tools: TOOL_SUPPORTED_PROVIDERS.has(provider)
5965
+ };
5966
+ }
5967
+ function buildToolContinuationMessages(input) {
5968
+ const isClaude = input.provider === "claude";
5969
+ const messages = input.messages.filter(
5970
+ (message) => !isEmptyClaudeAssistantMessage(isClaude, message)
5971
+ );
5972
+ const toolUses = input.completion.blocks.filter(
5973
+ (block) => block.type === "tool_use"
5974
+ );
5975
+ const assistantMessage = input.completion.assistant_message ?? buildAssistantToolCall(isClaude, toolUses);
5976
+ if (!isEmptyClaudeAssistantMessage(isClaude, assistantMessage)) {
5977
+ messages.push({ ...assistantMessage });
5978
+ }
5979
+ messages.push(...buildToolResultMessages(isClaude, input.toolResults));
5980
+ return messages;
5981
+ }
5982
+ function isEmptyClaudeAssistantMessage(isClaude, message) {
5983
+ if (!isClaude || message.role !== "assistant") {
5984
+ return false;
5985
+ }
5986
+ const content = message.content;
5987
+ return Array.isArray(content) && content.length === 0;
5988
+ }
5989
+ function buildAssistantToolCall(isClaude, toolUses) {
5990
+ if (isClaude) {
5991
+ return {
5992
+ role: "assistant",
5993
+ content: toolUses.map((toolUse) => ({
5994
+ type: "tool_use",
5995
+ id: toolUse.id,
5996
+ name: toolUse.name,
5997
+ input: toolUse.input ?? {}
5998
+ }))
5999
+ };
6000
+ }
6001
+ return {
6002
+ role: "assistant",
6003
+ content: [],
6004
+ tool_calls: toolUses.map((toolUse) => ({
6005
+ id: toolUse.id,
6006
+ type: "function",
6007
+ function: {
6008
+ name: toolUse.name,
6009
+ arguments: JSON.stringify(toolUse.input ?? {})
6010
+ }
6011
+ }))
6012
+ };
6013
+ }
6014
+ function buildToolResultMessages(isClaude, toolResults) {
6015
+ if (isClaude) {
6016
+ return toolResults.map(
6017
+ (result) => ({
6018
+ role: "user",
6019
+ content: [
6020
+ {
6021
+ type: "tool_result",
6022
+ tool_use_id: result.tool_use_id,
6023
+ content: result.content
6024
+ }
6025
+ ]
6026
+ })
6027
+ );
6028
+ }
6029
+ return toolResults.map(
6030
+ (result) => ({
6031
+ role: "tool",
6032
+ tool_call_id: result.tool_use_id,
6033
+ content: result.content
6034
+ })
6035
+ );
6036
+ }
6037
+
6038
+ // src/services/ChatServiceFactory.ts
5693
6039
  var MCP_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set(["openai", "gemini", "claude"]);
5694
6040
  var JSON_MODE_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set([
5695
6041
  "openai",
@@ -5701,11 +6047,12 @@ If it's in another language, summarize in that language.
5701
6047
  openai: ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
5702
6048
  claude: ["low", "medium", "high", "xhigh", "max"],
5703
6049
  gemini: ["minimal", "low", "medium", "high"],
5704
- openrouter: ["none", "minimal", "low", "medium", "high"],
6050
+ openrouter: ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
5705
6051
  kimi: ["low", "high", "max"],
5706
6052
  mistral: ["low", "medium", "high"],
5707
6053
  plamo: ["none", "medium"],
5708
- xai: ["none", "low", "medium", "high"]
6054
+ xai: ["none", "low", "medium", "high", "xhigh"],
6055
+ deepseek: ["none", "low", "high", "max"]
5709
6056
  };
5710
6057
  var ChatServiceFactory = class {
5711
6058
  /**
@@ -5754,18 +6101,19 @@ If it's in another language, summarize in that language.
5754
6101
  return void 0;
5755
6102
  }
5756
6103
  const vision = model ? this.getVisionSupportLevelForModel(providerName, model) : provider.getVisionSupportLevel();
6104
+ const backendCapabilities = getChatBackendProviderCapabilities(providerName);
5757
6105
  return {
5758
6106
  provider: providerName,
5759
6107
  models: provider.getSupportedModels(),
5760
6108
  defaultModel: typeof provider.getDefaultModel === "function" ? provider.getDefaultModel() : void 0,
5761
6109
  text: true,
5762
- streaming: true,
6110
+ streaming: backendCapabilities?.streaming ?? true,
5763
6111
  vision,
5764
- tools: TOOL_SUPPORTED_PROVIDERS.has(providerName),
6112
+ tools: backendCapabilities?.tools ?? false,
5765
6113
  mcp: MCP_SUPPORTED_PROVIDERS.has(providerName),
5766
6114
  jsonMode: JSON_MODE_SUPPORTED_PROVIDERS.has(providerName),
5767
6115
  responseLength: true,
5768
- reasoningEffort: providerName === "claude" && model ? [...getClaudeSupportedReasoningEfforts(model)] : providerName === "kimi" && model ? [...getKimiSupportedReasoningEfforts(model)] : REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
6116
+ reasoningEffort: providerName === "claude" && model ? [...getClaudeSupportedReasoningEfforts(model)] : providerName === "kimi" && model ? [...getKimiSupportedReasoningEfforts(model)] : providerName === "deepseek" && model ? [...getDeepSeekSupportedReasoningEfforts(model)] : providerName === "openrouter" && model ? [...getOpenRouterSupportedReasoningEfforts(model)] : providerName === "xai" && model ? [...getXaiSupportedReasoningEfforts(model)] : REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
5769
6117
  };
5770
6118
  }
5771
6119
  /**