@aituber-onair/chat 0.1.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 (211) hide show
  1. package/README.ja.md +318 -0
  2. package/README.md +318 -0
  3. package/dist/cjs/constants/chat.d.ts +26 -0
  4. package/dist/cjs/constants/chat.d.ts.map +1 -0
  5. package/dist/cjs/constants/chat.js +34 -0
  6. package/dist/cjs/constants/chat.js.map +1 -0
  7. package/dist/cjs/constants/claude.d.ts +9 -0
  8. package/dist/cjs/constants/claude.d.ts.map +1 -0
  9. package/dist/cjs/constants/claude.js +20 -0
  10. package/dist/cjs/constants/claude.js.map +1 -0
  11. package/dist/cjs/constants/gemini.d.ts +11 -0
  12. package/dist/cjs/constants/gemini.d.ts.map +1 -0
  13. package/dist/cjs/constants/gemini.js +26 -0
  14. package/dist/cjs/constants/gemini.js.map +1 -0
  15. package/dist/cjs/constants/index.d.ts +9 -0
  16. package/dist/cjs/constants/index.d.ts.map +1 -0
  17. package/dist/cjs/constants/index.js +25 -0
  18. package/dist/cjs/constants/index.js.map +1 -0
  19. package/dist/cjs/constants/openai.d.ts +13 -0
  20. package/dist/cjs/constants/openai.d.ts.map +1 -0
  21. package/dist/cjs/constants/openai.js +28 -0
  22. package/dist/cjs/constants/openai.js.map +1 -0
  23. package/dist/cjs/constants/prompts.d.ts +3 -0
  24. package/dist/cjs/constants/prompts.d.ts.map +1 -0
  25. package/dist/cjs/constants/prompts.js +16 -0
  26. package/dist/cjs/constants/prompts.js.map +1 -0
  27. package/dist/cjs/index.d.ts +17 -0
  28. package/dist/cjs/index.d.ts.map +1 -0
  29. package/dist/cjs/index.js +45 -0
  30. package/dist/cjs/index.js.map +1 -0
  31. package/dist/cjs/services/ChatService.d.ts +51 -0
  32. package/dist/cjs/services/ChatService.d.ts.map +1 -0
  33. package/dist/cjs/services/ChatService.js +3 -0
  34. package/dist/cjs/services/ChatService.js.map +1 -0
  35. package/dist/cjs/services/ChatServiceFactory.d.ts +39 -0
  36. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -0
  37. package/dist/cjs/services/ChatServiceFactory.js +65 -0
  38. package/dist/cjs/services/ChatServiceFactory.js.map +1 -0
  39. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +52 -0
  40. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -0
  41. package/dist/cjs/services/providers/ChatServiceProvider.js +3 -0
  42. package/dist/cjs/services/providers/ChatServiceProvider.js.map +1 -0
  43. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts +142 -0
  44. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts.map +1 -0
  45. package/dist/cjs/services/providers/claude/ClaudeChatService.js +501 -0
  46. package/dist/cjs/services/providers/claude/ClaudeChatService.js.map +1 -0
  47. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts +40 -0
  48. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -0
  49. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +68 -0
  50. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -0
  51. package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts +104 -0
  52. package/dist/cjs/services/providers/gemini/GeminiChatService.d.ts.map +1 -0
  53. package/dist/cjs/services/providers/gemini/GeminiChatService.js +653 -0
  54. package/dist/cjs/services/providers/gemini/GeminiChatService.js.map +1 -0
  55. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.d.ts +40 -0
  56. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -0
  57. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js +70 -0
  58. package/dist/cjs/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -0
  59. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts +110 -0
  60. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts.map +1 -0
  61. package/dist/cjs/services/providers/openai/OpenAIChatService.js +544 -0
  62. package/dist/cjs/services/providers/openai/OpenAIChatService.js.map +1 -0
  63. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts +40 -0
  64. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -0
  65. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +80 -0
  66. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -0
  67. package/dist/cjs/types/chat.d.ts +46 -0
  68. package/dist/cjs/types/chat.d.ts.map +1 -0
  69. package/dist/cjs/types/chat.js +6 -0
  70. package/dist/cjs/types/chat.js.map +1 -0
  71. package/dist/cjs/types/index.d.ts +8 -0
  72. package/dist/cjs/types/index.d.ts.map +1 -0
  73. package/dist/cjs/types/index.js +25 -0
  74. package/dist/cjs/types/index.js.map +1 -0
  75. package/dist/cjs/types/mcp.d.ts +37 -0
  76. package/dist/cjs/types/mcp.d.ts.map +1 -0
  77. package/dist/cjs/types/mcp.js +6 -0
  78. package/dist/cjs/types/mcp.js.map +1 -0
  79. package/dist/cjs/types/toolChat.d.ts +42 -0
  80. package/dist/cjs/types/toolChat.d.ts.map +1 -0
  81. package/dist/cjs/types/toolChat.js +3 -0
  82. package/dist/cjs/types/toolChat.js.map +1 -0
  83. package/dist/cjs/utils/chatServiceHttpClient.d.ts +47 -0
  84. package/dist/cjs/utils/chatServiceHttpClient.d.ts.map +1 -0
  85. package/dist/cjs/utils/chatServiceHttpClient.js +131 -0
  86. package/dist/cjs/utils/chatServiceHttpClient.js.map +1 -0
  87. package/dist/cjs/utils/emotionParser.d.ts +46 -0
  88. package/dist/cjs/utils/emotionParser.d.ts.map +1 -0
  89. package/dist/cjs/utils/emotionParser.js +59 -0
  90. package/dist/cjs/utils/emotionParser.js.map +1 -0
  91. package/dist/cjs/utils/index.d.ts +8 -0
  92. package/dist/cjs/utils/index.d.ts.map +1 -0
  93. package/dist/cjs/utils/index.js +24 -0
  94. package/dist/cjs/utils/index.js.map +1 -0
  95. package/dist/cjs/utils/mcpSchemaFetcher.d.ts +19 -0
  96. package/dist/cjs/utils/mcpSchemaFetcher.d.ts.map +1 -0
  97. package/dist/cjs/utils/mcpSchemaFetcher.js +98 -0
  98. package/dist/cjs/utils/mcpSchemaFetcher.js.map +1 -0
  99. package/dist/cjs/utils/screenplay.d.ts +20 -0
  100. package/dist/cjs/utils/screenplay.d.ts.map +1 -0
  101. package/dist/cjs/utils/screenplay.js +41 -0
  102. package/dist/cjs/utils/screenplay.js.map +1 -0
  103. package/dist/cjs/utils/streamTextAccumulator.d.ts +25 -0
  104. package/dist/cjs/utils/streamTextAccumulator.d.ts.map +1 -0
  105. package/dist/cjs/utils/streamTextAccumulator.js +47 -0
  106. package/dist/cjs/utils/streamTextAccumulator.js.map +1 -0
  107. package/dist/esm/constants/chat.d.ts +26 -0
  108. package/dist/esm/constants/chat.d.ts.map +1 -0
  109. package/dist/esm/constants/chat.js +30 -0
  110. package/dist/esm/constants/chat.js.map +1 -0
  111. package/dist/esm/constants/claude.d.ts +9 -0
  112. package/dist/esm/constants/claude.d.ts.map +1 -0
  113. package/dist/esm/constants/claude.js +17 -0
  114. package/dist/esm/constants/claude.js.map +1 -0
  115. package/dist/esm/constants/gemini.d.ts +11 -0
  116. package/dist/esm/constants/gemini.d.ts.map +1 -0
  117. package/dist/esm/constants/gemini.js +23 -0
  118. package/dist/esm/constants/gemini.js.map +1 -0
  119. package/dist/esm/constants/index.d.ts +9 -0
  120. package/dist/esm/constants/index.d.ts.map +1 -0
  121. package/dist/esm/constants/index.js +9 -0
  122. package/dist/esm/constants/index.js.map +1 -0
  123. package/dist/esm/constants/openai.d.ts +13 -0
  124. package/dist/esm/constants/openai.d.ts.map +1 -0
  125. package/dist/esm/constants/openai.js +25 -0
  126. package/dist/esm/constants/openai.js.map +1 -0
  127. package/dist/esm/constants/prompts.d.ts +3 -0
  128. package/dist/esm/constants/prompts.d.ts.map +1 -0
  129. package/dist/esm/constants/prompts.js +13 -0
  130. package/dist/esm/constants/prompts.js.map +1 -0
  131. package/dist/esm/index.d.ts +17 -0
  132. package/dist/esm/index.d.ts.map +1 -0
  133. package/dist/esm/index.js +21 -0
  134. package/dist/esm/index.js.map +1 -0
  135. package/dist/esm/services/ChatService.d.ts +51 -0
  136. package/dist/esm/services/ChatService.d.ts.map +1 -0
  137. package/dist/esm/services/ChatService.js +2 -0
  138. package/dist/esm/services/ChatService.js.map +1 -0
  139. package/dist/esm/services/ChatServiceFactory.d.ts +39 -0
  140. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -0
  141. package/dist/esm/services/ChatServiceFactory.js +61 -0
  142. package/dist/esm/services/ChatServiceFactory.js.map +1 -0
  143. package/dist/esm/services/providers/ChatServiceProvider.d.ts +52 -0
  144. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -0
  145. package/dist/esm/services/providers/ChatServiceProvider.js +2 -0
  146. package/dist/esm/services/providers/ChatServiceProvider.js.map +1 -0
  147. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts +142 -0
  148. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts.map +1 -0
  149. package/dist/esm/services/providers/claude/ClaudeChatService.js +497 -0
  150. package/dist/esm/services/providers/claude/ClaudeChatService.js.map +1 -0
  151. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts +40 -0
  152. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -0
  153. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +64 -0
  154. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -0
  155. package/dist/esm/services/providers/gemini/GeminiChatService.d.ts +104 -0
  156. package/dist/esm/services/providers/gemini/GeminiChatService.d.ts.map +1 -0
  157. package/dist/esm/services/providers/gemini/GeminiChatService.js +649 -0
  158. package/dist/esm/services/providers/gemini/GeminiChatService.js.map +1 -0
  159. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.d.ts +40 -0
  160. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.d.ts.map +1 -0
  161. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js +66 -0
  162. package/dist/esm/services/providers/gemini/GeminiChatServiceProvider.js.map +1 -0
  163. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts +110 -0
  164. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts.map +1 -0
  165. package/dist/esm/services/providers/openai/OpenAIChatService.js +540 -0
  166. package/dist/esm/services/providers/openai/OpenAIChatService.js.map +1 -0
  167. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts +40 -0
  168. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -0
  169. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +76 -0
  170. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -0
  171. package/dist/esm/types/chat.d.ts +46 -0
  172. package/dist/esm/types/chat.d.ts.map +1 -0
  173. package/dist/esm/types/chat.js +5 -0
  174. package/dist/esm/types/chat.js.map +1 -0
  175. package/dist/esm/types/index.d.ts +8 -0
  176. package/dist/esm/types/index.d.ts.map +1 -0
  177. package/dist/esm/types/index.js +9 -0
  178. package/dist/esm/types/index.js.map +1 -0
  179. package/dist/esm/types/mcp.d.ts +37 -0
  180. package/dist/esm/types/mcp.d.ts.map +1 -0
  181. package/dist/esm/types/mcp.js +5 -0
  182. package/dist/esm/types/mcp.js.map +1 -0
  183. package/dist/esm/types/toolChat.d.ts +42 -0
  184. package/dist/esm/types/toolChat.d.ts.map +1 -0
  185. package/dist/esm/types/toolChat.js +2 -0
  186. package/dist/esm/types/toolChat.js.map +1 -0
  187. package/dist/esm/utils/chatServiceHttpClient.d.ts +47 -0
  188. package/dist/esm/utils/chatServiceHttpClient.d.ts.map +1 -0
  189. package/dist/esm/utils/chatServiceHttpClient.js +126 -0
  190. package/dist/esm/utils/chatServiceHttpClient.js.map +1 -0
  191. package/dist/esm/utils/emotionParser.d.ts +46 -0
  192. package/dist/esm/utils/emotionParser.d.ts.map +1 -0
  193. package/dist/esm/utils/emotionParser.js +55 -0
  194. package/dist/esm/utils/emotionParser.js.map +1 -0
  195. package/dist/esm/utils/index.d.ts +8 -0
  196. package/dist/esm/utils/index.d.ts.map +1 -0
  197. package/dist/esm/utils/index.js +8 -0
  198. package/dist/esm/utils/index.js.map +1 -0
  199. package/dist/esm/utils/mcpSchemaFetcher.d.ts +19 -0
  200. package/dist/esm/utils/mcpSchemaFetcher.d.ts.map +1 -0
  201. package/dist/esm/utils/mcpSchemaFetcher.js +94 -0
  202. package/dist/esm/utils/mcpSchemaFetcher.js.map +1 -0
  203. package/dist/esm/utils/screenplay.d.ts +20 -0
  204. package/dist/esm/utils/screenplay.d.ts.map +1 -0
  205. package/dist/esm/utils/screenplay.js +36 -0
  206. package/dist/esm/utils/screenplay.js.map +1 -0
  207. package/dist/esm/utils/streamTextAccumulator.d.ts +25 -0
  208. package/dist/esm/utils/streamTextAccumulator.d.ts.map +1 -0
  209. package/dist/esm/utils/streamTextAccumulator.js +43 -0
  210. package/dist/esm/utils/streamTextAccumulator.js.map +1 -0
  211. package/package.json +54 -0
package/README.ja.md ADDED
@@ -0,0 +1,318 @@
1
+ # @aituber-onair/chat
2
+
3
+ ![@aituber-onair/chat ロゴ](./images/aituber-onair-chat.png)
4
+
5
+ AITuber OnAirのチャット・LLM API統合ライブラリです。このパッケージは、OpenAI、Claude、Gemini等の様々なAIチャットプロバイダーとやり取りするための統一されたインターフェースを提供します。
6
+
7
+ ## 機能
8
+
9
+ - 🤖 **複数のAIプロバイダー対応**: OpenAI、Claude (Anthropic)、Google Gemini
10
+ - 🔄 **統一されたインターフェース**: 異なるプロバイダー間での一貫したAPI
11
+ - 🛠️ **ツール・関数呼び出し**: AI関数呼び出しの自動反復処理をサポート
12
+ - 💬 **ストリーミングレスポンス**: リアルタイムストリーミングチャット応答
13
+ - 🖼️ **ビジョン対応**: ビジョン対応モデルでの画像処理
14
+ - 📝 **感情検出**: AI応答からの感情抽出
15
+ - 🎯 **応答長制御**: プリセットまたはカスタムトークン制限での応答長設定
16
+ - 🔌 **Model Context Protocol (MCP)**: MCP サーバーサポート
17
+
18
+ ## インストール
19
+
20
+ ```bash
21
+ npm install @aituber-onair/chat
22
+ ```
23
+
24
+ ## 使用方法
25
+
26
+ ### 基本的なチャット
27
+
28
+ ```typescript
29
+ import { ChatServiceFactory, ChatServiceOptions } from '@aituber-onair/chat';
30
+
31
+ // チャットサービスを作成
32
+ const options: ChatServiceOptions = {
33
+ apiKey: 'your-api-key',
34
+ model: 'gpt-4' // オプション、指定がない場合はプロバイダーのデフォルトを使用
35
+ };
36
+
37
+ const chatService = ChatServiceFactory.createChatService('openai', options);
38
+
39
+ // シンプルなチャット処理
40
+ const messages = [
41
+ { role: 'system', content: 'あなたは親切なアシスタントです。' },
42
+ { role: 'user', content: 'こんにちは!元気ですか?' }
43
+ ];
44
+
45
+ await chatService.processChat(
46
+ messages,
47
+ (partialText) => {
48
+ // ストリーミング応答を処理
49
+ console.log('部分:', partialText);
50
+ },
51
+ async (completeText) => {
52
+ // 完全な応答を処理
53
+ console.log('完了:', completeText);
54
+ }
55
+ );
56
+ ```
57
+
58
+ ### プロバイダー別の使用方法
59
+
60
+ #### OpenAI
61
+
62
+ ```typescript
63
+ const openaiService = ChatServiceFactory.createChatService('openai', {
64
+ apiKey: process.env.OPENAI_API_KEY,
65
+ model: 'gpt-4-turbo-preview',
66
+ endpoint: 'chat/completions' // o1シリーズモデルの場合は 'responses'
67
+ });
68
+ ```
69
+
70
+ #### Claude (Anthropic)
71
+
72
+ ```typescript
73
+ const claudeService = ChatServiceFactory.createChatService('claude', {
74
+ apiKey: process.env.ANTHROPIC_API_KEY,
75
+ model: 'claude-3-opus-20240229'
76
+ });
77
+ ```
78
+
79
+ #### Google Gemini
80
+
81
+ ```typescript
82
+ const geminiService = ChatServiceFactory.createChatService('gemini', {
83
+ apiKey: process.env.GOOGLE_API_KEY,
84
+ model: 'gemini-pro'
85
+ });
86
+ ```
87
+
88
+ ### ビジョンチャット
89
+
90
+ ```typescript
91
+ const visionMessage = {
92
+ role: 'user',
93
+ content: [
94
+ { type: 'text', text: 'この画像に何が見えますか?' },
95
+ {
96
+ type: 'image_url',
97
+ image_url: {
98
+ url: 'data:image/jpeg;base64,...', // または https:// URL
99
+ detail: 'low' // 'low', 'high', または 'auto'
100
+ }
101
+ }
102
+ ]
103
+ };
104
+
105
+ await chatService.processVisionChat(
106
+ [visionMessage],
107
+ (partial) => console.log(partial),
108
+ async (complete) => console.log(complete)
109
+ );
110
+ ```
111
+
112
+ ### ツール・関数呼び出し
113
+
114
+ ```typescript
115
+ import { ToolDefinition } from '@aituber-onair/chat';
116
+
117
+ const tools: ToolDefinition[] = [{
118
+ name: 'get_weather',
119
+ description: '指定された場所の現在の天気を取得',
120
+ parameters: {
121
+ type: 'object',
122
+ properties: {
123
+ location: { type: 'string', description: '都市名' }
124
+ },
125
+ required: ['location']
126
+ }
127
+ }];
128
+
129
+ // ツール呼び出しはチャットサービスによって自動的に処理されます
130
+ // サービス作成時にツールハンドラーを設定してください
131
+ ```
132
+
133
+ ### 応答長制御
134
+
135
+ ```typescript
136
+ // プリセット応答長を使用
137
+ const service = ChatServiceFactory.createChatService('openai', {
138
+ apiKey: 'your-key',
139
+ responseLength: 'medium' // 'veryShort', 'short', 'medium', 'long', 'veryLong'
140
+ });
141
+
142
+ // カスタムトークン制限を使用
143
+ const service = ChatServiceFactory.createChatService('openai', {
144
+ apiKey: 'your-key',
145
+ maxTokens: 500 // 直接トークン制限
146
+ });
147
+ ```
148
+
149
+ ### Model Context Protocol (MCP)
150
+
151
+ チャットパッケージは全てのプロバイダーでMCP(Model Context Protocol)サーバーをサポートしており、異なる実装アプローチを採用しています:
152
+
153
+ #### プロバイダー別MCP実装
154
+
155
+ **OpenAI & Claude**: 直接MCP統合
156
+ - プロバイダーのネイティブMCPサポートを使用(OpenAIのResponses API)
157
+ - サーバー間通信(CORSの問題なし)
158
+ - MCPサーバーへの直接接続
159
+
160
+ **Gemini**: 関数呼び出し統合
161
+ - MCPツールがGeminiの関数宣言として登録
162
+ - ToolExecutorがMCPサーバー通信を処理
163
+ - ブラウザ環境ではCORS設定が必要
164
+
165
+ #### 基本的な使用方法
166
+
167
+ ```typescript
168
+ // MCPサーバーは全てのプロバイダー(OpenAI、Claude、Gemini)で動作
169
+ const mcpServers = [{
170
+ type: 'url',
171
+ url: 'http://localhost:3000',
172
+ name: 'local-server',
173
+ authorization_token: 'optional-token'
174
+ }];
175
+
176
+ // OpenAI/Claude - 直接MCP統合
177
+ const openaiService = ChatServiceFactory.createChatService('openai', {
178
+ apiKey: 'your-key',
179
+ mcpServers // Responses API経由で直接統合
180
+ });
181
+
182
+ // Gemini - 関数呼び出し経由でMCP
183
+ const geminiService = ChatServiceFactory.createChatService('gemini', {
184
+ apiKey: 'your-key',
185
+ mcpServers // 関数宣言として統合
186
+ });
187
+
188
+ // MCPツールは自動的に利用可能になり、ToolExecutorによって処理されます
189
+ ```
190
+
191
+ #### Gemini固有のCORS設定
192
+
193
+ ブラウザ環境でGeminiをMCPと一緒に使用する場合、CORSの問題を回避するためにプロキシを設定する必要があります:
194
+
195
+ **Vite開発設定** (`vite.config.ts`):
196
+ ```typescript
197
+ export default defineConfig({
198
+ server: {
199
+ proxy: {
200
+ '/api/mcp': {
201
+ target: 'https://mcp.deepwiki.com',
202
+ changeOrigin: true,
203
+ rewrite: (path) => path.replace(/^\/api\/mcp/, ''),
204
+ }
205
+ }
206
+ }
207
+ })
208
+ ```
209
+
210
+ **動的MCPサーバー設定**:
211
+ ```typescript
212
+ // プロバイダー別MCPサーバー設定
213
+ const getMcpServers = (provider: string): MCPServerConfig[] => {
214
+ const baseUrl = provider === 'gemini'
215
+ ? '/api/mcp/sse' // Gemini用プロキシURL(ブラウザ)
216
+ : 'https://mcp.deepwiki.com/sse'; // OpenAI/Claude用直接URL
217
+
218
+ return [{
219
+ type: 'url',
220
+ url: baseUrl,
221
+ name: 'deepwiki',
222
+ }];
223
+ };
224
+
225
+ // チャットサービス作成で使用
226
+ const mcpServers = getMcpServers(chatProvider);
227
+ const chatService = ChatServiceFactory.createChatService(chatProvider, {
228
+ apiKey: 'your-api-key',
229
+ mcpServers
230
+ });
231
+ ```
232
+
233
+ #### エラーハンドリング・タイムアウト
234
+
235
+ Gemini MCP実装には堅牢なエラーハンドリングが含まれています:
236
+ - MCPスキーマ取得に5秒のタイムアウト
237
+ - MCPサーバーが利用できない場合の基本検索ツールへの自動フォールバック
238
+ - MCP初期化が失敗した場合の優雅な劣化
239
+
240
+ ### 感情検出
241
+
242
+ ```typescript
243
+ import { textToScreenplay } from '@aituber-onair/chat';
244
+
245
+ const text = "[happy] お会いできて嬉しいです!";
246
+ const screenplay = textToScreenplay(text);
247
+ console.log(screenplay); // { emotion: 'happy', text: "お会いできて嬉しいです!" }
248
+ ```
249
+
250
+ ## API リファレンス
251
+
252
+ ### ChatService インターフェース
253
+
254
+ ```typescript
255
+ interface ChatService {
256
+ getModel(): string;
257
+ getVisionModel(): string;
258
+
259
+ processChat(
260
+ messages: Message[],
261
+ onPartialResponse: (text: string) => void,
262
+ onCompleteResponse: (text: string) => Promise<void>
263
+ ): Promise<void>;
264
+
265
+ processVisionChat(
266
+ messages: MessageWithVision[],
267
+ onPartialResponse: (text: string) => void,
268
+ onCompleteResponse: (text: string) => Promise<void>
269
+ ): Promise<void>;
270
+
271
+ chatOnce(
272
+ messages: Message[],
273
+ stream: boolean,
274
+ onPartialResponse: (text: string) => void,
275
+ maxTokens?: number
276
+ ): Promise<ToolChatCompletion>;
277
+
278
+ visionChatOnce(
279
+ messages: MessageWithVision[],
280
+ stream: boolean,
281
+ onPartialResponse: (text: string) => void,
282
+ maxTokens?: number
283
+ ): Promise<ToolChatCompletion>;
284
+ }
285
+ ```
286
+
287
+ ### 型定義
288
+
289
+ ```typescript
290
+ interface Message {
291
+ role: 'system' | 'user' | 'assistant' | 'tool';
292
+ content: string;
293
+ timestamp?: number;
294
+ }
295
+
296
+ interface MessageWithVision {
297
+ role: 'system' | 'user' | 'assistant' | 'tool';
298
+ content: string | VisionBlock[];
299
+ }
300
+
301
+ type ChatResponseLength = 'veryShort' | 'short' | 'medium' | 'long' | 'veryLong';
302
+ ```
303
+
304
+ ## 利用可能なプロバイダー
305
+
306
+ 現在、以下のAIプロバイダーが組み込まれています:
307
+
308
+ - **OpenAI**: GPT-4.1(miniとnanoを含む), GPT-4, GPT-4o-mini, O3-mini, o1, o1-miniのモデルをサポート
309
+ - **Gemini**: Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite Preview, Gemini 2.0 Flash, Gemini 2.0 Flash-Lite, Gemini 1.5 Flash, Gemini 1.5 Proのモデルをサポート
310
+ - **Claude**: Claude 3 Haiku, Claude 3.5 Haiku, Claude 3.5 Sonnet v2, Claude 3.7 Sonnetのモデルをサポート
311
+
312
+ ## ライセンス
313
+
314
+ MIT
315
+
316
+ ## 貢献
317
+
318
+ 貢献を歓迎します!プルリクエストをお気軽にご提出ください。
package/README.md ADDED
@@ -0,0 +1,318 @@
1
+ # @aituber-onair/chat
2
+
3
+ ![@aituber-onair/chat logo](./images/aituber-onair-chat.png)
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, Claude, and Gemini.
6
+
7
+ ## Features
8
+
9
+ - 🤖 **Multiple AI Provider Support**: OpenAI, Claude (Anthropic), and Google Gemini
10
+ - 🔄 **Unified Interface**: Consistent API across different providers
11
+ - 🛠️ **Tool/Function Calling**: Support for AI function calling with automatic iteration
12
+ - 💬 **Streaming Responses**: Real-time streaming chat responses
13
+ - 🖼️ **Vision Support**: Process images with vision-enabled models
14
+ - 📝 **Emotion Detection**: Extract emotions from AI responses
15
+ - 🎯 **Response Length Control**: Configure response lengths with presets or custom token limits
16
+ - 🔌 **Model Context Protocol (MCP)**: Support for MCP servers
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ npm install @aituber-onair/chat
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ ### Basic Chat
27
+
28
+ ```typescript
29
+ import { ChatServiceFactory, ChatServiceOptions } from '@aituber-onair/chat';
30
+
31
+ // Create a chat service
32
+ const options: ChatServiceOptions = {
33
+ apiKey: 'your-api-key',
34
+ model: 'gpt-4' // optional, uses provider default if not specified
35
+ };
36
+
37
+ const chatService = ChatServiceFactory.createChatService('openai', options);
38
+
39
+ // Process a simple chat
40
+ const messages = [
41
+ { role: 'system', content: 'You are a helpful assistant.' },
42
+ { role: 'user', content: 'Hello! How are you?' }
43
+ ];
44
+
45
+ await chatService.processChat(
46
+ messages,
47
+ (partialText) => {
48
+ // Handle streaming response
49
+ console.log('Partial:', partialText);
50
+ },
51
+ async (completeText) => {
52
+ // Handle complete response
53
+ console.log('Complete:', completeText);
54
+ }
55
+ );
56
+ ```
57
+
58
+ ### Provider-Specific Usage
59
+
60
+ #### OpenAI
61
+
62
+ ```typescript
63
+ const openaiService = ChatServiceFactory.createChatService('openai', {
64
+ apiKey: process.env.OPENAI_API_KEY,
65
+ model: 'gpt-4-turbo-preview',
66
+ endpoint: 'chat/completions' // or 'responses' for o1 series models
67
+ });
68
+ ```
69
+
70
+ #### Claude (Anthropic)
71
+
72
+ ```typescript
73
+ const claudeService = ChatServiceFactory.createChatService('claude', {
74
+ apiKey: process.env.ANTHROPIC_API_KEY,
75
+ model: 'claude-3-opus-20240229'
76
+ });
77
+ ```
78
+
79
+ #### Google Gemini
80
+
81
+ ```typescript
82
+ const geminiService = ChatServiceFactory.createChatService('gemini', {
83
+ apiKey: process.env.GOOGLE_API_KEY,
84
+ model: 'gemini-pro'
85
+ });
86
+ ```
87
+
88
+ ### Vision Chat
89
+
90
+ ```typescript
91
+ const visionMessage = {
92
+ role: 'user',
93
+ content: [
94
+ { type: 'text', text: 'What do you see in this image?' },
95
+ {
96
+ type: 'image_url',
97
+ image_url: {
98
+ url: 'data:image/jpeg;base64,...', // or https:// URL
99
+ detail: 'low' // 'low', 'high', or 'auto'
100
+ }
101
+ }
102
+ ]
103
+ };
104
+
105
+ await chatService.processVisionChat(
106
+ [visionMessage],
107
+ (partial) => console.log(partial),
108
+ async (complete) => console.log(complete)
109
+ );
110
+ ```
111
+
112
+ ### Tool/Function Calling
113
+
114
+ ```typescript
115
+ import { ToolDefinition } from '@aituber-onair/chat';
116
+
117
+ const tools: ToolDefinition[] = [{
118
+ name: 'get_weather',
119
+ description: 'Get the current weather for a location',
120
+ parameters: {
121
+ type: 'object',
122
+ properties: {
123
+ location: { type: 'string', description: 'City name' }
124
+ },
125
+ required: ['location']
126
+ }
127
+ }];
128
+
129
+ // Tool calling is handled automatically by the chat service
130
+ // Configure tool handlers when creating the service
131
+ ```
132
+
133
+ ### Response Length Control
134
+
135
+ ```typescript
136
+ // Using preset response lengths
137
+ const service = ChatServiceFactory.createChatService('openai', {
138
+ apiKey: 'your-key',
139
+ responseLength: 'medium' // 'veryShort', 'short', 'medium', 'long', 'veryLong'
140
+ });
141
+
142
+ // Using custom token limits
143
+ const service = ChatServiceFactory.createChatService('openai', {
144
+ apiKey: 'your-key',
145
+ maxTokens: 500 // Direct token limit
146
+ });
147
+ ```
148
+
149
+ ### Model Context Protocol (MCP)
150
+
151
+ The chat package supports MCP (Model Context Protocol) servers across all providers, with different implementation approaches:
152
+
153
+ #### Provider-Specific MCP Implementation
154
+
155
+ **OpenAI & Claude**: Direct MCP Integration
156
+ - Uses provider's native MCP support (Responses API for OpenAI)
157
+ - Server-to-server communication (no CORS issues)
158
+ - Direct connection to MCP servers
159
+
160
+ **Gemini**: Function Calling Integration
161
+ - MCP tools are registered as Gemini function declarations
162
+ - ToolExecutor handles MCP server communication
163
+ - Requires CORS configuration in browser environments
164
+
165
+ #### Basic Usage
166
+
167
+ ```typescript
168
+ // MCP servers work with all providers (OpenAI, Claude, Gemini)
169
+ const mcpServers = [{
170
+ type: 'url',
171
+ url: 'http://localhost:3000',
172
+ name: 'local-server',
173
+ authorization_token: 'optional-token'
174
+ }];
175
+
176
+ // OpenAI/Claude - direct MCP integration
177
+ const openaiService = ChatServiceFactory.createChatService('openai', {
178
+ apiKey: 'your-key',
179
+ mcpServers // Direct integration via Responses API
180
+ });
181
+
182
+ // Gemini - MCP via function calling
183
+ const geminiService = ChatServiceFactory.createChatService('gemini', {
184
+ apiKey: 'your-key',
185
+ mcpServers // Integrated as function declarations
186
+ });
187
+
188
+ // MCP tools are automatically available and handled by ToolExecutor
189
+ ```
190
+
191
+ #### Gemini-Specific CORS Configuration
192
+
193
+ When using Gemini with MCP in browser environments, you need to configure a proxy to avoid CORS issues:
194
+
195
+ **Vite Development Setup** (`vite.config.ts`):
196
+ ```typescript
197
+ export default defineConfig({
198
+ server: {
199
+ proxy: {
200
+ '/api/mcp': {
201
+ target: 'https://mcp.deepwiki.com',
202
+ changeOrigin: true,
203
+ rewrite: (path) => path.replace(/^\/api\/mcp/, ''),
204
+ }
205
+ }
206
+ }
207
+ })
208
+ ```
209
+
210
+ **Dynamic MCP URL Configuration**:
211
+ ```typescript
212
+ // Provider-specific MCP server configuration
213
+ const getMcpServers = (provider: string): MCPServerConfig[] => {
214
+ const baseUrl = provider === 'gemini'
215
+ ? '/api/mcp/sse' // Proxy URL for Gemini (browser)
216
+ : 'https://mcp.deepwiki.com/sse'; // Direct URL for OpenAI/Claude
217
+
218
+ return [{
219
+ type: 'url',
220
+ url: baseUrl,
221
+ name: 'deepwiki',
222
+ }];
223
+ };
224
+
225
+ // Use in chat service creation
226
+ const mcpServers = getMcpServers(chatProvider);
227
+ const chatService = ChatServiceFactory.createChatService(chatProvider, {
228
+ apiKey: 'your-api-key',
229
+ mcpServers
230
+ });
231
+ ```
232
+
233
+ #### Error Handling & Timeouts
234
+
235
+ The Gemini MCP implementation includes robust error handling:
236
+ - 5-second timeout for MCP schema fetching
237
+ - Automatic fallback to basic search tools if MCP servers are unavailable
238
+ - Graceful degradation when MCP initialization fails
239
+
240
+ ### Emotion Detection
241
+
242
+ ```typescript
243
+ import { textToScreenplay } from '@aituber-onair/chat';
244
+
245
+ const text = "[happy] I'm so glad to see you!";
246
+ const screenplay = textToScreenplay(text);
247
+ console.log(screenplay); // { emotion: 'happy', text: "I'm so glad to see you!" }
248
+ ```
249
+
250
+ ## API Reference
251
+
252
+ ### ChatService Interface
253
+
254
+ ```typescript
255
+ interface ChatService {
256
+ getModel(): string;
257
+ getVisionModel(): string;
258
+
259
+ processChat(
260
+ messages: Message[],
261
+ onPartialResponse: (text: string) => void,
262
+ onCompleteResponse: (text: string) => Promise<void>
263
+ ): Promise<void>;
264
+
265
+ processVisionChat(
266
+ messages: MessageWithVision[],
267
+ onPartialResponse: (text: string) => void,
268
+ onCompleteResponse: (text: string) => Promise<void>
269
+ ): Promise<void>;
270
+
271
+ chatOnce(
272
+ messages: Message[],
273
+ stream: boolean,
274
+ onPartialResponse: (text: string) => void,
275
+ maxTokens?: number
276
+ ): Promise<ToolChatCompletion>;
277
+
278
+ visionChatOnce(
279
+ messages: MessageWithVision[],
280
+ stream: boolean,
281
+ onPartialResponse: (text: string) => void,
282
+ maxTokens?: number
283
+ ): Promise<ToolChatCompletion>;
284
+ }
285
+ ```
286
+
287
+ ### Types
288
+
289
+ ```typescript
290
+ interface Message {
291
+ role: 'system' | 'user' | 'assistant' | 'tool';
292
+ content: string;
293
+ timestamp?: number;
294
+ }
295
+
296
+ interface MessageWithVision {
297
+ role: 'system' | 'user' | 'assistant' | 'tool';
298
+ content: string | VisionBlock[];
299
+ }
300
+
301
+ type ChatResponseLength = 'veryShort' | 'short' | 'medium' | 'long' | 'veryLong';
302
+ ```
303
+
304
+ ## Available Providers
305
+
306
+ Currently, the following AI provider is built-in:
307
+
308
+ - **OpenAI**: Supports models like GPT-4.1(including mini and nano), GPT-4, GPT-4o-mini, O3-mini, o1, o1-mini
309
+ - **Gemini**: Supports models like Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite Preview, Gemini 2.0 Flash, Gemini 2.0 Flash-Lite, Gemini 1.5 Flash, Gemini 1.5 Pro
310
+ - **Claude**: Supports models like Claude 3 Haiku, Claude 3.5 Haiku, Claude 3.5 Sonnet v2, Claude 3.7 Sonnet
311
+
312
+ ## License
313
+
314
+ MIT
315
+
316
+ ## Contributing
317
+
318
+ Contributions are welcome! Please feel free to submit a Pull Request.
@@ -0,0 +1,26 @@
1
+ export declare const CHAT_RESPONSE_LENGTH: {
2
+ readonly VERY_SHORT: "veryShort";
3
+ readonly SHORT: "short";
4
+ readonly MEDIUM: "medium";
5
+ readonly LONG: "long";
6
+ readonly VERY_LONG: "veryLong";
7
+ };
8
+ export declare const MAX_TOKENS_BY_LENGTH: {
9
+ readonly veryShort: 40;
10
+ readonly short: 100;
11
+ readonly medium: 200;
12
+ readonly long: 300;
13
+ readonly veryLong: 1000;
14
+ };
15
+ /**
16
+ * Default max tokens for AI providers when not specified
17
+ */
18
+ export declare const DEFAULT_MAX_TOKENS = 1000;
19
+ export type ChatResponseLength = (typeof CHAT_RESPONSE_LENGTH)[keyof typeof CHAT_RESPONSE_LENGTH];
20
+ /**
21
+ * Converts a ChatResponseLength to the corresponding max_tokens value
22
+ * @param responseLength - The response length setting
23
+ * @returns The max_tokens value, or DEFAULT_MAX_TOKENS if responseLength is not provided
24
+ */
25
+ export declare function getMaxTokensForResponseLength(responseLength?: ChatResponseLength): number;
26
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB;;;;;;CAMvB,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;CAMvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,CAAC,EAAE,kBAAkB,GAClC,MAAM,CAKR"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_MAX_TOKENS = exports.MAX_TOKENS_BY_LENGTH = exports.CHAT_RESPONSE_LENGTH = void 0;
4
+ exports.getMaxTokensForResponseLength = getMaxTokensForResponseLength;
5
+ exports.CHAT_RESPONSE_LENGTH = {
6
+ VERY_SHORT: 'veryShort',
7
+ SHORT: 'short',
8
+ MEDIUM: 'medium',
9
+ LONG: 'long',
10
+ VERY_LONG: 'veryLong',
11
+ };
12
+ exports.MAX_TOKENS_BY_LENGTH = {
13
+ [exports.CHAT_RESPONSE_LENGTH.VERY_SHORT]: 40,
14
+ [exports.CHAT_RESPONSE_LENGTH.SHORT]: 100,
15
+ [exports.CHAT_RESPONSE_LENGTH.MEDIUM]: 200,
16
+ [exports.CHAT_RESPONSE_LENGTH.LONG]: 300,
17
+ [exports.CHAT_RESPONSE_LENGTH.VERY_LONG]: 1000,
18
+ };
19
+ /**
20
+ * Default max tokens for AI providers when not specified
21
+ */
22
+ exports.DEFAULT_MAX_TOKENS = 1000;
23
+ /**
24
+ * Converts a ChatResponseLength to the corresponding max_tokens value
25
+ * @param responseLength - The response length setting
26
+ * @returns The max_tokens value, or DEFAULT_MAX_TOKENS if responseLength is not provided
27
+ */
28
+ function getMaxTokensForResponseLength(responseLength) {
29
+ if (!responseLength) {
30
+ return exports.DEFAULT_MAX_TOKENS;
31
+ }
32
+ return exports.MAX_TOKENS_BY_LENGTH[responseLength] ?? exports.DEFAULT_MAX_TOKENS;
33
+ }
34
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":";;;AA6BA,sEAOC;AApCY,QAAA,oBAAoB,GAAG;IAClC,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,UAAU;CACb,CAAC;AAEE,QAAA,oBAAoB,GAAG;IAClC,CAAC,4BAAoB,CAAC,UAAU,CAAC,EAAE,EAAE;IACrC,CAAC,4BAAoB,CAAC,KAAK,CAAC,EAAE,GAAG;IACjC,CAAC,4BAAoB,CAAC,MAAM,CAAC,EAAE,GAAG;IAClC,CAAC,4BAAoB,CAAC,IAAI,CAAC,EAAE,GAAG;IAChC,CAAC,4BAAoB,CAAC,SAAS,CAAC,EAAE,IAAI;CAC9B,CAAC;AAEX;;GAEG;AACU,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAKvC;;;;GAIG;AACH,SAAgB,6BAA6B,CAC3C,cAAmC;IAEnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,0BAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,4BAAoB,CAAC,cAAc,CAAC,IAAI,0BAAkB,CAAC;AACpE,CAAC"}