@aituber-onair/chat 0.54.0 → 0.56.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 (115) hide show
  1. package/README.ja.md +54 -10
  2. package/README.md +56 -11
  3. package/dist/cjs/constants/claude.d.ts +2 -0
  4. package/dist/cjs/constants/claude.d.ts.map +1 -1
  5. package/dist/cjs/constants/claude.js +6 -1
  6. package/dist/cjs/constants/claude.js.map +1 -1
  7. package/dist/cjs/constants/deepseek.d.ts +1 -0
  8. package/dist/cjs/constants/deepseek.d.ts.map +1 -1
  9. package/dist/cjs/constants/deepseek.js +5 -2
  10. package/dist/cjs/constants/deepseek.js.map +1 -1
  11. package/dist/cjs/constants/openai.d.ts +10 -3
  12. package/dist/cjs/constants/openai.d.ts.map +1 -1
  13. package/dist/cjs/constants/openai.js +40 -7
  14. package/dist/cjs/constants/openai.js.map +1 -1
  15. package/dist/cjs/constants/openrouter.d.ts +11 -0
  16. package/dist/cjs/constants/openrouter.d.ts.map +1 -1
  17. package/dist/cjs/constants/openrouter.js +93 -3
  18. package/dist/cjs/constants/openrouter.js.map +1 -1
  19. package/dist/cjs/constants/xai.d.ts +1 -0
  20. package/dist/cjs/constants/xai.d.ts.map +1 -1
  21. package/dist/cjs/constants/xai.js +7 -2
  22. package/dist/cjs/constants/xai.js.map +1 -1
  23. package/dist/cjs/services/ChatService.d.ts +2 -0
  24. package/dist/cjs/services/ChatService.d.ts.map +1 -1
  25. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  26. package/dist/cjs/services/ChatServiceFactory.js +23 -15
  27. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  28. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +2 -0
  29. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  30. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  31. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +2 -0
  32. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  33. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts +24 -3
  34. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  35. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +211 -15
  36. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  37. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  38. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  39. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  40. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  41. package/dist/cjs/services/providers/openai/OpenAIChatService.js +6 -2
  42. package/dist/cjs/services/providers/openai/OpenAIChatService.js.map +1 -1
  43. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  44. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +17 -4
  45. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  46. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  47. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +9 -3
  48. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  49. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  50. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +8 -2
  51. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  52. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  53. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +11 -0
  54. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  55. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  56. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js +1 -0
  57. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  58. package/dist/esm/constants/claude.d.ts +2 -0
  59. package/dist/esm/constants/claude.d.ts.map +1 -1
  60. package/dist/esm/constants/claude.js +5 -0
  61. package/dist/esm/constants/claude.js.map +1 -1
  62. package/dist/esm/constants/deepseek.d.ts +1 -0
  63. package/dist/esm/constants/deepseek.d.ts.map +1 -1
  64. package/dist/esm/constants/deepseek.js +4 -1
  65. package/dist/esm/constants/deepseek.js.map +1 -1
  66. package/dist/esm/constants/openai.d.ts +10 -3
  67. package/dist/esm/constants/openai.d.ts.map +1 -1
  68. package/dist/esm/constants/openai.js +37 -6
  69. package/dist/esm/constants/openai.js.map +1 -1
  70. package/dist/esm/constants/openrouter.d.ts +11 -0
  71. package/dist/esm/constants/openrouter.d.ts.map +1 -1
  72. package/dist/esm/constants/openrouter.js +91 -1
  73. package/dist/esm/constants/openrouter.js.map +1 -1
  74. package/dist/esm/constants/xai.d.ts +1 -0
  75. package/dist/esm/constants/xai.d.ts.map +1 -1
  76. package/dist/esm/constants/xai.js +6 -1
  77. package/dist/esm/constants/xai.js.map +1 -1
  78. package/dist/esm/services/ChatService.d.ts +2 -0
  79. package/dist/esm/services/ChatService.d.ts.map +1 -1
  80. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  81. package/dist/esm/services/ChatServiceFactory.js +23 -15
  82. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  83. package/dist/esm/services/providers/ChatServiceProvider.d.ts +2 -0
  84. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  85. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  86. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +3 -1
  87. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  88. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts +24 -3
  89. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  90. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +211 -15
  91. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  92. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  93. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  94. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  95. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  96. package/dist/esm/services/providers/openai/OpenAIChatService.js +7 -3
  97. package/dist/esm/services/providers/openai/OpenAIChatService.js.map +1 -1
  98. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  99. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +18 -5
  100. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  101. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  102. package/dist/esm/services/providers/openai/openaiRequestBuilder.js +10 -4
  103. package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  104. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  105. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +9 -3
  106. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  107. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  108. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +12 -1
  109. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  110. package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  111. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js +2 -1
  112. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  113. package/dist/umd/aituber-onair-chat.js +457 -35
  114. package/dist/umd/aituber-onair-chat.min.js +8 -8
  115. package/package.json +1 -1
@@ -77,6 +77,7 @@ var AITuberOnAirChat = (() => {
77
77
  MODEL_ANTHROPIC_CLAUDE_3_7_SONNET: () => MODEL_ANTHROPIC_CLAUDE_3_7_SONNET,
78
78
  MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU: () => MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU,
79
79
  MODEL_ANTHROPIC_CLAUDE_FABLE_5: () => MODEL_ANTHROPIC_CLAUDE_FABLE_5,
80
+ MODEL_ANTHROPIC_CLAUDE_FABLE_5_1: () => MODEL_ANTHROPIC_CLAUDE_FABLE_5_1,
80
81
  MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST: () => MODEL_ANTHROPIC_CLAUDE_HAIKU_LATEST,
81
82
  MODEL_ANTHROPIC_CLAUDE_OPUS_4: () => MODEL_ANTHROPIC_CLAUDE_OPUS_4,
82
83
  MODEL_ANTHROPIC_CLAUDE_OPUS_4_8: () => MODEL_ANTHROPIC_CLAUDE_OPUS_4_8,
@@ -97,10 +98,13 @@ var AITuberOnAirChat = (() => {
97
98
  MODEL_CLAUDE_4_8_OPUS: () => MODEL_CLAUDE_4_8_OPUS,
98
99
  MODEL_CLAUDE_4_OPUS: () => MODEL_CLAUDE_4_OPUS,
99
100
  MODEL_CLAUDE_4_SONNET: () => MODEL_CLAUDE_4_SONNET,
101
+ MODEL_CLAUDE_5_1_FABLE: () => MODEL_CLAUDE_5_1_FABLE,
102
+ MODEL_CLAUDE_5_5_OPUS: () => MODEL_CLAUDE_5_5_OPUS,
100
103
  MODEL_CLAUDE_5_FABLE: () => MODEL_CLAUDE_5_FABLE,
101
104
  MODEL_CLAUDE_5_OPUS: () => MODEL_CLAUDE_5_OPUS,
102
105
  MODEL_CLAUDE_5_SONNET: () => MODEL_CLAUDE_5_SONNET,
103
106
  MODEL_DEEPSEEK_CHAT: () => MODEL_DEEPSEEK_CHAT,
107
+ MODEL_DEEPSEEK_FLASH: () => MODEL_DEEPSEEK_FLASH,
104
108
  MODEL_DEEPSEEK_REASONER: () => MODEL_DEEPSEEK_REASONER,
105
109
  MODEL_DEEPSEEK_V4_FLASH: () => MODEL_DEEPSEEK_V4_FLASH,
106
110
  MODEL_DEEPSEEK_V4_FLASH_VISION_EXP: () => MODEL_DEEPSEEK_V4_FLASH_VISION_EXP,
@@ -146,6 +150,7 @@ var AITuberOnAirChat = (() => {
146
150
  MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE: () => MODEL_GOOGLE_GEMINI_3_5_FLASH_LITE,
147
151
  MODEL_GOOGLE_GEMINI_3_6_FLASH: () => MODEL_GOOGLE_GEMINI_3_6_FLASH,
148
152
  MODEL_GOOGLE_GEMINI_3_7_FLASH: () => MODEL_GOOGLE_GEMINI_3_7_FLASH,
153
+ MODEL_GOOGLE_GEMINI_3_8_FLASH: () => MODEL_GOOGLE_GEMINI_3_8_FLASH,
149
154
  MODEL_GOOGLE_GEMINI_FLASH_LATEST: () => MODEL_GOOGLE_GEMINI_FLASH_LATEST,
150
155
  MODEL_GOOGLE_GEMINI_PRO_LATEST: () => MODEL_GOOGLE_GEMINI_PRO_LATEST,
151
156
  MODEL_GPT_4O: () => MODEL_GPT_4O,
@@ -166,6 +171,9 @@ var AITuberOnAirChat = (() => {
166
171
  MODEL_GPT_5_6_TERRA: () => MODEL_GPT_5_6_TERRA,
167
172
  MODEL_GPT_5_MINI: () => MODEL_GPT_5_MINI,
168
173
  MODEL_GPT_5_NANO: () => MODEL_GPT_5_NANO,
174
+ MODEL_GPT_6_ASTRA: () => MODEL_GPT_6_ASTRA,
175
+ MODEL_GPT_6_LUNA: () => MODEL_GPT_6_LUNA,
176
+ MODEL_GPT_6_SOL: () => MODEL_GPT_6_SOL,
169
177
  MODEL_GPT_OSS_20B_FREE: () => MODEL_GPT_OSS_20B_FREE,
170
178
  MODEL_GROK_4_1_FAST_NON_REASONING: () => MODEL_GROK_4_1_FAST_NON_REASONING,
171
179
  MODEL_GROK_4_1_FAST_REASONING: () => MODEL_GROK_4_1_FAST_REASONING,
@@ -174,6 +182,9 @@ var AITuberOnAirChat = (() => {
174
182
  MODEL_GROK_4_3: () => MODEL_GROK_4_3,
175
183
  MODEL_GROK_4_5: () => MODEL_GROK_4_5,
176
184
  MODEL_GROK_4_6: () => MODEL_GROK_4_6,
185
+ MODEL_GROK_4_7: () => MODEL_GROK_4_7,
186
+ MODEL_INCEPTION_MERCURY_2_5: () => MODEL_INCEPTION_MERCURY_2_5,
187
+ MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE: () => MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE,
177
188
  MODEL_KIMI_K2_5: () => MODEL_KIMI_K2_5,
178
189
  MODEL_KIMI_K2_6: () => MODEL_KIMI_K2_6,
179
190
  MODEL_KIMI_K2_7_CODE: () => MODEL_KIMI_K2_7_CODE,
@@ -181,6 +192,7 @@ var AITuberOnAirChat = (() => {
181
192
  MODEL_KIMI_K3: () => MODEL_KIMI_K3,
182
193
  MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5: () => MODEL_KWAIPILOT_KAT_CODER_AIR_V2_5,
183
194
  MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5: () => MODEL_KWAIPILOT_KAT_CODER_PRO_V2_5,
195
+ MODEL_META_MUSE_SPARK_1_3: () => MODEL_META_MUSE_SPARK_1_3,
184
196
  MODEL_MINISTRAL_14B_2512: () => MODEL_MINISTRAL_14B_2512,
185
197
  MODEL_MINISTRAL_3B_2512: () => MODEL_MINISTRAL_3B_2512,
186
198
  MODEL_MINISTRAL_8B_2512: () => MODEL_MINISTRAL_8B_2512,
@@ -195,6 +207,8 @@ var AITuberOnAirChat = (() => {
195
207
  MODEL_MOONSHOTAI_KIMI_K2_7_CODE: () => MODEL_MOONSHOTAI_KIMI_K2_7_CODE,
196
208
  MODEL_MOONSHOTAI_KIMI_K3: () => MODEL_MOONSHOTAI_KIMI_K3,
197
209
  MODEL_MOONSHOTAI_KIMI_LATEST: () => MODEL_MOONSHOTAI_KIMI_LATEST,
210
+ MODEL_NEX_AGI_NEX_N2_5_MINI_FREE: () => MODEL_NEX_AGI_NEX_N2_5_MINI_FREE,
211
+ MODEL_NEX_AGI_NEX_N2_5_PRO_FREE: () => MODEL_NEX_AGI_NEX_N2_5_PRO_FREE,
198
212
  MODEL_O1: () => MODEL_O1,
199
213
  MODEL_O1_MINI: () => MODEL_O1_MINI,
200
214
  MODEL_O3_MINI: () => MODEL_O3_MINI,
@@ -210,10 +224,13 @@ var AITuberOnAirChat = (() => {
210
224
  MODEL_OPENAI_GPT_5_6_TERRA: () => MODEL_OPENAI_GPT_5_6_TERRA,
211
225
  MODEL_OPENAI_GPT_5_MINI: () => MODEL_OPENAI_GPT_5_MINI,
212
226
  MODEL_OPENAI_GPT_5_NANO: () => MODEL_OPENAI_GPT_5_NANO,
227
+ MODEL_OPENAI_GPT_6_ASTRA: () => MODEL_OPENAI_GPT_6_ASTRA,
228
+ MODEL_OPENAI_GPT_6_ASTRA_PRO: () => MODEL_OPENAI_GPT_6_ASTRA_PRO,
213
229
  MODEL_OPENAI_GPT_LATEST: () => MODEL_OPENAI_GPT_LATEST,
214
230
  MODEL_OPENAI_GPT_MINI_LATEST: () => MODEL_OPENAI_GPT_MINI_LATEST,
215
231
  MODEL_OPENROUTER_AUTO: () => MODEL_OPENROUTER_AUTO,
216
232
  MODEL_OPENROUTER_AUTO_BETA: () => MODEL_OPENROUTER_AUTO_BETA,
233
+ MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH: () => MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH,
217
234
  MODEL_OPENROUTER_DEEPSEEK_V4_FLASH: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH,
218
235
  MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_0731,
219
236
  MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_VISION_EXP: () => MODEL_OPENROUTER_DEEPSEEK_V4_FLASH_VISION_EXP,
@@ -222,6 +239,7 @@ var AITuberOnAirChat = (() => {
222
239
  MODEL_PLAMO_2_2_PRIME: () => MODEL_PLAMO_2_2_PRIME,
223
240
  MODEL_PLAMO_3_0_PRIME: () => MODEL_PLAMO_3_0_PRIME,
224
241
  MODEL_QWEN_QWEN_3_8_FLASH: () => MODEL_QWEN_QWEN_3_8_FLASH,
242
+ MODEL_QWEN_QWEN_3_8_MAX_0902: () => MODEL_QWEN_QWEN_3_8_MAX_0902,
225
243
  MODEL_SAKANA_NAMAZU: () => MODEL_SAKANA_NAMAZU,
226
244
  MODEL_XAI_GROK_4_5: () => MODEL_XAI_GROK_4_5,
227
245
  MODEL_XAI_GROK_4_6: () => MODEL_XAI_GROK_4_6,
@@ -282,6 +300,7 @@ var AITuberOnAirChat = (() => {
282
300
  getDefaultKimiReasoningEffort: () => getDefaultKimiReasoningEffort,
283
301
  getDefaultOpenRouterReasoningEffort: () => getDefaultOpenRouterReasoningEffort,
284
302
  getDefaultReasoningEffortForGPT5Model: () => getDefaultReasoningEffortForGPT5Model,
303
+ getDefaultReasoningEffortForOpenAIModel: () => getDefaultReasoningEffortForOpenAIModel,
285
304
  getDefaultXaiReasoningEffort: () => getDefaultXaiReasoningEffort,
286
305
  getDefaultZaiReasoningEffort: () => getDefaultZaiReasoningEffort,
287
306
  getGeminiSupportedReasoningEfforts: () => getGeminiSupportedReasoningEfforts,
@@ -302,6 +321,7 @@ var AITuberOnAirChat = (() => {
302
321
  isMistralReasoningEffort: () => isMistralReasoningEffort,
303
322
  isMistralReasoningEffortModel: () => isMistralReasoningEffortModel,
304
323
  isMistralVisionModel: () => isMistralVisionModel,
324
+ isOpenAIReasoningModel: () => isOpenAIReasoningModel,
305
325
  isOpenRouterFreeModel: () => isOpenRouterFreeModel,
306
326
  isOpenRouterVisionModel: () => isOpenRouterVisionModel,
307
327
  isResponsesOnlyGPT5Model: () => isResponsesOnlyGPT5Model,
@@ -336,6 +356,9 @@ var AITuberOnAirChat = (() => {
336
356
  // src/constants/openai.ts
337
357
  var ENDPOINT_OPENAI_CHAT_COMPLETIONS_API = "https://api.openai.com/v1/chat/completions";
338
358
  var ENDPOINT_OPENAI_RESPONSES_API = "https://api.openai.com/v1/responses";
359
+ var MODEL_GPT_6_ASTRA = "gpt-6-astra";
360
+ var MODEL_GPT_6_SOL = "gpt-6-sol";
361
+ var MODEL_GPT_6_LUNA = "gpt-6-luna";
339
362
  var MODEL_GPT_5_NANO = "gpt-5-nano";
340
363
  var MODEL_GPT_5_MINI = "gpt-5-mini";
341
364
  var MODEL_GPT_5 = "gpt-5";
@@ -358,6 +381,9 @@ var AITuberOnAirChat = (() => {
358
381
  var MODEL_O1_MINI = "o1-mini";
359
382
  var MODEL_O1 = "o1";
360
383
  var VISION_SUPPORTED_MODELS = [
384
+ MODEL_GPT_6_ASTRA,
385
+ MODEL_GPT_6_SOL,
386
+ MODEL_GPT_6_LUNA,
361
387
  MODEL_GPT_5_NANO,
362
388
  MODEL_GPT_5_MINI,
363
389
  MODEL_GPT_5,
@@ -397,17 +423,20 @@ var AITuberOnAirChat = (() => {
397
423
  function isGPT5Model(model) {
398
424
  return GPT_5_MODELS.includes(model);
399
425
  }
426
+ function isOpenAIReasoningModel(model) {
427
+ return model === MODEL_GPT_6_ASTRA || model === MODEL_GPT_6_SOL || model === MODEL_GPT_6_LUNA || isGPT5Model(model);
428
+ }
400
429
  function isResponsesOnlyGPT5Model(model) {
401
430
  return model === MODEL_GPT_5_4_PRO;
402
431
  }
403
432
  function allowsReasoningXHigh(model) {
404
- return model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA || model === MODEL_GPT_5_5 || model === MODEL_GPT_5_4 || model === MODEL_GPT_5_4_MINI || model === MODEL_GPT_5_4_NANO || model === MODEL_GPT_5_4_PRO;
433
+ return model === MODEL_GPT_6_ASTRA || model === MODEL_GPT_6_SOL || model === MODEL_GPT_6_LUNA || model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA || model === MODEL_GPT_5_5 || model === MODEL_GPT_5_4 || model === MODEL_GPT_5_4_MINI || model === MODEL_GPT_5_4_NANO || model === MODEL_GPT_5_4_PRO;
405
434
  }
406
435
  function allowsReasoningMax(model) {
407
- return model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA;
436
+ return model === MODEL_GPT_6_ASTRA || model === MODEL_GPT_6_SOL || model === MODEL_GPT_6_LUNA || model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA;
408
437
  }
409
438
  function allowsReasoningNone(model) {
410
- return model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA || model === MODEL_GPT_5_1 || model === MODEL_GPT_5_4 || model === MODEL_GPT_5_5 || model === MODEL_GPT_5_4_MINI || model === MODEL_GPT_5_4_NANO;
439
+ return model === MODEL_GPT_6_SOL || model === MODEL_GPT_6_LUNA || model === MODEL_GPT_5_6 || model === MODEL_GPT_5_6_SOL || model === MODEL_GPT_5_6_TERRA || model === MODEL_GPT_5_6_LUNA || model === MODEL_GPT_5_1 || model === MODEL_GPT_5_4 || model === MODEL_GPT_5_5 || model === MODEL_GPT_5_4_MINI || model === MODEL_GPT_5_4_NANO;
411
440
  }
412
441
  function allowsReasoningMinimal(model) {
413
442
  return model === MODEL_GPT_5_NANO || model === MODEL_GPT_5_MINI || model === MODEL_GPT_5;
@@ -424,6 +453,9 @@ var AITuberOnAirChat = (() => {
424
453
  }
425
454
  return "medium";
426
455
  }
456
+ function getDefaultReasoningEffortForOpenAIModel(model) {
457
+ return model === MODEL_GPT_6_ASTRA ? "low" : model === MODEL_GPT_6_SOL ? "medium" : model === MODEL_GPT_6_LUNA ? "low" : getDefaultReasoningEffortForGPT5Model(model);
458
+ }
427
459
 
428
460
  // src/constants/gemini.ts
429
461
  var ENDPOINT_GEMINI_API = "https://generativelanguage.googleapis.com";
@@ -520,6 +552,7 @@ var AITuberOnAirChat = (() => {
520
552
 
521
553
  // src/constants/claude.ts
522
554
  var ENDPOINT_CLAUDE_API = "https://api.anthropic.com/v1/messages";
555
+ var MODEL_CLAUDE_5_1_FABLE = "claude-fable-5-1";
523
556
  var MODEL_CLAUDE_3_HAIKU = "claude-3-haiku-20240307";
524
557
  var MODEL_CLAUDE_3_5_HAIKU = "claude-3-5-haiku-20241022";
525
558
  var MODEL_CLAUDE_3_5_SONNET = "claude-3-5-sonnet-20241022";
@@ -536,6 +569,7 @@ var AITuberOnAirChat = (() => {
536
569
  var MODEL_CLAUDE_5_FABLE = "claude-fable-5";
537
570
  var MODEL_CLAUDE_5_SONNET = "claude-sonnet-5";
538
571
  var MODEL_CLAUDE_5_OPUS = "claude-opus-5";
572
+ var MODEL_CLAUDE_5_5_OPUS = "claude-opus-5-5";
539
573
  var CLAUDE_DEPRECATED_MODELS = [
540
574
  MODEL_CLAUDE_3_HAIKU,
541
575
  MODEL_CLAUDE_3_5_HAIKU,
@@ -564,11 +598,13 @@ var AITuberOnAirChat = (() => {
564
598
  [MODEL_CLAUDE_4_6_OPUS]: CLAUDE_MAX_REASONING_EFFORTS,
565
599
  [MODEL_CLAUDE_4_7_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
566
600
  [MODEL_CLAUDE_4_8_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
601
+ [MODEL_CLAUDE_5_1_FABLE]: CLAUDE_XHIGH_REASONING_EFFORTS,
567
602
  [MODEL_CLAUDE_5_FABLE]: CLAUDE_XHIGH_REASONING_EFFORTS,
568
603
  [MODEL_CLAUDE_5_SONNET]: CLAUDE_XHIGH_REASONING_EFFORTS,
569
604
  [MODEL_CLAUDE_5_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS
570
605
  };
571
606
  var CLAUDE_VISION_SUPPORTED_MODELS = [
607
+ MODEL_CLAUDE_5_1_FABLE,
572
608
  MODEL_CLAUDE_4_5_SONNET,
573
609
  MODEL_CLAUDE_4_5_HAIKU,
574
610
  MODEL_CLAUDE_4_5_OPUS,
@@ -578,7 +614,8 @@ var AITuberOnAirChat = (() => {
578
614
  MODEL_CLAUDE_4_8_OPUS,
579
615
  MODEL_CLAUDE_5_FABLE,
580
616
  MODEL_CLAUDE_5_SONNET,
581
- MODEL_CLAUDE_5_OPUS
617
+ MODEL_CLAUDE_5_OPUS,
618
+ MODEL_CLAUDE_5_5_OPUS
582
619
  ];
583
620
  function getClaudeSupportedReasoningEfforts(model) {
584
621
  return CLAUDE_REASONING_EFFORTS_BY_MODEL[model] ?? [];
@@ -605,6 +642,17 @@ var AITuberOnAirChat = (() => {
605
642
 
606
643
  // src/constants/openrouter.ts
607
644
  var ENDPOINT_OPENROUTER_API = "https://openrouter.ai/api/v1/chat/completions";
645
+ var MODEL_OPENAI_GPT_6_ASTRA = "openai/gpt-6-astra";
646
+ var MODEL_OPENAI_GPT_6_ASTRA_PRO = "openai/gpt-6-astra-pro";
647
+ var MODEL_ANTHROPIC_CLAUDE_FABLE_5_1 = "anthropic/claude-fable-5.1";
648
+ var MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH = "deepseek/deepseek-v4.1-flash";
649
+ var MODEL_GOOGLE_GEMINI_3_8_FLASH = "google/gemini-3.8-flash";
650
+ var MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE = "inclusionai/ling-3.0-flash-vl:free";
651
+ var MODEL_INCEPTION_MERCURY_2_5 = "inception/mercury-2.5";
652
+ var MODEL_NEX_AGI_NEX_N2_5_MINI_FREE = "nex-agi/nex-n2.5-mini:free";
653
+ var MODEL_NEX_AGI_NEX_N2_5_PRO_FREE = "nex-agi/nex-n2.5-pro:free";
654
+ var MODEL_QWEN_QWEN_3_8_MAX_0902 = "qwen/qwen3.8-max-0902";
655
+ var MODEL_META_MUSE_SPARK_1_3 = "meta/muse-spark-1.3";
608
656
  var MODEL_OPENROUTER_AUTO = "openrouter/auto";
609
657
  var MODEL_OPENROUTER_AUTO_BETA = "openrouter/auto-beta";
610
658
  var MODEL_OPENROUTER_FUSION = "openrouter/fusion";
@@ -711,8 +759,69 @@ var AITuberOnAirChat = (() => {
711
759
  "xhigh",
712
760
  "max"
713
761
  ];
714
- var OPENROUTER_FREE_MODELS = [MODEL_GPT_OSS_20B_FREE];
762
+ var OPENROUTER_MODEL_REASONING = {
763
+ [MODEL_OPENAI_GPT_6_ASTRA]: {
764
+ efforts: ["max", "xhigh", "high", "medium", "low"],
765
+ defaultEffort: "medium"
766
+ },
767
+ [MODEL_OPENAI_GPT_6_ASTRA_PRO]: {
768
+ efforts: ["max", "xhigh", "high", "medium", "low"],
769
+ defaultEffort: "medium"
770
+ },
771
+ [MODEL_ANTHROPIC_CLAUDE_FABLE_5_1]: {
772
+ efforts: ["max", "xhigh", "high", "medium", "low"],
773
+ defaultEffort: "high"
774
+ },
775
+ [MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH]: {
776
+ efforts: ["max", "high", "low", "none"],
777
+ defaultEffort: "none"
778
+ },
779
+ [MODEL_GOOGLE_GEMINI_3_8_FLASH]: {
780
+ efforts: ["high", "medium", "low"],
781
+ defaultEffort: "medium"
782
+ },
783
+ [MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE]: {
784
+ efforts: [],
785
+ defaultEffort: void 0
786
+ },
787
+ [MODEL_INCEPTION_MERCURY_2_5]: {
788
+ efforts: ["high", "medium", "low", "none"],
789
+ defaultEffort: "none"
790
+ },
791
+ [MODEL_NEX_AGI_NEX_N2_5_MINI_FREE]: {
792
+ efforts: ["high", "medium", "none"],
793
+ defaultEffort: "none"
794
+ },
795
+ [MODEL_NEX_AGI_NEX_N2_5_PRO_FREE]: {
796
+ efforts: ["high", "medium", "none"],
797
+ defaultEffort: "none"
798
+ },
799
+ [MODEL_QWEN_QWEN_3_8_MAX_0902]: {
800
+ efforts: ["xhigh", "high", "medium", "low", "minimal"],
801
+ defaultEffort: "xhigh"
802
+ },
803
+ [MODEL_META_MUSE_SPARK_1_3]: {
804
+ efforts: ["max", "xhigh", "high", "medium", "low", "minimal"],
805
+ defaultEffort: "medium"
806
+ }
807
+ };
808
+ var OPENROUTER_FREE_MODELS = [
809
+ MODEL_GPT_OSS_20B_FREE,
810
+ MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE,
811
+ MODEL_NEX_AGI_NEX_N2_5_MINI_FREE,
812
+ MODEL_NEX_AGI_NEX_N2_5_PRO_FREE
813
+ ];
715
814
  var OPENROUTER_VISION_SUPPORTED_MODELS = [
815
+ MODEL_OPENAI_GPT_6_ASTRA,
816
+ MODEL_OPENAI_GPT_6_ASTRA_PRO,
817
+ MODEL_ANTHROPIC_CLAUDE_FABLE_5_1,
818
+ MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH,
819
+ MODEL_GOOGLE_GEMINI_3_8_FLASH,
820
+ MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE,
821
+ MODEL_NEX_AGI_NEX_N2_5_MINI_FREE,
822
+ MODEL_NEX_AGI_NEX_N2_5_PRO_FREE,
823
+ MODEL_QWEN_QWEN_3_8_MAX_0902,
824
+ MODEL_META_MUSE_SPARK_1_3,
716
825
  MODEL_OPENROUTER_AUTO_BETA,
717
826
  MODEL_MOONSHOTAI_KIMI_K3,
718
827
  MODEL_MOONSHOTAI_KIMI_K2_6,
@@ -770,6 +879,11 @@ var AITuberOnAirChat = (() => {
770
879
  }
771
880
  function getOpenRouterSupportedReasoningEfforts(model) {
772
881
  const normalizedModel = model.trim();
882
+ const profile = Object.prototype.hasOwnProperty.call(
883
+ OPENROUTER_MODEL_REASONING,
884
+ normalizedModel
885
+ ) ? OPENROUTER_MODEL_REASONING[normalizedModel] : void 0;
886
+ if (profile) return profile.efforts;
773
887
  if (normalizedModel === MODEL_ZAI_GLM_5_3 || normalizedModel === MODEL_ZAI_GLM_5_3_FLASH) {
774
888
  return OPENROUTER_ALWAYS_THINKING_REASONING_EFFORTS;
775
889
  }
@@ -792,6 +906,11 @@ var AITuberOnAirChat = (() => {
792
906
  }
793
907
  function getDefaultOpenRouterReasoningEffort(model) {
794
908
  const normalizedModel = model.trim();
909
+ const profile = Object.prototype.hasOwnProperty.call(
910
+ OPENROUTER_MODEL_REASONING,
911
+ normalizedModel
912
+ ) ? OPENROUTER_MODEL_REASONING[normalizedModel] : void 0;
913
+ if (profile) return profile.defaultEffort;
795
914
  if (normalizedModel === MODEL_ZAI_GLM_5_3 || normalizedModel === MODEL_ZAI_GLM_5_3_FLASH) {
796
915
  return "low";
797
916
  }
@@ -799,7 +918,15 @@ var AITuberOnAirChat = (() => {
799
918
  }
800
919
  function normalizeOpenRouterReasoningEffort(model, effort) {
801
920
  const normalizedModel = model.trim();
921
+ const profile = Object.prototype.hasOwnProperty.call(
922
+ OPENROUTER_MODEL_REASONING,
923
+ normalizedModel
924
+ ) ? OPENROUTER_MODEL_REASONING[normalizedModel] : void 0;
802
925
  const requested = effort ?? getDefaultOpenRouterReasoningEffort(model);
926
+ if (profile) {
927
+ if (requested && profile.efforts.includes(requested)) return requested;
928
+ return profile.defaultEffort;
929
+ }
803
930
  if (!requested) {
804
931
  return void 0;
805
932
  }
@@ -937,6 +1064,7 @@ var AITuberOnAirChat = (() => {
937
1064
  // src/constants/xai.ts
938
1065
  var ENDPOINT_XAI_CHAT_COMPLETIONS_API = "https://api.x.ai/v1/chat/completions";
939
1066
  var MODEL_GROK_4_6 = "grok-4.6";
1067
+ var MODEL_GROK_4_7 = "grok-4.7";
940
1068
  var MODEL_GROK_4_5 = "grok-4.5";
941
1069
  var MODEL_GROK_4_3 = "grok-4.3";
942
1070
  var MODEL_GROK_4_20_REASONING = "grok-4.20-0309-reasoning";
@@ -949,6 +1077,7 @@ var AITuberOnAirChat = (() => {
949
1077
  ];
950
1078
  var XAI_VISION_SUPPORTED_MODELS = [
951
1079
  MODEL_GROK_4_6,
1080
+ MODEL_GROK_4_7,
952
1081
  MODEL_GROK_4_5,
953
1082
  MODEL_GROK_4_3,
954
1083
  MODEL_GROK_4_20_REASONING,
@@ -961,7 +1090,7 @@ var AITuberOnAirChat = (() => {
961
1090
  return getXaiSupportedReasoningEfforts(model).length > 0;
962
1091
  }
963
1092
  function getXaiSupportedReasoningEfforts(model) {
964
- if (model === MODEL_GROK_4_6) {
1093
+ if (model === MODEL_GROK_4_6 || model === MODEL_GROK_4_7) {
965
1094
  return ["low", "medium", "high", "xhigh"];
966
1095
  }
967
1096
  if (model === MODEL_GROK_4_5) {
@@ -976,6 +1105,9 @@ var AITuberOnAirChat = (() => {
976
1105
  return getXaiSupportedReasoningEfforts(model).includes("none");
977
1106
  }
978
1107
  function getDefaultXaiReasoningEffort(model) {
1108
+ if (model === MODEL_GROK_4_7) {
1109
+ return "low";
1110
+ }
979
1111
  if (model === MODEL_GROK_4_6 || model === MODEL_GROK_4_5) {
980
1112
  return "low";
981
1113
  }
@@ -1035,6 +1167,7 @@ var AITuberOnAirChat = (() => {
1035
1167
  // src/constants/deepseek.ts
1036
1168
  var DEEPSEEK_API_BASE_URL = "https://api.deepseek.com";
1037
1169
  var ENDPOINT_DEEPSEEK_CHAT_COMPLETIONS_API = `${DEEPSEEK_API_BASE_URL}/chat/completions`;
1170
+ var MODEL_DEEPSEEK_FLASH = "deepseek-flash";
1038
1171
  var MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash";
1039
1172
  var MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro";
1040
1173
  var MODEL_DEEPSEEK_V4_FLASH_VISION_EXP = "deepseek-v4-flash-vision-exp";
@@ -1052,11 +1185,13 @@ var AITuberOnAirChat = (() => {
1052
1185
  var MODEL_DEEPSEEK_CHAT = "deepseek-chat";
1053
1186
  var MODEL_DEEPSEEK_REASONER = "deepseek-reasoner";
1054
1187
  var DEEPSEEK_SUPPORTED_MODELS = [
1188
+ MODEL_DEEPSEEK_FLASH,
1055
1189
  MODEL_DEEPSEEK_V4_FLASH,
1056
1190
  MODEL_DEEPSEEK_V4_PRO,
1057
1191
  MODEL_DEEPSEEK_V4_FLASH_VISION_EXP
1058
1192
  ];
1059
1193
  var DEEPSEEK_VISION_SUPPORTED_MODELS = [
1194
+ MODEL_DEEPSEEK_FLASH,
1060
1195
  MODEL_DEEPSEEK_V4_FLASH_VISION_EXP
1061
1196
  ];
1062
1197
  var DEEPSEEK_DEPRECATED_MODELS = [
@@ -1064,7 +1199,7 @@ var AITuberOnAirChat = (() => {
1064
1199
  MODEL_DEEPSEEK_REASONER
1065
1200
  ];
1066
1201
  function getDeepSeekSupportedReasoningEfforts(model) {
1067
- if (model === MODEL_DEEPSEEK_V4_FLASH) {
1202
+ if (model === MODEL_DEEPSEEK_FLASH || model === MODEL_DEEPSEEK_V4_FLASH) {
1068
1203
  return DEEPSEEK_V4_FLASH_REASONING_EFFORTS;
1069
1204
  }
1070
1205
  if (model === MODEL_DEEPSEEK_V4_FLASH_VISION_EXP) {
@@ -2505,9 +2640,11 @@ If it's in another language, summarize in that language.
2505
2640
  MODEL_CLAUDE_4_6_OPUS,
2506
2641
  MODEL_CLAUDE_4_7_OPUS,
2507
2642
  MODEL_CLAUDE_4_8_OPUS,
2643
+ MODEL_CLAUDE_5_1_FABLE,
2508
2644
  MODEL_CLAUDE_5_FABLE,
2509
2645
  MODEL_CLAUDE_5_SONNET,
2510
- MODEL_CLAUDE_5_OPUS
2646
+ MODEL_CLAUDE_5_OPUS,
2647
+ MODEL_CLAUDE_5_5_OPUS
2511
2648
  ];
2512
2649
  }
2513
2650
  /**
@@ -2852,6 +2989,9 @@ If it's in another language, summarize in that language.
2852
2989
  chatTemplateThinking,
2853
2990
  maxTokens
2854
2991
  }) {
2992
+ if (model === MODEL_GPT_6_ASTRA && (!reasoning_effort || reasoning_effort === "none" || reasoning_effort === "minimal")) {
2993
+ reasoning_effort = "low";
2994
+ }
2855
2995
  const isResponsesAPI = endpoint === ENDPOINT_OPENAI_RESPONSES_API;
2856
2996
  validateMCPCompatibility(endpoint, mcpServers);
2857
2997
  const body = {
@@ -2883,7 +3023,7 @@ If it's in another language, summarize in that language.
2883
3023
  } else {
2884
3024
  body.messages = provider === "mistral" ? cleanMessagesForMistralChatCompletions(messages) : messages;
2885
3025
  }
2886
- if (isGPT5Model(model)) {
3026
+ if (isOpenAIReasoningModel(model)) {
2887
3027
  if (isResponsesAPI) {
2888
3028
  if (reasoning_effort) {
2889
3029
  body.reasoning = {
@@ -2961,10 +3101,10 @@ If it's in another language, summarize in that language.
2961
3101
  return maxTokens;
2962
3102
  }
2963
3103
  const baseTokenLimit = usesCompatibleChatCompletions(provider) ? responseLength !== void 0 ? getMaxTokensForResponseLength(responseLength) : void 0 : getMaxTokensForResponseLength(responseLength);
2964
- if (provider !== "openai" || !isGPT5Model(model) || responseLength === void 0) {
3104
+ if (provider !== "openai" || !isOpenAIReasoningModel(model) || responseLength === void 0) {
2965
3105
  return baseTokenLimit;
2966
3106
  }
2967
- const effectiveReasoningEffort = reasoning_effort ?? getDefaultReasoningEffortForGPT5Model(model);
3107
+ const effectiveReasoningEffort = reasoning_effort ?? getDefaultReasoningEffortForOpenAIModel(model);
2968
3108
  return Math.max(
2969
3109
  baseTokenLimit ?? 0,
2970
3110
  GPT5_RESPONSE_LENGTH_MIN_TOKENS[responseLength],
@@ -3069,7 +3209,7 @@ If it's in another language, summarize in that language.
3069
3209
  this.apiKey = apiKey;
3070
3210
  this.model = model;
3071
3211
  this.tools = tools || [];
3072
- this.endpoint = endpoint;
3212
+ this.endpoint = (model === MODEL_GPT_6_ASTRA || visionModel === MODEL_GPT_6_ASTRA) && endpoint === ENDPOINT_OPENAI_CHAT_COMPLETIONS_API ? ENDPOINT_OPENAI_RESPONSES_API : endpoint;
3073
3213
  this.mcpServers = mcpServers;
3074
3214
  this.responseLength = responseLength;
3075
3215
  this.verbosity = verbosity;
@@ -4211,6 +4351,7 @@ If it's in another language, summarize in that language.
4211
4351
  var GeminiNanoChatService = class {
4212
4352
  constructor(options = {}) {
4213
4353
  this.provider = "gemini-nano";
4354
+ this.consumedTranscript = [];
4214
4355
  this.expectedInputLanguages = options.expectedInputLanguages ?? [
4215
4356
  "ja",
4216
4357
  "en"
@@ -4220,6 +4361,7 @@ If it's in another language, summarize in that language.
4220
4361
  ...prompt
4221
4362
  }));
4222
4363
  this._responseLength = options.responseLength;
4364
+ this.sessionMode = options.sessionMode ?? "stateless";
4223
4365
  }
4224
4366
  getModel() {
4225
4367
  return MODEL_GEMINI_NANO;
@@ -4227,23 +4369,33 @@ If it's in another language, summarize in that language.
4227
4369
  getVisionModel() {
4228
4370
  return MODEL_GEMINI_NANO;
4229
4371
  }
4372
+ /** Destroy any persistent Prompt API sessions held by this service. */
4373
+ dispose() {
4374
+ this.destroyPersistentSessions();
4375
+ }
4230
4376
  /**
4231
4377
  * Process chat messages using Gemini Nano.
4232
- * Non-streaming: calls onPartialResponse once with the full response,
4233
- * then calls onCompleteResponse.
4378
+ * Streams response deltas when Chrome exposes promptStreaming(), then calls
4379
+ * onCompleteResponse with the complete response.
4234
4380
  */
4235
4381
  async processChat(messages, onPartialResponse, onCompleteResponse) {
4236
- const response = await this.generateResponse(messages);
4237
- onPartialResponse(response);
4382
+ const response = await this.generateResponse(
4383
+ messages,
4384
+ true,
4385
+ onPartialResponse
4386
+ );
4238
4387
  await onCompleteResponse(response);
4239
4388
  }
4240
4389
  async processVisionChat(_messages, _onPartialResponse, _onCompleteResponse) {
4241
4390
  throw new Error("Gemini Nano does not support vision capabilities.");
4242
4391
  }
4243
- async chatOnce(messages, _stream = false, onPartialResponse = () => {
4392
+ async chatOnce(messages, stream = false, onPartialResponse = () => {
4244
4393
  }, _maxTokens) {
4245
- const response = await this.generateResponse(messages);
4246
- onPartialResponse(response);
4394
+ const response = await this.generateResponse(
4395
+ messages,
4396
+ stream,
4397
+ onPartialResponse
4398
+ );
4247
4399
  return {
4248
4400
  blocks: [{ type: "text", text: response }],
4249
4401
  stop_reason: "end"
@@ -4256,7 +4408,7 @@ If it's in another language, summarize in that language.
4256
4408
  /**
4257
4409
  * Core logic: extract system prompt, manage session, call prompt().
4258
4410
  */
4259
- async generateResponse(messages) {
4411
+ async generateResponse(messages, stream, onPartialResponse) {
4260
4412
  const api = getLanguageModelAPI();
4261
4413
  if (!api) {
4262
4414
  throw new Error(
@@ -4264,11 +4416,8 @@ If it's in another language, summarize in that language.
4264
4416
  );
4265
4417
  }
4266
4418
  const modelOptions = this.getModelOptions();
4267
- const availability = await api.availability(modelOptions);
4268
- if (availability !== "available" && availability !== "downloadable") {
4269
- throw new Error(
4270
- `Gemini Nano Prompt API is not ready in this environment. LanguageModel.availability() returned "${availability}". Expected "available" or "downloadable".`
4271
- );
4419
+ if (this.sessionMode === "stateless") {
4420
+ await this.ensureAvailability(api, modelOptions);
4272
4421
  }
4273
4422
  const systemMessages = messages.filter((m) => m.role === "system");
4274
4423
  const systemPrompt = systemMessages.map((m) => m.content).join("\n");
@@ -4278,14 +4427,31 @@ If it's in another language, summarize in that language.
4278
4427
  throw new Error("No user message found in the provided messages.");
4279
4428
  }
4280
4429
  const lastUserMessage = conversationMessages[lastUserMessageIndex];
4430
+ const contextHistory = conversationMessages.slice(0, lastUserMessageIndex);
4431
+ if (this.sessionMode === "persistent") {
4432
+ return this.generatePersistentResponse(
4433
+ api,
4434
+ systemPrompt,
4435
+ contextHistory,
4436
+ lastUserMessage.content,
4437
+ modelOptions,
4438
+ stream,
4439
+ onPartialResponse
4440
+ );
4441
+ }
4281
4442
  const session = await this.createSession(
4282
4443
  api,
4283
4444
  systemPrompt,
4284
- conversationMessages.slice(0, lastUserMessageIndex),
4445
+ contextHistory,
4285
4446
  modelOptions
4286
4447
  );
4287
4448
  try {
4288
- return await session.prompt(lastUserMessage.content);
4449
+ return await this.promptSession(
4450
+ session,
4451
+ lastUserMessage.content,
4452
+ stream,
4453
+ onPartialResponse
4454
+ );
4289
4455
  } finally {
4290
4456
  try {
4291
4457
  session.destroy();
@@ -4293,6 +4459,241 @@ If it's in another language, summarize in that language.
4293
4459
  }
4294
4460
  }
4295
4461
  }
4462
+ async generatePersistentResponse(api, systemPrompt, contextHistory, userPrompt, modelOptions, stream, onPartialResponse) {
4463
+ const sessionKey = this.getPersistentSessionKey(systemPrompt, modelOptions);
4464
+ if (this.persistentSessionKey !== sessionKey) {
4465
+ this.destroyPersistentSessions();
4466
+ }
4467
+ if (!this.baseSession && !this.liveSession) {
4468
+ await this.ensureAvailability(api, modelOptions);
4469
+ await this.createPersistentBaseSession(
4470
+ api,
4471
+ systemPrompt,
4472
+ contextHistory,
4473
+ modelOptions
4474
+ );
4475
+ this.persistentSessionKey = sessionKey;
4476
+ }
4477
+ let session = await this.getPersistentLiveSession(
4478
+ api,
4479
+ systemPrompt,
4480
+ contextHistory,
4481
+ modelOptions
4482
+ );
4483
+ const reusedLiveSession = session === this.liveSession && this.isHistoryCompatible(contextHistory, this.consumedTranscript);
4484
+ this.persistentSessionKey = sessionKey;
4485
+ try {
4486
+ const response = await this.promptSession(
4487
+ session,
4488
+ userPrompt,
4489
+ stream,
4490
+ onPartialResponse
4491
+ );
4492
+ this.recordConsumedTranscript(
4493
+ contextHistory,
4494
+ userPrompt,
4495
+ response,
4496
+ reusedLiveSession
4497
+ );
4498
+ return response;
4499
+ } catch (error) {
4500
+ if (!this.isQuotaExceededError(error)) {
4501
+ this.destroyPersistentLiveSession();
4502
+ throw error;
4503
+ }
4504
+ this.destroyPersistentLiveSession();
4505
+ session = await this.getPersistentLiveSession(
4506
+ api,
4507
+ systemPrompt,
4508
+ [],
4509
+ modelOptions
4510
+ );
4511
+ this.persistentSessionKey = sessionKey;
4512
+ try {
4513
+ const response = await this.promptSession(
4514
+ session,
4515
+ userPrompt,
4516
+ stream,
4517
+ onPartialResponse
4518
+ );
4519
+ this.recordConsumedTranscript([], userPrompt, response, false);
4520
+ return response;
4521
+ } catch (retryError) {
4522
+ this.destroyPersistentLiveSession();
4523
+ throw retryError;
4524
+ }
4525
+ }
4526
+ }
4527
+ async ensureAvailability(api, modelOptions) {
4528
+ const availability = await api.availability(modelOptions);
4529
+ if (availability !== "available" && availability !== "downloadable") {
4530
+ throw new Error(
4531
+ `Gemini Nano Prompt API is not ready in this environment. LanguageModel.availability() returned "${availability}". Expected "available" or "downloadable".`
4532
+ );
4533
+ }
4534
+ }
4535
+ async createPersistentBaseSession(api, systemPrompt, contextHistory, modelOptions) {
4536
+ this.baseSession = await this.createSession(
4537
+ api,
4538
+ systemPrompt,
4539
+ [],
4540
+ modelOptions
4541
+ );
4542
+ if (contextHistory.length > 0) {
4543
+ this.liveSession = await this.createSession(
4544
+ api,
4545
+ systemPrompt,
4546
+ contextHistory,
4547
+ modelOptions
4548
+ );
4549
+ this.consumedTranscript = contextHistory.map((message) => ({
4550
+ ...message
4551
+ }));
4552
+ } else if (typeof this.baseSession.clone === "function") {
4553
+ this.liveSession = await this.baseSession.clone();
4554
+ } else {
4555
+ this.liveSession = this.baseSession;
4556
+ }
4557
+ }
4558
+ async getPersistentLiveSession(api, systemPrompt, contextHistory, modelOptions) {
4559
+ if (this.liveSession && this.isHistoryCompatible(contextHistory, this.consumedTranscript)) {
4560
+ return this.liveSession;
4561
+ }
4562
+ if (this.liveSession && this.liveSession !== this.baseSession) {
4563
+ this.destroyPersistentLiveSession();
4564
+ }
4565
+ if (contextHistory.length === 0 && this.baseSession) {
4566
+ if (typeof this.baseSession.clone === "function") {
4567
+ this.liveSession = await this.baseSession.clone();
4568
+ } else {
4569
+ if (this.consumedTranscript.length > 0) {
4570
+ this.destroyPersistentSessions();
4571
+ await this.createPersistentBaseSession(
4572
+ api,
4573
+ systemPrompt,
4574
+ [],
4575
+ modelOptions
4576
+ );
4577
+ return this.liveSession;
4578
+ }
4579
+ this.liveSession = this.baseSession;
4580
+ }
4581
+ return this.liveSession;
4582
+ }
4583
+ if (this.baseSession && typeof this.baseSession.clone === "function") {
4584
+ this.liveSession = await this.createSession(
4585
+ api,
4586
+ systemPrompt,
4587
+ contextHistory,
4588
+ modelOptions
4589
+ );
4590
+ return this.liveSession;
4591
+ }
4592
+ this.destroyPersistentSessions();
4593
+ await this.ensureAvailability(api, modelOptions);
4594
+ await this.createPersistentBaseSessionWithHistory(
4595
+ api,
4596
+ systemPrompt,
4597
+ contextHistory,
4598
+ modelOptions
4599
+ );
4600
+ return this.liveSession;
4601
+ }
4602
+ async createPersistentBaseSessionWithHistory(api, systemPrompt, contextHistory, modelOptions) {
4603
+ this.baseSession = await this.createSession(
4604
+ api,
4605
+ systemPrompt,
4606
+ contextHistory,
4607
+ modelOptions
4608
+ );
4609
+ this.liveSession = this.baseSession;
4610
+ this.consumedTranscript = contextHistory.map((message) => ({
4611
+ ...message
4612
+ }));
4613
+ }
4614
+ recordConsumedTranscript(contextHistory, userPrompt, response, reusedLiveSession) {
4615
+ const priorTranscript = reusedLiveSession ? this.consumedTranscript : contextHistory;
4616
+ this.consumedTranscript = [
4617
+ ...priorTranscript,
4618
+ { role: "user", content: userPrompt },
4619
+ { role: "assistant", content: response }
4620
+ ];
4621
+ }
4622
+ getPersistentSessionKey(systemPrompt, modelOptions) {
4623
+ return JSON.stringify({
4624
+ systemPrompt,
4625
+ modelOptions,
4626
+ initialPrompts: this.initialPrompts,
4627
+ responseLength: this._responseLength
4628
+ });
4629
+ }
4630
+ isHistoryCompatible(left, right) {
4631
+ if (left.length === 0 || right.length === 0) {
4632
+ return left.length === 0 && right.length === 0;
4633
+ }
4634
+ return this.isSuffix(left, right) || this.isSuffix(right, left);
4635
+ }
4636
+ isSuffix(candidate, full) {
4637
+ if (candidate.length > full.length) return false;
4638
+ const offset = full.length - candidate.length;
4639
+ return candidate.every(
4640
+ (message, index) => message.role === full[offset + index].role && message.content === full[offset + index].content
4641
+ );
4642
+ }
4643
+ isQuotaExceededError(error) {
4644
+ return typeof error === "object" && error !== null && "name" in error && error.name === "QuotaExceededError";
4645
+ }
4646
+ destroyPersistentLiveSession() {
4647
+ if (this.liveSession) {
4648
+ this.destroySession(this.liveSession);
4649
+ if (this.liveSession === this.baseSession) {
4650
+ this.baseSession = void 0;
4651
+ }
4652
+ }
4653
+ this.liveSession = void 0;
4654
+ this.consumedTranscript = [];
4655
+ }
4656
+ destroyPersistentSessions() {
4657
+ if (this.liveSession && this.liveSession !== this.baseSession) {
4658
+ this.destroySession(this.liveSession);
4659
+ }
4660
+ if (this.baseSession) {
4661
+ this.destroySession(this.baseSession);
4662
+ }
4663
+ this.baseSession = void 0;
4664
+ this.liveSession = void 0;
4665
+ this.persistentSessionKey = void 0;
4666
+ this.consumedTranscript = [];
4667
+ }
4668
+ destroySession(session) {
4669
+ try {
4670
+ session.destroy();
4671
+ } catch {
4672
+ }
4673
+ }
4674
+ async promptSession(session, prompt, stream, onPartialResponse) {
4675
+ if (stream && typeof session.promptStreaming === "function") {
4676
+ const reader = session.promptStreaming(prompt).getReader();
4677
+ let response2 = "";
4678
+ let streamMode = "unknown";
4679
+ while (true) {
4680
+ const { done, value } = await reader.read();
4681
+ if (done) break;
4682
+ const chunk = String(value ?? "");
4683
+ if (streamMode === "unknown" && response2 !== "") {
4684
+ streamMode = chunk.startsWith(response2) ? "cumulative" : "delta";
4685
+ }
4686
+ const isCumulative = streamMode === "cumulative";
4687
+ const delta = isCumulative ? chunk.slice(response2.length) : chunk;
4688
+ response2 = isCumulative ? chunk : response2 + chunk;
4689
+ if (delta) onPartialResponse(delta);
4690
+ }
4691
+ return response2;
4692
+ }
4693
+ const response = await session.prompt(prompt);
4694
+ onPartialResponse(response);
4695
+ return response;
4696
+ }
4296
4697
  /**
4297
4698
  * Create a new LanguageModel session with structured initial prompts.
4298
4699
  * System instructions, few-shot examples, and conversation history retain
@@ -4387,7 +4788,8 @@ If it's in another language, summarize in that language.
4387
4788
  expectedInputLanguages: options.expectedInputLanguages,
4388
4789
  expectedOutputLanguages: options.expectedOutputLanguages,
4389
4790
  initialPrompts: options.initialPrompts,
4390
- responseLength: options.responseLength
4791
+ responseLength: options.responseLength,
4792
+ sessionMode: options.sessionMode
4391
4793
  });
4392
4794
  }
4393
4795
  getProviderName() {
@@ -4935,11 +5337,14 @@ If it's in another language, summarize in that language.
4935
5337
  const mcpServers = optimizedOptions.mcpServers ?? [];
4936
5338
  const modelName = optimizedOptions.model || this.getDefaultModel();
4937
5339
  let shouldUseResponsesAPI = false;
4938
- if (mcpServers.length > 0) {
5340
+ if (mcpServers.length > 0 || modelName === MODEL_GPT_6_ASTRA || visionModel === MODEL_GPT_6_ASTRA) {
4939
5341
  shouldUseResponsesAPI = true;
5342
+ } else if (modelName === MODEL_GPT_6_SOL || visionModel === MODEL_GPT_6_SOL || modelName === MODEL_GPT_6_LUNA || visionModel === MODEL_GPT_6_LUNA) {
5343
+ const preference = optimizedOptions.gpt5EndpointPreference || "responses";
5344
+ shouldUseResponsesAPI = preference !== "chat" || optimizedOptions.reasoning_effort !== "none";
4940
5345
  } else if (isResponsesOnlyGPT5Model(modelName)) {
4941
5346
  shouldUseResponsesAPI = true;
4942
- } else if (isGPT5Model(modelName)) {
5347
+ } else if (isOpenAIReasoningModel(modelName)) {
4943
5348
  const preference = optimizedOptions.gpt5EndpointPreference || "chat";
4944
5349
  shouldUseResponsesAPI = preference === "responses";
4945
5350
  }
@@ -4982,6 +5387,9 @@ If it's in another language, summarize in that language.
4982
5387
  MODEL_GPT_5_4,
4983
5388
  MODEL_GPT_5_5,
4984
5389
  MODEL_GPT_5_6,
5390
+ MODEL_GPT_6_ASTRA,
5391
+ MODEL_GPT_6_SOL,
5392
+ MODEL_GPT_6_LUNA,
4985
5393
  MODEL_GPT_5_6_SOL,
4986
5394
  MODEL_GPT_5_6_TERRA,
4987
5395
  MODEL_GPT_5_6_LUNA,
@@ -5033,7 +5441,7 @@ If it's in another language, summarize in that language.
5033
5441
  */
5034
5442
  optimizeGPT5Options(options) {
5035
5443
  const modelName = options.model || this.getDefaultModel();
5036
- if (!isGPT5Model(modelName)) {
5444
+ if (!isOpenAIReasoningModel(modelName)) {
5037
5445
  return options;
5038
5446
  }
5039
5447
  const optimized = { ...options };
@@ -5043,7 +5451,7 @@ If it's in another language, summarize in that language.
5043
5451
  optimized.verbosity = preset.verbosity;
5044
5452
  } else {
5045
5453
  if (!options.reasoning_effort) {
5046
- optimized.reasoning_effort = getDefaultReasoningEffortForGPT5Model(modelName);
5454
+ optimized.reasoning_effort = getDefaultReasoningEffortForOpenAIModel(modelName);
5047
5455
  }
5048
5456
  }
5049
5457
  optimized.reasoning_effort = this.normalizeReasoningEffort(
@@ -5314,7 +5722,7 @@ If it's in another language, summarize in that language.
5314
5722
  if (reasoningEffort !== void 0 || this.includeReasoning !== void 0 || this.reasoningMaxTokens || defaultReasoningEffort) {
5315
5723
  body.reasoning = {};
5316
5724
  if (reasoningEffort) {
5317
- const effort = reasoningEffort === "minimal" ? "low" : reasoningEffort;
5725
+ const effort = reasoningEffort === "minimal" && model !== MODEL_QWEN_QWEN_3_8_MAX_0902 && model !== MODEL_META_MUSE_SPARK_1_3 ? "low" : reasoningEffort;
5318
5726
  body.reasoning.effort = effort;
5319
5727
  } else if (defaultReasoningEffort) {
5320
5728
  body.reasoning.effort = defaultReasoningEffort;
@@ -5330,7 +5738,9 @@ If it's in another language, summarize in that language.
5330
5738
  }
5331
5739
  if (this.tools.length > 0) {
5332
5740
  body.tools = buildOpenAICompatibleTools(this.tools, "chat-completions");
5333
- body.tool_choice = "auto";
5741
+ if (model !== MODEL_ANTHROPIC_CLAUDE_FABLE_5_1) {
5742
+ body.tool_choice = "auto";
5743
+ }
5334
5744
  }
5335
5745
  return body;
5336
5746
  }
@@ -5416,6 +5826,17 @@ If it's in another language, summarize in that language.
5416
5826
  */
5417
5827
  getSupportedModels() {
5418
5828
  return [
5829
+ MODEL_OPENAI_GPT_6_ASTRA,
5830
+ MODEL_OPENAI_GPT_6_ASTRA_PRO,
5831
+ MODEL_ANTHROPIC_CLAUDE_FABLE_5_1,
5832
+ MODEL_OPENROUTER_DEEPSEEK_V4_1_FLASH,
5833
+ MODEL_GOOGLE_GEMINI_3_8_FLASH,
5834
+ MODEL_INCLUSIONAI_LING_3_0_FLASH_VL_FREE,
5835
+ MODEL_INCEPTION_MERCURY_2_5,
5836
+ MODEL_NEX_AGI_NEX_N2_5_MINI_FREE,
5837
+ MODEL_NEX_AGI_NEX_N2_5_PRO_FREE,
5838
+ MODEL_QWEN_QWEN_3_8_MAX_0902,
5839
+ MODEL_META_MUSE_SPARK_1_3,
5419
5840
  // OpenRouter routing
5420
5841
  MODEL_OPENROUTER_AUTO,
5421
5842
  MODEL_OPENROUTER_AUTO_BETA,
@@ -5897,6 +6318,7 @@ If it's in another language, summarize in that language.
5897
6318
  getSupportedModels() {
5898
6319
  return [
5899
6320
  MODEL_GROK_4_6,
6321
+ MODEL_GROK_4_7,
5900
6322
  MODEL_GROK_4_5,
5901
6323
  MODEL_GROK_4_3,
5902
6324
  MODEL_GROK_4_20_REASONING,
@@ -6415,7 +6837,7 @@ If it's in another language, summarize in that language.
6415
6837
  mcp: MCP_SUPPORTED_PROVIDERS.has(providerName),
6416
6838
  jsonMode: JSON_MODE_SUPPORTED_PROVIDERS.has(providerName),
6417
6839
  responseLength: true,
6418
- reasoningEffort: providerName === "claude" && model ? [...getClaudeSupportedReasoningEfforts(model)] : providerName === "gemini" && model ? [...getGeminiSupportedReasoningEfforts(model)] : providerName === "kimi" && model ? [...getKimiSupportedReasoningEfforts(model)] : providerName === "deepseek" && model ? [...getDeepSeekSupportedReasoningEfforts(model)] : providerName === "openrouter" && model ? [...getOpenRouterSupportedReasoningEfforts(model)] : providerName === "xai" && model ? [...getXaiSupportedReasoningEfforts(model)] : providerName === "zai" && model ? [...getZaiSupportedReasoningEfforts(model)] : REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
6840
+ reasoningEffort: providerName === "openai" && model === MODEL_GPT_6_ASTRA ? ["low", "medium", "high", "xhigh", "max"] : providerName === "openai" && model === MODEL_GPT_6_SOL ? ["none", "low", "medium", "high", "xhigh", "max"] : providerName === "openai" && model === MODEL_GPT_6_LUNA ? ["none", "low", "medium", "high", "xhigh", "max"] : providerName === "claude" && model ? [...getClaudeSupportedReasoningEfforts(model)] : providerName === "gemini" && model ? [...getGeminiSupportedReasoningEfforts(model)] : providerName === "kimi" && model ? [...getKimiSupportedReasoningEfforts(model)] : providerName === "deepseek" && model ? [...getDeepSeekSupportedReasoningEfforts(model)] : providerName === "openrouter" && model ? [...getOpenRouterSupportedReasoningEfforts(model)] : providerName === "xai" && model ? [...getXaiSupportedReasoningEfforts(model)] : providerName === "zai" && model ? [...getZaiSupportedReasoningEfforts(model)] : REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
6419
6841
  };
6420
6842
  }
6421
6843
  /**