universal-llm-client 3.0.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +414 -0
  3. package/dist/ai-model.d.ts +53 -0
  4. package/dist/ai-model.d.ts.map +1 -0
  5. package/dist/ai-model.js +159 -0
  6. package/dist/ai-model.js.map +1 -0
  7. package/dist/auditor.d.ts +78 -0
  8. package/dist/auditor.d.ts.map +1 -0
  9. package/dist/auditor.js +104 -0
  10. package/dist/auditor.js.map +1 -0
  11. package/dist/client.d.ts +75 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +240 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/http.d.ts +47 -0
  16. package/dist/http.d.ts.map +1 -0
  17. package/dist/http.js +186 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/index.d.ts +16 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +41 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/interfaces.d.ts +324 -0
  24. package/dist/interfaces.d.ts.map +1 -0
  25. package/dist/interfaces.js +63 -0
  26. package/dist/interfaces.js.map +1 -0
  27. package/dist/mcp.d.ts +85 -0
  28. package/dist/mcp.d.ts.map +1 -0
  29. package/dist/mcp.js +255 -0
  30. package/dist/mcp.js.map +1 -0
  31. package/dist/providers/google.d.ts +33 -0
  32. package/dist/providers/google.d.ts.map +1 -0
  33. package/dist/providers/google.js +426 -0
  34. package/dist/providers/google.js.map +1 -0
  35. package/dist/providers/index.d.ts +7 -0
  36. package/dist/providers/index.d.ts.map +1 -0
  37. package/dist/providers/index.js +7 -0
  38. package/dist/providers/index.js.map +1 -0
  39. package/dist/providers/ollama.d.ts +26 -0
  40. package/dist/providers/ollama.d.ts.map +1 -0
  41. package/dist/providers/ollama.js +304 -0
  42. package/dist/providers/ollama.js.map +1 -0
  43. package/dist/providers/openai.d.ts +20 -0
  44. package/dist/providers/openai.d.ts.map +1 -0
  45. package/dist/providers/openai.js +251 -0
  46. package/dist/providers/openai.js.map +1 -0
  47. package/dist/router.d.ts +87 -0
  48. package/dist/router.d.ts.map +1 -0
  49. package/dist/router.js +260 -0
  50. package/dist/router.js.map +1 -0
  51. package/dist/stream-decoder.d.ts +112 -0
  52. package/dist/stream-decoder.d.ts.map +1 -0
  53. package/dist/stream-decoder.js +238 -0
  54. package/dist/stream-decoder.js.map +1 -0
  55. package/dist/tools.d.ts +78 -0
  56. package/dist/tools.d.ts.map +1 -0
  57. package/dist/tools.js +207 -0
  58. package/dist/tools.js.map +1 -0
  59. package/package.json +91 -0
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Universal LLM Client v3 — Google Provider
3
+ *
4
+ * Implements BaseLLMClient for Google AI Studio and Vertex AI.
5
+ * Supports Gemini and Gemma models with full tool calling,
6
+ * streaming, embeddings, and system prompt handling.
7
+ */
8
+ import { BaseLLMClient } from '../client.js';
9
+ import { httpRequest, httpStream } from '../http.js';
10
+ import { StandardChatDecoder } from '../stream-decoder.js';
11
+ export class GoogleClient extends BaseLLMClient {
12
+ isVertex;
13
+ apiVersion;
14
+ constructor(options, auditor) {
15
+ super(options, auditor);
16
+ this.isVertex = options.apiType === 'vertex';
17
+ this.apiVersion = options.apiVersion ?? 'v1beta';
18
+ }
19
+ // ========================================================================
20
+ // URL Building
21
+ // ========================================================================
22
+ getBaseUrl() {
23
+ if (this.isVertex) {
24
+ const region = this.options.region ?? 'us-central1';
25
+ return `https://${region}-aiplatform.googleapis.com/${this.apiVersion}/projects/-/locations/${region}/publishers/google/models/${this.options.model}`;
26
+ }
27
+ if (this.options.url)
28
+ return this.options.url.replace(/\/+$/, '');
29
+ return `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.options.model}`;
30
+ }
31
+ getChatUrl() {
32
+ const base = this.getBaseUrl();
33
+ if (this.isVertex) {
34
+ return `${base}:generateContent`;
35
+ }
36
+ return `${base}:generateContent?key=${this.options.apiKey}`;
37
+ }
38
+ getStreamUrl() {
39
+ const base = this.getBaseUrl();
40
+ if (this.isVertex) {
41
+ return `${base}:streamGenerateContent?alt=sse`;
42
+ }
43
+ return `${base}:streamGenerateContent?alt=sse&key=${this.options.apiKey}`;
44
+ }
45
+ getEmbedUrl() {
46
+ if (this.isVertex) {
47
+ const region = this.options.region ?? 'us-central1';
48
+ return `https://${region}-aiplatform.googleapis.com/${this.apiVersion}/projects/-/locations/${region}/publishers/google/models/${this.options.model}:embedContent`;
49
+ }
50
+ return `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.options.model}:embedContent?key=${this.options.apiKey}`;
51
+ }
52
+ getHeaders() {
53
+ const headers = {
54
+ 'Content-Type': 'application/json',
55
+ };
56
+ if (this.isVertex && this.options.apiKey) {
57
+ headers['Authorization'] = `Bearer ${this.options.apiKey}`;
58
+ }
59
+ return headers;
60
+ }
61
+ // ========================================================================
62
+ // Chat
63
+ // ========================================================================
64
+ async chat(messages, options) {
65
+ const url = this.getChatUrl();
66
+ const body = this.buildRequestBody(messages, options);
67
+ const start = Date.now();
68
+ this.auditor.record({
69
+ timestamp: start,
70
+ type: 'request',
71
+ provider: this.isVertex ? 'vertex' : 'google',
72
+ model: this.options.model,
73
+ });
74
+ const response = await httpRequest(url, {
75
+ method: 'POST',
76
+ headers: this.getHeaders(),
77
+ body,
78
+ timeout: this.options.timeout ?? 60000,
79
+ });
80
+ const result = this.parseGoogleResponse(response.data);
81
+ this.auditor.record({
82
+ timestamp: Date.now(),
83
+ type: 'response',
84
+ provider: this.isVertex ? 'vertex' : 'google',
85
+ model: this.options.model,
86
+ duration: Date.now() - start,
87
+ usage: result.usage,
88
+ });
89
+ return result;
90
+ }
91
+ // ========================================================================
92
+ // Streaming
93
+ // ========================================================================
94
+ async *chatStream(messages, options) {
95
+ const url = this.getStreamUrl();
96
+ const body = this.buildRequestBody(messages, options);
97
+ const start = Date.now();
98
+ this.auditor.record({
99
+ timestamp: start,
100
+ type: 'stream_start',
101
+ provider: this.isVertex ? 'vertex' : 'google',
102
+ model: this.options.model,
103
+ });
104
+ const decoder = new StandardChatDecoder(() => { });
105
+ let usage;
106
+ const allToolCalls = [];
107
+ const stream = httpStream(url, {
108
+ method: 'POST',
109
+ headers: this.getHeaders(),
110
+ body,
111
+ timeout: this.options.timeout ?? 120000,
112
+ });
113
+ // Google streams SSE with JSON payloads
114
+ let buffer = '';
115
+ for await (const chunk of stream) {
116
+ buffer += chunk;
117
+ // Google SSE uses "data: " prefix
118
+ const lines = buffer.split('\n');
119
+ buffer = lines.pop() ?? '';
120
+ for (const line of lines) {
121
+ if (!line.startsWith('data: '))
122
+ continue;
123
+ const jsonStr = line.slice(6).trim();
124
+ if (!jsonStr || jsonStr === '[DONE]')
125
+ continue;
126
+ try {
127
+ const data = JSON.parse(jsonStr);
128
+ if (data.usageMetadata) {
129
+ usage = {
130
+ inputTokens: data.usageMetadata.promptTokenCount ?? 0,
131
+ outputTokens: data.usageMetadata.candidatesTokenCount ?? 0,
132
+ totalTokens: data.usageMetadata.totalTokenCount ?? 0,
133
+ };
134
+ }
135
+ const candidate = data.candidates?.[0];
136
+ if (!candidate?.content?.parts)
137
+ continue;
138
+ for (const part of candidate.content.parts) {
139
+ if (part.text) {
140
+ decoder.push(part.text);
141
+ yield { type: 'text', content: part.text };
142
+ }
143
+ if (part.functionCall) {
144
+ const toolCall = this.convertFunctionCallToToolCall(part.functionCall, part.thoughtSignature);
145
+ allToolCalls.push(toolCall);
146
+ yield { type: 'tool_call', calls: [toolCall] };
147
+ }
148
+ }
149
+ }
150
+ catch {
151
+ // Skip unparseable JSON
152
+ }
153
+ }
154
+ }
155
+ decoder.flush();
156
+ this.auditor.record({
157
+ timestamp: Date.now(),
158
+ type: 'stream_end',
159
+ provider: this.isVertex ? 'vertex' : 'google',
160
+ model: this.options.model,
161
+ duration: Date.now() - start,
162
+ usage,
163
+ });
164
+ return {
165
+ message: {
166
+ role: 'assistant',
167
+ content: decoder.getCleanContent(),
168
+ tool_calls: allToolCalls.length > 0 ? allToolCalls : undefined,
169
+ },
170
+ reasoning: decoder.getReasoning(),
171
+ usage,
172
+ provider: this.isVertex ? 'vertex' : 'google',
173
+ };
174
+ }
175
+ // ========================================================================
176
+ // Embeddings
177
+ // ========================================================================
178
+ async embed(text) {
179
+ const url = this.getEmbedUrl();
180
+ const response = await httpRequest(url, {
181
+ method: 'POST',
182
+ headers: this.getHeaders(),
183
+ body: {
184
+ content: {
185
+ parts: [{ text }],
186
+ },
187
+ },
188
+ timeout: this.options.timeout ?? 30000,
189
+ });
190
+ return response.data.embedding.values;
191
+ }
192
+ // ========================================================================
193
+ // Model Discovery
194
+ // ========================================================================
195
+ async getModels() {
196
+ const baseUrl = this.isVertex
197
+ ? `https://${this.options.region ?? 'us-central1'}-aiplatform.googleapis.com/${this.apiVersion}/models`
198
+ : `https://generativelanguage.googleapis.com/${this.apiVersion}/models?key=${this.options.apiKey}`;
199
+ try {
200
+ const response = await httpRequest(baseUrl, {
201
+ headers: this.getHeaders(),
202
+ timeout: 10000,
203
+ });
204
+ return response.data.models.map(m => m.name.replace(/^models\//, ''));
205
+ }
206
+ catch {
207
+ return [];
208
+ }
209
+ }
210
+ // ========================================================================
211
+ // Request Building
212
+ // ========================================================================
213
+ buildRequestBody(messages, options) {
214
+ const isGemma = this.options.model.toLowerCase().includes('gemma');
215
+ const { systemInstruction, contents } = this.convertToGoogleMessages(messages, isGemma);
216
+ const tools = options?.tools ?? (Object.keys(this.toolRegistry).length > 0 ? this.getToolDefinitions() : undefined);
217
+ const body = {
218
+ contents,
219
+ generationConfig: this.buildGenerationConfig(options),
220
+ };
221
+ // System instruction (Gemini supports it, Gemma doesn't)
222
+ if (systemInstruction && !isGemma) {
223
+ body.systemInstruction = {
224
+ parts: [{ text: systemInstruction }],
225
+ };
226
+ }
227
+ // Tools
228
+ if (tools?.length) {
229
+ body.tools = [{
230
+ functionDeclarations: tools.map(t => this.convertToGoogleTool(t)),
231
+ }];
232
+ }
233
+ return body;
234
+ }
235
+ buildGenerationConfig(options) {
236
+ const config = {
237
+ ...this.options.defaultParameters,
238
+ ...options?.parameters,
239
+ };
240
+ if (options?.temperature !== undefined)
241
+ config['temperature'] = options.temperature;
242
+ if (options?.maxTokens !== undefined)
243
+ config['maxOutputTokens'] = options.maxTokens;
244
+ if (this.options.thinking) {
245
+ config['thinkingConfig'] = { thinkingBudget: 8192 };
246
+ }
247
+ return config;
248
+ }
249
+ // ========================================================================
250
+ // Message Conversion
251
+ // ========================================================================
252
+ convertToGoogleMessages(messages, isGemma) {
253
+ let systemInstruction;
254
+ const contents = [];
255
+ for (const msg of messages) {
256
+ if (msg.role === 'system') {
257
+ if (isGemma) {
258
+ // Gemma: prepend system message to first user message
259
+ systemInstruction = typeof msg.content === 'string'
260
+ ? msg.content
261
+ : msg.content.filter((p) => p.type === 'text').map(p => p.text).join('');
262
+ }
263
+ else {
264
+ systemInstruction = typeof msg.content === 'string'
265
+ ? msg.content
266
+ : msg.content.filter((p) => p.type === 'text').map(p => p.text).join('');
267
+ }
268
+ continue;
269
+ }
270
+ if (msg.role === 'tool') {
271
+ // Convert tool result to Google functionResponse
272
+ let responseData;
273
+ try {
274
+ responseData = typeof msg.content === 'string'
275
+ ? JSON.parse(msg.content)
276
+ : { result: msg.content };
277
+ }
278
+ catch {
279
+ responseData = { result: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content) };
280
+ }
281
+ contents.push({
282
+ role: 'function',
283
+ parts: [{
284
+ functionResponse: {
285
+ name: msg.tool_call_id ?? 'unknown',
286
+ response: responseData,
287
+ },
288
+ }],
289
+ });
290
+ continue;
291
+ }
292
+ if (msg.role === 'assistant') {
293
+ const parts = [];
294
+ const textContent = typeof msg.content === 'string' ? msg.content : '';
295
+ if (textContent)
296
+ parts.push({ text: textContent });
297
+ // Convert tool calls to functionCall parts
298
+ if (msg.tool_calls) {
299
+ for (const tc of msg.tool_calls) {
300
+ const part = {
301
+ functionCall: {
302
+ name: tc.function.name,
303
+ args: typeof tc.function.arguments === 'string'
304
+ ? JSON.parse(tc.function.arguments)
305
+ : tc.function.arguments,
306
+ },
307
+ };
308
+ // Echo thought signature back (required by Gemini 3.x)
309
+ if (tc.thoughtSignature) {
310
+ part.thoughtSignature = tc.thoughtSignature;
311
+ }
312
+ parts.push(part);
313
+ }
314
+ }
315
+ contents.push({ role: 'model', parts });
316
+ continue;
317
+ }
318
+ // User messages
319
+ const parts = this.convertContentToGoogleParts(msg.content);
320
+ // Gemma: prepend system instruction to first user message
321
+ if (isGemma && systemInstruction && contents.length === 0) {
322
+ const systemParts = [{ text: `[System Instructions]\n${systemInstruction}\n\n[User Message]\n` }];
323
+ contents.push({
324
+ role: 'user',
325
+ parts: [...systemParts, ...parts],
326
+ });
327
+ systemInstruction = undefined; // Consumed
328
+ }
329
+ else {
330
+ contents.push({ role: 'user', parts });
331
+ }
332
+ }
333
+ return { systemInstruction, contents };
334
+ }
335
+ convertContentToGoogleParts(content) {
336
+ if (typeof content === 'string') {
337
+ return [{ text: content }];
338
+ }
339
+ return content.map(part => {
340
+ if (part.type === 'text') {
341
+ return { text: part.text };
342
+ }
343
+ // Image content
344
+ const url = part.image_url.url;
345
+ if (url.startsWith('data:')) {
346
+ const match = url.match(/^data:([^;]+);base64,(.+)$/);
347
+ if (match) {
348
+ return {
349
+ inlineData: {
350
+ mimeType: match[1],
351
+ data: match[2],
352
+ },
353
+ };
354
+ }
355
+ }
356
+ // For regular URLs, try inline data format
357
+ return { text: `[Image: ${url}]` };
358
+ });
359
+ }
360
+ // ========================================================================
361
+ // Tool Conversion
362
+ // ========================================================================
363
+ convertToGoogleTool(tool) {
364
+ return {
365
+ name: tool.function.name,
366
+ description: tool.function.description,
367
+ parameters: {
368
+ type: 'object',
369
+ properties: tool.function.parameters.properties ?? {},
370
+ required: tool.function.parameters.required,
371
+ },
372
+ };
373
+ }
374
+ convertFunctionCallToToolCall(fc, thoughtSignature) {
375
+ const toolCall = {
376
+ id: this.generateToolCallId(),
377
+ type: 'function',
378
+ function: {
379
+ name: fc.name,
380
+ arguments: JSON.stringify(fc.args),
381
+ },
382
+ };
383
+ if (thoughtSignature) {
384
+ toolCall.thoughtSignature = thoughtSignature;
385
+ }
386
+ return toolCall;
387
+ }
388
+ // ========================================================================
389
+ // Response Parsing
390
+ // ========================================================================
391
+ parseGoogleResponse(data) {
392
+ const candidate = data.candidates?.[0];
393
+ if (!candidate?.content?.parts) {
394
+ return {
395
+ message: { role: 'assistant', content: '' },
396
+ provider: this.isVertex ? 'vertex' : 'google',
397
+ };
398
+ }
399
+ let textContent = '';
400
+ const toolCalls = [];
401
+ for (const part of candidate.content.parts) {
402
+ if (part.text)
403
+ textContent += part.text;
404
+ if (part.functionCall) {
405
+ toolCalls.push(this.convertFunctionCallToToolCall(part.functionCall, part.thoughtSignature));
406
+ }
407
+ }
408
+ const usage = data.usageMetadata
409
+ ? {
410
+ inputTokens: data.usageMetadata.promptTokenCount,
411
+ outputTokens: data.usageMetadata.candidatesTokenCount,
412
+ totalTokens: data.usageMetadata.totalTokenCount,
413
+ }
414
+ : undefined;
415
+ return {
416
+ message: {
417
+ role: 'assistant',
418
+ content: textContent,
419
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
420
+ },
421
+ usage,
422
+ provider: this.isVertex ? 'vertex' : 'google',
423
+ };
424
+ }
425
+ }
426
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Universal LLM Client v3 — Provider Barrel Export
3
+ */
4
+ export { OllamaClient } from './ollama.js';
5
+ export { OpenAICompatibleClient } from './openai.js';
6
+ export { GoogleClient } from './google.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Universal LLM Client v3 — Provider Barrel Export
3
+ */
4
+ export { OllamaClient } from './ollama.js';
5
+ export { OpenAICompatibleClient } from './openai.js';
6
+ export { GoogleClient } from './google.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Universal LLM Client v3 — Ollama Provider
3
+ *
4
+ * Implements BaseLLMClient for Ollama's native API.
5
+ * Supports chat, streaming (NDJSON), embeddings, model discovery,
6
+ * and context length detection via /api/show.
7
+ */
8
+ import { BaseLLMClient } from '../client.js';
9
+ import type { LLMClientOptions, LLMChatMessage, LLMChatResponse, ChatOptions, ModelMetadata } from '../interfaces.js';
10
+ import type { DecodedEvent } from '../stream-decoder.js';
11
+ import type { Auditor } from '../auditor.js';
12
+ export declare class OllamaClient extends BaseLLMClient {
13
+ constructor(options: LLMClientOptions, auditor?: Auditor);
14
+ chat(messages: LLMChatMessage[], options?: ChatOptions): Promise<LLMChatResponse>;
15
+ chatStream(messages: LLMChatMessage[], options?: ChatOptions): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown>;
16
+ embed(text: string): Promise<number[]>;
17
+ embedArray(texts: string[]): Promise<number[][]>;
18
+ getModels(): Promise<string[]>;
19
+ getModelInfo(modelName?: string): Promise<ModelMetadata>;
20
+ /** Ensure model is available, pull if missing */
21
+ ensureReady(): Promise<void>;
22
+ private convertMessages;
23
+ private convertToolsToOllama;
24
+ private buildOllamaOptions;
25
+ }
26
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EACX,aAAa,EAKhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,YAAa,SAAQ,aAAa;gBAC/B,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAWlD,IAAI,CACN,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAkFpB,UAAU,CACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAmG1D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW7B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAezD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQrB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuCvE,iDAAiD;IAC3C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,kBAAkB;CAS7B"}