@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
@@ -0,0 +1,497 @@
1
+ import { ENDPOINT_CLAUDE_API, MODEL_CLAUDE_3_HAIKU, CLAUDE_VISION_SUPPORTED_MODELS, } from '../../../constants';
2
+ import { getMaxTokensForResponseLength, } from '../../../constants/chat';
3
+ import { ChatServiceHttpClient } from '../../../utils/chatServiceHttpClient';
4
+ /**
5
+ * Claude implementation of ChatService
6
+ */
7
+ export class ClaudeChatService {
8
+ /**
9
+ * Constructor
10
+ * @param apiKey Anthropic API key
11
+ * @param model Name of the model to use
12
+ * @param visionModel Name of the vision model
13
+ * @param tools Array of tool definitions
14
+ * @param mcpServers Array of MCP server configurations (optional)
15
+ * @throws Error if the vision model doesn't support vision capabilities
16
+ */
17
+ constructor(apiKey, model = MODEL_CLAUDE_3_HAIKU, visionModel = MODEL_CLAUDE_3_HAIKU, tools = [], mcpServers = [], responseLength) {
18
+ /** Provider name */
19
+ this.provider = 'claude';
20
+ this.apiKey = apiKey;
21
+ this.model = model || MODEL_CLAUDE_3_HAIKU;
22
+ this.visionModel = visionModel || MODEL_CLAUDE_3_HAIKU;
23
+ this.tools = tools;
24
+ this.mcpServers = mcpServers;
25
+ this.responseLength = responseLength;
26
+ // Validate vision model supports vision capabilities
27
+ if (!CLAUDE_VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
28
+ throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
29
+ }
30
+ }
31
+ /**
32
+ * Get the current model name
33
+ * @returns Model name
34
+ */
35
+ getModel() {
36
+ return this.model;
37
+ }
38
+ /**
39
+ * Get the current vision model name
40
+ * @returns Vision model name
41
+ */
42
+ getVisionModel() {
43
+ return this.visionModel;
44
+ }
45
+ /**
46
+ * Get configured MCP servers
47
+ * @returns Array of MCP server configurations
48
+ */
49
+ getMCPServers() {
50
+ return this.mcpServers;
51
+ }
52
+ /**
53
+ * Add MCP server configuration
54
+ * @param serverConfig MCP server configuration
55
+ */
56
+ addMCPServer(serverConfig) {
57
+ this.mcpServers.push(serverConfig);
58
+ }
59
+ /**
60
+ * Remove MCP server by name
61
+ * @param serverName Name of the server to remove
62
+ */
63
+ removeMCPServer(serverName) {
64
+ this.mcpServers = this.mcpServers.filter((server) => server.name !== serverName);
65
+ }
66
+ /**
67
+ * Check if MCP servers are configured
68
+ * @returns True if MCP servers are configured
69
+ */
70
+ hasMCPServers() {
71
+ return this.mcpServers.length > 0;
72
+ }
73
+ /**
74
+ * Process chat messages
75
+ * @param messages Array of messages to send
76
+ * @param onPartialResponse Callback to receive each part of streaming response
77
+ * @param onCompleteResponse Callback to execute when response is complete
78
+ */
79
+ async processChat(messages, onPartialResponse, onCompleteResponse) {
80
+ // not use tools or MCP servers
81
+ if (this.tools.length === 0 && this.mcpServers.length === 0) {
82
+ const res = await this.callClaude(messages, this.model, true);
83
+ const full = await this.parsePureStream(res, onPartialResponse);
84
+ await onCompleteResponse(full);
85
+ return;
86
+ }
87
+ // use tools or MCP servers
88
+ const result = await this.chatOnce(messages, true, onPartialResponse);
89
+ if (result.stop_reason === 'end') {
90
+ const full = result.blocks
91
+ .filter((b) => b.type === 'text')
92
+ .map((b) => b.text)
93
+ .join('');
94
+ await onCompleteResponse(full);
95
+ return;
96
+ }
97
+ /* if tool_use, throw error */
98
+ throw new Error('processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled.');
99
+ }
100
+ /**
101
+ * Process chat messages with images
102
+ * @param messages Array of messages to send (including images)
103
+ * @param onPartialResponse Callback to receive each part of streaming response
104
+ * @param onCompleteResponse Callback to execute when response is complete
105
+ */
106
+ async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
107
+ /* same branch logic for vision */
108
+ if (this.tools.length === 0 && this.mcpServers.length === 0) {
109
+ const res = await this.callClaude(messages, this.visionModel, true);
110
+ const full = await this.parsePureStream(res, onPartialResponse);
111
+ await onCompleteResponse(full);
112
+ return;
113
+ }
114
+ const result = await this.visionChatOnce(messages); // non-stream (tools only)
115
+ if (result.stop_reason === 'end') {
116
+ const full = result.blocks
117
+ .filter((b) => b.type === 'text')
118
+ .map((b) => b.text)
119
+ .join('');
120
+ await onCompleteResponse(full);
121
+ return;
122
+ }
123
+ throw new Error('processVisionChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled.');
124
+ }
125
+ /**
126
+ * Convert AITuber OnAir messages to Claude format
127
+ * @param messages Array of messages
128
+ * @returns Claude formatted messages
129
+ */
130
+ convertMessagesToClaudeFormat(messages) {
131
+ return messages.map((msg) => {
132
+ return {
133
+ role: this.mapRoleToClaude(msg.role),
134
+ content: msg.content,
135
+ };
136
+ });
137
+ }
138
+ /**
139
+ * Convert AITuber OnAir vision messages to Claude format
140
+ * @param messages Array of vision messages
141
+ * @returns Claude formatted vision messages
142
+ */
143
+ convertVisionMessagesToClaudeFormat(messages) {
144
+ return messages.map((msg) => {
145
+ // If message content is a string, create a text-only message
146
+ if (typeof msg.content === 'string') {
147
+ return {
148
+ role: this.mapRoleToClaude(msg.role),
149
+ content: [
150
+ {
151
+ type: 'text',
152
+ text: msg.content,
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ // If message content is an array of blocks, convert each block
158
+ if (Array.isArray(msg.content)) {
159
+ const content = msg.content
160
+ .map((block) => {
161
+ if (block.type === 'image_url') {
162
+ // check if the image url is a data url
163
+ if (block.image_url.url.startsWith('data:')) {
164
+ const m = block.image_url.url.match(/^data:([^;]+);base64,(.+)$/);
165
+ if (m) {
166
+ return {
167
+ type: 'image',
168
+ source: { type: 'base64', media_type: m[1], data: m[2] },
169
+ };
170
+ }
171
+ return null;
172
+ }
173
+ // if the image url is a normal url
174
+ return {
175
+ type: 'image',
176
+ source: {
177
+ type: 'url',
178
+ url: block.image_url.url,
179
+ media_type: this.getMimeTypeFromUrl(block.image_url.url),
180
+ },
181
+ };
182
+ }
183
+ return block;
184
+ })
185
+ .filter((b) => b);
186
+ return {
187
+ role: this.mapRoleToClaude(msg.role),
188
+ content,
189
+ };
190
+ }
191
+ return {
192
+ role: this.mapRoleToClaude(msg.role),
193
+ content: [],
194
+ };
195
+ });
196
+ }
197
+ /**
198
+ * Map AITuber OnAir roles to Claude roles
199
+ * @param role AITuber OnAir role
200
+ * @returns Claude role
201
+ */
202
+ mapRoleToClaude(role) {
203
+ switch (role) {
204
+ case 'system':
205
+ // Claude handles system messages separately, but we'll map it anyway
206
+ return 'system';
207
+ case 'user':
208
+ return 'user';
209
+ case 'assistant':
210
+ return 'assistant';
211
+ default:
212
+ return 'user';
213
+ }
214
+ }
215
+ /**
216
+ * Get MIME type from URL
217
+ * @param url Image URL
218
+ * @returns MIME type
219
+ */
220
+ getMimeTypeFromUrl(url) {
221
+ const extension = url.split('.').pop()?.toLowerCase();
222
+ switch (extension) {
223
+ case 'jpg':
224
+ case 'jpeg':
225
+ return 'image/jpeg';
226
+ case 'png':
227
+ return 'image/png';
228
+ case 'gif':
229
+ return 'image/gif';
230
+ case 'webp':
231
+ return 'image/webp';
232
+ default:
233
+ return 'image/jpeg';
234
+ }
235
+ }
236
+ /**
237
+ * Call Claude API
238
+ * @param messages Array of messages to send
239
+ * @param model Model name
240
+ * @param stream Whether to stream the response
241
+ * @param maxTokens Maximum tokens for response (optional)
242
+ * @returns Response
243
+ */
244
+ async callClaude(messages, model, stream, maxTokens) {
245
+ const system = messages.find((m) => m.role === 'system')?.content ?? '';
246
+ const content = messages.filter((m) => m.role !== 'system');
247
+ const hasVision = content.some((m) => Array.isArray(m.content) &&
248
+ m.content.some((b) => b.type === 'image_url' || b.type === 'image'));
249
+ const body = {
250
+ model,
251
+ system,
252
+ messages: hasVision
253
+ ? this.convertVisionMessagesToClaudeFormat(content)
254
+ : this.convertMessagesToClaudeFormat(content),
255
+ stream,
256
+ max_tokens: maxTokens !== undefined
257
+ ? maxTokens
258
+ : getMaxTokensForResponseLength(this.responseLength),
259
+ };
260
+ if (this.tools.length) {
261
+ body.tools = this.tools.map((t) => ({
262
+ name: t.name,
263
+ description: t.description,
264
+ input_schema: t.parameters,
265
+ }));
266
+ body.tool_choice = { type: 'auto' };
267
+ }
268
+ // Add MCP servers if configured
269
+ if (this.mcpServers.length > 0) {
270
+ body.mcp_servers = this.mcpServers;
271
+ }
272
+ const headers = {
273
+ 'Content-Type': 'application/json',
274
+ 'x-api-key': this.apiKey,
275
+ 'anthropic-version': '2023-06-01',
276
+ 'anthropic-dangerous-direct-browser-access': 'true',
277
+ };
278
+ // Add beta header if MCP servers are configured
279
+ if (this.mcpServers.length > 0) {
280
+ headers['anthropic-beta'] = 'mcp-client-2025-04-04';
281
+ }
282
+ const res = await ChatServiceHttpClient.post(ENDPOINT_CLAUDE_API, body, headers);
283
+ return res;
284
+ }
285
+ /**
286
+ * Parse stream response
287
+ * @param res Response
288
+ * @param onPartial Callback to receive each part of streaming response
289
+ * @returns ClaudeInternalCompletion
290
+ */
291
+ async parseStream(res, onPartial) {
292
+ const reader = res.body.getReader();
293
+ const dec = new TextDecoder();
294
+ const textBlocks = [];
295
+ const toolCalls = new Map();
296
+ let buf = '';
297
+ while (true) {
298
+ const { done, value } = await reader.read();
299
+ if (done)
300
+ break;
301
+ buf += dec.decode(value, { stream: true });
302
+ let nl;
303
+ while ((nl = buf.indexOf('\n')) !== -1) {
304
+ const line = buf.slice(0, nl).trim();
305
+ buf = buf.slice(nl + 1);
306
+ if (!line.startsWith('data:'))
307
+ continue;
308
+ const payload = line.slice(5).trim();
309
+ if (payload === '[DONE]')
310
+ break;
311
+ const ev = JSON.parse(payload);
312
+ /* content delta */
313
+ if (ev.type === 'content_block_delta' && ev.delta?.text) {
314
+ onPartial(ev.delta.text);
315
+ textBlocks.push({ type: 'text', text: ev.delta.text });
316
+ }
317
+ /* tool_call delta */
318
+ if (ev.type === 'content_block_start' &&
319
+ ev.content_block?.type === 'tool_use') {
320
+ toolCalls.set(ev.index, {
321
+ id: ev.content_block.id,
322
+ name: ev.content_block.name,
323
+ args: '',
324
+ });
325
+ }
326
+ else if (ev.type === 'content_block_start' &&
327
+ ev.content_block?.type === 'mcp_tool_use') {
328
+ // Handle MCP tool use
329
+ toolCalls.set(ev.index, {
330
+ id: ev.content_block.id,
331
+ name: ev.content_block.name,
332
+ args: '',
333
+ server_name: ev.content_block.server_name,
334
+ });
335
+ }
336
+ else if (ev.type === 'content_block_start' && // case of non-stream
337
+ ev.content_block?.type === 'tool_result') {
338
+ textBlocks.push({
339
+ type: 'tool_result',
340
+ tool_use_id: ev.content_block.tool_use_id,
341
+ content: ev.content_block.content ?? '',
342
+ });
343
+ }
344
+ else if (ev.type === 'content_block_start' &&
345
+ ev.content_block?.type === 'mcp_tool_result') {
346
+ // Handle MCP tool result
347
+ textBlocks.push({
348
+ type: 'mcp_tool_result',
349
+ tool_use_id: ev.content_block.tool_use_id,
350
+ is_error: ev.content_block.is_error ?? false,
351
+ content: ev.content_block.content ?? [],
352
+ });
353
+ }
354
+ /* case of input_json_delta */
355
+ if (ev.type === 'content_block_delta' &&
356
+ ev.delta?.type === 'input_json_delta') {
357
+ const entry = toolCalls.get(ev.index);
358
+ if (entry)
359
+ entry.args += ev.delta.partial_json || '';
360
+ }
361
+ /* case of content_block_stop */
362
+ if (ev.type === 'content_block_stop' && toolCalls.has(ev.index)) {
363
+ const { id, name, args, server_name } = toolCalls.get(ev.index);
364
+ if (server_name) {
365
+ // MCP tool use
366
+ textBlocks.push({
367
+ type: 'mcp_tool_use',
368
+ id,
369
+ name,
370
+ server_name,
371
+ input: JSON.parse(args || '{}'),
372
+ });
373
+ }
374
+ else {
375
+ // Standard tool use
376
+ textBlocks.push({
377
+ type: 'tool_use',
378
+ id,
379
+ name,
380
+ input: JSON.parse(args || '{}'),
381
+ });
382
+ }
383
+ toolCalls.delete(ev.index);
384
+ }
385
+ }
386
+ }
387
+ return {
388
+ blocks: textBlocks,
389
+ stop_reason: textBlocks.some((b) => b.type === 'tool_use' || b.type === 'mcp_tool_use')
390
+ ? 'tool_use'
391
+ : 'end',
392
+ };
393
+ }
394
+ async parsePureStream(res, onPartial) {
395
+ const { blocks } = await this.parseStream(res, onPartial);
396
+ return blocks
397
+ .filter((b) => b.type === 'text')
398
+ .map((b) => b.text)
399
+ .join('');
400
+ }
401
+ parseOneShot(data) {
402
+ const blocks = [];
403
+ (data.content ?? []).forEach((c) => {
404
+ if (c.type === 'text') {
405
+ blocks.push({ type: 'text', text: c.text });
406
+ }
407
+ else if (c.type === 'tool_use') {
408
+ blocks.push({
409
+ type: 'tool_use',
410
+ id: c.id,
411
+ name: c.name,
412
+ input: c.input ?? {},
413
+ });
414
+ }
415
+ else if (c.type === 'mcp_tool_use') {
416
+ blocks.push({
417
+ type: 'mcp_tool_use',
418
+ id: c.id,
419
+ name: c.name,
420
+ server_name: c.server_name,
421
+ input: c.input ?? {},
422
+ });
423
+ }
424
+ else if (c.type === 'tool_result') {
425
+ blocks.push({
426
+ type: 'tool_result',
427
+ tool_use_id: c.tool_use_id,
428
+ content: c.content ?? '',
429
+ });
430
+ }
431
+ else if (c.type === 'mcp_tool_result') {
432
+ blocks.push({
433
+ type: 'mcp_tool_result',
434
+ tool_use_id: c.tool_use_id,
435
+ is_error: c.is_error ?? false,
436
+ content: c.content ?? [],
437
+ });
438
+ }
439
+ });
440
+ return {
441
+ blocks,
442
+ stop_reason: blocks.some((b) => b.type === 'tool_use' || b.type === 'mcp_tool_use')
443
+ ? 'tool_use'
444
+ : 'end',
445
+ };
446
+ }
447
+ /**
448
+ * Process chat messages
449
+ * @param messages Array of messages to send
450
+ * @param stream Whether to stream the response
451
+ * @param onPartial Callback to receive each part of streaming response
452
+ * @param maxTokens Maximum tokens for response (optional)
453
+ * @returns ToolChatCompletion
454
+ */
455
+ async chatOnce(messages, stream = true, onPartial = () => { }, maxTokens) {
456
+ const res = await this.callClaude(messages, this.model, stream, maxTokens);
457
+ const internalResult = stream
458
+ ? await this.parseStream(res, onPartial)
459
+ : this.parseOneShot(await res.json());
460
+ // Convert ClaudeInternalCompletion to ToolChatCompletion for compatibility
461
+ return this.convertToStandardCompletion(internalResult);
462
+ }
463
+ /**
464
+ * Process vision chat messages
465
+ * @param messages Array of messages to send
466
+ * @param stream Whether to stream the response
467
+ * @param onPartial Callback to receive each part of streaming response
468
+ * @param maxTokens Maximum tokens for response (optional)
469
+ * @returns ToolChatCompletion
470
+ */
471
+ async visionChatOnce(messages, stream = false, onPartial = () => { }, maxTokens) {
472
+ const res = await this.callClaude(messages, this.visionModel, stream, maxTokens);
473
+ const internalResult = stream
474
+ ? await this.parseStream(res, onPartial)
475
+ : this.parseOneShot(await res.json());
476
+ // Convert ClaudeInternalCompletion to ToolChatCompletion for compatibility
477
+ return this.convertToStandardCompletion(internalResult);
478
+ }
479
+ /**
480
+ * Convert internal completion to standard ToolChatCompletion
481
+ * @param completion Internal completion result
482
+ * @returns Standard ToolChatCompletion
483
+ */
484
+ convertToStandardCompletion(completion) {
485
+ // Filter out MCP-specific blocks and convert to standard format
486
+ const standardBlocks = completion.blocks.filter((block) => {
487
+ return (block.type === 'text' ||
488
+ block.type === 'tool_use' ||
489
+ block.type === 'tool_result');
490
+ });
491
+ return {
492
+ blocks: standardBlocks,
493
+ stop_reason: completion.stop_reason,
494
+ };
495
+ }
496
+ }
497
+ //# sourceMappingURL=ClaudeChatService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeChatService.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatService.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAoB7E;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAW5B;;;;;;;;OAQG;IACH,YACE,MAAc,EACd,QAAgB,oBAAoB,EACpC,cAAsB,oBAAoB,EAC1C,QAA0B,EAAE,EAC5B,aAAgC,EAAE,EAClC,cAAmC;QAzBrC,oBAAoB;QACX,aAAQ,GAAW,QAAQ,CAAC;QA0BnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,oBAAoB,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,oBAAoB,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,qDAAqD;QACrD,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,CAAC,WAAW,wCAAwC,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,YAA6B;QACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,UAAkB;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CACtC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CACvC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CACf,QAAmB,EACnB,iBAAyC,EACzC,kBAAmD;QAEnD,+BAA+B;QAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAChE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAEtE,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAA6B,EAC7B,iBAAyC,EACzC,kBAAmD;QAEnD,kCAAkC;QAClC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAChE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,0BAA0B;QAE9E,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,6BAA6B,CAAC,QAAmB;QACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,mCAAmC,CACzC,QAA6B;QAE7B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,6DAA6D;YAC7D,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;oBACpC,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,GAAG,CAAC,OAAO;yBAClB;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;qBACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACb,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAC/B,uCAAuC;wBACvC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CACjC,4BAA4B,CAC7B,CAAC;4BACF,IAAI,CAAC,EAAE,CAAC;gCACN,OAAO;oCACL,IAAI,EAAE,OAAO;oCACb,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;iCACzD,CAAC;4BACJ,CAAC;4BACD,OAAO,IAAI,CAAC;wBACd,CAAC;wBAED,mCAAmC;wBACnC,OAAO;4BACL,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE;gCACN,IAAI,EAAE,KAAK;gCACX,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG;gCACxB,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;6BACzD;yBACF,CAAC;oBACJ,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC;qBACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEpB,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;oBACpC,OAAO;iBACR,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpC,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,IAAY;QAClC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,qEAAqE;gBACrE,OAAO,QAAQ,CAAC;YAClB,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC;YACrB;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,GAAW;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QACtD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,WAAW,CAAC;YACrB,KAAK,KAAK;gBACR,OAAO,WAAW,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB;gBACE,OAAO,YAAY,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,UAAU,CACtB,QAAyC,EACzC,KAAa,EACb,MAAe,EACf,SAAkB;QAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,OAAO,CAAE,CAAS,CAAC,OAAO,CAAC;YAChC,CAAS,CAAC,OAAO,CAAC,IAAI,CACrB,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CACzD,CACJ,CAAC;QAEF,MAAM,IAAI,GAAQ;YAChB,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,SAAS;gBACjB,CAAC,CAAC,IAAI,CAAC,mCAAmC,CACtC,OAA8B,CAC/B;gBACH,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,OAAoB,CAAC;YAC5D,MAAM;YACN,UAAU,EACR,SAAS,KAAK,SAAS;gBACrB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,cAAc,CAAC;SACzD,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,YAAY,EAAE,CAAC,CAAC,UAAU;aAC3B,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACtC,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,mBAAmB,EAAE,YAAY;YACjC,2CAA2C,EAAE,MAAM;SACpD,CAAC;QAEF,gDAAgD;QAChD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,gBAAgB,CAAC,GAAG,uBAAuB,CAAC;QACtD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAC1C,mBAAmB,EACnB,IAAI,EACJ,OAAO,CACR,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,WAAW,CACvB,GAAa,EACb,SAA8B;QAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAE9B,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAGtB,CAAC;QAEJ,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,IAAI,EAAE,CAAC;YACP,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAExC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,OAAO,KAAK,QAAQ;oBAAE,MAAM;gBAEhC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAE/B,mBAAmB;gBACnB,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;oBACxD,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;gBAED,qBAAqB;gBACrB,IACE,EAAE,CAAC,IAAI,KAAK,qBAAqB;oBACjC,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,UAAU,EACrC,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE;wBACtB,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE;wBACvB,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI;wBAC3B,IAAI,EAAE,EAAE;qBACT,CAAC,CAAC;gBACL,CAAC;qBAAM,IACL,EAAE,CAAC,IAAI,KAAK,qBAAqB;oBACjC,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,cAAc,EACzC,CAAC;oBACD,sBAAsB;oBACtB,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE;wBACtB,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE;wBACvB,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI;wBAC3B,IAAI,EAAE,EAAE;wBACR,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,WAAW;qBAC1C,CAAC,CAAC;gBACL,CAAC;qBAAM,IACL,EAAE,CAAC,IAAI,KAAK,qBAAqB,IAAI,qBAAqB;oBAC1D,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,aAAa,EACxC,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,WAAW;wBACzC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,IAAI,EAAE;qBACxC,CAAC,CAAC;gBACL,CAAC;qBAAM,IACL,EAAE,CAAC,IAAI,KAAK,qBAAqB;oBACjC,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,iBAAiB,EAC5C,CAAC;oBACD,yBAAyB;oBACzB,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,iBAAiB;wBACvB,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,WAAW;wBACzC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,IAAI,KAAK;wBAC5C,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,IAAI,EAAE;qBACxC,CAAC,CAAC;gBACL,CAAC;gBAED,8BAA8B;gBAC9B,IACE,EAAE,CAAC,IAAI,KAAK,qBAAqB;oBACjC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,kBAAkB,EACrC,CAAC;oBACD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,KAAK;wBAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;gBACvD,CAAC;gBAED,gCAAgC;gBAChC,IAAI,EAAE,CAAC,IAAI,KAAK,oBAAoB,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAE,CAAC;oBACjE,IAAI,WAAW,EAAE,CAAC;wBAChB,eAAe;wBACf,UAAU,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,cAAc;4BACpB,EAAE;4BACF,IAAI;4BACJ,WAAW;4BACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;yBAChC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,oBAAoB;wBACpB,UAAU,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,UAAU;4BAChB,EAAE;4BACF,IAAI;4BACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;yBAChC,CAAC,CAAC;oBACL,CAAC;oBACD,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,UAAU,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAC1D;gBACC,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,KAAK;SACV,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,GAAa,EACb,SAA8B;QAE9B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,IAAS;QAC5B,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YACtC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,cAAc;oBACpB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;iBACzB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;oBAC7B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM;YACN,WAAW,EAAE,MAAM,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAC1D;gBACC,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,KAAK;SACV,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACZ,QAAmB,EACnB,SAAkB,IAAI,EACtB,YAAiC,GAAG,EAAE,GAAE,CAAC,EACzC,SAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,cAAc,GAAG,MAAM;YAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC;YACxC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAExC,2EAA2E;QAC3E,OAAO,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAClB,QAA6B,EAC7B,SAAkB,KAAK,EACvB,YAAiC,GAAG,EAAE,GAAE,CAAC,EACzC,SAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAC/B,QAAQ,EACR,IAAI,CAAC,WAAW,EAChB,MAAM,EACN,SAAS,CACV,CAAC;QACF,MAAM,cAAc,GAAG,MAAM;YAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC;YACxC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAExC,2EAA2E;QAC3E,OAAO,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACK,2BAA2B,CACjC,UAAoC;QAEpC,gEAAgE;QAChE,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAC7C,CAAC,KAAK,EAA8B,EAAE;YACpC,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,KAAK,CAAC,IAAI,KAAK,UAAU;gBACzB,KAAK,CAAC,IAAI,KAAK,aAAa,CAC7B,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,UAAU,CAAC,WAAW;SACpC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import { ChatService } from '../../ChatService';
2
+ import { ChatServiceOptions, ChatServiceProvider } from '../ChatServiceProvider';
3
+ /**
4
+ * Claude API provider implementation
5
+ */
6
+ export declare class ClaudeChatServiceProvider implements ChatServiceProvider {
7
+ /**
8
+ * Create a chat service instance
9
+ * @param options Service options (can include mcpServers)
10
+ * @returns ClaudeChatService instance
11
+ */
12
+ createChatService(options: ChatServiceOptions): ChatService;
13
+ /**
14
+ * Get the provider name
15
+ * @returns Provider name ('claude')
16
+ */
17
+ getProviderName(): string;
18
+ /**
19
+ * Get the list of supported models
20
+ * @returns Array of supported model names
21
+ */
22
+ getSupportedModels(): string[];
23
+ /**
24
+ * Get the default model
25
+ * @returns Default model name
26
+ */
27
+ getDefaultModel(): string;
28
+ /**
29
+ * Check if this provider supports vision (image processing)
30
+ * @returns Vision support status (true)
31
+ */
32
+ supportsVision(): boolean;
33
+ /**
34
+ * Check if a specific model supports vision capabilities
35
+ * @param model The model name to check
36
+ * @returns True if the model supports vision, false otherwise
37
+ */
38
+ supportsVisionForModel(model: string): boolean;
39
+ }
40
+ //# sourceMappingURL=ClaudeChatServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW;IAkB3D;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAW9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAG/C"}
@@ -0,0 +1,64 @@
1
+ import { MODEL_CLAUDE_3_HAIKU, MODEL_CLAUDE_3_5_HAIKU, MODEL_CLAUDE_3_5_SONNET, MODEL_CLAUDE_3_7_SONNET, MODEL_CLAUDE_4_SONNET, MODEL_CLAUDE_4_OPUS, CLAUDE_VISION_SUPPORTED_MODELS, } from '../../../constants';
2
+ import { ClaudeChatService } from './ClaudeChatService';
3
+ /**
4
+ * Claude API provider implementation
5
+ */
6
+ export class ClaudeChatServiceProvider {
7
+ /**
8
+ * Create a chat service instance
9
+ * @param options Service options (can include mcpServers)
10
+ * @returns ClaudeChatService instance
11
+ */
12
+ createChatService(options) {
13
+ // Use the visionModel if provided, otherwise use the model that supports vision
14
+ const visionModel = options.visionModel ||
15
+ (this.supportsVisionForModel(options.model || this.getDefaultModel())
16
+ ? options.model
17
+ : this.getDefaultModel());
18
+ return new ClaudeChatService(options.apiKey, options.model || this.getDefaultModel(), visionModel, options.tools ?? [], options.mcpServers ?? [], options.responseLength);
19
+ }
20
+ /**
21
+ * Get the provider name
22
+ * @returns Provider name ('claude')
23
+ */
24
+ getProviderName() {
25
+ return 'claude';
26
+ }
27
+ /**
28
+ * Get the list of supported models
29
+ * @returns Array of supported model names
30
+ */
31
+ getSupportedModels() {
32
+ return [
33
+ MODEL_CLAUDE_3_HAIKU,
34
+ MODEL_CLAUDE_3_5_HAIKU,
35
+ MODEL_CLAUDE_3_5_SONNET,
36
+ MODEL_CLAUDE_3_7_SONNET,
37
+ MODEL_CLAUDE_4_SONNET,
38
+ MODEL_CLAUDE_4_OPUS,
39
+ ];
40
+ }
41
+ /**
42
+ * Get the default model
43
+ * @returns Default model name
44
+ */
45
+ getDefaultModel() {
46
+ return MODEL_CLAUDE_3_HAIKU;
47
+ }
48
+ /**
49
+ * Check if this provider supports vision (image processing)
50
+ * @returns Vision support status (true)
51
+ */
52
+ supportsVision() {
53
+ return true;
54
+ }
55
+ /**
56
+ * Check if a specific model supports vision capabilities
57
+ * @param model The model name to check
58
+ * @returns True if the model supports vision, false otherwise
59
+ */
60
+ supportsVisionForModel(model) {
61
+ return CLAUDE_VISION_SUPPORTED_MODELS.includes(model);
62
+ }
63
+ }
64
+ //# sourceMappingURL=ClaudeChatServiceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,OAA2B;QAC3C,gFAAgF;QAChF,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;YACnB,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnE,CAAC,CAAC,OAAO,CAAC,KAAK;gBACf,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAE9B,OAAO,IAAI,iBAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,OAAO,CAAC,KAAK,IAAI,EAAE,EAClB,OAAe,CAAC,UAAU,IAAI,EAAE,EACjC,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,oBAAoB;YACpB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB,qBAAqB;YACrB,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,8BAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF"}