@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.
- package/README.ja.md +42 -15
- package/README.md +42 -15
- package/dist/cjs/backend.d.ts +20 -0
- package/dist/cjs/backend.d.ts.map +1 -0
- package/dist/cjs/backend.js +115 -0
- package/dist/cjs/backend.js.map +1 -0
- package/dist/cjs/constants/deepseek.d.ts +6 -0
- package/dist/cjs/constants/deepseek.d.ts.map +1 -1
- package/dist/cjs/constants/deepseek.js +47 -0
- package/dist/cjs/constants/deepseek.js.map +1 -1
- package/dist/cjs/constants/openrouter.d.ts +6 -0
- package/dist/cjs/constants/openrouter.d.ts.map +1 -1
- package/dist/cjs/constants/openrouter.js +66 -2
- package/dist/cjs/constants/openrouter.js.map +1 -1
- package/dist/cjs/constants/xai.d.ts +6 -1
- package/dist/cjs/constants/xai.d.ts.map +1 -1
- package/dist/cjs/constants/xai.js +29 -7
- package/dist/cjs/constants/xai.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
- package/dist/cjs/services/ChatServiceFactory.js +17 -19
- package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts +7 -2
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js +9 -2
- package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
- package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
- package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/gemini/GeminiChatService.js +3 -0
- package/dist/cjs/services/providers/gemini/GeminiChatService.js.map +1 -1
- package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts +5 -0
- package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
- package/dist/cjs/services/providers/gemini/geminiMessageConverter.js +16 -0
- package/dist/cjs/services/providers/gemini/geminiMessageConverter.js.map +1 -1
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts +1 -1
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +2 -2
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +35 -5
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
- package/dist/cjs/services/providers/openai/responsesParser.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/responsesParser.js +71 -6
- package/dist/cjs/services/providers/openai/responsesParser.js.map +1 -1
- package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
- package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +7 -8
- package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
- package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +3 -0
- package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
- package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js +1 -0
- package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
- package/dist/esm/backend.d.ts +20 -0
- package/dist/esm/backend.d.ts.map +1 -0
- package/dist/esm/backend.js +111 -0
- package/dist/esm/backend.js.map +1 -0
- package/dist/esm/constants/deepseek.d.ts +6 -0
- package/dist/esm/constants/deepseek.d.ts.map +1 -1
- package/dist/esm/constants/deepseek.js +43 -0
- package/dist/esm/constants/deepseek.js.map +1 -1
- package/dist/esm/constants/openrouter.d.ts +6 -0
- package/dist/esm/constants/openrouter.d.ts.map +1 -1
- package/dist/esm/constants/openrouter.js +61 -0
- package/dist/esm/constants/openrouter.js.map +1 -1
- package/dist/esm/constants/xai.d.ts +6 -1
- package/dist/esm/constants/xai.d.ts.map +1 -1
- package/dist/esm/constants/xai.js +27 -6
- package/dist/esm/constants/xai.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
- package/dist/esm/services/ChatServiceFactory.js +17 -19
- package/dist/esm/services/ChatServiceFactory.js.map +1 -1
- package/dist/esm/services/providers/ChatServiceProvider.d.ts +7 -2
- package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatService.js +10 -3
- package/dist/esm/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
- package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
- package/dist/esm/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/gemini/GeminiChatService.js +4 -1
- package/dist/esm/services/providers/gemini/GeminiChatService.js.map +1 -1
- package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts +5 -0
- package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
- package/dist/esm/services/providers/gemini/geminiMessageConverter.js +15 -0
- package/dist/esm/services/providers/gemini/geminiMessageConverter.js.map +1 -1
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts +1 -1
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +2 -2
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
- package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/openaiRequestBuilder.js +35 -5
- package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
- package/dist/esm/services/providers/openai/responsesParser.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/responsesParser.js +71 -6
- package/dist/esm/services/providers/openai/responsesParser.js.map +1 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +8 -9
- package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +4 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
- package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/xai/XAIChatServiceProvider.js +2 -1
- package/dist/esm/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
- package/dist/umd/aituber-onair-chat.js +392 -44
- package/dist/umd/aituber-onair-chat.min.js +9 -9
- 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
|
|
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
|
|
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 ===
|
|
709
|
-
return
|
|
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
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
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.
|
|
2559
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
4822
|
-
|
|
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 (
|
|
4825
|
-
const effort =
|
|
5067
|
+
if (reasoningEffort) {
|
|
5068
|
+
const effort = reasoningEffort === "minimal" ? "low" : reasoningEffort;
|
|
4826
5069
|
body.reasoning.effort = effort;
|
|
4827
|
-
} else if (
|
|
5070
|
+
} else if (defaultReasoningEffort) {
|
|
4828
5071
|
body.reasoning.effort = defaultReasoningEffort;
|
|
4829
5072
|
}
|
|
4830
|
-
if (
|
|
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/
|
|
5679
|
-
var
|
|
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
|
-
"
|
|
5684
|
-
"
|
|
5685
|
-
"zai",
|
|
5939
|
+
"plamo",
|
|
5940
|
+
"sakana",
|
|
5686
5941
|
"xai",
|
|
5687
|
-
"
|
|
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
|
-
"
|
|
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:
|
|
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
|
/**
|