@aituber-onair/chat 0.47.0 → 0.49.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 (165) hide show
  1. package/README.ja.md +128 -23
  2. package/README.md +137 -23
  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/gemini.d.ts +17 -0
  8. package/dist/cjs/constants/gemini.d.ts.map +1 -1
  9. package/dist/cjs/constants/gemini.js +67 -1
  10. package/dist/cjs/constants/gemini.js.map +1 -1
  11. package/dist/cjs/constants/kimi.d.ts +14 -0
  12. package/dist/cjs/constants/kimi.d.ts.map +1 -1
  13. package/dist/cjs/constants/kimi.js +27 -1
  14. package/dist/cjs/constants/kimi.js.map +1 -1
  15. package/dist/cjs/constants/openrouter.d.ts +12 -0
  16. package/dist/cjs/constants/openrouter.d.ts.map +1 -1
  17. package/dist/cjs/constants/openrouter.js +24 -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/ChatService.d.ts +2 -2
  23. package/dist/cjs/services/ChatService.d.ts.map +1 -1
  24. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  25. package/dist/cjs/services/ChatServiceFactory.js +10 -1
  26. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  27. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +23 -4
  28. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  29. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts +3 -1
  30. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  31. package/dist/cjs/services/providers/claude/ClaudeChatService.js +51 -4
  32. package/dist/cjs/services/providers/claude/ClaudeChatService.js.map +1 -1
  33. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  34. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +13 -2
  35. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  36. package/dist/cjs/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
  37. package/dist/cjs/services/providers/claude/claudeMessageConverter.js +7 -1
  38. package/dist/cjs/services/providers/claude/claudeMessageConverter.js.map +1 -1
  39. package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts +8 -2
  40. package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
  41. package/dist/cjs/services/providers/gemini/GeminiChatService.js +65 -38
  42. package/dist/cjs/services/providers/gemini/GeminiChatService.js.map +1 -1
  43. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -1
  44. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js +9 -2
  45. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -1
  46. package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts +6 -0
  47. package/dist/cjs/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
  48. package/dist/cjs/services/providers/gemini/geminiMessageConverter.js +61 -58
  49. package/dist/cjs/services/providers/gemini/geminiMessageConverter.js.map +1 -1
  50. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts +7 -2
  51. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  52. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js +83 -30
  53. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  54. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  55. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  56. package/dist/cjs/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  57. package/dist/cjs/services/providers/kimi/KimiChatService.d.ts +5 -4
  58. package/dist/cjs/services/providers/kimi/KimiChatService.d.ts.map +1 -1
  59. package/dist/cjs/services/providers/kimi/KimiChatService.js +32 -18
  60. package/dist/cjs/services/providers/kimi/KimiChatService.js.map +1 -1
  61. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts +1 -0
  62. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  63. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js +23 -1
  64. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  65. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  66. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +34 -15
  67. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  68. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  69. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +13 -0
  70. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  71. package/dist/cjs/types/chat.d.ts +12 -2
  72. package/dist/cjs/types/chat.d.ts.map +1 -1
  73. package/dist/cjs/types/toolChat.d.ts +19 -0
  74. package/dist/cjs/types/toolChat.d.ts.map +1 -1
  75. package/dist/cjs/utils/openaiCompatibleSse.d.ts +2 -0
  76. package/dist/cjs/utils/openaiCompatibleSse.d.ts.map +1 -1
  77. package/dist/cjs/utils/openaiCompatibleSse.js +70 -5
  78. package/dist/cjs/utils/openaiCompatibleSse.js.map +1 -1
  79. package/dist/cjs/utils/processChatFlow.d.ts +2 -2
  80. package/dist/cjs/utils/processChatFlow.d.ts.map +1 -1
  81. package/dist/cjs/utils/processChatFlow.js +8 -3
  82. package/dist/cjs/utils/processChatFlow.js.map +1 -1
  83. package/dist/esm/constants/claude.d.ts +15 -0
  84. package/dist/esm/constants/claude.d.ts.map +1 -1
  85. package/dist/esm/constants/claude.js +56 -0
  86. package/dist/esm/constants/claude.js.map +1 -1
  87. package/dist/esm/constants/gemini.d.ts +17 -0
  88. package/dist/esm/constants/gemini.d.ts.map +1 -1
  89. package/dist/esm/constants/gemini.js +62 -0
  90. package/dist/esm/constants/gemini.js.map +1 -1
  91. package/dist/esm/constants/kimi.d.ts +14 -0
  92. package/dist/esm/constants/kimi.d.ts.map +1 -1
  93. package/dist/esm/constants/kimi.js +23 -0
  94. package/dist/esm/constants/kimi.js.map +1 -1
  95. package/dist/esm/constants/openrouter.d.ts +12 -0
  96. package/dist/esm/constants/openrouter.d.ts.map +1 -1
  97. package/dist/esm/constants/openrouter.js +22 -0
  98. package/dist/esm/constants/openrouter.js.map +1 -1
  99. package/dist/esm/index.d.ts +1 -1
  100. package/dist/esm/index.d.ts.map +1 -1
  101. package/dist/esm/index.js.map +1 -1
  102. package/dist/esm/services/ChatService.d.ts +2 -2
  103. package/dist/esm/services/ChatService.d.ts.map +1 -1
  104. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  105. package/dist/esm/services/ChatServiceFactory.js +10 -1
  106. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  107. package/dist/esm/services/providers/ChatServiceProvider.d.ts +23 -4
  108. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  109. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts +3 -1
  110. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  111. package/dist/esm/services/providers/claude/ClaudeChatService.js +52 -5
  112. package/dist/esm/services/providers/claude/ClaudeChatService.js.map +1 -1
  113. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  114. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +14 -3
  115. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  116. package/dist/esm/services/providers/claude/claudeMessageConverter.d.ts.map +1 -1
  117. package/dist/esm/services/providers/claude/claudeMessageConverter.js +7 -1
  118. package/dist/esm/services/providers/claude/claudeMessageConverter.js.map +1 -1
  119. package/dist/esm/services/providers/gemini/GeminiChatService.d.ts +8 -2
  120. package/dist/esm/services/providers/gemini/GeminiChatService.d.ts.map +1 -1
  121. package/dist/esm/services/providers/gemini/GeminiChatService.js +66 -39
  122. package/dist/esm/services/providers/gemini/GeminiChatService.js.map +1 -1
  123. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -1
  124. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js +10 -3
  125. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -1
  126. package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts +6 -0
  127. package/dist/esm/services/providers/gemini/geminiMessageConverter.d.ts.map +1 -1
  128. package/dist/esm/services/providers/gemini/geminiMessageConverter.js +61 -58
  129. package/dist/esm/services/providers/gemini/geminiMessageConverter.js.map +1 -1
  130. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts +7 -2
  131. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.d.ts.map +1 -1
  132. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js +84 -31
  133. package/dist/esm/services/providers/geminiNano/GeminiNanoChatService.js.map +1 -1
  134. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.d.ts.map +1 -1
  135. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js +1 -0
  136. package/dist/esm/services/providers/geminiNano/GeminiNanoChatServiceProvider.js.map +1 -1
  137. package/dist/esm/services/providers/kimi/KimiChatService.d.ts +5 -4
  138. package/dist/esm/services/providers/kimi/KimiChatService.d.ts.map +1 -1
  139. package/dist/esm/services/providers/kimi/KimiChatService.js +34 -20
  140. package/dist/esm/services/providers/kimi/KimiChatService.js.map +1 -1
  141. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts +1 -0
  142. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  143. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js +24 -2
  144. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  145. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -1
  146. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +35 -16
  147. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -1
  148. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  149. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +14 -1
  150. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  151. package/dist/esm/types/chat.d.ts +12 -2
  152. package/dist/esm/types/chat.d.ts.map +1 -1
  153. package/dist/esm/types/toolChat.d.ts +19 -0
  154. package/dist/esm/types/toolChat.d.ts.map +1 -1
  155. package/dist/esm/utils/openaiCompatibleSse.d.ts +2 -0
  156. package/dist/esm/utils/openaiCompatibleSse.d.ts.map +1 -1
  157. package/dist/esm/utils/openaiCompatibleSse.js +70 -5
  158. package/dist/esm/utils/openaiCompatibleSse.js.map +1 -1
  159. package/dist/esm/utils/processChatFlow.d.ts +2 -2
  160. package/dist/esm/utils/processChatFlow.d.ts.map +1 -1
  161. package/dist/esm/utils/processChatFlow.js +8 -3
  162. package/dist/esm/utils/processChatFlow.js.map +1 -1
  163. package/dist/umd/aituber-onair-chat.js +621 -177
  164. package/dist/umd/aituber-onair-chat.min.js +9 -11
  165. package/package.json +1 -1
package/README.ja.md CHANGED
@@ -571,30 +571,57 @@ CI/ローカルで再現性を高める場合は
571
571
  ```typescript
572
572
  const claudeService = ChatServiceFactory.createChatService('claude', {
573
573
  apiKey: process.env.ANTHROPIC_API_KEY,
574
- model: 'claude-sonnet-5'
574
+ model: 'claude-opus-5',
575
+ reasoning_effort: 'low'
575
576
  });
576
577
  ```
577
578
 
579
+ `claude-opus-5` は高性能用途向けの明示的な選択肢として利用でき、パッケージの
580
+ 既定値にはしていません。Claude Opus 5 は adaptive thinking が既定で有効です。
581
+ 対応するClaudeモデルでは `reasoning_effort` を指定でき、Anthropic APIの
582
+ `output_config.effort` に変換されます。省略時のClaude API既定値は `high` です。
583
+
584
+ - Claude Opus 5、Sonnet 5、Opus 4.8、Opus 4.7:
585
+ `low`、`medium`、`high`、`xhigh`、`max`
586
+ - Claude Opus 4.6、Sonnet 4.6:
587
+ `low`、`medium`、`high`、`max`
588
+ - Claude Opus 4.5: `low`、`medium`、`high`
589
+
590
+ effortを下げるとレイテンシーとトークン効率を優先できますが、表示される回答の
591
+ 短さは保証されません。短い回答が必要な場合は、回答長の指示も併用してください。
592
+ 複数ターンのツール呼び出しでは provider 固有の thinking / tool-use ブロックを
593
+ 保持するため、返された `completion.assistant_message` を会話履歴へ追加してください。
594
+
578
595
  #### Google Gemini
579
596
 
580
597
  ```typescript
581
598
  const geminiService = ChatServiceFactory.createChatService('gemini', {
582
599
  apiKey: process.env.GOOGLE_API_KEY,
583
- model: 'gemini-3.1-flash-lite'
600
+ model: 'gemini-3.1-flash-lite',
601
+ reasoning_effort: 'minimal'
584
602
  });
585
603
  ```
586
604
 
587
- `gemini-3.1-flash-lite` が推奨の安定版 Flash-Lite モデルです。
588
- 現在の安定版 Flash モデルとして `gemini-3.5-flash` も利用できます。
605
+ `gemini-3.1-flash-lite` は既定の Flash-Lite モデルとして維持します。
606
+ 最新の安定版・低遅延 Flash-Lite として `gemini-3.5-flash-lite`、
607
+ より高度なエージェント・マルチモーダル用途向けに `gemini-3.6-flash`、
608
+ 安定版 Flash として `gemini-3.5-flash` も利用できます。
589
609
  `gemini-3.1-flash-lite-preview`、`gemini-3-pro-preview`、
590
610
  `gemini-2.5-flash-lite-preview-06-17` などの preview / deprecated
591
611
  モデルは後方互換のため明示的な model string では利用できますが、本番用途では
592
612
  新しいモデルへ移行してください。
593
613
 
594
- チャット用途では、`gemini-3.5-flash` に対して Gemini の
595
- `thinkingConfig`(`thinkingLevel: 'MINIMAL'`、`includeThoughts: false`)を
596
- 自動で送信します。利用者側で追加オプションを指定する必要はなく、既定で高速な
597
- チャット応答と hidden thinking token の抑制を優先します。
614
+ Gemini 3 モデルでは `reasoning_effort` を指定できます。この値は Gemini の
615
+ `thinkingConfig.thinkingLevel` に変換され、`includeThoughts: false` を維持します。
616
+
617
+ - Gemini 3 Flash / Flash-Lite: `minimal`, `low`, `medium`, `high`。
618
+ 低遅延なチャット向けの既定値は `minimal` です。
619
+ - Gemini 3 Pro: `low`, `medium`, `high`。Pro は `minimal` 非対応のため、
620
+ 既定値は `low` です。
621
+
622
+ これにより Gemini 3.6/3.5 Flash の medium thinking 既定値を上書きし、短い
623
+ 出力上限を hidden thinking が使い切るリスクを抑えます。Gemini 2.5 は
624
+ `thinkingBudget` を使うため、`reasoning_effort` は送信しません。
598
625
 
599
626
  #### OpenRouter
600
627
 
@@ -609,26 +636,36 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
609
636
  ```
610
637
 
611
638
  **OpenRouterの重要な注意事項:**
612
- - `gpt-oss-20b:free`モデルでは、技術的制限によりトークン制限が自動的に無効化されます
613
- - 応答の長さを制御するには、プロンプト内で指示してください(例:「40文字以内で返答してください」)
639
+ - `openrouter/auto` と `openrouter/auto-beta` では、ルーティング先のreasoningモデルが可視テキストの生成前に出力予算を使い切ることを避けるため、`responseLength` 由来のトークン制限を自動的に無効化します。明示的に指定した `maxTokens` はそのまま使用します。
640
+ - `gpt-oss-20b:free` と `z-ai/glm-5.2` では、すべてのトークン制限を引き続き無効化します。これらのモデルと動的Routerでは、応答の長さをプロンプトで指示してください(例:「40文字以内で回答してください」)。
614
641
  - 無料階層にはレート制限があります(20リクエスト/分)
615
642
  - 無料モデル判定はモデルID末尾の `:free` で行います(動的取得した `:free` も同様にレート制限対象)
643
+ - `openrouter/auto-beta` はタスクを判定するBetaルーターです。リクエストごとにモデルを選択し、そのモデルの料金が適用されます。選択結果はレスポンスの `model` またはOpenRouter Activityで確認できます。
616
644
  - `openrouter/fusion` は複数モデルのパネルとジャッジモデルを実行します。単一モデルの固定単価ではなく、内部で使われた各モデル呼び出しと web search/fetch 利用分の合算で課金されます。
617
- - `z-ai/glm-5.2` は OpenRouter reasoning を `none` にし、reasoning token が出力上限を使い切って可視テキストが空になることを避けるため、トークン制限も自動的に無効化します。
645
+ - `z-ai/glm-5.2` は OpenRouter reasoning も `none` にします。
646
+ - コーディング特化モデルはデフォルトではなく明示的な選択肢です。`kwaipilot/kat-coder-air-v2.5` と `kwaipilot/kat-coder-pro-v2.5` はテキスト専用です。
647
+ - `moonshotai/kimi-k3` の可用性は上流キャパシティに依存し、混雑時はOpenRouterから429レスポンスが返る場合があります。
648
+ - `x-ai/grok-4.5` には現在のEU制限を含む地域別の可用性制限があります。`~x-ai/grok-latest` がGrok 4.5へ解決される場合も同じ制限を受けます。
618
649
  - サポート対象モデル(キュレーション済み):
619
- - `openrouter/auto`
650
+ - `openrouter/auto`, `openrouter/auto-beta`
620
651
  - `openrouter/fusion`
621
652
  - `openai/gpt-oss-20b:free`
622
- - `~openai/gpt-latest`, `~openai/gpt-mini-latest`, `openai/gpt-5.5-pro`, `openai/gpt-5.5`
653
+ - `~openai/gpt-latest`, `~openai/gpt-mini-latest`
654
+ - `openai/gpt-5.6-sol`, `openai/gpt-5.6-terra`, `openai/gpt-5.6-luna`
655
+ - `openai/gpt-5.5-pro`, `openai/gpt-5.5`
623
656
  - `openai/gpt-5.1-chat`, `openai/gpt-5.1-codex`, `openai/gpt-5-mini`, `openai/gpt-5-nano`
624
657
  - `openai/gpt-4o`, `openai/gpt-4.1-mini`, `openai/gpt-4.1-nano`
625
658
  - `~anthropic/claude-sonnet-latest`, `~anthropic/claude-haiku-latest`
659
+ - `anthropic/claude-opus-5`
626
660
  - `anthropic/claude-opus-4`, `anthropic/claude-sonnet-4`
627
661
  - `anthropic/claude-3.7-sonnet`, `anthropic/claude-3.5-sonnet`, `anthropic/claude-haiku-4.5`
628
662
  - `~google/gemini-pro-latest`, `~google/gemini-flash-latest`
663
+ - `google/gemini-3.6-flash`, `google/gemini-3.5-flash-lite`
629
664
  - `google/gemini-2.5-pro`, `google/gemini-2.5-flash`, `google/gemini-2.5-flash-lite-preview-09-2025`
630
665
  - `z-ai/glm-5.2`, `z-ai/glm-4.7-flash`, `z-ai/glm-4.5-air`, `z-ai/glm-4.5-air:free`
631
- - `~moonshotai/kimi-latest`, `moonshotai/kimi-k2.7-code`, `moonshotai/kimi-k2.5`
666
+ - `~x-ai/grok-latest`, `x-ai/grok-4.5`
667
+ - `~moonshotai/kimi-latest`, `moonshotai/kimi-k3`, `moonshotai/kimi-k2.7-code`, `moonshotai/kimi-k2.5`
668
+ - `kwaipilot/kat-coder-air-v2.5`, `kwaipilot/kat-coder-pro-v2.5`
632
669
 
633
670
  **OpenRouter freeモデルの動的リフレッシュ**
634
671
 
@@ -697,18 +734,21 @@ const xaiService = ChatServiceFactory.createChatService('xai', {
697
734
  ```typescript
698
735
  const kimiService = ChatServiceFactory.createChatService('kimi', {
699
736
  apiKey: process.env.MOONSHOT_API_KEY,
700
- model: 'kimi-k2.6',
737
+ model: 'kimi-k3',
701
738
  // Optional: エンドポイント/ベースURLの上書き
702
739
  // endpoint: 'https://api.moonshot.ai/v1/chat/completions',
703
740
  // baseUrl: 'https://api.moonshot.ai/v1',
704
- thinking: { type: 'enabled' }
741
+ reasoning_effort: 'low'
705
742
  });
706
743
  ```
707
744
 
708
745
  注意:
709
746
  - KimiはOpenAI互換のChat Completionsを利用します。
710
- - 対応モデル: `kimi-k2.7-code`, `kimi-k2.7-code-highspeed`, `kimi-k2.6`, `kimi-k2.5`
747
+ - 対応モデル: `kimi-k3`, `kimi-k2.7-code`, `kimi-k2.7-code-highspeed`, `kimi-k2.6`, `kimi-k2.5`
711
748
  - チャット用途向けのデフォルトモデルは引き続き `kimi-k2.6` です。
749
+ - Kimi K3は明示的に選択するReasoningモデルです。`reasoning_effort: 'low' | 'high' | 'max'` に対応し、デフォルトは `max` です。Reasoning自体は無効化できず、K2系の `thinking` オプションも利用できません。`none`、`minimal`、`medium` は非対応です。
750
+ - Kimi K3の出力上限には `max_completion_tokens` を使用します。
751
+ - Kimi K3の複数ターン・ツール呼び出しでは、`reasoning_content` と `tool_calls` を保持するため、返された `completion.assistant_message` を会話履歴へ追加してください。
712
752
  - Kimi K2.7 Code 系モデルはコーディング寄りで、thinking mode が必須のため、ツール使用時も `thinking` を有効のままにします。
713
753
  - Kimi K2.7 Code 系モデルで `thinking: { type: 'disabled' }` を明示指定すると、リクエスト送信前にエラーになります。
714
754
  - 旧 Kimi モデルでは、ツール使用時に `thinking` を `{ type: 'disabled' }` に強制します。
@@ -791,7 +831,7 @@ const sakanaService = ChatServiceFactory.createChatService('sakana', {
791
831
  - 対応モデル: `fugu`(デフォルト), `fugu-ultra`, `fugu-ultra-20260615`
792
832
  - Sakanaは新しいChat Completions連携では`max_completion_tokens`を推奨していますが、legacyな`max_tokens`も受け付けます。このproviderでは既存OpenAI互換providerの挙動に合わせて`max_tokens`を使います。
793
833
  - Sakanaは最高性能にはResponses APIを推奨していますが、このproviderはpackageのOpenAI互換chat経路に合わせてChat Completionsを利用します。
794
- - ブラウザから直接呼ぶ場合、Sakana側がoriginに対してCORSを許可していないと失敗します。ブラウザ単体ではなく、Node.js、backend/serverless proxy、または`examples/sakana-basic`を利用してください。
834
+ - ブラウザから直接呼ぶ場合、Sakana側がoriginに対してCORSを許可していないと失敗します。ブラウザ単体ではなく、Node.js、backend/serverless proxy、または`examples/node-basic/sakana-example.js`を利用してください。
795
835
 
796
836
  #### PLaMo
797
837
 
@@ -814,12 +854,33 @@ const plamoService = ChatServiceFactory.createChatService('plamo', {
814
854
 
815
855
  ```typescript
816
856
  const geminiNanoService = ChatServiceFactory.createChatService('gemini-nano', {
817
- responseLength: 'medium'
857
+ responseLength: 'short',
858
+ initialPrompts: [
859
+ {
860
+ role: 'system',
861
+ content: 'あなたは明るく自然な話し方をするキャラクターです。'
862
+ },
863
+ { role: 'user', content: '今日はどんな気分?' },
864
+ { role: 'assistant', content: '元気いっぱいで、お話しするのが楽しみだよ!' },
865
+ { role: 'user', content: '準備できた?' },
866
+ { role: 'assistant', content: 'うん、いつでも始められるよ!' }
867
+ ]
818
868
  });
819
869
  ```
820
870
 
821
871
  注意:
822
872
  - APIキー不要 — ChromeのLanguageModel API(Prompt API)を使用します。
873
+ - システム指示、設定した会話例、直近の会話履歴は、roleを維持した
874
+ `initialPrompts`として渡されます。
875
+ - 設定した`initialPrompts`にsystemメッセージがある場合は、必ず先頭へ
876
+ 正規化されます。会話例はオンデバイスモデルのコンテキストを消費するため、
877
+ 短い例を使用してください。
878
+ - Gemini Nanoでは、トークン数の目安に加えて、`veryShort`は最大1文、
879
+ `short`は最大2文、`medium`は最大3文、`long`は最大5文、
880
+ `veryLong`は最大10文となるよう具体的に指示します。`deep`は約5000
881
+ トークンの目安だけを残し、文数は制限しません。ただし、出力長は厳密保証
882
+ ではありません。
883
+ - 構造化された履歴として、直近20件までのuser/assistantメッセージを渡します。
823
884
  - **Chrome 138以降**で、以下のフラグを有効にする必要があります:
824
885
  - `chrome://flags/#optimization-guide-on-device-model` → Enabled
825
886
  - `chrome://flags/#prompt-api-for-gemini-nano` → Enabled
@@ -828,6 +889,50 @@ const geminiNanoService = ChatServiceFactory.createChatService('gemini-nano', {
828
889
  - ビジョン(画像入力)は非対応です。
829
890
  - 初回のモデルダウンロードにはユーザー操作が必要で、数分かかる場合があります。
830
891
 
892
+ ##### Tips: 会話例で応答長の安定性を高める
893
+
894
+ `responseLength`を設定すると、Gemini Nano向けの文数、書式、トークン数の
895
+ 目安が自動的に指示へ追加されます。さらに、短いuser/assistantの会話例を
896
+ 2〜3組ほど`initialPrompts`で渡すと、指示をより強く補強できます。
897
+
898
+ ```typescript
899
+ import {
900
+ ChatServiceFactory,
901
+ type GeminiNanoInitialPrompt
902
+ } from '@aituber-onair/chat';
903
+
904
+ const veryShortExamples: GeminiNanoInitialPrompt[] = [
905
+ { role: 'user', content: '今日はどんな気分?' },
906
+ { role: 'assistant', content: 'みんなと話せて元気いっぱいだよ!' },
907
+ { role: 'user', content: '好きな食べ物は?' },
908
+ { role: 'assistant', content: '特にサーモンのお寿司が好き!' }
909
+ ];
910
+
911
+ const service = ChatServiceFactory.createChatService('gemini-nano', {
912
+ responseLength: 'veryShort',
913
+ initialPrompts: veryShortExamples
914
+ });
915
+ ```
916
+
917
+ 会話例は任意です。`initialPrompts`を省略しても、パッケージ側の応答長指示は
918
+ 適用されます。会話例を加えることで、期待する文章量、口調、リアクション、
919
+ 会話のテンポをオンデバイスモデルへ具体的に伝えられます。
920
+
921
+ - assistantの例文は選択したプリセットに合わせてください。`veryShort`なら
922
+ 1文、`short`なら最大2文にします。
923
+ - 例文は対象キャラクターの口調で記述してください。汎用的な固定例文は
924
+ キャラクター性を変える可能性があるため、パッケージからは自動追加しません。
925
+ - 明確に長い回答が必要な`medium`以上へ1文の例を流用すると、短い回答へ
926
+ 偏る可能性があります。
927
+ - 例文はシステムプロンプトや会話履歴と同じコンテキストを消費するため、
928
+ 少数かつ短く保ってください。
929
+ - `responseLength`または`initialPrompts`を変更した場合は、チャットサービスを
930
+ 作り直してください。React Basic Exampleではこれを自動的に行い、短い例文は
931
+ `veryShort`と`short`だけに適用しています。
932
+ - これは応答長の安定性を高める制御であり、厳密な出力上限ではありません。
933
+ ChromeのLanguageModel APIにはmax output tokens相当の設定がないため、
934
+ 指定した文数を超える場合があります。
935
+
831
936
  ### ビジョンチャット
832
937
 
833
938
  組み込み provider のうち、対応モデル一覧を持つものは vision 対応を
@@ -1136,12 +1241,12 @@ vision、JSON mode、reasoning 設定を使うべきかを provider 固有ロジ
1136
1241
 
1137
1242
  - **OpenAI**: GPT-5.6(Sol/Terra/Luna)、GPT-5.5、GPT-5.4 Pro、GPT-5.4、GPT-5.4 Mini、GPT-5.4 Nano、GPT-5.1、GPT-5(Nano/Mini/Standard)、GPT-4.1(miniとnanoを含む), GPT-4, GPT-4o-mini, O3-mini, o1, o1-miniのモデルをサポート
1138
1243
  - **OpenAI-Compatible**: OpenAI互換 endpoint 経由で任意のローカル/セルフホスト model ID を利用できます。vision 対応可否は endpoint ごとに差があるため、原則 `unknown` 扱いです
1139
- - **Gemini**: Gemini 3.5 Flash、Gemini 3.1 Flash-Lite、Gemini 3.1 Pro Preview、Gemini 3 Flash Preview、Gemini 2.5 Pro、Gemini 2.5 Flash、Gemini 2.5 Flash Lite、Gemma 4 31B IT、Gemma 4 26B A4B IT などの推奨モデルをサポート。Gemini 3.5 Flash はチャット用途向けに minimal thinking を自動適用します。Gemini 3.1 Flash-Lite Preview、Gemini 3 Pro Preview、Gemini 2.5 Flash Lite Preview などの lifecycle 上 deprecated なモデルは明示指定用に export を残しています
1140
- - **Claude**: Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Haiku 4.5 に加え、まだ利用可能だが非推奨の Claude 4 Opus, Claude 4 Sonnet, Claude 3 Haiku をサポート
1141
- - **OpenRouter**: OpenRouterのキュレーション済みモデル一覧(OpenAI/Claude/Gemini/Z.ai/Kimi)をサポート。モデルIDはOpenRouter節を参照してください
1244
+ - **Gemini**: Gemini 3.6 Flash、Gemini 3.5 Flash、Gemini 3.5 Flash-Lite、Gemini 3.1 Flash-Lite、Gemini 3.1 Pro Preview、Gemini 3 Flash Preview、Gemini 2.5 Pro、Gemini 2.5 Flash、Gemini 2.5 Flash Lite、Gemma 4 31B IT、Gemma 4 26B A4B IT などの推奨モデルをサポート。チャット用途向けに Gemini 3 Flash は minimal thinking、Gemini 3 Pro は low thinking を既定値にします。Gemini 3.1 Flash-Lite Preview、Gemini 3 Pro Preview、Gemini 2.5 Flash Lite Preview などの lifecycle 上 deprecated なモデルは明示指定用に export を残しています
1245
+ - **Claude**: Claude Opus 5, Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Haiku 4.5 に加え、まだ利用可能だが非推奨の Claude 4 Opus, Claude 4 Sonnet, Claude 3 Haiku をサポート。調整可能な `reasoning_effort` は対応モデルに限り `output_config.effort` として送信します
1246
+ - **OpenRouter**: OpenRouterのキュレーション済みモデル一覧(OpenAI/Claude/Gemini/Z.ai/xAI/Kimi/Kwaipilot)をサポート。モデルIDはOpenRouter節を参照してください
1142
1247
  - **Z.ai**: GLM-5.2/GLM-5.1/GLM-5/GLM-5-Turbo(テキスト)、GLM-4.7/4.6(テキスト)、GLM-5V-Turbo/GLM-4.6V系(ビジョン)をサポート
1143
1248
  - **xAI**: Grok 4.5 をチャット用途向けに `reasoning_effort: 'low'` デフォルトでサポート。加えて Grok 4.3、Grok 4.20 の Reasoning/Non-Reasoning、Grok 4-1 Fast の Reasoning/Non-Reasoning をサポートし、全モデルでビジョン対応
1144
- - **Kimi**: Kimi K2.7 Code(`kimi-k2.7-code`)、Kimi K2.7 Code HighSpeed(`kimi-k2.7-code-highspeed`)、Kimi K2.6(`kimi-k2.6`、デフォルト)、Kimi K2.5(`kimi-k2.5`、いずれもビジョン対応)をサポート
1249
+ - **Kimi**: Kimi K3(`kimi-k3`、`low` / `high` / `max` reasoning、デフォルトは `max`)、Kimi K2.7 Code(`kimi-k2.7-code`)、Kimi K2.7 Code HighSpeed(`kimi-k2.7-code-highspeed`)、Kimi K2.6(`kimi-k2.6`、デフォルト)、Kimi K2.5(`kimi-k2.5`、いずれもビジョン対応)をサポート
1145
1250
  - **DeepSeek**: DeepSeek V4 Flash(`deepseek-v4-flash`)と DeepSeek V4 Pro(`deepseek-v4-pro`)をOpenAI互換Chat Completions経由でサポート。legacy alias の`deepseek-chat`と`deepseek-reasoner`はDeepSeek側で非推奨です
1146
1251
  - **Mistral**: Ministral 3系(`ministral-3b-2512`, `ministral-8b-2512`, `ministral-14b-2512`)と現行generalist modelをサポートし、streamingとvisionにも対応。adjustable `reasoning_effort`は対応モデルにだけ送信します
1147
1252
  - **Sakana AI**: Fugu(`fugu`)と Fugu Ultra(`fugu-ultra`, `fugu-ultra-20260615`)をOpenAI互換Chat Completions経由でサポート
package/README.md CHANGED
@@ -585,30 +585,61 @@ For CI/local deterministic runs, pair it with `examples/mock-openai-server`.
585
585
  ```typescript
586
586
  const claudeService = ChatServiceFactory.createChatService('claude', {
587
587
  apiKey: process.env.ANTHROPIC_API_KEY,
588
- model: 'claude-sonnet-5'
588
+ model: 'claude-opus-5',
589
+ reasoning_effort: 'low'
589
590
  });
590
591
  ```
591
592
 
593
+ `claude-opus-5` is available as an explicit high-capability option and is not
594
+ the package default. Claude Opus 5 has adaptive thinking enabled by default.
595
+ Supported Claude models accept `reasoning_effort`, which maps to Anthropic's
596
+ `output_config.effort`. The Claude API defaults to `high` when it is omitted:
597
+
598
+ - Claude Opus 5, Sonnet 5, Opus 4.8, and Opus 4.7:
599
+ `low`, `medium`, `high`, `xhigh`, or `max`.
600
+ - Claude Opus 4.6 and Sonnet 4.6:
601
+ `low`, `medium`, `high`, or `max`.
602
+ - Claude Opus 4.5: `low`, `medium`, or `high`.
603
+
604
+ Lower effort prioritizes latency and token efficiency, but does not guarantee
605
+ a shorter visible response. Use response-length prompting as well when concise
606
+ output is required.
607
+ For multi-turn tool calls, append the returned
608
+ `completion.assistant_message` to history so its provider-native thinking and
609
+ tool-use blocks are preserved.
610
+
592
611
  #### Google Gemini
593
612
 
594
613
  ```typescript
595
614
  const geminiService = ChatServiceFactory.createChatService('gemini', {
596
615
  apiKey: process.env.GOOGLE_API_KEY,
597
- model: 'gemini-3.1-flash-lite'
616
+ model: 'gemini-3.1-flash-lite',
617
+ reasoning_effort: 'minimal'
598
618
  });
599
619
  ```
600
620
 
601
- `gemini-3.1-flash-lite` is the recommended stable Flash-Lite model. Deprecated
621
+ `gemini-3.1-flash-lite` remains the default Flash-Lite model.
622
+ `gemini-3.5-flash-lite` is available as the latest stable, low-latency
623
+ Flash-Lite option, while `gemini-3.6-flash` is available for stronger agentic
624
+ and multimodal tasks. Deprecated
602
625
  preview and shutdown-scheduled models such as `gemini-3.1-flash-lite-preview`,
603
626
  `gemini-3-pro-preview`, and `gemini-2.5-flash-lite-preview-06-17` remain usable
604
627
  by explicit model string for backward compatibility, but are no longer
605
628
  advertised in the standard supported-model list for production use.
606
- `gemini-3.5-flash` is also available as the current stable Flash model.
629
+ `gemini-3.5-flash` is also available as a stable Flash model.
630
+
631
+ Gemini 3 models accept `reasoning_effort`, which maps to Gemini
632
+ `thinkingConfig.thinkingLevel` while keeping `includeThoughts: false`:
633
+
634
+ - Gemini 3 Flash / Flash-Lite: `minimal`, `low`, `medium`, or `high`;
635
+ defaults to `minimal` for low-latency chat.
636
+ - Gemini 3 Pro: `low`, `medium`, or `high`; defaults to `low` because Pro does
637
+ not support `minimal`.
607
638
 
608
- For chat-style usage, `gemini-3.5-flash` automatically sends Gemini
609
- `thinkingConfig` with `thinkingLevel: 'MINIMAL'` and `includeThoughts: false`.
610
- No user-facing option is required; this keeps default chat responses fast and
611
- reduces hidden thinking token usage.
639
+ This overrides the medium thinking default of Gemini 3.6/3.5 Flash and reduces
640
+ the risk of hidden thinking exhausting short output limits. Gemini 2.5 uses
641
+ `thinkingBudget` instead, so `reasoning_effort` is intentionally not sent for
642
+ those models.
612
643
 
613
644
  #### OpenRouter
614
645
 
@@ -623,26 +654,36 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
623
654
  ```
624
655
 
625
656
  **Important Notes for OpenRouter:**
626
- - Token limits are automatically disabled for the `gpt-oss-20b:free` model due to technical limitations
627
- - To control response length, include instructions in your prompt (e.g., "Please respond in 40 characters or less")
657
+ - Automatic token limits from `responseLength` are disabled for `openrouter/auto` and `openrouter/auto-beta` because a routed reasoning model can spend the entire output budget before emitting visible content. An explicitly supplied `maxTokens` is still honored.
658
+ - All token limits remain disabled for `gpt-oss-20b:free` and `z-ai/glm-5.2`. For these models and the dynamic routers, control response length with prompt instructions (e.g., "Please respond in 40 characters or less").
628
659
  - Free tier has rate limits (20 requests/minute)
629
660
  - Free tier detection is based on the model ID suffix `:free` (dynamic `:free` IDs are also rate-limited)
661
+ - `openrouter/auto-beta` is a Beta task-aware router. It chooses a model for each request and charges that routed model's rate; inspect the response `model` field or OpenRouter Activity to see the selection.
630
662
  - `openrouter/fusion` runs a multi-model panel plus a judge model; OpenRouter bills the sum of the underlying model calls and any enabled web search/fetch usage, not a single fixed model rate.
631
- - For `z-ai/glm-5.2`, OpenRouter reasoning defaults to `none` and token limits are automatically disabled because reasoning tokens can otherwise exhaust the output budget before visible content is emitted.
663
+ - For `z-ai/glm-5.2`, OpenRouter reasoning also defaults to `none`.
664
+ - Specialized coding models are explicit options rather than defaults. This includes `kwaipilot/kat-coder-air-v2.5` and `kwaipilot/kat-coder-pro-v2.5`, which are text-only.
665
+ - `moonshotai/kimi-k3` availability depends on upstream capacity; OpenRouter may return 429 responses when capacity is constrained.
666
+ - `x-ai/grok-4.5` has region-specific availability, including a current EU limitation. `~x-ai/grok-latest` inherits those limits when it resolves to Grok 4.5.
632
667
  - Supported models (curated list):
633
- - `openrouter/auto`
668
+ - `openrouter/auto`, `openrouter/auto-beta`
634
669
  - `openrouter/fusion`
635
670
  - `openai/gpt-oss-20b:free`
636
- - `~openai/gpt-latest`, `~openai/gpt-mini-latest`, `openai/gpt-5.5-pro`, `openai/gpt-5.5`
671
+ - `~openai/gpt-latest`, `~openai/gpt-mini-latest`
672
+ - `openai/gpt-5.6-sol`, `openai/gpt-5.6-terra`, `openai/gpt-5.6-luna`
673
+ - `openai/gpt-5.5-pro`, `openai/gpt-5.5`
637
674
  - `openai/gpt-5.1-chat`, `openai/gpt-5.1-codex`, `openai/gpt-5-mini`, `openai/gpt-5-nano`
638
675
  - `openai/gpt-4o`, `openai/gpt-4.1-mini`, `openai/gpt-4.1-nano`
639
676
  - `~anthropic/claude-sonnet-latest`, `~anthropic/claude-haiku-latest`
677
+ - `anthropic/claude-opus-5`
640
678
  - `anthropic/claude-opus-4`, `anthropic/claude-sonnet-4`
641
679
  - `anthropic/claude-3.7-sonnet`, `anthropic/claude-3.5-sonnet`, `anthropic/claude-haiku-4.5`
642
680
  - `~google/gemini-pro-latest`, `~google/gemini-flash-latest`
681
+ - `google/gemini-3.6-flash`, `google/gemini-3.5-flash-lite`
643
682
  - `google/gemini-2.5-pro`, `google/gemini-2.5-flash`, `google/gemini-2.5-flash-lite-preview-09-2025`
644
683
  - `z-ai/glm-5.2`, `z-ai/glm-4.7-flash`, `z-ai/glm-4.5-air`, `z-ai/glm-4.5-air:free`
645
- - `~moonshotai/kimi-latest`, `moonshotai/kimi-k2.7-code`, `moonshotai/kimi-k2.5`
684
+ - `~x-ai/grok-latest`, `x-ai/grok-4.5`
685
+ - `~moonshotai/kimi-latest`, `moonshotai/kimi-k3`, `moonshotai/kimi-k2.7-code`, `moonshotai/kimi-k2.5`
686
+ - `kwaipilot/kat-coder-air-v2.5`, `kwaipilot/kat-coder-pro-v2.5`
646
687
 
647
688
  **Dynamic OpenRouter free model refresh**
648
689
 
@@ -710,18 +751,21 @@ Notes:
710
751
  ```typescript
711
752
  const kimiService = ChatServiceFactory.createChatService('kimi', {
712
753
  apiKey: process.env.MOONSHOT_API_KEY,
713
- model: 'kimi-k2.6',
754
+ model: 'kimi-k3',
714
755
  // Optional: override endpoint or baseUrl
715
756
  // endpoint: 'https://api.moonshot.ai/v1/chat/completions',
716
757
  // baseUrl: 'https://api.moonshot.ai/v1',
717
- thinking: { type: 'enabled' }
758
+ reasoning_effort: 'low'
718
759
  });
719
760
  ```
720
761
 
721
762
  Notes:
722
763
  - Kimi uses OpenAI-compatible Chat Completions.
723
- - Supported models: `kimi-k2.7-code`, `kimi-k2.7-code-highspeed`, `kimi-k2.6`, `kimi-k2.5`
764
+ - Supported models: `kimi-k3`, `kimi-k2.7-code`, `kimi-k2.7-code-highspeed`, `kimi-k2.6`, `kimi-k2.5`
724
765
  - `kimi-k2.6` remains the default model for chat-oriented usage.
766
+ - Kimi K3 is an explicit reasoning model. It accepts `reasoning_effort: 'low' | 'high' | 'max'`, defaults to `max`, always reasons, and does not accept the K2.x `thinking` option. `none`, `minimal`, and `medium` are not supported.
767
+ - Kimi K3 uses `max_completion_tokens` for configured response limits.
768
+ - For Kimi K3 multi-turn and tool-call flows, append the returned `completion.assistant_message` to history so `reasoning_content` and `tool_calls` are preserved.
725
769
  - Kimi K2.7 Code models are coding-oriented and require thinking mode, so they keep `thinking` enabled even when tools are used.
726
770
  - Explicitly setting `thinking: { type: 'disabled' }` with Kimi K2.7 Code models throws before sending the request.
727
771
  - For older Kimi models, when tools are enabled, `thinking` is forced to `{ type: 'disabled' }`.
@@ -804,7 +848,7 @@ Notes:
804
848
  - Supported models: `fugu` (default), `fugu-ultra`, and `fugu-ultra-20260615`.
805
849
  - Sakana recommends `max_completion_tokens` for new Chat Completions integrations, but also accepts legacy `max_tokens`. This provider keeps `max_tokens` to match existing OpenAI-compatible provider behavior.
806
850
  - Sakana recommends the Responses API for best performance, but this provider uses Chat Completions because it matches the package's OpenAI-compatible chat path.
807
- - Direct browser usage may fail with CORS unless Sakana enables CORS for your origin. Use Node.js, a backend/serverless proxy, or `examples/sakana-basic` instead of calling Sakana directly from browser-only apps.
851
+ - Direct browser usage may fail with CORS unless Sakana enables CORS for your origin. Use Node.js, a backend/serverless proxy, or `examples/node-basic/sakana-example.js` instead of calling Sakana directly from browser-only apps.
808
852
 
809
853
  #### PLaMo
810
854
 
@@ -829,12 +873,34 @@ Notes:
829
873
 
830
874
  ```typescript
831
875
  const geminiNanoService = ChatServiceFactory.createChatService('gemini-nano', {
832
- responseLength: 'medium'
876
+ responseLength: 'short',
877
+ initialPrompts: [
878
+ {
879
+ role: 'system',
880
+ content: 'You are a cheerful character who speaks naturally.'
881
+ },
882
+ { role: 'user', content: 'How are you feeling today?' },
883
+ { role: 'assistant', content: 'I feel great and ready to chat!' },
884
+ { role: 'user', content: 'Are you ready?' },
885
+ { role: 'assistant', content: 'Yes, we can start anytime!' }
886
+ ]
833
887
  });
834
888
  ```
835
889
 
836
890
  Notes:
837
891
  - No API key required — uses Chrome's built-in LanguageModel API (Prompt API).
892
+ - System instructions, configured examples, and the most recent conversation
893
+ history are passed through `initialPrompts` with their roles preserved.
894
+ - If configured `initialPrompts` contain a system message, it is normalized to
895
+ the first entry. Keep few-shot examples short because they consume the
896
+ on-device model's context window.
897
+ - Gemini Nano uses concrete sentence-count guidance in addition to the soft
898
+ token budget: `veryShort` up to 1 sentence, `short` up to 2, `medium` up to
899
+ 3, `long` up to 5, and `veryLong` up to 10. `deep` keeps its approximately
900
+ 5000-token guidance without a sentence-count limit. Output length is still
901
+ best effort.
902
+ - Up to the most recent 20 user/assistant messages are included as structured
903
+ history.
838
904
  - Requires **Chrome 138+** with the following flags enabled:
839
905
  - `chrome://flags/#optimization-guide-on-device-model` → Enabled
840
906
  - `chrome://flags/#prompt-api-for-gemini-nano` → Enabled
@@ -843,6 +909,54 @@ Notes:
843
909
  - Vision is not supported.
844
910
  - The initial model download requires a user action and may take a few minutes.
845
911
 
912
+ ##### Tip: improve response-length consistency with examples
913
+
914
+ Setting `responseLength` automatically adds Gemini Nano-specific sentence-count,
915
+ formatting, and soft token-budget instructions. You can reinforce those
916
+ instructions by also passing two or three short user/assistant examples through
917
+ `initialPrompts`:
918
+
919
+ ```typescript
920
+ import {
921
+ ChatServiceFactory,
922
+ type GeminiNanoInitialPrompt
923
+ } from '@aituber-onair/chat';
924
+
925
+ const veryShortExamples: GeminiNanoInitialPrompt[] = [
926
+ { role: 'user', content: 'How are you feeling today?' },
927
+ { role: 'assistant', content: 'I feel great and ready to chat!' },
928
+ { role: 'user', content: 'What food do you like?' },
929
+ { role: 'assistant', content: 'Salmon sushi is my favorite!' }
930
+ ];
931
+
932
+ const service = ChatServiceFactory.createChatService('gemini-nano', {
933
+ responseLength: 'veryShort',
934
+ initialPrompts: veryShortExamples
935
+ });
936
+ ```
937
+
938
+ The examples are optional; the package applies the length instruction even
939
+ when `initialPrompts` is omitted. Examples help the on-device model learn the
940
+ desired response size, speaking style, reaction level, and tempo more
941
+ consistently.
942
+
943
+ - Match every assistant example to the selected preset. For `veryShort`, use
944
+ one sentence; for `short`, use no more than two.
945
+ - Write examples in the target character's voice. Hardcoded generic examples
946
+ are not added by the package because they could change the character's
947
+ personality.
948
+ - Do not reuse one-sentence examples for `medium` or longer responses when you
949
+ want visibly longer answers; those examples can bias the model toward short
950
+ output.
951
+ - Keep the set small because examples share the on-device context window with
952
+ the system prompt and conversation history.
953
+ - Recreate the chat service when `responseLength` or `initialPrompts` changes.
954
+ The React basic example does this automatically and applies its short
955
+ examples only to `veryShort` and `short`.
956
+ - These controls improve consistency but do not provide a strict output limit.
957
+ Chrome's LanguageModel API currently has no max-output-token option, so
958
+ Gemini Nano may occasionally exceed the requested sentence count.
959
+
846
960
  ### Vision Chat
847
961
 
848
962
  For built-in providers with curated model lists, the library pre-validates
@@ -1152,12 +1266,12 @@ Currently, the following AI providers are built-in:
1152
1266
 
1153
1267
  - **OpenAI**: Supports models like GPT-5.6 (Sol/Terra/Luna), GPT-5.5, GPT-5.4 Pro, GPT-5.4, GPT-5.4 Mini, GPT-5.4 Nano, GPT-5.1, GPT-5 (Nano/Mini/Standard), GPT-4.1 (including mini and nano), GPT-4, GPT-4o-mini, O3-mini, o1, o1-mini
1154
1268
  - **OpenAI-Compatible**: Supports arbitrary local/self-hosted model IDs via OpenAI-compatible endpoints. Vision capability is treated as `unknown` unless your app knows the endpoint-specific model catalog.
1155
- - **Gemini**: Supports recommended models like Gemini 3.5 Flash, Gemini 3.1 Flash-Lite, Gemini 3.1 Pro Preview, Gemini 3 Flash Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite, Gemma 4 31B IT, and Gemma 4 26B A4B IT. Gemini 3.5 Flash automatically uses minimal thinking for chat-style responses. Deprecated lifecycle models such as Gemini 3.1 Flash-Lite Preview, Gemini 3 Pro Preview, and Gemini 2.5 Flash Lite Preview remain exported for explicit use.
1156
- - **Claude**: Supports current Claude API model IDs including Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Haiku 4.5, plus deprecated-but-still-available Claude 4 Opus, Claude 4 Sonnet, and Claude 3 Haiku
1157
- - **OpenRouter**: Supports a curated OpenRouter model list (OpenAI/Claude/Gemini/Z.ai/Kimi). See the OpenRouter section for model IDs.
1269
+ - **Gemini**: Supports recommended models like Gemini 3.6 Flash, Gemini 3.5 Flash, Gemini 3.5 Flash-Lite, Gemini 3.1 Flash-Lite, Gemini 3.1 Pro Preview, Gemini 3 Flash Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite, Gemma 4 31B IT, and Gemma 4 26B A4B IT. Gemini 3 Flash models default to minimal thinking for chat-style responses, while Gemini 3 Pro models default to low. Deprecated lifecycle models such as Gemini 3.1 Flash-Lite Preview, Gemini 3 Pro Preview, and Gemini 2.5 Flash Lite Preview remain exported for explicit use.
1270
+ - **Claude**: Supports current Claude API model IDs including Claude Opus 5, Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Haiku 4.5, plus deprecated-but-still-available Claude 4 Opus, Claude 4 Sonnet, and Claude 3 Haiku. Adjustable `reasoning_effort` is sent as `output_config.effort` only for models that support it
1271
+ - **OpenRouter**: Supports a curated OpenRouter model list (OpenAI/Claude/Gemini/Z.ai/xAI/Kimi/Kwaipilot). See the OpenRouter section for model IDs.
1158
1272
  - **Z.ai**: Supports GLM-5.2/GLM-5.1/GLM-5/GLM-5-Turbo (text), GLM-4.7/4.6 (text), and GLM-5V-Turbo/GLM-4.6V family (vision)
1159
1273
  - **xAI**: Supports Grok 4.5 with `reasoning_effort: 'low'` by default for chat-style responses, plus Grok 4.3, Grok 4.20 Reasoning/Non-Reasoning, and Grok 4-1 Fast Reasoning/Non-Reasoning, all with vision support.
1160
- - **Kimi**: Supports Kimi K2.7 Code (`kimi-k2.7-code`), Kimi K2.7 Code HighSpeed (`kimi-k2.7-code-highspeed`), Kimi K2.6 (`kimi-k2.6`, default), and Kimi K2.5 (`kimi-k2.5`) with vision support
1274
+ - **Kimi**: Supports Kimi K3 (`kimi-k3`, `low` / `high` / `max` reasoning with `max` as the default), Kimi K2.7 Code (`kimi-k2.7-code`), Kimi K2.7 Code HighSpeed (`kimi-k2.7-code-highspeed`), Kimi K2.6 (`kimi-k2.6`, default), and Kimi K2.5 (`kimi-k2.5`) with vision support
1161
1275
  - **DeepSeek**: Supports DeepSeek V4 Flash (`deepseek-v4-flash`) and DeepSeek V4 Pro (`deepseek-v4-pro`) via OpenAI-compatible Chat Completions. Legacy aliases `deepseek-chat` and `deepseek-reasoner` are deprecated by DeepSeek.
1162
1276
  - **Mistral**: Supports the Ministral 3 family (`ministral-3b-2512`, `ministral-8b-2512`, `ministral-14b-2512`) and current Mistral generalist models, with streaming and vision support. Adjustable `reasoning_effort` is only sent for supported models.
1163
1277
  - **Sakana AI**: Supports Fugu (`fugu`) and Fugu Ultra (`fugu-ultra`, `fugu-ultra-20260615`) via OpenAI-compatible Chat Completions.
@@ -13,5 +13,20 @@ export declare const MODEL_CLAUDE_4_6_OPUS = "claude-opus-4-6";
13
13
  export declare const MODEL_CLAUDE_4_7_OPUS = "claude-opus-4-7";
14
14
  export declare const MODEL_CLAUDE_4_8_OPUS = "claude-opus-4-8";
15
15
  export declare const MODEL_CLAUDE_5_SONNET = "claude-sonnet-5";
16
+ export declare const MODEL_CLAUDE_5_OPUS = "claude-opus-5";
17
+ export type ClaudeReasoningEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
16
18
  export declare const CLAUDE_VISION_SUPPORTED_MODELS: string[];
19
+ /**
20
+ * Return the effort values supported by a Claude model.
21
+ */
22
+ export declare function getClaudeSupportedReasoningEfforts(model: string): readonly ClaudeReasoningEffort[];
23
+ export declare function isClaudeReasoningEffortModel(model: string): boolean;
24
+ /**
25
+ * Claude API defaults to high effort when output_config.effort is omitted.
26
+ */
27
+ export declare function getDefaultClaudeReasoningEffort(model: string): ClaudeReasoningEffort | undefined;
28
+ /**
29
+ * Normalize UI state when switching between Claude models.
30
+ */
31
+ export declare function normalizeClaudeReasoningEffort(model: string, effort?: ClaudeReasoningEffort): ClaudeReasoningEffort | undefined;
17
32
  //# sourceMappingURL=claude.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/constants/claude.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,0CAA0C,CAAC;AAG3E,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD,eAAO,MAAM,8BAA8B,UAY1C,CAAC"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/constants/claude.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,0CAA0C,CAAC;AAG3E,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAgChF,eAAO,MAAM,8BAA8B,UAa1C,CAAC;AAEF;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GACZ,SAAS,qBAAqB,EAAE,CAElC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GACZ,qBAAqB,GAAG,SAAS,CAEnC;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,qBAAqB,GAC7B,qBAAqB,GAAG,SAAS,CAenC"}
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CLAUDE_VISION_SUPPORTED_MODELS = exports.MODEL_CLAUDE_5_SONNET = exports.MODEL_CLAUDE_4_8_OPUS = exports.MODEL_CLAUDE_4_7_OPUS = exports.MODEL_CLAUDE_4_6_OPUS = exports.MODEL_CLAUDE_4_6_SONNET = exports.MODEL_CLAUDE_4_5_OPUS = exports.MODEL_CLAUDE_4_5_HAIKU = exports.MODEL_CLAUDE_4_5_SONNET = exports.MODEL_CLAUDE_4_OPUS = exports.MODEL_CLAUDE_4_SONNET = exports.MODEL_CLAUDE_3_7_SONNET = exports.MODEL_CLAUDE_3_5_SONNET = exports.MODEL_CLAUDE_3_5_HAIKU = exports.MODEL_CLAUDE_3_HAIKU = exports.ENDPOINT_CLAUDE_API = void 0;
3
+ exports.CLAUDE_VISION_SUPPORTED_MODELS = exports.MODEL_CLAUDE_5_OPUS = exports.MODEL_CLAUDE_5_SONNET = exports.MODEL_CLAUDE_4_8_OPUS = exports.MODEL_CLAUDE_4_7_OPUS = exports.MODEL_CLAUDE_4_6_OPUS = exports.MODEL_CLAUDE_4_6_SONNET = exports.MODEL_CLAUDE_4_5_OPUS = exports.MODEL_CLAUDE_4_5_HAIKU = exports.MODEL_CLAUDE_4_5_SONNET = exports.MODEL_CLAUDE_4_OPUS = exports.MODEL_CLAUDE_4_SONNET = exports.MODEL_CLAUDE_3_7_SONNET = exports.MODEL_CLAUDE_3_5_SONNET = exports.MODEL_CLAUDE_3_5_HAIKU = exports.MODEL_CLAUDE_3_HAIKU = exports.ENDPOINT_CLAUDE_API = void 0;
4
+ exports.getClaudeSupportedReasoningEfforts = getClaudeSupportedReasoningEfforts;
5
+ exports.isClaudeReasoningEffortModel = isClaudeReasoningEffortModel;
6
+ exports.getDefaultClaudeReasoningEffort = getDefaultClaudeReasoningEffort;
7
+ exports.normalizeClaudeReasoningEffort = normalizeClaudeReasoningEffort;
4
8
  exports.ENDPOINT_CLAUDE_API = 'https://api.anthropic.com/v1/messages';
5
9
  // claude model
6
10
  exports.MODEL_CLAUDE_3_HAIKU = 'claude-3-haiku-20240307';
@@ -17,6 +21,30 @@ exports.MODEL_CLAUDE_4_6_OPUS = 'claude-opus-4-6';
17
21
  exports.MODEL_CLAUDE_4_7_OPUS = 'claude-opus-4-7';
18
22
  exports.MODEL_CLAUDE_4_8_OPUS = 'claude-opus-4-8';
19
23
  exports.MODEL_CLAUDE_5_SONNET = 'claude-sonnet-5';
24
+ exports.MODEL_CLAUDE_5_OPUS = 'claude-opus-5';
25
+ const CLAUDE_STANDARD_REASONING_EFFORTS = [
26
+ 'low',
27
+ 'medium',
28
+ 'high',
29
+ ];
30
+ const CLAUDE_MAX_REASONING_EFFORTS = [
31
+ ...CLAUDE_STANDARD_REASONING_EFFORTS,
32
+ 'max',
33
+ ];
34
+ const CLAUDE_XHIGH_REASONING_EFFORTS = [
35
+ ...CLAUDE_STANDARD_REASONING_EFFORTS,
36
+ 'xhigh',
37
+ 'max',
38
+ ];
39
+ const CLAUDE_REASONING_EFFORTS_BY_MODEL = {
40
+ [exports.MODEL_CLAUDE_4_5_OPUS]: CLAUDE_STANDARD_REASONING_EFFORTS,
41
+ [exports.MODEL_CLAUDE_4_6_SONNET]: CLAUDE_MAX_REASONING_EFFORTS,
42
+ [exports.MODEL_CLAUDE_4_6_OPUS]: CLAUDE_MAX_REASONING_EFFORTS,
43
+ [exports.MODEL_CLAUDE_4_7_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
44
+ [exports.MODEL_CLAUDE_4_8_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
45
+ [exports.MODEL_CLAUDE_5_SONNET]: CLAUDE_XHIGH_REASONING_EFFORTS,
46
+ [exports.MODEL_CLAUDE_5_OPUS]: CLAUDE_XHIGH_REASONING_EFFORTS,
47
+ };
20
48
  exports.CLAUDE_VISION_SUPPORTED_MODELS = [
21
49
  exports.MODEL_CLAUDE_3_HAIKU,
22
50
  exports.MODEL_CLAUDE_4_SONNET,
@@ -29,5 +57,37 @@ exports.CLAUDE_VISION_SUPPORTED_MODELS = [
29
57
  exports.MODEL_CLAUDE_4_7_OPUS,
30
58
  exports.MODEL_CLAUDE_4_8_OPUS,
31
59
  exports.MODEL_CLAUDE_5_SONNET,
60
+ exports.MODEL_CLAUDE_5_OPUS,
32
61
  ];
62
+ /**
63
+ * Return the effort values supported by a Claude model.
64
+ */
65
+ function getClaudeSupportedReasoningEfforts(model) {
66
+ return CLAUDE_REASONING_EFFORTS_BY_MODEL[model] ?? [];
67
+ }
68
+ function isClaudeReasoningEffortModel(model) {
69
+ return getClaudeSupportedReasoningEfforts(model).length > 0;
70
+ }
71
+ /**
72
+ * Claude API defaults to high effort when output_config.effort is omitted.
73
+ */
74
+ function getDefaultClaudeReasoningEffort(model) {
75
+ return isClaudeReasoningEffortModel(model) ? 'high' : undefined;
76
+ }
77
+ /**
78
+ * Normalize UI state when switching between Claude models.
79
+ */
80
+ function normalizeClaudeReasoningEffort(model, effort) {
81
+ const supported = getClaudeSupportedReasoningEfforts(model);
82
+ if (supported.length === 0) {
83
+ return undefined;
84
+ }
85
+ if (!effort) {
86
+ return getDefaultClaudeReasoningEffort(model);
87
+ }
88
+ if (supported.includes(effort)) {
89
+ return effort;
90
+ }
91
+ return 'high';
92
+ }
33
93
  //# sourceMappingURL=claude.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/constants/claude.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,uCAAuC,CAAC;AAE3E,eAAe;AACF,QAAA,oBAAoB,GAAG,yBAAyB,CAAC;AACjD,QAAA,sBAAsB,GAAG,2BAA2B,CAAC;AACrD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,qBAAqB,GAAG,0BAA0B,CAAC;AACnD,QAAA,mBAAmB,GAAG,wBAAwB,CAAC;AAC/C,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,sBAAsB,GAAG,2BAA2B,CAAC;AACrD,QAAA,qBAAqB,GAAG,0BAA0B,CAAC;AACnD,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAE1C,QAAA,8BAA8B,GAAG;IAC5C,4BAAoB;IACpB,6BAAqB;IACrB,2BAAmB;IACnB,+BAAuB;IACvB,8BAAsB;IACtB,6BAAqB;IACrB,+BAAuB;IACvB,6BAAqB;IACrB,6BAAqB;IACrB,6BAAqB;IACrB,6BAAqB;CACtB,CAAC"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/constants/claude.ts"],"names":[],"mappings":";;;AAqEA,gFAIC;AAED,oEAEC;AAKD,0EAIC;AAKD,wEAkBC;AA7GY,QAAA,mBAAmB,GAAG,uCAAuC,CAAC;AAE3E,eAAe;AACF,QAAA,oBAAoB,GAAG,yBAAyB,CAAC;AACjD,QAAA,sBAAsB,GAAG,2BAA2B,CAAC;AACrD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,qBAAqB,GAAG,0BAA0B,CAAC;AACnD,QAAA,mBAAmB,GAAG,wBAAwB,CAAC;AAC/C,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AACvD,QAAA,sBAAsB,GAAG,2BAA2B,CAAC;AACrD,QAAA,qBAAqB,GAAG,0BAA0B,CAAC;AACnD,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,qBAAqB,GAAG,iBAAiB,CAAC;AAC1C,QAAA,mBAAmB,GAAG,eAAe,CAAC;AAInD,MAAM,iCAAiC,GAAqC;IAC1E,KAAK;IACL,QAAQ;IACR,MAAM;CACP,CAAC;AAEF,MAAM,4BAA4B,GAAqC;IACrE,GAAG,iCAAiC;IACpC,KAAK;CACN,CAAC;AAEF,MAAM,8BAA8B,GAAqC;IACvE,GAAG,iCAAiC;IACpC,OAAO;IACP,KAAK;CACN,CAAC;AAEF,MAAM,iCAAiC,GAGnC;IACF,CAAC,6BAAqB,CAAC,EAAE,iCAAiC;IAC1D,CAAC,+BAAuB,CAAC,EAAE,4BAA4B;IACvD,CAAC,6BAAqB,CAAC,EAAE,4BAA4B;IACrD,CAAC,6BAAqB,CAAC,EAAE,8BAA8B;IACvD,CAAC,6BAAqB,CAAC,EAAE,8BAA8B;IACvD,CAAC,6BAAqB,CAAC,EAAE,8BAA8B;IACvD,CAAC,2BAAmB,CAAC,EAAE,8BAA8B;CACtD,CAAC;AAEW,QAAA,8BAA8B,GAAG;IAC5C,4BAAoB;IACpB,6BAAqB;IACrB,2BAAmB;IACnB,+BAAuB;IACvB,8BAAsB;IACtB,6BAAqB;IACrB,+BAAuB;IACvB,6BAAqB;IACrB,6BAAqB;IACrB,6BAAqB;IACrB,6BAAqB;IACrB,2BAAmB;CACpB,CAAC;AAEF;;GAEG;AACH,SAAgB,kCAAkC,CAChD,KAAa;IAEb,OAAO,iCAAiC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAgB,4BAA4B,CAAC,KAAa;IACxD,OAAO,kCAAkC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,+BAA+B,CAC7C,KAAa;IAEb,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,SAAgB,8BAA8B,CAC5C,KAAa,EACb,MAA8B;IAE9B,MAAM,SAAS,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}