@aituber-onair/chat 0.21.2 → 0.23.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 (121) hide show
  1. package/README.ja.md +63 -3
  2. package/README.md +64 -3
  3. package/dist/cjs/constants/index.d.ts +1 -0
  4. package/dist/cjs/constants/index.d.ts.map +1 -1
  5. package/dist/cjs/constants/index.js +1 -0
  6. package/dist/cjs/constants/index.js.map +1 -1
  7. package/dist/cjs/constants/xai.d.ts +11 -0
  8. package/dist/cjs/constants/xai.d.ts.map +1 -0
  9. package/dist/cjs/constants/xai.js +24 -0
  10. package/dist/cjs/constants/xai.js.map +1 -0
  11. package/dist/cjs/index.d.ts +3 -1
  12. package/dist/cjs/index.d.ts.map +1 -1
  13. package/dist/cjs/index.js +6 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/services/ChatServiceFactory.d.ts +9 -1
  16. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  17. package/dist/cjs/services/ChatServiceFactory.js +25 -0
  18. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  19. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +20 -1
  20. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  21. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts +3 -1
  22. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  23. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +7 -1
  24. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  25. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.d.ts +3 -1
  26. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -1
  27. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js +7 -1
  28. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -1
  29. package/dist/cjs/services/providers/index.d.ts +2 -1
  30. package/dist/cjs/services/providers/index.d.ts.map +1 -1
  31. package/dist/cjs/services/providers/index.js +2 -0
  32. package/dist/cjs/services/providers/index.js.map +1 -1
  33. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts +3 -1
  34. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  35. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js +7 -1
  36. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  37. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts +3 -1
  38. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  39. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +7 -1
  40. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  41. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts +4 -1
  42. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts.map +1 -1
  43. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js +10 -1
  44. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js.map +1 -1
  45. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +3 -1
  46. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  47. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +9 -1
  48. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  49. package/dist/cjs/services/providers/xai/XAIChatService.d.ts +65 -0
  50. package/dist/cjs/services/providers/xai/XAIChatService.d.ts.map +1 -0
  51. package/dist/cjs/services/providers/xai/XAIChatService.js +150 -0
  52. package/dist/cjs/services/providers/xai/XAIChatService.js.map +1 -0
  53. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts +38 -0
  54. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -0
  55. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js +76 -0
  56. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js.map +1 -0
  57. package/dist/cjs/services/providers/zai/ZAIChatServiceProvider.d.ts +3 -1
  58. package/dist/cjs/services/providers/zai/ZAIChatServiceProvider.d.ts.map +1 -1
  59. package/dist/cjs/services/providers/zai/ZAIChatServiceProvider.js +7 -1
  60. package/dist/cjs/services/providers/zai/ZAIChatServiceProvider.js.map +1 -1
  61. package/dist/esm/constants/index.d.ts +1 -0
  62. package/dist/esm/constants/index.d.ts.map +1 -1
  63. package/dist/esm/constants/index.js +1 -0
  64. package/dist/esm/constants/index.js.map +1 -1
  65. package/dist/esm/constants/xai.d.ts +11 -0
  66. package/dist/esm/constants/xai.d.ts.map +1 -0
  67. package/dist/esm/constants/xai.js +20 -0
  68. package/dist/esm/constants/xai.js.map +1 -0
  69. package/dist/esm/index.d.ts +3 -1
  70. package/dist/esm/index.d.ts.map +1 -1
  71. package/dist/esm/index.js +3 -0
  72. package/dist/esm/index.js.map +1 -1
  73. package/dist/esm/services/ChatServiceFactory.d.ts +9 -1
  74. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  75. package/dist/esm/services/ChatServiceFactory.js +25 -0
  76. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  77. package/dist/esm/services/providers/ChatServiceProvider.d.ts +20 -1
  78. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  79. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts +3 -1
  80. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  81. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +7 -1
  82. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  83. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.d.ts +3 -1
  84. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -1
  85. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js +7 -1
  86. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -1
  87. package/dist/esm/services/providers/index.d.ts +2 -1
  88. package/dist/esm/services/providers/index.d.ts.map +1 -1
  89. package/dist/esm/services/providers/index.js +2 -0
  90. package/dist/esm/services/providers/index.js.map +1 -1
  91. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts +3 -1
  92. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  93. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js +7 -1
  94. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  95. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts +3 -1
  96. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  97. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +7 -1
  98. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  99. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts +4 -1
  100. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts.map +1 -1
  101. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js +10 -1
  102. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js.map +1 -1
  103. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +3 -1
  104. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  105. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +9 -1
  106. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  107. package/dist/esm/services/providers/xai/XAIChatService.d.ts +65 -0
  108. package/dist/esm/services/providers/xai/XAIChatService.d.ts.map +1 -0
  109. package/dist/esm/services/providers/xai/XAIChatService.js +146 -0
  110. package/dist/esm/services/providers/xai/XAIChatService.js.map +1 -0
  111. package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts +38 -0
  112. package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -0
  113. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js +72 -0
  114. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js.map +1 -0
  115. package/dist/esm/services/providers/zai/ZAIChatServiceProvider.d.ts +3 -1
  116. package/dist/esm/services/providers/zai/ZAIChatServiceProvider.d.ts.map +1 -1
  117. package/dist/esm/services/providers/zai/ZAIChatServiceProvider.js +7 -1
  118. package/dist/esm/services/providers/zai/ZAIChatServiceProvider.js.map +1 -1
  119. package/dist/umd/aituber-onair-chat.js +320 -7
  120. package/dist/umd/aituber-onair-chat.min.js +6 -6
  121. package/package.json +1 -1
package/README.ja.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  ![@aituber-onair/chat ロゴ](./images/aituber-onair-chat.png)
4
4
 
5
- AITuber OnAirのチャット・LLM API統合ライブラリです。このパッケージは、OpenAI、ローカルLLM含むOpenAI互換プロバイダー、Claude、Gemini、OpenRouter、Z.ai、Kimi等の様々なAIチャットプロバイダーとやり取りするための統一されたインターフェースを提供します。
5
+ AITuber OnAirのチャット・LLM API統合ライブラリです。このパッケージは、OpenAI、ローカルLLM含むOpenAI互換プロバイダー、Claude、Gemini、OpenRouter、Z.ai、xAI、Kimi等の様々なAIチャットプロバイダーとやり取りするための統一されたインターフェースを提供します。
6
6
 
7
7
  ## 機能
8
8
 
9
- - 🤖 **複数のAIプロバイダー対応**: OpenAI、ローカルLLM含むOpenAI互換プロバイダー、Claude (Anthropic)、Google Gemini、OpenRouter、Z.ai、Kimi
9
+ - 🤖 **複数のAIプロバイダー対応**: OpenAI、ローカルLLM含むOpenAI互換プロバイダー、Claude (Anthropic)、Google Gemini、OpenRouter、Z.ai、xAI、Kimi
10
10
  - 🔄 **統一されたインターフェース**: 異なるプロバイダー間での一貫したAPI
11
11
  - 🛠️ **ツール・関数呼び出し**: AI関数呼び出しの自動反復処理をサポート
12
12
  - 💬 **ストリーミングレスポンス**: リアルタイムストリーミングチャット応答
@@ -182,6 +182,9 @@ const compatibleService = ChatServiceFactory.createChatService(
182
182
  - `openai-compatible` は `endpoint` と `model` の指定が必須です。
183
183
  - `openai-compatible` では `apiKey` は任意です。
184
184
  - `openai-compatible` では `mcpServers` は利用できません。
185
+ - `openai-compatible` の vision 対応可否は `unknown` として扱われます。
186
+ 画像リクエスト自体は許可されますが、未対応の endpoint / model の
187
+ 場合は実行時エラーになります。
185
188
  - 既存の `openai` プロバイダーの挙動は変更されません。
186
189
 
187
190
  `reasoning_effort` の選択肢はモデルによって異なります。
@@ -212,7 +215,7 @@ const compatibleService = ChatServiceFactory.createChatService(
212
215
 
213
216
  ベストエフォート:
214
217
  - tools/function calling
215
- - vision入力
218
+ - vision入力(`openai-compatible` では実行時検証)
216
219
  - JSONモードの厳密互換
217
220
 
218
221
  ### OpenAI互換APIトラブルシューティング
@@ -226,6 +229,9 @@ const compatibleService = ChatServiceFactory.createChatService(
226
229
  サーバー側が期待するトークン形式を確認してください。
227
230
  - model名: 互換サーバーごとに利用可能なモデルIDが異なります。
228
231
  エンドポイントが受け付ける正確なモデル名を指定してください。
232
+ - Vision: `openai-compatible` では画像対応を事前検証しません。
233
+ 画像付きリクエストが失敗する場合は、endpoint と model の双方が
234
+ vision入力に対応しているか確認してください。
229
235
  - ストリーム互換: `stream: true` では OpenAI互換のSSE形式
230
236
  (`data: {...}` + `data: [DONE]`)を想定しています。
231
237
  形式が異なる場合、ストリーム解析に失敗する可能性があります。
@@ -331,6 +337,21 @@ const zaiService = ChatServiceFactory.createChatService('zai', {
331
337
  - ビジョン対応モデル: `glm-4.6V`, `glm-4.6V-FlashX`, `glm-4.6V-Flash`
332
338
  - `thinking` はデフォルトで無効化しています。
333
339
 
340
+ #### xAI(Grok)
341
+
342
+ ```typescript
343
+ const xaiService = ChatServiceFactory.createChatService('xai', {
344
+ apiKey: process.env.XAI_API_KEY,
345
+ model: 'grok-4-1-fast-non-reasoning',
346
+ visionModel: 'grok-4-1-fast-non-reasoning', // 任意: xAI の全モデルがビジョン対応
347
+ });
348
+ ```
349
+
350
+ 注意:
351
+ - xAIはOpenAI互換のChat Completionsを利用します。
352
+ - 対応モデル: `grok-4.20-0309-reasoning`, `grok-4.20-0309-non-reasoning`, `grok-4-1-fast-reasoning`, `grok-4-1-fast-non-reasoning`
353
+ - すべての対応 xAI モデルでビジョンとツール・関数呼び出しを利用できます。
354
+
334
355
  #### Kimi(Moonshot)
335
356
 
336
357
  ```typescript
@@ -363,6 +384,11 @@ const kimiService = ChatServiceFactory.createChatService('kimi', {
363
384
 
364
385
  ### ビジョンチャット
365
386
 
387
+ 組み込み provider のうち、対応モデル一覧を持つものは vision 対応を
388
+ 事前判定します。一方 `openai-compatible` は endpoint / model ごとの差が
389
+ 大きいため、原則 `unknown` として扱います。この場合でも画像リクエストは
390
+ 許可され、非互換は接続先 endpoint の実行時エラーとして表面化します。
391
+
366
392
  ```typescript
367
393
  const visionMessage = {
368
394
  role: 'user',
@@ -385,6 +411,17 @@ await chatService.processVisionChat(
385
411
  );
386
412
  ```
387
413
 
414
+ `ChatServiceFactory` から事前判定の状態を参照できます。
415
+
416
+ ```typescript
417
+ const level = ChatServiceFactory.getVisionSupportLevelForModel(
418
+ 'openai-compatible',
419
+ 'your-local-model',
420
+ );
421
+
422
+ console.log(level); // 'unknown'
423
+ ```
424
+
388
425
  ### ツール・関数呼び出し
389
426
 
390
427
  ```typescript
@@ -592,17 +629,40 @@ interface MessageWithVision {
592
629
  }
593
630
 
594
631
  type ChatResponseLength = 'veryShort' | 'short' | 'medium' | 'long' | 'veryLong';
632
+ type VisionSupportLevel = 'supported' | 'unsupported' | 'unknown';
633
+ ```
634
+
635
+ ### Vision対応判定
636
+
637
+ ```typescript
638
+ const providerLevel = ChatServiceFactory.getVisionSupportLevel(
639
+ 'openai-compatible',
640
+ );
641
+ const modelLevel = ChatServiceFactory.getVisionSupportLevelForModel(
642
+ 'openai-compatible',
643
+ 'your-local-model',
644
+ );
645
+
646
+ console.log(providerLevel); // 'unknown'
647
+ console.log(modelLevel); // 'unknown'
595
648
  ```
596
649
 
650
+ 意味:
651
+ - `supported`: リクエスト送信前に vision 対応と分かっている
652
+ - `unsupported`: リクエスト送信前に非対応と分かっている
653
+ - `unknown`: 事前判定できないが、実際には成功する可能性がある
654
+
597
655
  ## 利用可能なプロバイダー
598
656
 
599
657
  現在、以下のAIプロバイダーが組み込まれています:
600
658
 
601
659
  - **OpenAI**: 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のモデルをサポート
660
+ - **OpenAI-Compatible**: OpenAI互換 endpoint 経由で任意のローカル/セルフホスト model ID を利用できます。vision 対応可否は endpoint ごとに差があるため、原則 `unknown` 扱いです
602
661
  - **Gemini**: Gemini 3.1 Pro Preview, Gemini 3.1 Flash-Lite Preview, Gemini 3 Pro Preview, Gemini 3 Flash Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite Preview, Gemini 2.0 Flash, Gemini 2.0 Flash-Liteのモデルをサポート
603
662
  - **Claude**: Claude Sonnet 4.6, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5, Claude 4 Sonnet, Claude 4 Opus, Claude 3.7 Sonnet, Claude 3.5 Haiku/Sonnet, Claude 3 Haikuのモデルをサポート
604
663
  - **OpenRouter**: OpenRouterのキュレーション済みモデル一覧(OpenAI/Claude/Gemini/Z.ai/Kimi)をサポート。モデルIDはOpenRouter節を参照してください
605
664
  - **Z.ai**: GLM-5/GLM-5-Turbo(テキスト)、GLM-4.7/4.6(テキスト)、GLM-4.6V系(ビジョン)をサポート
665
+ - **xAI**: Grok 4.20 の Reasoning/Non-Reasoning と Grok 4-1 Fast の Reasoning/Non-Reasoning をサポートし、全モデルでビジョン対応
606
666
  - **Kimi**: Kimi K2.5(`kimi-k2.5`、ビジョン対応)をサポート
607
667
 
608
668
  ## ライセンス
package/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  ![@aituber-onair/chat logo](https://github.com/shinshin86/aituber-onair/raw/main/packages/chat/images/aituber-onair-chat.png)
4
4
 
5
- Chat and LLM API integration library for AITuber OnAir. This package provides a unified interface for interacting with various AI chat providers including OpenAI, OpenAI-compatible, Claude, Gemini, OpenRouter, Z.ai, and Kimi.
5
+ Chat and LLM API integration library for AITuber OnAir. This package provides a unified interface for interacting with various AI chat providers including OpenAI, OpenAI-compatible, Claude, Gemini, OpenRouter, Z.ai, xAI, and Kimi.
6
6
 
7
7
  ## Features
8
8
 
9
- - 🤖 **Multiple AI Provider Support**: OpenAI, OpenAI-compatible, Claude (Anthropic), Google Gemini, OpenRouter, Z.ai, and Kimi
9
+ - 🤖 **Multiple AI Provider Support**: OpenAI, OpenAI-compatible, Claude (Anthropic), Google Gemini, OpenRouter, Z.ai, xAI, and Kimi
10
10
  - 🔄 **Unified Interface**: Consistent API across different providers
11
11
  - 🛠️ **Tool/Function Calling**: Support for AI function calling with automatic iteration
12
12
  - 💬 **Streaming Responses**: Real-time streaming chat responses
@@ -182,6 +182,9 @@ Notes:
182
182
  - `openai-compatible` requires both `endpoint` and `model`.
183
183
  - `apiKey` is optional for `openai-compatible`.
184
184
  - `openai-compatible` does not support `mcpServers`.
185
+ - Vision support for `openai-compatible` is treated as `unknown`.
186
+ Image requests are allowed, but unsupported endpoints or models will fail
187
+ at runtime.
185
188
  - Existing `openai` provider behavior is unchanged.
186
189
 
187
190
  `reasoning_effort` options differ per model:
@@ -212,7 +215,7 @@ Required:
212
215
 
213
216
  Best effort:
214
217
  - tools/function calling
215
- - vision input support
218
+ - vision input support (runtime-validated for `openai-compatible`)
216
219
  - strict JSON mode compatibility across implementations
217
220
 
218
221
  ### OpenAI-Compatible Troubleshooting
@@ -224,6 +227,9 @@ Best effort:
224
227
  Confirm the expected token format on the server side.
225
228
  - Model name: Compatible servers often expose different model IDs.
226
229
  Confirm the exact model name accepted by your endpoint.
230
+ - Vision: `openai-compatible` does not pre-validate vision capability.
231
+ If an image request fails, confirm that both the endpoint and selected model
232
+ actually support image input.
227
233
  - Stream compatibility: `stream: true` assumes OpenAI-compatible SSE chunks
228
234
  (`data: { ... }` + `data: [DONE]`). If the format differs, streaming parse
229
235
  may fail.
@@ -327,6 +333,21 @@ Notes:
327
333
  - Supported vision models: `glm-4.6V`, `glm-4.6V-FlashX`, `glm-4.6V-Flash`
328
334
  - `thinking` is disabled by default to match fast response behavior.
329
335
 
336
+ #### xAI (Grok)
337
+
338
+ ```typescript
339
+ const xaiService = ChatServiceFactory.createChatService('xai', {
340
+ apiKey: process.env.XAI_API_KEY,
341
+ model: 'grok-4-1-fast-non-reasoning',
342
+ visionModel: 'grok-4-1-fast-non-reasoning', // Optional: all xAI models support vision
343
+ });
344
+ ```
345
+
346
+ Notes:
347
+ - xAI uses OpenAI-compatible Chat Completions.
348
+ - Supported models: `grok-4.20-0309-reasoning`, `grok-4.20-0309-non-reasoning`, `grok-4-1-fast-reasoning`, `grok-4-1-fast-non-reasoning`
349
+ - All supported xAI models support vision and tool/function calling.
350
+
330
351
  #### Kimi (Moonshot)
331
352
 
332
353
  ```typescript
@@ -359,6 +380,12 @@ Notes for self-hosted:
359
380
 
360
381
  ### Vision Chat
361
382
 
383
+ For built-in providers with curated model lists, the library pre-validates
384
+ vision support. For `openai-compatible`, vision support is reported as
385
+ `'unknown'` unless your application adds its own endpoint-specific knowledge.
386
+ In that case, image requests are still allowed and any incompatibility is
387
+ surfaced as a runtime error from the target endpoint.
388
+
362
389
  ```typescript
363
390
  const visionMessage = {
364
391
  role: 'user',
@@ -381,6 +408,17 @@ await chatService.processVisionChat(
381
408
  );
382
409
  ```
383
410
 
411
+ You can inspect the pre-validation status from `ChatServiceFactory`:
412
+
413
+ ```typescript
414
+ const level = ChatServiceFactory.getVisionSupportLevelForModel(
415
+ 'openai-compatible',
416
+ 'your-local-model',
417
+ );
418
+
419
+ console.log(level); // 'unknown'
420
+ ```
421
+
384
422
  ### Tool/Function Calling
385
423
 
386
424
  ```typescript
@@ -587,17 +625,40 @@ interface MessageWithVision {
587
625
  }
588
626
 
589
627
  type ChatResponseLength = 'veryShort' | 'short' | 'medium' | 'long' | 'veryLong' | 'deep';
628
+ type VisionSupportLevel = 'supported' | 'unsupported' | 'unknown';
629
+ ```
630
+
631
+ ### Vision Support Discovery
632
+
633
+ ```typescript
634
+ const providerLevel = ChatServiceFactory.getVisionSupportLevel(
635
+ 'openai-compatible',
636
+ );
637
+ const modelLevel = ChatServiceFactory.getVisionSupportLevelForModel(
638
+ 'openai-compatible',
639
+ 'your-local-model',
640
+ );
641
+
642
+ console.log(providerLevel); // 'unknown'
643
+ console.log(modelLevel); // 'unknown'
590
644
  ```
591
645
 
646
+ Semantics:
647
+ - `supported`: Known to support vision before sending the request
648
+ - `unsupported`: Known to reject vision before sending the request
649
+ - `unknown`: Cannot be pre-validated, but vision requests may still succeed
650
+
592
651
  ## Available Providers
593
652
 
594
653
  Currently, the following AI providers are built-in:
595
654
 
596
655
  - **OpenAI**: Supports models like 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
656
+ - **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.
597
657
  - **Gemini**: Supports models like Gemini 3.1 Pro Preview, Gemini 3.1 Flash-Lite Preview, Gemini 3 Pro Preview, Gemini 3 Flash Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite Preview, Gemini 2.0 Flash, Gemini 2.0 Flash-Lite
598
658
  - **Claude**: Supports models like Claude Sonnet 4.6, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5, Claude 4 Sonnet, Claude 4 Opus, Claude 3.7 Sonnet, Claude 3.5 Haiku/Sonnet, Claude 3 Haiku
599
659
  - **OpenRouter**: Supports a curated OpenRouter model list (OpenAI/Claude/Gemini/Z.ai/Kimi). See the OpenRouter section for model IDs.
600
660
  - **Z.ai**: Supports GLM-5/GLM-5-Turbo (text), GLM-4.7/4.6 (text), and GLM-4.6V family (vision)
661
+ - **xAI**: Supports Grok 4.20 Reasoning/Non-Reasoning and Grok 4-1 Fast Reasoning/Non-Reasoning, all with vision support
601
662
  - **Kimi**: Supports Kimi K2.5 (`kimi-k2.5`) with vision support
602
663
 
603
664
  ## License
@@ -6,6 +6,7 @@ export * from './gemini';
6
6
  export * from './claude';
7
7
  export * from './openrouter';
8
8
  export * from './zai';
9
+ export * from './xai';
9
10
  export * from './kimi';
10
11
  export * from './chat';
11
12
  export * from './prompts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
@@ -22,6 +22,7 @@ __exportStar(require("./gemini"), exports);
22
22
  __exportStar(require("./claude"), exports);
23
23
  __exportStar(require("./openrouter"), exports);
24
24
  __exportStar(require("./zai"), exports);
25
+ __exportStar(require("./xai"), exports);
25
26
  __exportStar(require("./kimi"), exports);
26
27
  __exportStar(require("./chat"), exports);
27
28
  __exportStar(require("./prompts"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,+CAA6B;AAC7B,wCAAsB;AACtB,yCAAuB;AACvB,yCAAuB;AACvB,4CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,+CAA6B;AAC7B,wCAAsB;AACtB,wCAAsB;AACtB,yCAAuB;AACvB,yCAAuB;AACvB,4CAA0B"}
@@ -0,0 +1,11 @@
1
+ export declare const ENDPOINT_XAI_CHAT_COMPLETIONS_API = "https://api.x.ai/v1/chat/completions";
2
+ export declare const MODEL_GROK_4_20_REASONING = "grok-4.20-0309-reasoning";
3
+ export declare const MODEL_GROK_4_20_NON_REASONING = "grok-4.20-0309-non-reasoning";
4
+ export declare const MODEL_GROK_4_1_FAST_REASONING = "grok-4-1-fast-reasoning";
5
+ export declare const MODEL_GROK_4_1_FAST_NON_REASONING = "grok-4-1-fast-non-reasoning";
6
+ export declare const XAI_VISION_SUPPORTED_MODELS: string[];
7
+ /**
8
+ * Check if a model supports vision capabilities
9
+ */
10
+ export declare function isXaiVisionModel(model: string): boolean;
11
+ //# sourceMappingURL=xai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../../src/constants/xai.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,yCACN,CAAC;AAGzC,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAC5E,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AACvE,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAG/E,eAAO,MAAM,2BAA2B,UAKvC,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XAI_VISION_SUPPORTED_MODELS = exports.MODEL_GROK_4_1_FAST_NON_REASONING = exports.MODEL_GROK_4_1_FAST_REASONING = exports.MODEL_GROK_4_20_NON_REASONING = exports.MODEL_GROK_4_20_REASONING = exports.ENDPOINT_XAI_CHAT_COMPLETIONS_API = void 0;
4
+ exports.isXaiVisionModel = isXaiVisionModel;
5
+ exports.ENDPOINT_XAI_CHAT_COMPLETIONS_API = 'https://api.x.ai/v1/chat/completions';
6
+ // xAI Grok models
7
+ exports.MODEL_GROK_4_20_REASONING = 'grok-4.20-0309-reasoning';
8
+ exports.MODEL_GROK_4_20_NON_REASONING = 'grok-4.20-0309-non-reasoning';
9
+ exports.MODEL_GROK_4_1_FAST_REASONING = 'grok-4-1-fast-reasoning';
10
+ exports.MODEL_GROK_4_1_FAST_NON_REASONING = 'grok-4-1-fast-non-reasoning';
11
+ // Vision support for models
12
+ exports.XAI_VISION_SUPPORTED_MODELS = [
13
+ exports.MODEL_GROK_4_20_REASONING,
14
+ exports.MODEL_GROK_4_20_NON_REASONING,
15
+ exports.MODEL_GROK_4_1_FAST_REASONING,
16
+ exports.MODEL_GROK_4_1_FAST_NON_REASONING,
17
+ ];
18
+ /**
19
+ * Check if a model supports vision capabilities
20
+ */
21
+ function isXaiVisionModel(model) {
22
+ return exports.XAI_VISION_SUPPORTED_MODELS.includes(model);
23
+ }
24
+ //# sourceMappingURL=xai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/constants/xai.ts"],"names":[],"mappings":";;;AAoBA,4CAEC;AAtBY,QAAA,iCAAiC,GAC5C,sCAAsC,CAAC;AAEzC,kBAAkB;AACL,QAAA,yBAAyB,GAAG,0BAA0B,CAAC;AACvD,QAAA,6BAA6B,GAAG,8BAA8B,CAAC;AAC/D,QAAA,6BAA6B,GAAG,yBAAyB,CAAC;AAC1D,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAE/E,4BAA4B;AACf,QAAA,2BAA2B,GAAG;IACzC,iCAAyB;IACzB,qCAA6B;IAC7B,qCAA6B;IAC7B,yCAAiC;CAClC,CAAC;AAEF;;GAEG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,OAAO,mCAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
@@ -5,7 +5,7 @@
5
5
  export * from './types';
6
6
  export type { ChatService } from './services/ChatService';
7
7
  export { ChatServiceFactory } from './services/ChatServiceFactory';
8
- export type { ChatServiceOptions, ChatServiceOptionsByProvider, ChatProviderName, OpenAIChatServiceOptions, OpenAICompatibleChatServiceOptions, OpenRouterChatServiceOptions, GeminiChatServiceOptions, ClaudeChatServiceOptions, ZAIChatServiceOptions, KimiChatServiceOptions, ChatServiceProvider, } from './services/providers/ChatServiceProvider';
8
+ export type { ChatServiceOptions, ChatServiceOptionsByProvider, ChatProviderName, OpenAIChatServiceOptions, OpenAICompatibleChatServiceOptions, OpenRouterChatServiceOptions, GeminiChatServiceOptions, ClaudeChatServiceOptions, ZAIChatServiceOptions, XAIChatServiceOptions, KimiChatServiceOptions, ChatServiceProvider, VisionSupportLevel, } from './services/providers/ChatServiceProvider';
9
9
  export { OpenAIChatService } from './services/providers/openai/OpenAIChatService';
10
10
  export { OpenAIChatServiceProvider } from './services/providers/openai/OpenAIChatServiceProvider';
11
11
  export { OpenAICompatibleChatServiceProvider } from './services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider';
@@ -17,6 +17,8 @@ export { OpenRouterChatService } from './services/providers/openrouter/OpenRoute
17
17
  export { OpenRouterChatServiceProvider } from './services/providers/openrouter/OpenRouterChatServiceProvider';
18
18
  export { ZAIChatService } from './services/providers/zai/ZAIChatService';
19
19
  export { ZAIChatServiceProvider } from './services/providers/zai/ZAIChatServiceProvider';
20
+ export { XAIChatService } from './services/providers/xai/XAIChatService';
21
+ export { XAIChatServiceProvider } from './services/providers/xai/XAIChatServiceProvider';
20
22
  export { KimiChatService } from './services/providers/kimi/KimiChatService';
21
23
  export { KimiChatServiceProvider } from './services/providers/kimi/KimiChatServiceProvider';
22
24
  export * from './constants';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,kCAAkC,EAClC,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,2EAA2E,CAAC;AAGhI,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,+DAA+D,CAAC;AAG9G,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAG5F,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,kCAAkC,EAClC,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,2EAA2E,CAAC;AAGhI,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,+DAA+D,CAAC;AAG9G,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAG5F,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.installGASFetch = exports.KimiChatServiceProvider = exports.KimiChatService = exports.ZAIChatServiceProvider = exports.ZAIChatService = exports.OpenRouterChatServiceProvider = exports.OpenRouterChatService = exports.ClaudeChatServiceProvider = exports.ClaudeChatService = exports.GeminiChatServiceProvider = exports.GeminiChatService = exports.OpenAICompatibleChatServiceProvider = exports.OpenAIChatServiceProvider = exports.OpenAIChatService = exports.ChatServiceFactory = void 0;
21
+ exports.installGASFetch = exports.KimiChatServiceProvider = exports.KimiChatService = exports.XAIChatServiceProvider = exports.XAIChatService = exports.ZAIChatServiceProvider = exports.ZAIChatService = exports.OpenRouterChatServiceProvider = exports.OpenRouterChatService = exports.ClaudeChatServiceProvider = exports.ClaudeChatService = exports.GeminiChatServiceProvider = exports.GeminiChatService = exports.OpenAICompatibleChatServiceProvider = exports.OpenAIChatServiceProvider = exports.OpenAIChatService = exports.ChatServiceFactory = void 0;
22
22
  // Type definitions exports
23
23
  __exportStar(require("./types"), exports);
24
24
  var ChatServiceFactory_1 = require("./services/ChatServiceFactory");
@@ -50,6 +50,11 @@ var ZAIChatService_1 = require("./services/providers/zai/ZAIChatService");
50
50
  Object.defineProperty(exports, "ZAIChatService", { enumerable: true, get: function () { return ZAIChatService_1.ZAIChatService; } });
51
51
  var ZAIChatServiceProvider_1 = require("./services/providers/zai/ZAIChatServiceProvider");
52
52
  Object.defineProperty(exports, "ZAIChatServiceProvider", { enumerable: true, get: function () { return ZAIChatServiceProvider_1.ZAIChatServiceProvider; } });
53
+ // xAI provider exports
54
+ var XAIChatService_1 = require("./services/providers/xai/XAIChatService");
55
+ Object.defineProperty(exports, "XAIChatService", { enumerable: true, get: function () { return XAIChatService_1.XAIChatService; } });
56
+ var XAIChatServiceProvider_1 = require("./services/providers/xai/XAIChatServiceProvider");
57
+ Object.defineProperty(exports, "XAIChatServiceProvider", { enumerable: true, get: function () { return XAIChatServiceProvider_1.XAIChatServiceProvider; } });
53
58
  // Kimi provider exports
54
59
  var KimiChatService_1 = require("./services/providers/kimi/KimiChatService");
55
60
  Object.defineProperty(exports, "KimiChatService", { enumerable: true, get: function () { return KimiChatService_1.KimiChatService; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,2BAA2B;AAC3B,0CAAwB;AAIxB,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAiB3B,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAClC,iIAAgI;AAAvH,0JAAA,mCAAmC,OAAA;AAE5C,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAElC,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAElC,8BAA8B;AAC9B,+FAA8F;AAArF,8HAAA,qBAAqB,OAAA;AAC9B,+GAA8G;AAArG,8IAAA,6BAA6B,OAAA;AAEtC,wBAAwB;AACxB,0EAAyE;AAAhE,gHAAA,cAAc,OAAA;AACvB,0FAAyF;AAAhF,gIAAA,sBAAsB,OAAA;AAE/B,wBAAwB;AACxB,6EAA4E;AAAnE,kHAAA,eAAe,OAAA;AACxB,6FAA4F;AAAnF,kIAAA,uBAAuB,OAAA;AAEhC,oBAAoB;AACpB,8CAA4B;AAE5B,kBAAkB;AAClB,0CAAwB;AAExB,WAAW;AACX,gDAAsD;AAA7C,2GAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,2BAA2B;AAC3B,0CAAwB;AAIxB,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAmB3B,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAClC,iIAAgI;AAAvH,0JAAA,mCAAmC,OAAA;AAE5C,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAElC,0BAA0B;AAC1B,mFAAkF;AAAzE,sHAAA,iBAAiB,OAAA;AAC1B,mGAAkG;AAAzF,sIAAA,yBAAyB,OAAA;AAElC,8BAA8B;AAC9B,+FAA8F;AAArF,8HAAA,qBAAqB,OAAA;AAC9B,+GAA8G;AAArG,8IAAA,6BAA6B,OAAA;AAEtC,wBAAwB;AACxB,0EAAyE;AAAhE,gHAAA,cAAc,OAAA;AACvB,0FAAyF;AAAhF,gIAAA,sBAAsB,OAAA;AAE/B,uBAAuB;AACvB,0EAAyE;AAAhE,gHAAA,cAAc,OAAA;AACvB,0FAAyF;AAAhF,gIAAA,sBAAsB,OAAA;AAE/B,wBAAwB;AACxB,6EAA4E;AAAnE,kHAAA,eAAe,OAAA;AACxB,6FAA4F;AAAnF,kIAAA,uBAAuB,OAAA;AAEhC,oBAAoB;AACpB,8CAA4B;AAE5B,kBAAkB;AAClB,0CAAwB;AAExB,WAAW;AACX,gDAAsD;AAA7C,2GAAA,eAAe,OAAA"}
@@ -1,5 +1,5 @@
1
1
  import { ChatService } from './ChatService';
2
- import { ChatServiceOptionsByProvider, ChatProviderName, ChatServiceProvider } from './providers/ChatServiceProvider';
2
+ import { ChatServiceOptionsByProvider, ChatProviderName, ChatServiceProvider, VisionSupportLevel } from './providers/ChatServiceProvider';
3
3
  /**
4
4
  * Chat service factory
5
5
  * Manages and creates various AI providers
@@ -35,5 +35,13 @@ export declare class ChatServiceFactory {
35
35
  * @returns Array of supported models, empty array if provider doesn't exist
36
36
  */
37
37
  static getSupportedModels(providerName: string): string[];
38
+ /**
39
+ * Get provider-level vision support status.
40
+ */
41
+ static getVisionSupportLevel(providerName: string): VisionSupportLevel;
42
+ /**
43
+ * Get model-level vision support status.
44
+ */
45
+ static getVisionSupportLevelForModel(providerName: string, model: string): VisionSupportLevel;
38
46
  }
39
47
  //# sourceMappingURL=ChatServiceFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceFactory.d.ts","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAEL,4BAA4B,EAC5B,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoD;IAE5E;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,IAAI;IAIjE;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,SAAS,gBAAgB,EACzD,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,4BAA4B,CAAC,SAAS,CAAC,GAC/C,WAAW;IAYd;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAI5D;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAIxC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;CAI1D"}
1
+ {"version":3,"file":"ChatServiceFactory.d.ts","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAEL,4BAA4B,EAC5B,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoD;IAE5E;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,IAAI;IAIjE;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,SAAS,gBAAgB,EACzD,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,4BAA4B,CAAC,SAAS,CAAC,GAC/C,WAAW;IAYd;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAI5D;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAIxC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;IAKzD;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB;IAKtE;;OAEG;IACH,MAAM,CAAC,6BAA6B,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,kBAAkB;CAkBtB"}
@@ -44,6 +44,31 @@ class ChatServiceFactory {
44
44
  const provider = this.providers.get(providerName);
45
45
  return provider ? provider.getSupportedModels() : [];
46
46
  }
47
+ /**
48
+ * Get provider-level vision support status.
49
+ */
50
+ static getVisionSupportLevel(providerName) {
51
+ const provider = this.providers.get(providerName);
52
+ return provider ? provider.getVisionSupportLevel() : 'unsupported';
53
+ }
54
+ /**
55
+ * Get model-level vision support status.
56
+ */
57
+ static getVisionSupportLevelForModel(providerName, model) {
58
+ const provider = this.providers.get(providerName);
59
+ if (!provider) {
60
+ return 'unsupported';
61
+ }
62
+ if (provider.getVisionSupportLevelForModel) {
63
+ return provider.getVisionSupportLevelForModel(model);
64
+ }
65
+ if (provider.supportsVisionForModel) {
66
+ return provider.supportsVisionForModel(model)
67
+ ? 'supported'
68
+ : 'unsupported';
69
+ }
70
+ return provider.getVisionSupportLevel();
71
+ }
47
72
  }
48
73
  exports.ChatServiceFactory = ChatServiceFactory;
49
74
  /** Map of registered providers */
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":";;;AAOA,2CAA6D;AAE7D;;;GAGG;AACH,MAAa,kBAAkB;IAI7B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAkC;QACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAYD,MAAM,CAAC,iBAAiB,CACtB,YAAoB,EACpB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAoB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;;AAzDH,gDA0DC;AAzDC,kCAAkC;AACnB,4BAAS,GAA0C,IAAI,GAAG,EAAE,CAAC;AA0D9E,0CAA8B,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAClD,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAC9C,CAAC"}
1
+ {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":";;;AAQA,2CAA6D;AAE7D;;;GAGG;AACH,MAAa,kBAAkB;IAI7B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAkC;QACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAYD,MAAM,CAAC,iBAAiB,CACtB,YAAoB,EACpB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAoB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,YAAoB;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,6BAA6B,CAClC,YAAoB,EACpB,KAAa;QAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,QAAQ,CAAC,6BAA6B,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC;gBAC3C,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,aAAa,CAAC;QACpB,CAAC;QAED,OAAO,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAC1C,CAAC;;AA1FH,gDA2FC;AA1FC,kCAAkC;AACnB,4BAAS,GAA0C,IAAI,GAAG,EAAE,CAAC;AA2F9E,0CAA8B,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAClD,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAC9C,CAAC"}
@@ -69,6 +69,7 @@ export type ClaudeChatServiceOptions = DisallowKeys<BaseChatServiceOptions, 'end
69
69
  };
70
70
  export type KimiChatServiceOptions = DisallowKeys<BaseChatServiceOptions, 'verbosity' | 'reasoning_effort' | 'gpt5Preset' | 'gpt5EndpointPreference' | 'enableReasoningSummary' | 'includeReasoning' | 'reasoningMaxTokens'>;
71
71
  export type ZAIChatServiceOptions = DisallowKeys<BaseChatServiceOptions, 'verbosity' | 'reasoning_effort' | 'gpt5Preset' | 'gpt5EndpointPreference' | 'enableReasoningSummary' | 'includeReasoning' | 'reasoningMaxTokens' | 'baseUrl'>;
72
+ export type XAIChatServiceOptions = DisallowKeys<BaseChatServiceOptions, 'verbosity' | 'reasoning_effort' | 'gpt5Preset' | 'gpt5EndpointPreference' | 'enableReasoningSummary' | 'includeReasoning' | 'reasoningMaxTokens' | 'baseUrl' | 'thinking' | 'responseFormat'>;
72
73
  export type ChatServiceOptions<TExtra extends Record<string, unknown> = Record<string, unknown>> = BaseChatServiceOptions & TExtra;
73
74
  export type ChatServiceOptionsByProvider = {
74
75
  openai: OpenAIChatServiceOptions;
@@ -77,9 +78,11 @@ export type ChatServiceOptionsByProvider = {
77
78
  gemini: GeminiChatServiceOptions;
78
79
  claude: ClaudeChatServiceOptions;
79
80
  zai: ZAIChatServiceOptions;
81
+ xai: XAIChatServiceOptions;
80
82
  kimi: KimiChatServiceOptions;
81
83
  };
82
84
  export type ChatProviderName = keyof ChatServiceOptionsByProvider;
85
+ export type VisionSupportLevel = 'supported' | 'unsupported' | 'unknown';
83
86
  /**
84
87
  * Chat service provider interface
85
88
  * Abstraction for various AI API providers (OpenAI, Gemini, Claude, etc.)
@@ -106,11 +109,27 @@ export interface ChatServiceProvider<TOptions = BaseChatServiceOptions> {
106
109
  * @returns Default model name
107
110
  */
108
111
  getDefaultModel(): string;
112
+ /**
113
+ * Get the provider-level vision support status.
114
+ * - supported: known to support vision
115
+ * - unsupported: known to not support vision
116
+ * - unknown: depends on endpoint/model and cannot be pre-validated
117
+ */
118
+ getVisionSupportLevel(): VisionSupportLevel;
119
+ /**
120
+ * Get the model-level vision support status when pre-validation is possible.
121
+ */
122
+ getVisionSupportLevelForModel?(model: string): VisionSupportLevel;
109
123
  /**
110
124
  * Check if the provider supports vision (image processing)
111
- * @returns Support status
125
+ * @returns True when vision can be attempted
112
126
  */
113
127
  supportsVision(): boolean;
128
+ /**
129
+ * Check if a specific model supports vision capabilities.
130
+ * Returns true when vision can be attempted for the model.
131
+ */
132
+ supportsVisionForModel?(model: string): boolean;
114
133
  }
115
134
  export {};
116
135
  //# sourceMappingURL=ChatServiceProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ChatService } from '../../ChatService';
2
- import { ClaudeChatServiceOptions, ChatServiceProvider } from '../ChatServiceProvider';
2
+ import { ClaudeChatServiceOptions, ChatServiceProvider, VisionSupportLevel } from '../ChatServiceProvider';
3
3
  /**
4
4
  * Claude API provider implementation
5
5
  */
@@ -30,11 +30,13 @@ export declare class ClaudeChatServiceProvider implements ChatServiceProvider<Cl
30
30
  * @returns Vision support status (true)
31
31
  */
32
32
  supportsVision(): boolean;
33
+ getVisionSupportLevel(): VisionSupportLevel;
33
34
  /**
34
35
  * Check if a specific model supports vision capabilities
35
36
  * @param model The model name to check
36
37
  * @returns True if the model supports vision, false otherwise
37
38
  */
38
39
  supportsVisionForModel(model: string): boolean;
40
+ getVisionSupportLevelForModel(model: string): VisionSupportLevel;
39
41
  }
40
42
  //# sourceMappingURL=ClaudeChatServiceProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAGhC;;GAEG;AACH,qBAAa,yBACX,YAAW,mBAAmB,CAAC,wBAAwB,CAAC;IAExD;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW;IAqBjE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAgB9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAG/C"}
1
+ {"version":3,"file":"ClaudeChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAGhC;;GAEG;AACH,qBAAa,yBACX,YAAW,mBAAmB,CAAC,wBAAwB,CAAC;IAExD;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW;IAqBjE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAgB9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB,qBAAqB,IAAI,kBAAkB;IAI3C;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;CAGjE"}
@@ -63,7 +63,10 @@ class ClaudeChatServiceProvider {
63
63
  * @returns Vision support status (true)
64
64
  */
65
65
  supportsVision() {
66
- return true;
66
+ return this.getVisionSupportLevel() !== 'unsupported';
67
+ }
68
+ getVisionSupportLevel() {
69
+ return 'supported';
67
70
  }
68
71
  /**
69
72
  * Check if a specific model supports vision capabilities
@@ -73,6 +76,9 @@ class ClaudeChatServiceProvider {
73
76
  supportsVisionForModel(model) {
74
77
  return constants_1.CLAUDE_VISION_SUPPORTED_MODELS.includes(model);
75
78
  }
79
+ getVisionSupportLevelForModel(model) {
80
+ return this.supportsVisionForModel(model) ? 'supported' : 'unsupported';
81
+ }
76
82
  }
77
83
  exports.ClaudeChatServiceProvider = ClaudeChatServiceProvider;
78
84
  //# sourceMappingURL=ClaudeChatServiceProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":";;;AAAA,kDAa4B;AAE5B,2DAAwD;AAMxD,0CAAoD;AAEpD;;GAEG;AACH,MAAa,yBAAyB;IAGpC;;;;OAIG;IACH,iBAAiB,CAAC,OAAiC;QACjD,gFAAgF;QAChF,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE;YAC1C,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACrE,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,qCAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,UAAU,IAAI,EAAE,EACxB,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,gCAAoB;YACpB,kCAAsB;YACtB,mCAAuB;YACvB,mCAAuB;YACvB,iCAAqB;YACrB,+BAAmB;YACnB,mCAAuB;YACvB,kCAAsB;YACtB,iCAAqB;YACrB,mCAAuB;YACvB,iCAAqB;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,gCAAoB,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,0CAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF;AAjFD,8DAiFC"}
1
+ {"version":3,"file":"ClaudeChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":";;;AAAA,kDAa4B;AAE5B,2DAAwD;AAOxD,0CAAoD;AAEpD;;GAEG;AACH,MAAa,yBAAyB;IAGpC;;;;OAIG;IACH,iBAAiB,CAAC,OAAiC;QACjD,gFAAgF;QAChF,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE;YAC1C,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACrE,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,qCAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,UAAU,IAAI,EAAE,EACxB,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,gCAAoB;YACpB,kCAAsB;YACtB,mCAAuB;YACvB,mCAAuB;YACvB,iCAAqB;YACrB,+BAAmB;YACnB,mCAAuB;YACvB,kCAAsB;YACtB,iCAAqB;YACrB,mCAAuB;YACvB,iCAAqB;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,gCAAoB,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,KAAK,aAAa,CAAC;IACxD,CAAC;IAED,qBAAqB;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,0CAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1E,CAAC;CACF;AAzFD,8DAyFC"}
@@ -1,5 +1,5 @@
1
1
  import { ChatService } from '../../ChatService';
2
- import { GeminiChatServiceOptions, ChatServiceProvider } from '../ChatServiceProvider';
2
+ import { GeminiChatServiceOptions, ChatServiceProvider, VisionSupportLevel } from '../ChatServiceProvider';
3
3
  /**
4
4
  * Gemini API provider implementation
5
5
  */
@@ -30,11 +30,13 @@ export declare class GeminiChatServiceProvider implements ChatServiceProvider<Ge
30
30
  * @returns Vision support status (true)
31
31
  */
32
32
  supportsVision(): boolean;
33
+ getVisionSupportLevel(): VisionSupportLevel;
33
34
  /**
34
35
  * Check if a specific model supports vision capabilities
35
36
  * @param model The model name to check
36
37
  * @returns True if the model supports vision, false otherwise
37
38
  */
38
39
  supportsVisionForModel(model: string): boolean;
40
+ getVisionSupportLevelForModel(model: string): VisionSupportLevel;
39
41
  }
40
42
  //# sourceMappingURL=GeminiChatServiceProvider.d.ts.map