@aituber-onair/chat 0.48.0 → 0.50.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 +125 -21
- package/README.md +132 -21
- package/dist/cjs/constants/claude.d.ts +15 -0
- package/dist/cjs/constants/claude.d.ts.map +1 -1
- package/dist/cjs/constants/claude.js +61 -1
- package/dist/cjs/constants/claude.js.map +1 -1
- 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/kimi.d.ts +5 -1
- package/dist/cjs/constants/kimi.d.ts.map +1 -1
- package/dist/cjs/constants/kimi.js +8 -1
- package/dist/cjs/constants/kimi.js.map +1 -1
- package/dist/cjs/constants/openrouter.d.ts +18 -0
- package/dist/cjs/constants/openrouter.d.ts.map +1 -1
- package/dist/cjs/constants/openrouter.js +88 -1
- package/dist/cjs/constants/openrouter.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- 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 -2
- package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts +22 -5
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts +3 -1
- package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/claude/ClaudeChatService.js +51 -4
- package/dist/cjs/services/providers/claude/ClaudeChatService.js.map +1 -1
- package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +13 -2
- package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
- package/dist/cjs/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
- package/dist/cjs/services/providers/claude/claudeMessageConverter.js +7 -1
- package/dist/cjs/services/providers/claude/claudeMessageConverter.js.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/geminiNano/GeminiNanoChatService.d.ts +8 -3
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +85 -32
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
- package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
- package/dist/cjs/services/providers/kimi/KimiChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/kimi/KimiChatService.js +3 -5
- package/dist/cjs/services/providers/kimi/KimiChatService.js.map +1 -1
- package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js +1 -1
- package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +8 -0
- package/dist/cjs/services/providers/openai/openaiRequestBuilder.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 +41 -23
- 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 +16 -0
- package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
- package/dist/cjs/types/chat.d.ts +2 -0
- package/dist/cjs/types/chat.d.ts.map +1 -1
- package/dist/cjs/types/toolChat.d.ts +2 -3
- package/dist/cjs/types/toolChat.d.ts.map +1 -1
- package/dist/cjs/utils/openaiCompatibleSse.d.ts +1 -0
- package/dist/cjs/utils/openaiCompatibleSse.d.ts.map +1 -1
- package/dist/cjs/utils/openaiCompatibleSse.js +22 -0
- package/dist/cjs/utils/openaiCompatibleSse.js.map +1 -1
- package/dist/esm/constants/claude.d.ts +15 -0
- package/dist/esm/constants/claude.d.ts.map +1 -1
- package/dist/esm/constants/claude.js +56 -0
- package/dist/esm/constants/claude.js.map +1 -1
- 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/kimi.d.ts +5 -1
- package/dist/esm/constants/kimi.d.ts.map +1 -1
- package/dist/esm/constants/kimi.js +7 -1
- package/dist/esm/constants/kimi.js.map +1 -1
- package/dist/esm/constants/openrouter.d.ts +18 -0
- package/dist/esm/constants/openrouter.d.ts.map +1 -1
- package/dist/esm/constants/openrouter.js +83 -0
- package/dist/esm/constants/openrouter.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- 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 -2
- package/dist/esm/services/ChatServiceFactory.js.map +1 -1
- package/dist/esm/services/providers/ChatServiceProvider.d.ts +22 -5
- package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/claude/ClaudeChatService.d.ts +3 -1
- package/dist/esm/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/claude/ClaudeChatService.js +52 -5
- package/dist/esm/services/providers/claude/ClaudeChatService.js.map +1 -1
- package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +14 -3
- package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
- package/dist/esm/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
- package/dist/esm/services/providers/claude/claudeMessageConverter.js +7 -1
- package/dist/esm/services/providers/claude/claudeMessageConverter.js.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/geminiNano/GeminiNanoChatService.d.ts +8 -3
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +86 -33
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
- package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
- package/dist/esm/services/providers/kimi/KimiChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/kimi/KimiChatService.js +4 -6
- package/dist/esm/services/providers/kimi/KimiChatService.js.map +1 -1
- package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js +2 -2
- package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
- package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/openaiRequestBuilder.js +8 -0
- package/dist/esm/services/providers/openai/openaiRequestBuilder.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 +42 -24
- 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 +17 -1
- package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
- package/dist/esm/types/chat.d.ts +2 -0
- package/dist/esm/types/chat.d.ts.map +1 -1
- package/dist/esm/types/toolChat.d.ts +2 -3
- package/dist/esm/types/toolChat.d.ts.map +1 -1
- package/dist/esm/utils/openaiCompatibleSse.d.ts +1 -0
- package/dist/esm/utils/openaiCompatibleSse.d.ts.map +1 -1
- package/dist/esm/utils/openaiCompatibleSse.js +22 -0
- package/dist/esm/utils/openaiCompatibleSse.js.map +1 -1
- package/dist/umd/aituber-onair-chat.js +444 -63
- package/dist/umd/aituber-onair-chat.min.js +9 -11
- package/package.json +1 -1
|
@@ -75,6 +75,7 @@ var AITuberOnAirChat = (() => {
|
|
|
75
75
|
MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU: () => MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU,
|
|
76
76
|
MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST: () => MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST,
|
|
77
77
|
MODEL_ANTHROPIC_CLAUDE_OPUS_4: () => MODEL_ANTHROPIC_CLAUDE_OPUS_4,
|
|
78
|
+
MODEL_ANTHROPIC_CLAUDE_OPUS_5: () => MODEL_ANTHROPIC_CLAUDE_OPUS_5,
|
|
78
79
|
MODEL_ANTHROPIC_CLAUDE_SONNET_4: () => MODEL_ANTHROPIC_CLAUDE_SONNET_4,
|
|
79
80
|
MODEL_ANTHROPIC_CLAUDE_SONNET_LATEST: () => MODEL_ANTHROPIC_CLAUDE_SONNET_LATEST,
|
|
80
81
|
MODEL_CLAUDE_3_5_HAIKU: () => MODEL_CLAUDE_3_5_HAIKU,
|
|
@@ -90,6 +91,7 @@ var AITuberOnAirChat = (() => {
|
|
|
90
91
|
MODEL_CLAUDE_4_8_OPUS: () => MODEL_CLAUDE_4_8_OPUS,
|
|
91
92
|
MODEL_CLAUDE_4_OPUS: () => MODEL_CLAUDE_4_OPUS,
|
|
92
93
|
MODEL_CLAUDE_4_SONNET: () => MODEL_CLAUDE_4_SONNET,
|
|
94
|
+
MODEL_CLAUDE_5_OPUS: () => MODEL_CLAUDE_5_OPUS,
|
|
93
95
|
MODEL_CLAUDE_5_SONNET: () => MODEL_CLAUDE_5_SONNET,
|
|
94
96
|
MODEL_DEEPSEEK_CHAT: () => MODEL_DEEPSEEK_CHAT,
|
|
95
97
|
MODEL_DEEPSEEK_REASONER: () => MODEL_DEEPSEEK_REASONER,
|
|
@@ -128,6 +130,8 @@ var AITuberOnAirChat = (() => {
|
|
|
128
130
|
MODEL_GOOGLE_GEMINI_2_5_FLASH: () => MODEL_GOOGLE_GEMINI_2_5_FLASH,
|
|
129
131
|
MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025: () => MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,
|
|
130
132
|
MODEL_GOOGLE_GEMINI_2_5_PRO: () => MODEL_GOOGLE_GEMINI_2_5_PRO,
|
|
133
|
+
MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE: () => MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE,
|
|
134
|
+
MODEL_GOOGLE_GEMINI_3_6_FLASH: () => MODEL_GOOGLE_GEMINI_3_6_FLASH,
|
|
131
135
|
MODEL_GOOGLE_GEMINI_FLASH_LATEST: () => MODEL_GOOGLE_GEMINI_FLASH_LATEST,
|
|
132
136
|
MODEL_GOOGLE_GEMINI_PRO_LATEST: () => MODEL_GOOGLE_GEMINI_PRO_LATEST,
|
|
133
137
|
MODEL_GPT_4O: () => MODEL_GPT_4O,
|
|
@@ -160,6 +164,8 @@ var AITuberOnAirChat = (() => {
|
|
|
160
164
|
MODEL_KIMI_K2_7_CODE: () => MODEL_KIMI_K2_7_CODE,
|
|
161
165
|
MODEL_KIMI_K2_7_CODE_HIGHSPEED: () => MODEL_KIMI_K2_7_CODE_HIGHSPEED,
|
|
162
166
|
MODEL_KIMI_K3: () => MODEL_KIMI_K3,
|
|
167
|
+
MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5: () => MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5,
|
|
168
|
+
MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5: () => MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5,
|
|
163
169
|
MODEL_MINISTRAL_14B_2512: () => MODEL_MINISTRAL_14B_2512,
|
|
164
170
|
MODEL_MINISTRAL_3B_2512: () => MODEL_MINISTRAL_3B_2512,
|
|
165
171
|
MODEL_MINISTRAL_8B_2512: () => MODEL_MINISTRAL_8B_2512,
|
|
@@ -171,6 +177,7 @@ var AITuberOnAirChat = (() => {
|
|
|
171
177
|
MODEL_MISTRAL_SMALL_LATEST: () => MODEL_MISTRAL_SMALL_LATEST,
|
|
172
178
|
MODEL_MOONSHOTAI_KIMI_K2_5: () => MODEL_MOONSHOTAI_KIMI_K2_5,
|
|
173
179
|
MODEL_MOONSHOTAI_KIMI_K2_7_CODE: () => MODEL_MOONSHOTAI_KIMI_K2_7_CODE,
|
|
180
|
+
MODEL_MOONSHOTAI_KIMI_K3: () => MODEL_MOONSHOTAI_KIMI_K3,
|
|
174
181
|
MODEL_MOONSHOTAI_KIMI_LATEST: () => MODEL_MOONSHOTAI_KIMI_LATEST,
|
|
175
182
|
MODEL_O1: () => MODEL_O1,
|
|
176
183
|
MODEL_O1_MINI: () => MODEL_O1_MINI,
|
|
@@ -182,14 +189,22 @@ var AITuberOnAirChat = (() => {
|
|
|
182
189
|
MODEL_OPENAI_GPT_5_1_CODEX: () => MODEL_OPENAI_GPT_5_1_CODEX,
|
|
183
190
|
MODEL_OPENAI_GPT_5_5: () => MODEL_OPENAI_GPT_5_5,
|
|
184
191
|
MODEL_OPENAI_GPT_5_5_PRO: () => MODEL_OPENAI_GPT_5_5_PRO,
|
|
192
|
+
MODEL_OPENAI_GPT_5_6_LUNA: () => MODEL_OPENAI_GPT_5_6_LUNA,
|
|
193
|
+
MODEL_OPENAI_GPT_5_6_SOL: () => MODEL_OPENAI_GPT_5_6_SOL,
|
|
194
|
+
MODEL_OPENAI_GPT_5_6_TERRA: () => MODEL_OPENAI_GPT_5_6_TERRA,
|
|
185
195
|
MODEL_OPENAI_GPT_5_MINI: () => MODEL_OPENAI_GPT_5_MINI,
|
|
186
196
|
MODEL_OPENAI_GPT_5_NANO: () => MODEL_OPENAI_GPT_5_NANO,
|
|
187
197
|
MODEL_OPENAI_GPT_LATEST: () => MODEL_OPENAI_GPT_LATEST,
|
|
188
198
|
MODEL_OPENAI_GPT_MINI_LATEST: () => MODEL_OPENAI_GPT_MINI_LATEST,
|
|
189
199
|
MODEL_OPENROUTER_AUTO: () => MODEL_OPENROUTER_AUTO,
|
|
200
|
+
MODEL_OPENROUTER_AUTO_BETA: () => MODEL_OPENROUTER_AUTO_BETA,
|
|
201
|
+
MODEL_OPENROUTER_DEEPSEEK_V4_FLASH: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH,
|
|
202
|
+
MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731,
|
|
190
203
|
MODEL_OPENROUTER_FUSION: () => MODEL_OPENROUTER_FUSION,
|
|
191
204
|
MODEL_PLAMO_2_2_PRIME: () => MODEL_PLAMO_2_2_PRIME,
|
|
192
205
|
MODEL_PLAMO_3_0_PRIME: () => MODEL_PLAMO_3_0_PRIME,
|
|
206
|
+
MODEL_XAI_GROK_4_5: () => MODEL_XAI_GROK_4_5,
|
|
207
|
+
MODEL_XAI_GROK_LATEST: () => MODEL_XAI_GROK_LATEST,
|
|
193
208
|
MODEL_ZAI_GLM_4_5_AIR: () => MODEL_ZAI_GLM_4_5_AIR,
|
|
194
209
|
MODEL_ZAI_GLM_4_5_AIR_FREE: () => MODEL_ZAI_GLM_4_5_AIR_FREE,
|
|
195
210
|
MODEL_ZAI_GLM_4_7_FLASH: () => MODEL_ZAI_GLM_4_7_FLASH,
|
|
@@ -229,13 +244,22 @@ var AITuberOnAirChat = (() => {
|
|
|
229
244
|
allowsReasoningNone: () => allowsReasoningNone,
|
|
230
245
|
allowsReasoningXHigh: () => allowsReasoningXHigh,
|
|
231
246
|
buildOpenAICompatibleTools: () => buildOpenAICompatibleTools,
|
|
247
|
+
getClaudeSupportedReasoningEfforts: () => getClaudeSupportedReasoningEfforts,
|
|
248
|
+
getDeepSeekSupportedReasoningEfforts: () => getDeepSeekSupportedReasoningEfforts,
|
|
249
|
+
getDefaultClaudeReasoningEffort: () => getDefaultClaudeReasoningEffort,
|
|
250
|
+
getDefaultDeepSeekReasoningEffort: () => getDefaultDeepSeekReasoningEffort,
|
|
232
251
|
getDefaultGeminiReasoningEffort: () => getDefaultGeminiReasoningEffort,
|
|
252
|
+
getDefaultKimiReasoningEffort: () => getDefaultKimiReasoningEffort,
|
|
253
|
+
getDefaultOpenRouterReasoningEffort: () => getDefaultOpenRouterReasoningEffort,
|
|
233
254
|
getDefaultReasoningEffortForGPT5Model: () => getDefaultReasoningEffortForGPT5Model,
|
|
234
255
|
getDefaultXaiReasoningEffort: () => getDefaultXaiReasoningEffort,
|
|
235
256
|
getGeminiSupportedReasoningEfforts: () => getGeminiSupportedReasoningEfforts,
|
|
236
257
|
getKimiSupportedReasoningEfforts: () => getKimiSupportedReasoningEfforts,
|
|
237
258
|
getMaxTokensForResponseLength: () => getMaxTokensForResponseLength,
|
|
259
|
+
getOpenRouterSupportedReasoningEfforts: () => getOpenRouterSupportedReasoningEfforts,
|
|
238
260
|
installGASFetch: () => installGASFetch,
|
|
261
|
+
isClaudeReasoningEffortModel: () => isClaudeReasoningEffortModel,
|
|
262
|
+
isDeepSeekReasoningEffortModel: () => isDeepSeekReasoningEffortModel,
|
|
239
263
|
isGPT5Model: () => isGPT5Model,
|
|
240
264
|
isGeminiReasoningEffortModel: () => isGeminiReasoningEffortModel,
|
|
241
265
|
isKimiReasoningEffortModel: () => isKimiReasoningEffortModel,
|
|
@@ -252,7 +276,10 @@ var AITuberOnAirChat = (() => {
|
|
|
252
276
|
isXaiVisionModel: () => isXaiVisionModel,
|
|
253
277
|
isZaiToolStreamModel: () => isZaiToolStreamModel,
|
|
254
278
|
isZaiVisionModel: () => isZaiVisionModel,
|
|
279
|
+
normalizeClaudeReasoningEffort: () => normalizeClaudeReasoningEffort,
|
|
280
|
+
normalizeDeepSeekReasoningEffort: () => normalizeDeepSeekReasoningEffort,
|
|
255
281
|
normalizeGeminiReasoningEffort: () => normalizeGeminiReasoningEffort,
|
|
282
|
+
normalizeOpenRouterReasoningEffort: () => normalizeOpenRouterReasoningEffort,
|
|
256
283
|
normalizeXaiReasoningEffort: () => normalizeXaiReasoningEffort,
|
|
257
284
|
parseOpenAICompatibleOneShot: () => parseOpenAICompatibleOneShot,
|
|
258
285
|
parseOpenAICompatibleTextStream: () => parseOpenAICompatibleTextStream,
|
|
@@ -463,6 +490,30 @@ var AITuberOnAirChat = (() => {
|
|
|
463
490
|
var MODEL_CLAUDE_4_7_OPUS = "claude-opus-4-7";
|
|
464
491
|
var MODEL_CLAUDE_4_8_OPUS = "claude-opus-4-8";
|
|
465
492
|
var MODEL_CLAUDE_5_SONNET = "claude-sonnet-5";
|
|
493
|
+
var MODEL_CLAUDE_5_OPUS = "claude-opus-5";
|
|
494
|
+
var CLAUDE_STANDARD_REASONING_EFFORTS = [
|
|
495
|
+
"low",
|
|
496
|
+
"medium",
|
|
497
|
+
"high"
|
|
498
|
+
];
|
|
499
|
+
var CLAUDE_MAX_REASONING_EFFORTS = [
|
|
500
|
+
...CLAUDE_STANDARD_REASONING_EFFORTS,
|
|
501
|
+
"max"
|
|
502
|
+
];
|
|
503
|
+
var CLAUDE_XHIGH_REASONING_EFFORTS = [
|
|
504
|
+
...CLAUDE_STANDARD_REASONING_EFFORTS,
|
|
505
|
+
"xhigh",
|
|
506
|
+
"max"
|
|
507
|
+
];
|
|
508
|
+
var CLAUDE_REASONING_EFFORTS_BY_MODEL = {
|
|
509
|
+
[MODEL_CLAUDE_4_5_OPUS]: CLAUDE_STANDARD_REASONING_EFFORTS,
|
|
510
|
+
[MODEL_CLAUDE_4_6_SONNET]: CLAUDE_MAX_REASONING_EFFORTS,
|
|
511
|
+
[MODEL_CLAUDE_4_6_OPUS]: CLAUDE_MAX_REASONING_EFFORTS,
|
|
512
|
+
[MODEL_CLAUDE_4_7_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
|
|
513
|
+
[MODEL_CLAUDE_4_8_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
|
|
514
|
+
[MODEL_CLAUDE_5_SONNET]: CLAUDE_XHIGH_REASONING_EFFORTS,
|
|
515
|
+
[MODEL_CLAUDE_5_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS
|
|
516
|
+
};
|
|
466
517
|
var CLAUDE_VISION_SUPPORTED_MODELS = [
|
|
467
518
|
MODEL_CLAUDE_3_HAIKU,
|
|
468
519
|
MODEL_CLAUDE_4_SONNET,
|
|
@@ -474,19 +525,47 @@ var AITuberOnAirChat = (() => {
|
|
|
474
525
|
MODEL_CLAUDE_4_6_OPUS,
|
|
475
526
|
MODEL_CLAUDE_4_7_OPUS,
|
|
476
527
|
MODEL_CLAUDE_4_8_OPUS,
|
|
477
|
-
MODEL_CLAUDE_5_SONNET
|
|
528
|
+
MODEL_CLAUDE_5_SONNET,
|
|
529
|
+
MODEL_CLAUDE_5_OPUS
|
|
478
530
|
];
|
|
531
|
+
function getClaudeSupportedReasoningEfforts(model) {
|
|
532
|
+
return CLAUDE_REASONING_EFFORTS_BY_MODEL[model] ?? [];
|
|
533
|
+
}
|
|
534
|
+
function isClaudeReasoningEffortModel(model) {
|
|
535
|
+
return getClaudeSupportedReasoningEfforts(model).length > 0;
|
|
536
|
+
}
|
|
537
|
+
function getDefaultClaudeReasoningEffort(model) {
|
|
538
|
+
return isClaudeReasoningEffortModel(model) ? "high" : void 0;
|
|
539
|
+
}
|
|
540
|
+
function normalizeClaudeReasoningEffort(model, effort) {
|
|
541
|
+
const supported = getClaudeSupportedReasoningEfforts(model);
|
|
542
|
+
if (supported.length === 0) {
|
|
543
|
+
return void 0;
|
|
544
|
+
}
|
|
545
|
+
if (!effort) {
|
|
546
|
+
return getDefaultClaudeReasoningEffort(model);
|
|
547
|
+
}
|
|
548
|
+
if (supported.includes(effort)) {
|
|
549
|
+
return effort;
|
|
550
|
+
}
|
|
551
|
+
return "high";
|
|
552
|
+
}
|
|
479
553
|
|
|
480
554
|
// src/constants/openrouter.ts
|
|
481
555
|
var ENDPOINT_OPENROUTER_API = "https://openrouter.ai/api/v1/chat/completions";
|
|
482
556
|
var MODEL_OPENROUTER_AUTO = "openrouter/auto";
|
|
557
|
+
var MODEL_OPENROUTER_AUTO_BETA = "openrouter/auto-beta";
|
|
483
558
|
var MODEL_OPENROUTER_FUSION = "openrouter/fusion";
|
|
484
559
|
var MODEL_GPT_OSS_20B_FREE = "openai/gpt-oss-20b:free";
|
|
560
|
+
var MODEL_MOONSHOTAI_KIMI_K3 = "moonshotai/kimi-k3";
|
|
485
561
|
var MODEL_MOONSHOTAI_KIMI_K2_7_CODE = "moonshotai/kimi-k2.7-code";
|
|
486
562
|
var MODEL_MOONSHOTAI_KIMI_K2_5 = "moonshotai/kimi-k2.5";
|
|
487
563
|
var MODEL_MOONSHOTAI_KIMI_LATEST = "~moonshotai/kimi-latest";
|
|
488
564
|
var MODEL_OPENAI_GPT_LATEST = "~openai/gpt-latest";
|
|
489
565
|
var MODEL_OPENAI_GPT_MINI_LATEST = "~openai/gpt-mini-latest";
|
|
566
|
+
var MODEL_OPENAI_GPT_5_6_SOL = "openai/gpt-5.6-sol";
|
|
567
|
+
var MODEL_OPENAI_GPT_5_6_TERRA = "openai/gpt-5.6-terra";
|
|
568
|
+
var MODEL_OPENAI_GPT_5_6_LUNA = "openai/gpt-5.6-luna";
|
|
490
569
|
var MODEL_OPENAI_GPT_5_5_PRO = "openai/gpt-5.5-pro";
|
|
491
570
|
var MODEL_OPENAI_GPT_5_5 = "openai/gpt-5.5";
|
|
492
571
|
var MODEL_OPENAI_GPT_5_1_CHAT = "openai/gpt-5.1-chat";
|
|
@@ -498,6 +577,7 @@ var AITuberOnAirChat = (() => {
|
|
|
498
577
|
var MODEL_OPENAI_GPT_4_1_NANO = "openai/gpt-4.1-nano";
|
|
499
578
|
var MODEL_ANTHROPIC_CLAUDE_SONNET_LATEST = "~anthropic/claude-sonnet-latest";
|
|
500
579
|
var MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST = "~anthropic/claude-haiku-latest";
|
|
580
|
+
var MODEL_ANTHROPIC_CLAUDE_OPUS_5 = "anthropic/claude-opus-5";
|
|
501
581
|
var MODEL_ANTHROPIC_CLAUDE_OPUS_4 = "anthropic/claude-opus-4";
|
|
502
582
|
var MODEL_ANTHROPIC_CLAUDE_SONNET_4 = "anthropic/claude-sonnet-4";
|
|
503
583
|
var MODEL_ANTHROPIC_CLAUDE_3_7_SONNET = "anthropic/claude-3.7-sonnet";
|
|
@@ -505,6 +585,8 @@ var AITuberOnAirChat = (() => {
|
|
|
505
585
|
var MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU = "anthropic/claude-haiku-4.5";
|
|
506
586
|
var MODEL_GOOGLE_GEMINI_PRO_LATEST = "~google/gemini-pro-latest";
|
|
507
587
|
var MODEL_GOOGLE_GEMINI_FLASH_LATEST = "~google/gemini-flash-latest";
|
|
588
|
+
var MODEL_GOOGLE_GEMINI_3_6_FLASH = "google/gemini-3.6-flash";
|
|
589
|
+
var MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE = "google/gemini-3.5-flash-lite";
|
|
508
590
|
var MODEL_GOOGLE_GEMINI_2_5_PRO = "google/gemini-2.5-pro";
|
|
509
591
|
var MODEL_GOOGLE_GEMINI_2_5_FLASH = "google/gemini-2.5-flash";
|
|
510
592
|
var MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025 = "google/gemini-2.5-flash-lite-preview-09-2025";
|
|
@@ -512,14 +594,43 @@ var AITuberOnAirChat = (() => {
|
|
|
512
594
|
var MODEL_ZAI_GLM_4_7_FLASH = "z-ai/glm-4.7-flash";
|
|
513
595
|
var MODEL_ZAI_GLM_4_5_AIR = "z-ai/glm-4.5-air";
|
|
514
596
|
var MODEL_ZAI_GLM_4_5_AIR_FREE = "z-ai/glm-4.5-air:free";
|
|
597
|
+
var MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5 = "kwaipilot/kat-coder-air-v2.5";
|
|
598
|
+
var MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5 = "kwaipilot/kat-coder-pro-v2.5";
|
|
599
|
+
var MODEL_XAI_GROK_LATEST = "~x-ai/grok-latest";
|
|
600
|
+
var MODEL_XAI_GROK_4_5 = "x-ai/grok-4.5";
|
|
601
|
+
var MODEL_OPENROUTER_DEEPSEEK_V4_FLASH = "deepseek/deepseek-v4-flash";
|
|
602
|
+
var MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731 = "deepseek/deepseek-v4-flash-0731";
|
|
603
|
+
var DEFAULT_OPENROUTER_REASONING_EFFORTS = [
|
|
604
|
+
"none",
|
|
605
|
+
"minimal",
|
|
606
|
+
"low",
|
|
607
|
+
"medium",
|
|
608
|
+
"high"
|
|
609
|
+
];
|
|
610
|
+
var OPENROUTER_DEEPSEEK_V4_FLASH_REASONING_EFFORTS = [
|
|
611
|
+
"none",
|
|
612
|
+
"high",
|
|
613
|
+
"xhigh"
|
|
614
|
+
];
|
|
615
|
+
var OPENROUTER_DEEPSEEK_V4_FLASH_0731_REASONING_EFFORTS = [
|
|
616
|
+
"none",
|
|
617
|
+
"low",
|
|
618
|
+
"high",
|
|
619
|
+
"max"
|
|
620
|
+
];
|
|
515
621
|
var OPENROUTER_FREE_MODELS = [
|
|
516
622
|
MODEL_GPT_OSS_20B_FREE,
|
|
517
623
|
MODEL_ZAI_GLM_4_5_AIR_FREE
|
|
518
624
|
];
|
|
519
625
|
var OPENROUTER_VISION_SUPPORTED_MODELS = [
|
|
626
|
+
MODEL_OPENROUTER_AUTO_BETA,
|
|
627
|
+
MODEL_MOONSHOTAI_KIMI_K3,
|
|
520
628
|
MODEL_MOONSHOTAI_KIMI_LATEST,
|
|
521
629
|
MODEL_OPENAI_GPT_LATEST,
|
|
522
630
|
MODEL_OPENAI_GPT_MINI_LATEST,
|
|
631
|
+
MODEL_OPENAI_GPT_5_6_SOL,
|
|
632
|
+
MODEL_OPENAI_GPT_5_6_TERRA,
|
|
633
|
+
MODEL_OPENAI_GPT_5_6_LUNA,
|
|
523
634
|
MODEL_OPENAI_GPT_5_5_PRO,
|
|
524
635
|
MODEL_OPENAI_GPT_5_5,
|
|
525
636
|
MODEL_OPENAI_GPT_5_1_CHAT,
|
|
@@ -531,17 +642,22 @@ var AITuberOnAirChat = (() => {
|
|
|
531
642
|
MODEL_OPENAI_GPT_4_1_NANO,
|
|
532
643
|
MODEL_ANTHROPIC_CLAUDE_SONNET_LATEST,
|
|
533
644
|
MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST,
|
|
645
|
+
MODEL_ANTHROPIC_CLAUDE_OPUS_5,
|
|
534
646
|
MODEL_ANTHROPIC_CLAUDE_OPUS_4,
|
|
535
647
|
MODEL_ANTHROPIC_CLAUDE_SONNET_4,
|
|
536
648
|
MODEL_ANTHROPIC_CLAUDE_3_7_SONNET,
|
|
537
649
|
MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU,
|
|
538
650
|
MODEL_GOOGLE_GEMINI_PRO_LATEST,
|
|
539
651
|
MODEL_GOOGLE_GEMINI_FLASH_LATEST,
|
|
652
|
+
MODEL_GOOGLE_GEMINI_3_6_FLASH,
|
|
653
|
+
MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE,
|
|
540
654
|
MODEL_GOOGLE_GEMINI_2_5_PRO,
|
|
541
655
|
MODEL_GOOGLE_GEMINI_2_5_FLASH,
|
|
542
656
|
MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,
|
|
543
657
|
MODEL_MOONSHOTAI_KIMI_K2_7_CODE,
|
|
544
|
-
MODEL_MOONSHOTAI_KIMI_K2_5
|
|
658
|
+
MODEL_MOONSHOTAI_KIMI_K2_5,
|
|
659
|
+
MODEL_XAI_GROK_LATEST,
|
|
660
|
+
MODEL_XAI_GROK_4_5
|
|
545
661
|
];
|
|
546
662
|
var OPENROUTER_FREE_RATE_LIMIT_PER_MINUTE = 20;
|
|
547
663
|
var OPENROUTER_FREE_DAILY_LIMIT_LOW_CREDITS = 50;
|
|
@@ -555,6 +671,43 @@ var AITuberOnAirChat = (() => {
|
|
|
555
671
|
(visionModel) => model.includes(visionModel)
|
|
556
672
|
);
|
|
557
673
|
}
|
|
674
|
+
function getOpenRouterSupportedReasoningEfforts(model) {
|
|
675
|
+
const normalizedModel = model.trim();
|
|
676
|
+
if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH) {
|
|
677
|
+
return OPENROUTER_DEEPSEEK_V4_FLASH_REASONING_EFFORTS;
|
|
678
|
+
}
|
|
679
|
+
if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731) {
|
|
680
|
+
return OPENROUTER_DEEPSEEK_V4_FLASH_0731_REASONING_EFFORTS;
|
|
681
|
+
}
|
|
682
|
+
return DEFAULT_OPENROUTER_REASONING_EFFORTS;
|
|
683
|
+
}
|
|
684
|
+
function getDefaultOpenRouterReasoningEffort(model) {
|
|
685
|
+
const normalizedModel = model.trim();
|
|
686
|
+
return normalizedModel === MODEL_ZAI_GLM_5_2 || normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH || normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731 ? "none" : void 0;
|
|
687
|
+
}
|
|
688
|
+
function normalizeOpenRouterReasoningEffort(model, effort) {
|
|
689
|
+
const normalizedModel = model.trim();
|
|
690
|
+
const requested = effort ?? getDefaultOpenRouterReasoningEffort(model);
|
|
691
|
+
if (!requested) {
|
|
692
|
+
return void 0;
|
|
693
|
+
}
|
|
694
|
+
const supported = getOpenRouterSupportedReasoningEfforts(model);
|
|
695
|
+
if (supported.includes(requested)) {
|
|
696
|
+
return requested;
|
|
697
|
+
}
|
|
698
|
+
if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH) {
|
|
699
|
+
return requested === "max" ? "xhigh" : "none";
|
|
700
|
+
}
|
|
701
|
+
if (normalizedModel === MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731) {
|
|
702
|
+
if (requested === "minimal" || requested === "medium") {
|
|
703
|
+
return "low";
|
|
704
|
+
}
|
|
705
|
+
if (requested === "xhigh") {
|
|
706
|
+
return "high";
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
return requested;
|
|
710
|
+
}
|
|
558
711
|
|
|
559
712
|
// src/constants/zai.ts
|
|
560
713
|
var ENDPOINT_ZAI_CHAT_COMPLETIONS_API = "https://api.z.ai/api/paas/v4/chat/completions";
|
|
@@ -632,7 +785,7 @@ var AITuberOnAirChat = (() => {
|
|
|
632
785
|
var MODEL_KIMI_K2_6 = "kimi-k2.6";
|
|
633
786
|
var MODEL_KIMI_K2_5 = "kimi-k2.5";
|
|
634
787
|
var KIMI_REASONING_EFFORTS_BY_MODEL = {
|
|
635
|
-
[MODEL_KIMI_K3]: ["max"]
|
|
788
|
+
[MODEL_KIMI_K3]: ["low", "high", "max"]
|
|
636
789
|
};
|
|
637
790
|
var KIMI_VISION_SUPPORTED_MODELS = [
|
|
638
791
|
MODEL_KIMI_K3,
|
|
@@ -654,6 +807,9 @@ var AITuberOnAirChat = (() => {
|
|
|
654
807
|
function getKimiSupportedReasoningEfforts(model) {
|
|
655
808
|
return KIMI_REASONING_EFFORTS_BY_MODEL[model] ?? [];
|
|
656
809
|
}
|
|
810
|
+
function getDefaultKimiReasoningEffort(model) {
|
|
811
|
+
return model === MODEL_KIMI_K3 ? "max" : void 0;
|
|
812
|
+
}
|
|
657
813
|
function isKimiReasoningEffortModel(model) {
|
|
658
814
|
return getKimiSupportedReasoningEfforts(model).length > 0;
|
|
659
815
|
}
|
|
@@ -663,6 +819,17 @@ var AITuberOnAirChat = (() => {
|
|
|
663
819
|
var ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API = `${DEEPSEEK_API_BASE_URL}/chat/completions`;
|
|
664
820
|
var MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash";
|
|
665
821
|
var MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro";
|
|
822
|
+
var DEEPSEEK_V4_FLASH_REASONING_EFFORTS = [
|
|
823
|
+
"none",
|
|
824
|
+
"low",
|
|
825
|
+
"high",
|
|
826
|
+
"max"
|
|
827
|
+
];
|
|
828
|
+
var DEEPSEEK_V4_PRO_REASONING_EFFORTS = [
|
|
829
|
+
"none",
|
|
830
|
+
"high",
|
|
831
|
+
"max"
|
|
832
|
+
];
|
|
666
833
|
var MODEL_DEEPSEEK_CHAT = "deepseek-chat";
|
|
667
834
|
var MODEL_DEEPSEEK_REASONER = "deepseek-reasoner";
|
|
668
835
|
var DEEPSEEK_SUPPORTED_MODELS = [
|
|
@@ -673,6 +840,35 @@ var AITuberOnAirChat = (() => {
|
|
|
673
840
|
MODEL_DEEPSEEK_CHAT,
|
|
674
841
|
MODEL_DEEPSEEK_REASONER
|
|
675
842
|
];
|
|
843
|
+
function getDeepSeekSupportedReasoningEfforts(model) {
|
|
844
|
+
if (model === MODEL_DEEPSEEK_V4_FLASH) {
|
|
845
|
+
return DEEPSEEK_V4_FLASH_REASONING_EFFORTS;
|
|
846
|
+
}
|
|
847
|
+
if (model === MODEL_DEEPSEEK_V4_PRO) {
|
|
848
|
+
return DEEPSEEK_V4_PRO_REASONING_EFFORTS;
|
|
849
|
+
}
|
|
850
|
+
return [];
|
|
851
|
+
}
|
|
852
|
+
function isDeepSeekReasoningEffortModel(model) {
|
|
853
|
+
return getDeepSeekSupportedReasoningEfforts(model).length > 0;
|
|
854
|
+
}
|
|
855
|
+
function getDefaultDeepSeekReasoningEffort(model) {
|
|
856
|
+
return isDeepSeekReasoningEffortModel(model) ? "none" : void 0;
|
|
857
|
+
}
|
|
858
|
+
function normalizeDeepSeekReasoningEffort(model, effort) {
|
|
859
|
+
const supported = getDeepSeekSupportedReasoningEfforts(model);
|
|
860
|
+
if (supported.length === 0) {
|
|
861
|
+
return void 0;
|
|
862
|
+
}
|
|
863
|
+
const requested = effort ?? getDefaultDeepSeekReasoningEffort(model);
|
|
864
|
+
if (requested && supported.includes(requested)) {
|
|
865
|
+
return requested;
|
|
866
|
+
}
|
|
867
|
+
if (model === MODEL_DEEPSEEK_V4_PRO && requested === "low") {
|
|
868
|
+
return "high";
|
|
869
|
+
}
|
|
870
|
+
return getDefaultDeepSeekReasoningEffort(model);
|
|
871
|
+
}
|
|
676
872
|
|
|
677
873
|
// src/constants/mistral.ts
|
|
678
874
|
var MISTRAL_API_BASE_URL = "https://api.mistral.ai/v1";
|
|
@@ -1090,6 +1286,15 @@ If it's in another language, summarize in that language.
|
|
|
1090
1286
|
return "";
|
|
1091
1287
|
}).join("");
|
|
1092
1288
|
};
|
|
1289
|
+
var throwIfApiError = (data) => {
|
|
1290
|
+
const choice = data.choices?.[0];
|
|
1291
|
+
const error = data.error ?? choice?.error;
|
|
1292
|
+
if (!error && choice?.finish_reason !== "error") {
|
|
1293
|
+
return;
|
|
1294
|
+
}
|
|
1295
|
+
const message = typeof error === "string" ? error : typeof error?.message === "string" ? error.message : "The provider ended the response with an error.";
|
|
1296
|
+
throw new Error(`Provider response error: ${message}`);
|
|
1297
|
+
};
|
|
1093
1298
|
var forEachSsePayload = async (res, onPayload) => {
|
|
1094
1299
|
const reader = res.body?.getReader();
|
|
1095
1300
|
if (!reader) {
|
|
@@ -1122,6 +1327,9 @@ If it's in another language, summarize in that language.
|
|
|
1122
1327
|
await forEachSsePayload(res, (payload) => {
|
|
1123
1328
|
const json = parseJsonPayload(payload, options.onJsonError);
|
|
1124
1329
|
if (!json) return;
|
|
1330
|
+
if (options.throwOnApiError) {
|
|
1331
|
+
throwIfApiError(json);
|
|
1332
|
+
}
|
|
1125
1333
|
const content = extractTextContent(json.choices?.[0]?.delta?.content);
|
|
1126
1334
|
if (content) {
|
|
1127
1335
|
onPartial(content);
|
|
@@ -1141,6 +1349,9 @@ If it's in another language, summarize in that language.
|
|
|
1141
1349
|
await forEachSsePayload(res, (payload) => {
|
|
1142
1350
|
const json = parseJsonPayload(payload, options.onJsonError);
|
|
1143
1351
|
if (!json) return;
|
|
1352
|
+
if (options.throwOnApiError) {
|
|
1353
|
+
throwIfApiError(json);
|
|
1354
|
+
}
|
|
1144
1355
|
const choice = json.choices?.[0];
|
|
1145
1356
|
if (typeof choice?.finish_reason === "string") {
|
|
1146
1357
|
finishReason = choice.finish_reason;
|
|
@@ -1208,6 +1419,9 @@ If it's in another language, summarize in that language.
|
|
|
1208
1419
|
};
|
|
1209
1420
|
}
|
|
1210
1421
|
function parseOpenAICompatibleOneShot(data, options = {}) {
|
|
1422
|
+
if (options.throwOnApiError) {
|
|
1423
|
+
throwIfApiError(data);
|
|
1424
|
+
}
|
|
1211
1425
|
const choice = data?.choices?.[0];
|
|
1212
1426
|
const blocks = [];
|
|
1213
1427
|
const content = extractTextContent(choice?.message?.content);
|
|
@@ -1515,11 +1729,17 @@ If it's in another language, summarize in that language.
|
|
|
1515
1729
|
function convertMessagesToClaudeFormat(messages) {
|
|
1516
1730
|
return messages.map((msg) => ({
|
|
1517
1731
|
role: mapRoleToClaude(msg.role),
|
|
1518
|
-
content: msg.content
|
|
1732
|
+
content: msg.provider_content ?? msg.content
|
|
1519
1733
|
}));
|
|
1520
1734
|
}
|
|
1521
1735
|
function convertVisionMessagesToClaudeFormat(messages) {
|
|
1522
1736
|
return messages.map((msg) => {
|
|
1737
|
+
if (msg.provider_content) {
|
|
1738
|
+
return {
|
|
1739
|
+
role: mapRoleToClaude(msg.role),
|
|
1740
|
+
content: msg.provider_content
|
|
1741
|
+
};
|
|
1742
|
+
}
|
|
1523
1743
|
if (typeof msg.content === "string") {
|
|
1524
1744
|
return {
|
|
1525
1745
|
role: mapRoleToClaude(msg.role),
|
|
@@ -1610,7 +1830,7 @@ If it's in another language, summarize in that language.
|
|
|
1610
1830
|
* @param mcpServers Array of MCP server configurations (optional)
|
|
1611
1831
|
* @throws Error if the vision model doesn't support vision capabilities
|
|
1612
1832
|
*/
|
|
1613
|
-
constructor(apiKey, model = MODEL_CLAUDE_4_5_HAIKU, visionModel = MODEL_CLAUDE_4_5_HAIKU, tools = [], mcpServers = [], responseLength) {
|
|
1833
|
+
constructor(apiKey, model = MODEL_CLAUDE_4_5_HAIKU, visionModel = MODEL_CLAUDE_4_5_HAIKU, tools = [], mcpServers = [], responseLength, reasoningEffort) {
|
|
1614
1834
|
/** Provider name */
|
|
1615
1835
|
this.provider = "claude";
|
|
1616
1836
|
this.apiKey = apiKey;
|
|
@@ -1619,6 +1839,7 @@ If it's in another language, summarize in that language.
|
|
|
1619
1839
|
this.tools = tools;
|
|
1620
1840
|
this.mcpServers = mcpServers;
|
|
1621
1841
|
this.responseLength = responseLength;
|
|
1842
|
+
this.reasoningEffort = reasoningEffort;
|
|
1622
1843
|
if (!CLAUDE_VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
|
|
1623
1844
|
throw new Error(
|
|
1624
1845
|
`Model ${this.visionModel} does not support vision capabilities.`
|
|
@@ -1728,6 +1949,9 @@ If it's in another language, summarize in that language.
|
|
|
1728
1949
|
stream,
|
|
1729
1950
|
max_tokens: maxTokens !== void 0 ? maxTokens : getMaxTokensForResponseLength(this.responseLength)
|
|
1730
1951
|
};
|
|
1952
|
+
if (this.reasoningEffort !== void 0 && getClaudeSupportedReasoningEfforts(model).includes(this.reasoningEffort)) {
|
|
1953
|
+
body.output_config = { effort: this.reasoningEffort };
|
|
1954
|
+
}
|
|
1731
1955
|
if (this.tools.length) {
|
|
1732
1956
|
body.tools = this.tools.map((t) => ({
|
|
1733
1957
|
name: t.name,
|
|
@@ -1765,6 +1989,7 @@ If it's in another language, summarize in that language.
|
|
|
1765
1989
|
const reader = res.body.getReader();
|
|
1766
1990
|
const dec = new TextDecoder();
|
|
1767
1991
|
const textBlocks = [];
|
|
1992
|
+
const providerBlocks = /* @__PURE__ */ new Map();
|
|
1768
1993
|
const toolCalls = /* @__PURE__ */ new Map();
|
|
1769
1994
|
let buf = "";
|
|
1770
1995
|
while (true) {
|
|
@@ -1779,9 +2004,28 @@ If it's in another language, summarize in that language.
|
|
|
1779
2004
|
const payload = line.slice(5).trim();
|
|
1780
2005
|
if (payload === "[DONE]") break;
|
|
1781
2006
|
const ev = JSON.parse(payload);
|
|
1782
|
-
if (ev.type === "
|
|
2007
|
+
if (ev.type === "content_block_start" && ev.content_block && typeof ev.index === "number") {
|
|
2008
|
+
providerBlocks.set(ev.index, { ...ev.content_block });
|
|
2009
|
+
}
|
|
2010
|
+
if (ev.type === "content_block_delta" && ev.delta?.type === "text_delta") {
|
|
1783
2011
|
onPartial(ev.delta.text);
|
|
1784
2012
|
textBlocks.push({ type: "text", text: ev.delta.text });
|
|
2013
|
+
const block = providerBlocks.get(ev.index);
|
|
2014
|
+
if (block?.type === "text") {
|
|
2015
|
+
block.text = `${block.text ?? ""}${ev.delta.text}`;
|
|
2016
|
+
}
|
|
2017
|
+
}
|
|
2018
|
+
if (ev.type === "content_block_delta" && ev.delta?.type === "thinking_delta") {
|
|
2019
|
+
const block = providerBlocks.get(ev.index);
|
|
2020
|
+
if (block?.type === "thinking") {
|
|
2021
|
+
block.thinking = `${block.thinking ?? ""}${ev.delta.thinking ?? ""}`;
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
if (ev.type === "content_block_delta" && ev.delta?.type === "signature_delta") {
|
|
2025
|
+
const block = providerBlocks.get(ev.index);
|
|
2026
|
+
if (block?.type === "thinking") {
|
|
2027
|
+
block.signature = `${block.signature ?? ""}${ev.delta.signature ?? ""}`;
|
|
2028
|
+
}
|
|
1785
2029
|
}
|
|
1786
2030
|
if (ev.type === "content_block_start" && ev.content_block?.type === "tool_use") {
|
|
1787
2031
|
toolCalls.set(ev.index, {
|
|
@@ -1817,20 +2061,25 @@ If it's in another language, summarize in that language.
|
|
|
1817
2061
|
}
|
|
1818
2062
|
if (ev.type === "content_block_stop" && toolCalls.has(ev.index)) {
|
|
1819
2063
|
const { id, name, args, server_name } = toolCalls.get(ev.index);
|
|
2064
|
+
const input = JSON.parse(args || "{}");
|
|
2065
|
+
const providerBlock = providerBlocks.get(ev.index);
|
|
2066
|
+
if (providerBlock) {
|
|
2067
|
+
providerBlock.input = input;
|
|
2068
|
+
}
|
|
1820
2069
|
if (server_name) {
|
|
1821
2070
|
textBlocks.push({
|
|
1822
2071
|
type: "mcp_tool_use",
|
|
1823
2072
|
id,
|
|
1824
2073
|
name,
|
|
1825
2074
|
server_name,
|
|
1826
|
-
input
|
|
2075
|
+
input
|
|
1827
2076
|
});
|
|
1828
2077
|
} else {
|
|
1829
2078
|
textBlocks.push({
|
|
1830
2079
|
type: "tool_use",
|
|
1831
2080
|
id,
|
|
1832
2081
|
name,
|
|
1833
|
-
input
|
|
2082
|
+
input
|
|
1834
2083
|
});
|
|
1835
2084
|
}
|
|
1836
2085
|
toolCalls.delete(ev.index);
|
|
@@ -1839,6 +2088,7 @@ If it's in another language, summarize in that language.
|
|
|
1839
2088
|
}
|
|
1840
2089
|
return {
|
|
1841
2090
|
blocks: textBlocks,
|
|
2091
|
+
providerContent: [...providerBlocks.entries()].sort(([a], [b]) => a - b).map(([, block]) => block),
|
|
1842
2092
|
stop_reason: textBlocks.some(
|
|
1843
2093
|
(b) => b.type === "tool_use" || b.type === "mcp_tool_use"
|
|
1844
2094
|
) ? "tool_use" : "end"
|
|
@@ -1885,6 +2135,7 @@ If it's in another language, summarize in that language.
|
|
|
1885
2135
|
});
|
|
1886
2136
|
return {
|
|
1887
2137
|
blocks,
|
|
2138
|
+
providerContent: (data.content ?? []).map((block) => ({ ...block })),
|
|
1888
2139
|
stop_reason: blocks.some(
|
|
1889
2140
|
(b) => b.type === "tool_use" || b.type === "mcp_tool_use"
|
|
1890
2141
|
) ? "tool_use" : "end"
|
|
@@ -1936,7 +2187,12 @@ If it's in another language, summarize in that language.
|
|
|
1936
2187
|
);
|
|
1937
2188
|
return {
|
|
1938
2189
|
blocks: standardBlocks,
|
|
1939
|
-
stop_reason: completion.stop_reason
|
|
2190
|
+
stop_reason: completion.stop_reason,
|
|
2191
|
+
assistant_message: {
|
|
2192
|
+
role: "assistant",
|
|
2193
|
+
content: standardBlocks.filter((block) => block.type === "text").map((block) => block.text).join(""),
|
|
2194
|
+
provider_content: completion.providerContent
|
|
2195
|
+
}
|
|
1940
2196
|
};
|
|
1941
2197
|
}
|
|
1942
2198
|
};
|
|
@@ -1949,21 +2205,30 @@ If it's in another language, summarize in that language.
|
|
|
1949
2205
|
* @returns ClaudeChatService instance
|
|
1950
2206
|
*/
|
|
1951
2207
|
createChatService(options) {
|
|
2208
|
+
const model = options.model || this.getDefaultModel();
|
|
2209
|
+
const supportedReasoningEfforts = getClaudeSupportedReasoningEfforts(model);
|
|
2210
|
+
if (options.reasoning_effort !== void 0 && !supportedReasoningEfforts.includes(options.reasoning_effort)) {
|
|
2211
|
+
const supportedMessage = supportedReasoningEfforts.length > 0 ? `Supported values: ${supportedReasoningEfforts.join(", ")}.` : "This model does not expose configurable effort.";
|
|
2212
|
+
throw new Error(
|
|
2213
|
+
`Model ${model} does not support Claude reasoning_effort: ${options.reasoning_effort}. ${supportedMessage}`
|
|
2214
|
+
);
|
|
2215
|
+
}
|
|
1952
2216
|
const visionModel = resolveVisionModel({
|
|
1953
|
-
model
|
|
2217
|
+
model,
|
|
1954
2218
|
visionModel: options.visionModel,
|
|
1955
2219
|
defaultModel: this.getDefaultModel(),
|
|
1956
2220
|
defaultVisionModel: this.getDefaultModel(),
|
|
1957
|
-
supportsVisionForModel: (
|
|
2221
|
+
supportsVisionForModel: (model2) => this.supportsVisionForModel(model2),
|
|
1958
2222
|
validate: "resolved"
|
|
1959
2223
|
});
|
|
1960
2224
|
return new ClaudeChatService(
|
|
1961
2225
|
options.apiKey,
|
|
1962
|
-
|
|
2226
|
+
model,
|
|
1963
2227
|
visionModel,
|
|
1964
2228
|
options.tools ?? [],
|
|
1965
2229
|
options.mcpServers ?? [],
|
|
1966
|
-
options.responseLength
|
|
2230
|
+
options.responseLength,
|
|
2231
|
+
options.reasoning_effort
|
|
1967
2232
|
);
|
|
1968
2233
|
}
|
|
1969
2234
|
/**
|
|
@@ -1989,6 +2254,7 @@ If it's in another language, summarize in that language.
|
|
|
1989
2254
|
MODEL_CLAUDE_4_7_OPUS,
|
|
1990
2255
|
MODEL_CLAUDE_4_8_OPUS,
|
|
1991
2256
|
MODEL_CLAUDE_5_SONNET,
|
|
2257
|
+
MODEL_CLAUDE_5_OPUS,
|
|
1992
2258
|
MODEL_CLAUDE_3_HAIKU
|
|
1993
2259
|
];
|
|
1994
2260
|
}
|
|
@@ -2353,6 +2619,14 @@ If it's in another language, summarize in that language.
|
|
|
2353
2619
|
if (provider === "plamo" && reasoning_effort) {
|
|
2354
2620
|
body.reasoning_effort = reasoning_effort;
|
|
2355
2621
|
}
|
|
2622
|
+
if (provider === "deepseek" && reasoning_effort) {
|
|
2623
|
+
body.thinking = {
|
|
2624
|
+
type: reasoning_effort === "none" ? "disabled" : "enabled"
|
|
2625
|
+
};
|
|
2626
|
+
if (reasoning_effort !== "none") {
|
|
2627
|
+
body.reasoning_effort = reasoning_effort;
|
|
2628
|
+
}
|
|
2629
|
+
}
|
|
2356
2630
|
const toolDefinitions = buildOpenAIToolsDefinition({
|
|
2357
2631
|
tools,
|
|
2358
2632
|
mcpServers,
|
|
@@ -2640,7 +2914,11 @@ If it's in another language, summarize in that language.
|
|
|
2640
2914
|
|
|
2641
2915
|
// src/services/providers/deepseek/DeepSeekChatService.ts
|
|
2642
2916
|
var DeepSeekChatService = class extends OpenAIChatService {
|
|
2643
|
-
constructor(apiKey, model = MODEL_DEEPSEEK_V4_FLASH, visionModel = model, tools, endpoint = ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API, responseLength) {
|
|
2917
|
+
constructor(apiKey, model = MODEL_DEEPSEEK_V4_FLASH, visionModel = model, tools, endpoint = ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API, responseLength, reasoningEffort) {
|
|
2918
|
+
const normalizedReasoningEffort = normalizeDeepSeekReasoningEffort(
|
|
2919
|
+
model,
|
|
2920
|
+
reasoningEffort
|
|
2921
|
+
);
|
|
2644
2922
|
super(
|
|
2645
2923
|
apiKey,
|
|
2646
2924
|
model,
|
|
@@ -2650,11 +2928,16 @@ If it's in another language, summarize in that language.
|
|
|
2650
2928
|
[],
|
|
2651
2929
|
responseLength,
|
|
2652
2930
|
void 0,
|
|
2653
|
-
|
|
2931
|
+
normalizedReasoningEffort,
|
|
2654
2932
|
false,
|
|
2655
2933
|
"deepseek",
|
|
2656
2934
|
false
|
|
2657
2935
|
);
|
|
2936
|
+
if (tools?.length && normalizedReasoningEffort !== void 0 && normalizedReasoningEffort !== "none") {
|
|
2937
|
+
throw new Error(
|
|
2938
|
+
"DeepSeek thinking with tools is not supported yet. Use reasoning_effort: 'none' for tool calling."
|
|
2939
|
+
);
|
|
2940
|
+
}
|
|
2658
2941
|
}
|
|
2659
2942
|
};
|
|
2660
2943
|
|
|
@@ -2670,7 +2953,8 @@ If it's in another language, summarize in that language.
|
|
|
2670
2953
|
options.visionModel ?? model,
|
|
2671
2954
|
tools,
|
|
2672
2955
|
this.resolveEndpoint(options),
|
|
2673
|
-
options.responseLength
|
|
2956
|
+
options.responseLength,
|
|
2957
|
+
options.reasoning_effort
|
|
2674
2958
|
);
|
|
2675
2959
|
}
|
|
2676
2960
|
getProviderName() {
|
|
@@ -3567,8 +3851,14 @@ If it's in another language, summarize in that language.
|
|
|
3567
3851
|
var GeminiNanoChatService = class {
|
|
3568
3852
|
constructor(options = {}) {
|
|
3569
3853
|
this.provider = "gemini-nano";
|
|
3570
|
-
this.expectedInputLanguages = options.expectedInputLanguages ?? [
|
|
3854
|
+
this.expectedInputLanguages = options.expectedInputLanguages ?? [
|
|
3855
|
+
"ja",
|
|
3856
|
+
"en"
|
|
3857
|
+
];
|
|
3571
3858
|
this.expectedOutputLanguages = options.expectedOutputLanguages ?? ["ja"];
|
|
3859
|
+
this.initialPrompts = (options.initialPrompts ?? []).map((prompt) => ({
|
|
3860
|
+
...prompt
|
|
3861
|
+
}));
|
|
3572
3862
|
this._responseLength = options.responseLength;
|
|
3573
3863
|
}
|
|
3574
3864
|
getModel() {
|
|
@@ -3610,10 +3900,11 @@ If it's in another language, summarize in that language.
|
|
|
3610
3900
|
const api = getLanguageModelAPI();
|
|
3611
3901
|
if (!api) {
|
|
3612
3902
|
throw new Error(
|
|
3613
|
-
"Gemini Nano is not available in this environment. Chrome
|
|
3903
|
+
"Gemini Nano is not available in this environment. Chrome 148+ on a supported desktop device is required for web pages."
|
|
3614
3904
|
);
|
|
3615
3905
|
}
|
|
3616
|
-
const
|
|
3906
|
+
const modelOptions = this.getModelOptions();
|
|
3907
|
+
const availability = await api.availability(modelOptions);
|
|
3617
3908
|
if (availability !== "available" && availability !== "downloadable") {
|
|
3618
3909
|
throw new Error(
|
|
3619
3910
|
`Gemini Nano Prompt API is not ready in this environment. LanguageModel.availability() returned "${availability}". Expected "available" or "downloadable".`
|
|
@@ -3621,15 +3912,17 @@ If it's in another language, summarize in that language.
|
|
|
3621
3912
|
}
|
|
3622
3913
|
const systemMessages = messages.filter((m) => m.role === "system");
|
|
3623
3914
|
const systemPrompt = systemMessages.map((m) => m.content).join("\n");
|
|
3624
|
-
const conversationMessages = messages.filter((m) => m.role
|
|
3625
|
-
const
|
|
3626
|
-
if (
|
|
3915
|
+
const conversationMessages = messages.filter((m) => m.role === "user" || m.role === "assistant").slice(-GEMINI_NANO_MAX_CONTEXT_MESSAGES);
|
|
3916
|
+
const lastUserMessageIndex = this.findLastUserMessageIndex(conversationMessages);
|
|
3917
|
+
if (lastUserMessageIndex === -1) {
|
|
3627
3918
|
throw new Error("No user message found in the provided messages.");
|
|
3628
3919
|
}
|
|
3920
|
+
const lastUserMessage = conversationMessages[lastUserMessageIndex];
|
|
3629
3921
|
const session = await this.createSession(
|
|
3630
3922
|
api,
|
|
3631
3923
|
systemPrompt,
|
|
3632
|
-
conversationMessages
|
|
3924
|
+
conversationMessages.slice(0, lastUserMessageIndex),
|
|
3925
|
+
modelOptions
|
|
3633
3926
|
);
|
|
3634
3927
|
try {
|
|
3635
3928
|
return await session.prompt(lastUserMessage.content);
|
|
@@ -3641,25 +3934,55 @@ If it's in another language, summarize in that language.
|
|
|
3641
3934
|
}
|
|
3642
3935
|
}
|
|
3643
3936
|
/**
|
|
3644
|
-
* Create a new LanguageModel session with
|
|
3645
|
-
*
|
|
3937
|
+
* Create a new LanguageModel session with structured initial prompts.
|
|
3938
|
+
* System instructions, few-shot examples, and conversation history retain
|
|
3939
|
+
* their roles instead of being flattened into a single string.
|
|
3646
3940
|
*/
|
|
3647
|
-
async createSession(api, systemPrompt, contextHistory) {
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3941
|
+
async createSession(api, systemPrompt, contextHistory, modelOptions) {
|
|
3942
|
+
const initialPrompts = this.buildInitialPrompts(
|
|
3943
|
+
systemPrompt,
|
|
3944
|
+
contextHistory
|
|
3945
|
+
);
|
|
3946
|
+
const createOptions = {
|
|
3947
|
+
...modelOptions,
|
|
3948
|
+
...initialPrompts.length > 0 ? { initialPrompts } : {}
|
|
3949
|
+
};
|
|
3950
|
+
return api.create(createOptions);
|
|
3951
|
+
}
|
|
3952
|
+
getModelOptions() {
|
|
3953
|
+
return {
|
|
3656
3954
|
expectedInputs: [
|
|
3657
3955
|
{ type: "text", languages: this.expectedInputLanguages }
|
|
3658
3956
|
],
|
|
3659
3957
|
expectedOutputs: [
|
|
3660
3958
|
{ type: "text", languages: this.expectedOutputLanguages }
|
|
3661
3959
|
]
|
|
3662
|
-
}
|
|
3960
|
+
};
|
|
3961
|
+
}
|
|
3962
|
+
buildInitialPrompts(systemPrompt, contextHistory) {
|
|
3963
|
+
const configuredSystemPrompts = this.initialPrompts.filter((prompt) => prompt.role === "system").map((prompt) => prompt.content);
|
|
3964
|
+
const combinedSystemPrompt = this.buildSystemPrompt(
|
|
3965
|
+
[systemPrompt, ...configuredSystemPrompts].filter(Boolean).join("\n\n")
|
|
3966
|
+
);
|
|
3967
|
+
const prompts = [];
|
|
3968
|
+
if (combinedSystemPrompt) {
|
|
3969
|
+
prompts.push({ role: "system", content: combinedSystemPrompt });
|
|
3970
|
+
}
|
|
3971
|
+
prompts.push(
|
|
3972
|
+
...this.initialPrompts.filter((prompt) => prompt.role !== "system").map((prompt) => ({ ...prompt })),
|
|
3973
|
+
...contextHistory.filter(
|
|
3974
|
+
(message) => message.role === "user" || message.role === "assistant"
|
|
3975
|
+
).map(({ role, content }) => ({ role, content }))
|
|
3976
|
+
);
|
|
3977
|
+
return prompts;
|
|
3978
|
+
}
|
|
3979
|
+
findLastUserMessageIndex(messages) {
|
|
3980
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
3981
|
+
if (messages[index].role === "user") {
|
|
3982
|
+
return index;
|
|
3983
|
+
}
|
|
3984
|
+
}
|
|
3985
|
+
return -1;
|
|
3663
3986
|
}
|
|
3664
3987
|
buildSystemPrompt(systemPrompt) {
|
|
3665
3988
|
const promptParts = [];
|
|
@@ -3680,7 +4003,20 @@ If it's in another language, summarize in that language.
|
|
|
3680
4003
|
if (!maxTokens) {
|
|
3681
4004
|
return void 0;
|
|
3682
4005
|
}
|
|
3683
|
-
|
|
4006
|
+
switch (this._responseLength) {
|
|
4007
|
+
case CHAT_RESPONSE_LENGTH.VERY_SHORT:
|
|
4008
|
+
return `Reply in no more than one concise sentence. Do not use a preamble, summary, bullet points, or Markdown. Keep the reaction and answer short enough to read in one breath. Stay within approximately ${maxTokens} tokens.`;
|
|
4009
|
+
case CHAT_RESPONSE_LENGTH.SHORT:
|
|
4010
|
+
return `Reply in no more than two concise sentences. Do not use a preamble, summary, bullet points, or Markdown. Keep the reaction and answer short enough to read in one breath. Use natural conversational language. Stay within approximately ${maxTokens} tokens.`;
|
|
4011
|
+
case CHAT_RESPONSE_LENGTH.MEDIUM:
|
|
4012
|
+
return `Reply in no more than three concise sentences. Answer directly and include only the context needed to understand the answer. Do not use a preamble, summary, bullet points, or Markdown. Use natural conversational language. Stay within approximately ${maxTokens} tokens.`;
|
|
4013
|
+
case CHAT_RESPONSE_LENGTH.LONG:
|
|
4014
|
+
return `Reply in no more than five sentences. Explain the important details clearly, but avoid unnecessary preambles, repetition, bullet points, or Markdown. Use natural conversational language. Stay within approximately ${maxTokens} tokens.`;
|
|
4015
|
+
case CHAT_RESPONSE_LENGTH.VERY_LONG:
|
|
4016
|
+
return `Reply in no more than ten sentences. Give a thorough but focused answer. Use short plain-text paragraphs when helpful, and avoid unnecessary repetition, bullet points, or Markdown. Stay within approximately ${maxTokens} tokens.`;
|
|
4017
|
+
case CHAT_RESPONSE_LENGTH.DEEP:
|
|
4018
|
+
return `Give a detailed response and organize it in the way that best fits the request. No sentence-count limit applies at this level. Stay within approximately ${maxTokens} tokens.`;
|
|
4019
|
+
}
|
|
3684
4020
|
}
|
|
3685
4021
|
};
|
|
3686
4022
|
|
|
@@ -3690,6 +4026,7 @@ If it's in another language, summarize in that language.
|
|
|
3690
4026
|
return new GeminiNanoChatService({
|
|
3691
4027
|
expectedInputLanguages: options.expectedInputLanguages,
|
|
3692
4028
|
expectedOutputLanguages: options.expectedOutputLanguages,
|
|
4029
|
+
initialPrompts: options.initialPrompts,
|
|
3693
4030
|
responseLength: options.responseLength
|
|
3694
4031
|
});
|
|
3695
4032
|
}
|
|
@@ -3734,7 +4071,7 @@ If it's in another language, summarize in that language.
|
|
|
3734
4071
|
`Model ${model} does not support reasoning_effort: ${reasoningEffort}.`
|
|
3735
4072
|
);
|
|
3736
4073
|
}
|
|
3737
|
-
this.reasoningEffort = reasoningEffort ?? (
|
|
4074
|
+
this.reasoningEffort = reasoningEffort ?? getDefaultKimiReasoningEffort(model);
|
|
3738
4075
|
this.visionModel = visionModel;
|
|
3739
4076
|
}
|
|
3740
4077
|
/**
|
|
@@ -3835,7 +4172,7 @@ If it's in another language, summarize in that language.
|
|
|
3835
4172
|
body.response_format = this.responseFormat;
|
|
3836
4173
|
}
|
|
3837
4174
|
if (isKimiReasoningEffortModel(model)) {
|
|
3838
|
-
body.reasoning_effort = this.reasoningEffort ??
|
|
4175
|
+
body.reasoning_effort = this.reasoningEffort ?? getDefaultKimiReasoningEffort(model);
|
|
3839
4176
|
}
|
|
3840
4177
|
const effectiveThinking = this.resolveEffectiveThinking(model);
|
|
3841
4178
|
if (effectiveThinking) {
|
|
@@ -4037,7 +4374,7 @@ If it's in another language, summarize in that language.
|
|
|
4037
4374
|
}
|
|
4038
4375
|
return void 0;
|
|
4039
4376
|
}
|
|
4040
|
-
const resolved = reasoningEffort ?? supported[0];
|
|
4377
|
+
const resolved = reasoningEffort ?? getDefaultKimiReasoningEffort(model) ?? supported[0];
|
|
4041
4378
|
if (!supported.includes(resolved)) {
|
|
4042
4379
|
throw new Error(
|
|
4043
4380
|
`Model ${model} supports reasoning_effort values: ${supported.join(", ")}.`
|
|
@@ -4391,8 +4728,18 @@ If it's in another language, summarize in that language.
|
|
|
4391
4728
|
};
|
|
4392
4729
|
|
|
4393
4730
|
// src/services/providers/openrouter/OpenRouterChatService.ts
|
|
4731
|
+
var isOpenRouterAutoModel = (model) => [MODEL_OPENROUTER_AUTO, MODEL_OPENROUTER_AUTO_BETA].includes(model.trim());
|
|
4394
4732
|
var isTokenLimitUnsupportedModel = (model) => [MODEL_GPT_OSS_20B_FREE, MODEL_ZAI_GLM_5_2].includes(model.trim());
|
|
4395
|
-
var
|
|
4733
|
+
var ensureAutoRouterOutput = (model, hasVisibleOutput) => {
|
|
4734
|
+
if (isOpenRouterAutoModel(model) && !hasVisibleOutput) {
|
|
4735
|
+
throw new Error(
|
|
4736
|
+
"OpenRouter Auto Router returned no visible content. Please retry."
|
|
4737
|
+
);
|
|
4738
|
+
}
|
|
4739
|
+
};
|
|
4740
|
+
var hasUsableCompletionOutput = (completion) => completion.blocks.some(
|
|
4741
|
+
(block) => block.type !== "text" || block.text.trim().length > 0
|
|
4742
|
+
);
|
|
4396
4743
|
var OpenRouterChatService = class {
|
|
4397
4744
|
/**
|
|
4398
4745
|
* Constructor
|
|
@@ -4476,7 +4823,7 @@ If it's in another language, summarize in that language.
|
|
|
4476
4823
|
hasTools: this.tools.length > 0,
|
|
4477
4824
|
runWithoutTools: async () => {
|
|
4478
4825
|
const res = await this.callOpenRouter(messages, this.model, true);
|
|
4479
|
-
return this.handleStream(res, onPartialResponse);
|
|
4826
|
+
return this.handleStream(res, onPartialResponse, this.model);
|
|
4480
4827
|
},
|
|
4481
4828
|
runWithTools: () => this.chatOnce(messages, true, onPartialResponse),
|
|
4482
4829
|
onCompleteResponse,
|
|
@@ -4505,7 +4852,7 @@ If it's in another language, summarize in that language.
|
|
|
4505
4852
|
this.visionModel,
|
|
4506
4853
|
true
|
|
4507
4854
|
);
|
|
4508
|
-
return this.handleStream(res, onPartialResponse);
|
|
4855
|
+
return this.handleStream(res, onPartialResponse, this.visionModel);
|
|
4509
4856
|
},
|
|
4510
4857
|
runWithTools: () => this.visionChatOnce(messages, true, onPartialResponse),
|
|
4511
4858
|
onCompleteResponse,
|
|
@@ -4533,7 +4880,7 @@ If it's in another language, summarize in that language.
|
|
|
4533
4880
|
stream,
|
|
4534
4881
|
maxTokens
|
|
4535
4882
|
);
|
|
4536
|
-
return stream ? this.parseStream(res, onPartialResponse) : this.parseOneShot(await res.json());
|
|
4883
|
+
return stream ? this.parseStream(res, onPartialResponse, this.model) : this.parseOneShot(await res.json(), this.model);
|
|
4537
4884
|
}
|
|
4538
4885
|
/**
|
|
4539
4886
|
* Process vision chat messages with tools
|
|
@@ -4557,7 +4904,7 @@ If it's in another language, summarize in that language.
|
|
|
4557
4904
|
stream,
|
|
4558
4905
|
maxTokens
|
|
4559
4906
|
);
|
|
4560
|
-
return stream ? this.parseStream(res, onPartialResponse) : this.parseOneShot(await res.json());
|
|
4907
|
+
return stream ? this.parseStream(res, onPartialResponse, this.visionModel) : this.parseOneShot(await res.json(), this.visionModel);
|
|
4561
4908
|
}
|
|
4562
4909
|
/**
|
|
4563
4910
|
* Call OpenRouter API
|
|
@@ -4586,23 +4933,28 @@ If it's in another language, summarize in that language.
|
|
|
4586
4933
|
stream
|
|
4587
4934
|
};
|
|
4588
4935
|
const tokenLimit = maxTokens !== void 0 ? maxTokens : getMaxTokensForResponseLength(this.responseLength);
|
|
4589
|
-
|
|
4936
|
+
const shouldOmitTokenLimit = isTokenLimitUnsupportedModel(model) || isOpenRouterAutoModel(model) && maxTokens === void 0;
|
|
4937
|
+
if (tokenLimit && shouldOmitTokenLimit) {
|
|
4590
4938
|
console.warn(
|
|
4591
4939
|
`OpenRouter: Token limits are disabled for ${model} because this model can return empty content when a token limit is set.`
|
|
4592
4940
|
);
|
|
4593
4941
|
} else if (tokenLimit) {
|
|
4594
4942
|
body.max_tokens = tokenLimit;
|
|
4595
4943
|
}
|
|
4596
|
-
const defaultReasoningEffort =
|
|
4597
|
-
|
|
4944
|
+
const defaultReasoningEffort = getDefaultOpenRouterReasoningEffort(model);
|
|
4945
|
+
const reasoningEffort = normalizeOpenRouterReasoningEffort(
|
|
4946
|
+
model,
|
|
4947
|
+
this.reasoning_effort
|
|
4948
|
+
);
|
|
4949
|
+
if (reasoningEffort !== void 0 || this.includeReasoning !== void 0 || this.reasoningMaxTokens || defaultReasoningEffort) {
|
|
4598
4950
|
body.reasoning = {};
|
|
4599
|
-
if (
|
|
4600
|
-
const effort =
|
|
4951
|
+
if (reasoningEffort) {
|
|
4952
|
+
const effort = reasoningEffort === "minimal" ? "low" : reasoningEffort;
|
|
4601
4953
|
body.reasoning.effort = effort;
|
|
4602
|
-
} else if (
|
|
4954
|
+
} else if (defaultReasoningEffort) {
|
|
4603
4955
|
body.reasoning.effort = defaultReasoningEffort;
|
|
4604
4956
|
}
|
|
4605
|
-
if (
|
|
4957
|
+
if (reasoningEffort === "none" || this.includeReasoning !== true) {
|
|
4606
4958
|
body.reasoning.exclude = true;
|
|
4607
4959
|
}
|
|
4608
4960
|
if (this.reasoningMaxTokens) {
|
|
@@ -4621,24 +4973,34 @@ If it's in another language, summarize in that language.
|
|
|
4621
4973
|
* Handle streaming response from OpenRouter
|
|
4622
4974
|
* OpenRouter uses SSE format with potential comment lines
|
|
4623
4975
|
*/
|
|
4624
|
-
async handleStream(res, onPartial) {
|
|
4625
|
-
|
|
4626
|
-
onJsonError: (payload) => console.debug("Failed to parse SSE data:", payload)
|
|
4976
|
+
async handleStream(res, onPartial, model) {
|
|
4977
|
+
const text = await parseOpenAICompatibleTextStream(res, onPartial, {
|
|
4978
|
+
onJsonError: (payload) => console.debug("Failed to parse SSE data:", payload),
|
|
4979
|
+
throwOnApiError: isOpenRouterAutoModel(model)
|
|
4627
4980
|
});
|
|
4981
|
+
ensureAutoRouterOutput(model, text.trim().length > 0);
|
|
4982
|
+
return text;
|
|
4628
4983
|
}
|
|
4629
4984
|
/**
|
|
4630
4985
|
* Parse streaming response with tool support
|
|
4631
4986
|
*/
|
|
4632
|
-
async parseStream(res, onPartial) {
|
|
4633
|
-
|
|
4634
|
-
onJsonError: (payload) => console.debug("Failed to parse SSE data:", payload)
|
|
4987
|
+
async parseStream(res, onPartial, model) {
|
|
4988
|
+
const completion = await parseOpenAICompatibleToolStream(res, onPartial, {
|
|
4989
|
+
onJsonError: (payload) => console.debug("Failed to parse SSE data:", payload),
|
|
4990
|
+
throwOnApiError: isOpenRouterAutoModel(model)
|
|
4635
4991
|
});
|
|
4992
|
+
ensureAutoRouterOutput(model, hasUsableCompletionOutput(completion));
|
|
4993
|
+
return completion;
|
|
4636
4994
|
}
|
|
4637
4995
|
/**
|
|
4638
4996
|
* Parse non-streaming response
|
|
4639
4997
|
*/
|
|
4640
|
-
parseOneShot(data) {
|
|
4641
|
-
|
|
4998
|
+
parseOneShot(data, model) {
|
|
4999
|
+
const completion = parseOpenAICompatibleOneShot(data, {
|
|
5000
|
+
throwOnApiError: isOpenRouterAutoModel(model)
|
|
5001
|
+
});
|
|
5002
|
+
ensureAutoRouterOutput(model, hasUsableCompletionOutput(completion));
|
|
5003
|
+
return completion;
|
|
4642
5004
|
}
|
|
4643
5005
|
};
|
|
4644
5006
|
|
|
@@ -4691,6 +5053,7 @@ If it's in another language, summarize in that language.
|
|
|
4691
5053
|
return [
|
|
4692
5054
|
// OpenRouter routing
|
|
4693
5055
|
MODEL_OPENROUTER_AUTO,
|
|
5056
|
+
MODEL_OPENROUTER_AUTO_BETA,
|
|
4694
5057
|
MODEL_OPENROUTER_FUSION,
|
|
4695
5058
|
// Free models
|
|
4696
5059
|
MODEL_GPT_OSS_20B_FREE,
|
|
@@ -4698,6 +5061,9 @@ If it's in another language, summarize in that language.
|
|
|
4698
5061
|
// OpenAI models
|
|
4699
5062
|
MODEL_OPENAI_GPT_LATEST,
|
|
4700
5063
|
MODEL_OPENAI_GPT_MINI_LATEST,
|
|
5064
|
+
MODEL_OPENAI_GPT_5_6_SOL,
|
|
5065
|
+
MODEL_OPENAI_GPT_5_6_TERRA,
|
|
5066
|
+
MODEL_OPENAI_GPT_5_6_LUNA,
|
|
4701
5067
|
MODEL_OPENAI_GPT_5_5_PRO,
|
|
4702
5068
|
MODEL_OPENAI_GPT_5_5,
|
|
4703
5069
|
MODEL_OPENAI_GPT_5_1_CHAT,
|
|
@@ -4710,6 +5076,7 @@ If it's in another language, summarize in that language.
|
|
|
4710
5076
|
// Anthropic models
|
|
4711
5077
|
MODEL_ANTHROPIC_CLAUDE_SONNET_LATEST,
|
|
4712
5078
|
MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST,
|
|
5079
|
+
MODEL_ANTHROPIC_CLAUDE_OPUS_5,
|
|
4713
5080
|
MODEL_ANTHROPIC_CLAUDE_OPUS_4,
|
|
4714
5081
|
MODEL_ANTHROPIC_CLAUDE_SONNET_4,
|
|
4715
5082
|
MODEL_ANTHROPIC_CLAUDE_3_7_SONNET,
|
|
@@ -4718,6 +5085,8 @@ If it's in another language, summarize in that language.
|
|
|
4718
5085
|
// Gemini models
|
|
4719
5086
|
MODEL_GOOGLE_GEMINI_PRO_LATEST,
|
|
4720
5087
|
MODEL_GOOGLE_GEMINI_FLASH_LATEST,
|
|
5088
|
+
MODEL_GOOGLE_GEMINI_3_6_FLASH,
|
|
5089
|
+
MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE,
|
|
4721
5090
|
MODEL_GOOGLE_GEMINI_2_5_PRO,
|
|
4722
5091
|
MODEL_GOOGLE_GEMINI_2_5_FLASH,
|
|
4723
5092
|
MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025,
|
|
@@ -4725,10 +5094,19 @@ If it's in another language, summarize in that language.
|
|
|
4725
5094
|
MODEL_ZAI_GLM_5_2,
|
|
4726
5095
|
MODEL_ZAI_GLM_4_7_FLASH,
|
|
4727
5096
|
MODEL_ZAI_GLM_4_5_AIR,
|
|
5097
|
+
// xAI models
|
|
5098
|
+
MODEL_XAI_GROK_LATEST,
|
|
5099
|
+
MODEL_XAI_GROK_4_5,
|
|
5100
|
+
// DeepSeek models
|
|
5101
|
+
MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731,
|
|
5102
|
+
MODEL_OPENROUTER_DEEPSEEK_V4_FLASH,
|
|
4728
5103
|
// Other models
|
|
4729
5104
|
MODEL_MOONSHOTAI_KIMI_LATEST,
|
|
5105
|
+
MODEL_MOONSHOTAI_KIMI_K3,
|
|
4730
5106
|
MODEL_MOONSHOTAI_KIMI_K2_7_CODE,
|
|
4731
|
-
MODEL_MOONSHOTAI_KIMI_K2_5
|
|
5107
|
+
MODEL_MOONSHOTAI_KIMI_K2_5,
|
|
5108
|
+
MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5,
|
|
5109
|
+
MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5
|
|
4732
5110
|
];
|
|
4733
5111
|
}
|
|
4734
5112
|
/**
|
|
@@ -5451,11 +5829,14 @@ If it's in another language, summarize in that language.
|
|
|
5451
5829
|
]);
|
|
5452
5830
|
var REASONING_EFFORT_BY_PROVIDER = {
|
|
5453
5831
|
openai: ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
|
|
5832
|
+
claude: ["low", "medium", "high", "xhigh", "max"],
|
|
5454
5833
|
gemini: ["minimal", "low", "medium", "high"],
|
|
5455
|
-
openrouter: ["none", "minimal", "low", "medium", "high"],
|
|
5834
|
+
openrouter: ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
|
|
5835
|
+
kimi: ["low", "high", "max"],
|
|
5456
5836
|
mistral: ["low", "medium", "high"],
|
|
5457
5837
|
plamo: ["none", "medium"],
|
|
5458
|
-
xai: ["none", "low", "medium", "high"]
|
|
5838
|
+
xai: ["none", "low", "medium", "high"],
|
|
5839
|
+
deepseek: ["none", "low", "high", "max"]
|
|
5459
5840
|
};
|
|
5460
5841
|
var ChatServiceFactory = class {
|
|
5461
5842
|
/**
|
|
@@ -5515,7 +5896,7 @@ If it's in another language, summarize in that language.
|
|
|
5515
5896
|
mcp: MCP_SUPPORTED_PROVIDERS.has(providerName),
|
|
5516
5897
|
jsonMode: JSON_MODE_SUPPORTED_PROVIDERS.has(providerName),
|
|
5517
5898
|
responseLength: true,
|
|
5518
|
-
reasoningEffort: REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
|
|
5899
|
+
reasoningEffort: providerName === "claude" && model ? [...getClaudeSupportedReasoningEfforts(model)] : providerName === "kimi" && model ? [...getKimiSupportedReasoningEfforts(model)] : providerName === "deepseek" && model ? [...getDeepSeekSupportedReasoningEfforts(model)] : providerName === "openrouter" && model ? [...getOpenRouterSupportedReasoningEfforts(model)] : REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
|
|
5519
5900
|
};
|
|
5520
5901
|
}
|
|
5521
5902
|
/**
|