@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.
Files changed (149) hide show
  1. package/README.ja.md +125 -21
  2. package/README.md +132 -21
  3. package/dist/cjs/constants/claude.d.ts +15 -0
  4. package/dist/cjs/constants/claude.d.ts.map +1 -1
  5. package/dist/cjs/constants/claude.js +61 -1
  6. package/dist/cjs/constants/claude.js.map +1 -1
  7. package/dist/cjs/constants/deepseek.d.ts +6 -0
  8. package/dist/cjs/constants/deepseek.d.ts.map +1 -1
  9. package/dist/cjs/constants/deepseek.js +47 -0
  10. package/dist/cjs/constants/deepseek.js.map +1 -1
  11. package/dist/cjs/constants/kimi.d.ts +5 -1
  12. package/dist/cjs/constants/kimi.d.ts.map +1 -1
  13. package/dist/cjs/constants/kimi.js +8 -1
  14. package/dist/cjs/constants/kimi.js.map +1 -1
  15. package/dist/cjs/constants/openrouter.d.ts +18 -0
  16. package/dist/cjs/constants/openrouter.d.ts.map +1 -1
  17. package/dist/cjs/constants/openrouter.js +88 -1
  18. package/dist/cjs/constants/openrouter.js.map +1 -1
  19. package/dist/cjs/index.d.ts +1 -1
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  23. package/dist/cjs/services/ChatServiceFactory.js +17 -2
  24. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  25. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +22 -5
  26. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  27. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts +3 -1
  28. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  29. package/dist/cjs/services/providers/claude/ClaudeChatService.js +51 -4
  30. package/dist/cjs/services/providers/claude/ClaudeChatService.js.map +1 -1
  31. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  32. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +13 -2
  33. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  34. package/dist/cjs/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
  35. package/dist/cjs/services/providers/claude/claudeMessageConverter.js +7 -1
  36. package/dist/cjs/services/providers/claude/claudeMessageConverter.js.map +1 -1
  37. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
  38. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
  39. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js +9 -2
  40. package/dist/cjs/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
  41. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
  42. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
  43. package/dist/cjs/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
  44. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts +8 -3
  45. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  46. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +85 -32
  47. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  48. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  49. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  50. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  51. package/dist/cjs/services/providers/kimi/KimiChatService.d.ts.map +1 -1
  52. package/dist/cjs/services/providers/kimi/KimiChatService.js +3 -5
  53. package/dist/cjs/services/providers/kimi/KimiChatService.js.map +1 -1
  54. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  55. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js +1 -1
  56. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  57. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  58. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +8 -0
  59. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  60. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
  61. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  62. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +41 -23
  63. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  64. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  65. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +16 -0
  66. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  67. package/dist/cjs/types/chat.d.ts +2 -0
  68. package/dist/cjs/types/chat.d.ts.map +1 -1
  69. package/dist/cjs/types/toolChat.d.ts +2 -3
  70. package/dist/cjs/types/toolChat.d.ts.map +1 -1
  71. package/dist/cjs/utils/openaiCompatibleSse.d.ts +1 -0
  72. package/dist/cjs/utils/openaiCompatibleSse.d.ts.map +1 -1
  73. package/dist/cjs/utils/openaiCompatibleSse.js +22 -0
  74. package/dist/cjs/utils/openaiCompatibleSse.js.map +1 -1
  75. package/dist/esm/constants/claude.d.ts +15 -0
  76. package/dist/esm/constants/claude.d.ts.map +1 -1
  77. package/dist/esm/constants/claude.js +56 -0
  78. package/dist/esm/constants/claude.js.map +1 -1
  79. package/dist/esm/constants/deepseek.d.ts +6 -0
  80. package/dist/esm/constants/deepseek.d.ts.map +1 -1
  81. package/dist/esm/constants/deepseek.js +43 -0
  82. package/dist/esm/constants/deepseek.js.map +1 -1
  83. package/dist/esm/constants/kimi.d.ts +5 -1
  84. package/dist/esm/constants/kimi.d.ts.map +1 -1
  85. package/dist/esm/constants/kimi.js +7 -1
  86. package/dist/esm/constants/kimi.js.map +1 -1
  87. package/dist/esm/constants/openrouter.d.ts +18 -0
  88. package/dist/esm/constants/openrouter.d.ts.map +1 -1
  89. package/dist/esm/constants/openrouter.js +83 -0
  90. package/dist/esm/constants/openrouter.js.map +1 -1
  91. package/dist/esm/index.d.ts +1 -1
  92. package/dist/esm/index.d.ts.map +1 -1
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  95. package/dist/esm/services/ChatServiceFactory.js +17 -2
  96. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  97. package/dist/esm/services/providers/ChatServiceProvider.d.ts +22 -5
  98. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  99. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts +3 -1
  100. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  101. package/dist/esm/services/providers/claude/ClaudeChatService.js +52 -5
  102. package/dist/esm/services/providers/claude/ClaudeChatService.js.map +1 -1
  103. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  104. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +14 -3
  105. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  106. package/dist/esm/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
  107. package/dist/esm/services/providers/claude/claudeMessageConverter.js +7 -1
  108. package/dist/esm/services/providers/claude/claudeMessageConverter.js.map +1 -1
  109. package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts +2 -1
  110. package/dist/esm/services/providers/deepseek/DeepSeekChatService.d.ts.map +1 -1
  111. package/dist/esm/services/providers/deepseek/DeepSeekChatService.js +10 -3
  112. package/dist/esm/services/providers/deepseek/DeepSeekChatService.js.map +1 -1
  113. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.d.ts.map +1 -1
  114. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js +1 -1
  115. package/dist/esm/services/providers/deepseek/DeepSeekChatServiceProvider.js.map +1 -1
  116. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts +8 -3
  117. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  118. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +86 -33
  119. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  120. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  121. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  122. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  123. package/dist/esm/services/providers/kimi/KimiChatService.d.ts.map +1 -1
  124. package/dist/esm/services/providers/kimi/KimiChatService.js +4 -6
  125. package/dist/esm/services/providers/kimi/KimiChatService.js.map +1 -1
  126. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  127. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js +2 -2
  128. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  129. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  130. package/dist/esm/services/providers/openai/openaiRequestBuilder.js +8 -0
  131. package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  132. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts +2 -1
  133. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  134. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +42 -24
  135. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  136. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  137. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +17 -1
  138. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  139. package/dist/esm/types/chat.d.ts +2 -0
  140. package/dist/esm/types/chat.d.ts.map +1 -1
  141. package/dist/esm/types/toolChat.d.ts +2 -3
  142. package/dist/esm/types/toolChat.d.ts.map +1 -1
  143. package/dist/esm/utils/openaiCompatibleSse.d.ts +1 -0
  144. package/dist/esm/utils/openaiCompatibleSse.d.ts.map +1 -1
  145. package/dist/esm/utils/openaiCompatibleSse.js +22 -0
  146. package/dist/esm/utils/openaiCompatibleSse.js.map +1 -1
  147. package/dist/umd/aituber-onair-chat.js +444 -63
  148. package/dist/umd/aituber-onair-chat.min.js +9 -11
  149. 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 === "content_block_delta" && ev.delta?.text) {
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: JSON.parse(args || "{}")
2075
+ input
1827
2076
  });
1828
2077
  } else {
1829
2078
  textBlocks.push({
1830
2079
  type: "tool_use",
1831
2080
  id,
1832
2081
  name,
1833
- input: JSON.parse(args || "{}")
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: options.model,
2217
+ model,
1954
2218
  visionModel: options.visionModel,
1955
2219
  defaultModel: this.getDefaultModel(),
1956
2220
  defaultVisionModel: this.getDefaultModel(),
1957
- supportsVisionForModel: (model) => this.supportsVisionForModel(model),
2221
+ supportsVisionForModel: (model2) => this.supportsVisionForModel(model2),
1958
2222
  validate: "resolved"
1959
2223
  });
1960
2224
  return new ClaudeChatService(
1961
2225
  options.apiKey,
1962
- options.model || this.getDefaultModel(),
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
- void 0,
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 ?? ["ja"];
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 138+ with Prompt API enabled is required."
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 availability = await api.availability();
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 !== "system").slice(-GEMINI_NANO_MAX_CONTEXT_MESSAGES);
3625
- const lastUserMessage = [...conversationMessages].reverse().find((m) => m.role === "user");
3626
- if (!lastUserMessage) {
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 system prompt and context history.
3645
- * Context history (excluding the last user message) is embedded in the system prompt.
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
- let prompt = this.buildSystemPrompt(systemPrompt);
3649
- const historyMessages = contextHistory.slice(0, -1);
3650
- if (historyMessages.length > 0) {
3651
- const history = historyMessages.map((m) => `${m.role === "user" ? "User" : "Assistant"}: ${m.content}`).join("\n");
3652
- prompt += "\n\nThe following is the prior conversation history. Use it as context for your response:\n" + history;
3653
- }
3654
- return api.create({
3655
- systemPrompt: prompt,
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
- return `Please keep your response concise, within approximately ${maxTokens} tokens.`;
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 ?? (isKimiReasoningEffortModel(model) ? supportedReasoningEfforts[0] : void 0);
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 ?? "max";
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 getDefaultReasoningEffort = (model) => model.trim() === MODEL_ZAI_GLM_5_2 ? "none" : void 0;
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
- if (tokenLimit && isTokenLimitUnsupportedModel(model)) {
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 = getDefaultReasoningEffort(model);
4597
- if (this.reasoning_effort !== void 0 || this.includeReasoning !== void 0 || this.reasoningMaxTokens || defaultReasoningEffort) {
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 (this.reasoning_effort && this.reasoning_effort !== "none") {
4600
- const effort = this.reasoning_effort === "minimal" ? "low" : this.reasoning_effort;
4951
+ if (reasoningEffort) {
4952
+ const effort = reasoningEffort === "minimal" ? "low" : reasoningEffort;
4601
4953
  body.reasoning.effort = effort;
4602
- } else if (this.reasoning_effort === void 0 && defaultReasoningEffort) {
4954
+ } else if (defaultReasoningEffort) {
4603
4955
  body.reasoning.effort = defaultReasoningEffort;
4604
4956
  }
4605
- if (this.reasoning_effort === "none" || this.includeReasoning !== true) {
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
- return parseOpenAICompatibleTextStream(res, onPartial, {
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
- return parseOpenAICompatibleToolStream(res, onPartial, {
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
- return parseOpenAICompatibleOneShot(data);
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
  /**