ai.matey.backend 0.2.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index.js +60 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/providers/ai21.js +331 -0
  5. package/dist/cjs/providers/ai21.js.map +1 -0
  6. package/dist/cjs/providers/anthropic.js +664 -0
  7. package/dist/cjs/providers/anthropic.js.map +1 -0
  8. package/dist/cjs/providers/anyscale.js +338 -0
  9. package/dist/cjs/providers/anyscale.js.map +1 -0
  10. package/dist/cjs/providers/aws-bedrock.js +374 -0
  11. package/dist/cjs/providers/aws-bedrock.js.map +1 -0
  12. package/dist/cjs/providers/azure-openai.js +406 -0
  13. package/dist/cjs/providers/azure-openai.js.map +1 -0
  14. package/dist/cjs/providers/cerebras.js +356 -0
  15. package/dist/cjs/providers/cerebras.js.map +1 -0
  16. package/dist/cjs/providers/cloudflare.js +359 -0
  17. package/dist/cjs/providers/cloudflare.js.map +1 -0
  18. package/dist/cjs/providers/cohere.js +368 -0
  19. package/dist/cjs/providers/cohere.js.map +1 -0
  20. package/dist/cjs/providers/deepinfra.js +343 -0
  21. package/dist/cjs/providers/deepinfra.js.map +1 -0
  22. package/dist/cjs/providers/deepseek.js +104 -0
  23. package/dist/cjs/providers/deepseek.js.map +1 -0
  24. package/dist/cjs/providers/fireworks.js +363 -0
  25. package/dist/cjs/providers/fireworks.js.map +1 -0
  26. package/dist/cjs/providers/gemini.js +292 -0
  27. package/dist/cjs/providers/gemini.js.map +1 -0
  28. package/dist/cjs/providers/groq.js +143 -0
  29. package/dist/cjs/providers/groq.js.map +1 -0
  30. package/dist/cjs/providers/huggingface.js +392 -0
  31. package/dist/cjs/providers/huggingface.js.map +1 -0
  32. package/dist/cjs/providers/lmstudio.js +144 -0
  33. package/dist/cjs/providers/lmstudio.js.map +1 -0
  34. package/dist/cjs/providers/mistral.js +288 -0
  35. package/dist/cjs/providers/mistral.js.map +1 -0
  36. package/dist/cjs/providers/nvidia.js +167 -0
  37. package/dist/cjs/providers/nvidia.js.map +1 -0
  38. package/dist/cjs/providers/ollama.js +257 -0
  39. package/dist/cjs/providers/ollama.js.map +1 -0
  40. package/dist/cjs/providers/openai.js +640 -0
  41. package/dist/cjs/providers/openai.js.map +1 -0
  42. package/dist/cjs/providers/openrouter.js +379 -0
  43. package/dist/cjs/providers/openrouter.js.map +1 -0
  44. package/dist/cjs/providers/perplexity.js +372 -0
  45. package/dist/cjs/providers/perplexity.js.map +1 -0
  46. package/dist/cjs/providers/replicate.js +340 -0
  47. package/dist/cjs/providers/replicate.js.map +1 -0
  48. package/dist/cjs/providers/together-ai.js +341 -0
  49. package/dist/cjs/providers/together-ai.js.map +1 -0
  50. package/dist/cjs/providers/xai.js +339 -0
  51. package/dist/cjs/providers/xai.js.map +1 -0
  52. package/dist/cjs/shared.js +279 -0
  53. package/dist/cjs/shared.js.map +1 -0
  54. package/dist/esm/index.js +44 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/providers/ai21.js +327 -0
  57. package/dist/esm/providers/ai21.js.map +1 -0
  58. package/dist/esm/providers/anthropic.js +660 -0
  59. package/dist/esm/providers/anthropic.js.map +1 -0
  60. package/dist/esm/providers/anyscale.js +334 -0
  61. package/dist/esm/providers/anyscale.js.map +1 -0
  62. package/dist/esm/providers/aws-bedrock.js +370 -0
  63. package/dist/esm/providers/aws-bedrock.js.map +1 -0
  64. package/dist/esm/providers/azure-openai.js +402 -0
  65. package/dist/esm/providers/azure-openai.js.map +1 -0
  66. package/dist/esm/providers/cerebras.js +352 -0
  67. package/dist/esm/providers/cerebras.js.map +1 -0
  68. package/dist/esm/providers/cloudflare.js +355 -0
  69. package/dist/esm/providers/cloudflare.js.map +1 -0
  70. package/dist/esm/providers/cohere.js +364 -0
  71. package/dist/esm/providers/cohere.js.map +1 -0
  72. package/dist/esm/providers/deepinfra.js +339 -0
  73. package/dist/esm/providers/deepinfra.js.map +1 -0
  74. package/dist/esm/providers/deepseek.js +99 -0
  75. package/dist/esm/providers/deepseek.js.map +1 -0
  76. package/dist/esm/providers/fireworks.js +359 -0
  77. package/dist/esm/providers/fireworks.js.map +1 -0
  78. package/dist/esm/providers/gemini.js +288 -0
  79. package/dist/esm/providers/gemini.js.map +1 -0
  80. package/dist/esm/providers/groq.js +138 -0
  81. package/dist/esm/providers/groq.js.map +1 -0
  82. package/dist/esm/providers/huggingface.js +387 -0
  83. package/dist/esm/providers/huggingface.js.map +1 -0
  84. package/dist/esm/providers/lmstudio.js +139 -0
  85. package/dist/esm/providers/lmstudio.js.map +1 -0
  86. package/dist/esm/providers/mistral.js +284 -0
  87. package/dist/esm/providers/mistral.js.map +1 -0
  88. package/dist/esm/providers/nvidia.js +162 -0
  89. package/dist/esm/providers/nvidia.js.map +1 -0
  90. package/dist/esm/providers/ollama.js +253 -0
  91. package/dist/esm/providers/ollama.js.map +1 -0
  92. package/dist/esm/providers/openai.js +636 -0
  93. package/dist/esm/providers/openai.js.map +1 -0
  94. package/dist/esm/providers/openrouter.js +375 -0
  95. package/dist/esm/providers/openrouter.js.map +1 -0
  96. package/dist/esm/providers/perplexity.js +368 -0
  97. package/dist/esm/providers/perplexity.js.map +1 -0
  98. package/dist/esm/providers/replicate.js +336 -0
  99. package/dist/esm/providers/replicate.js.map +1 -0
  100. package/dist/esm/providers/together-ai.js +337 -0
  101. package/dist/esm/providers/together-ai.js.map +1 -0
  102. package/dist/esm/providers/xai.js +335 -0
  103. package/dist/esm/providers/xai.js.map +1 -0
  104. package/dist/esm/shared.js +272 -0
  105. package/dist/esm/shared.js.map +1 -0
  106. package/dist/types/index.d.ts +38 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/providers/ai21.d.ts +106 -0
  109. package/dist/types/providers/ai21.d.ts.map +1 -0
  110. package/dist/types/providers/anthropic.d.ts +194 -0
  111. package/dist/types/providers/anthropic.d.ts.map +1 -0
  112. package/dist/types/providers/anyscale.d.ts +109 -0
  113. package/dist/types/providers/anyscale.d.ts.map +1 -0
  114. package/dist/types/providers/aws-bedrock.d.ts +152 -0
  115. package/dist/types/providers/aws-bedrock.d.ts.map +1 -0
  116. package/dist/types/providers/azure-openai.d.ts +142 -0
  117. package/dist/types/providers/azure-openai.d.ts.map +1 -0
  118. package/dist/types/providers/cerebras.d.ts +130 -0
  119. package/dist/types/providers/cerebras.d.ts.map +1 -0
  120. package/dist/types/providers/cloudflare.d.ts +125 -0
  121. package/dist/types/providers/cloudflare.d.ts.map +1 -0
  122. package/dist/types/providers/cohere.d.ts +114 -0
  123. package/dist/types/providers/cohere.d.ts.map +1 -0
  124. package/dist/types/providers/deepinfra.d.ts +118 -0
  125. package/dist/types/providers/deepinfra.d.ts.map +1 -0
  126. package/dist/types/providers/deepseek.d.ts +68 -0
  127. package/dist/types/providers/deepseek.d.ts.map +1 -0
  128. package/dist/types/providers/fireworks.d.ts +127 -0
  129. package/dist/types/providers/fireworks.d.ts.map +1 -0
  130. package/dist/types/providers/gemini.d.ts +71 -0
  131. package/dist/types/providers/gemini.d.ts.map +1 -0
  132. package/dist/types/providers/groq.d.ts +83 -0
  133. package/dist/types/providers/groq.d.ts.map +1 -0
  134. package/dist/types/providers/huggingface.d.ts +154 -0
  135. package/dist/types/providers/huggingface.d.ts.map +1 -0
  136. package/dist/types/providers/lmstudio.d.ts +88 -0
  137. package/dist/types/providers/lmstudio.d.ts.map +1 -0
  138. package/dist/types/providers/mistral.d.ts +65 -0
  139. package/dist/types/providers/mistral.d.ts.map +1 -0
  140. package/dist/types/providers/nvidia.d.ts +100 -0
  141. package/dist/types/providers/nvidia.d.ts.map +1 -0
  142. package/dist/types/providers/ollama.d.ts +59 -0
  143. package/dist/types/providers/ollama.d.ts.map +1 -0
  144. package/dist/types/providers/openai.d.ts +205 -0
  145. package/dist/types/providers/openai.d.ts.map +1 -0
  146. package/dist/types/providers/openrouter.d.ts +135 -0
  147. package/dist/types/providers/openrouter.d.ts.map +1 -0
  148. package/dist/types/providers/perplexity.d.ts +116 -0
  149. package/dist/types/providers/perplexity.d.ts.map +1 -0
  150. package/dist/types/providers/replicate.d.ts +91 -0
  151. package/dist/types/providers/replicate.d.ts.map +1 -0
  152. package/dist/types/providers/together-ai.d.ts +118 -0
  153. package/dist/types/providers/together-ai.d.ts.map +1 -0
  154. package/dist/types/providers/xai.d.ts +119 -0
  155. package/dist/types/providers/xai.d.ts.map +1 -0
  156. package/dist/types/shared.d.ts +116 -0
  157. package/dist/types/shared.d.ts.map +1 -0
  158. package/package.json +327 -0
  159. package/readme.md +86 -0
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Fireworks AI Backend Adapter
3
+ *
4
+ * Adapts Universal IR to Fireworks AI Chat Completions API.
5
+ * Fireworks AI is OpenAI-compatible with 100+ models and fastest APIs.
6
+ *
7
+ * @module
8
+ */
9
+ import { NetworkError, ProviderError, StreamError, ErrorCode, createErrorFromHttpResponse, } from 'ai.matey.errors';
10
+ import { normalizeSystemMessages } from 'ai.matey.utils';
11
+ import { getEffectiveStreamMode, mergeStreamingConfig } from 'ai.matey.utils';
12
+ // ============================================================================
13
+ // Fireworks AI Backend Adapter
14
+ // ============================================================================
15
+ /**
16
+ * Backend adapter for Fireworks AI Chat Completions API.
17
+ *
18
+ * Features:
19
+ * - 100+ open-source models
20
+ * - Fastest inference APIs
21
+ * - OpenAI-compatible with topK support
22
+ * - Vision model support
23
+ * - Function calling support
24
+ * - Reasoning models with reasoning_effort parameter
25
+ * - Pricing from $0.10 per 1M tokens
26
+ */
27
+ export class FireworksAIBackendAdapter {
28
+ metadata;
29
+ config;
30
+ baseURL;
31
+ constructor(config) {
32
+ this.config = config;
33
+ this.baseURL = config.baseURL || 'https://api.fireworks.ai/inference/v1';
34
+ this.metadata = {
35
+ name: 'fireworks-ai-backend',
36
+ version: '1.0.0',
37
+ provider: 'Fireworks AI',
38
+ capabilities: {
39
+ streaming: true,
40
+ multiModal: true, // Vision models available
41
+ tools: true, // Function calling
42
+ maxContextTokens: 128000,
43
+ systemMessageStrategy: 'in-messages',
44
+ supportsMultipleSystemMessages: true,
45
+ supportsTemperature: true,
46
+ supportsTopP: true,
47
+ supportsTopK: true, // Fireworks AI supports topK
48
+ supportsSeed: false,
49
+ supportsFrequencyPenalty: true,
50
+ supportsPresencePenalty: true,
51
+ maxStopSequences: 4,
52
+ },
53
+ config: {
54
+ baseURL: this.baseURL,
55
+ },
56
+ };
57
+ }
58
+ /**
59
+ * Convert IR to Fireworks AI format.
60
+ */
61
+ fromIR(request) {
62
+ const { messages } = normalizeSystemMessages(request.messages, this.metadata.capabilities.systemMessageStrategy, this.metadata.capabilities.supportsMultipleSystemMessages);
63
+ const fireworksMessages = messages.map((msg) => ({
64
+ role: msg.role,
65
+ content: typeof msg.content === 'string'
66
+ ? msg.content
67
+ : msg.content.map((block) => {
68
+ if (block.type === 'text') {
69
+ return { type: 'text', text: block.text };
70
+ }
71
+ else if (block.type === 'image') {
72
+ return {
73
+ type: 'image_url',
74
+ image_url: {
75
+ url: block.source.type === 'url'
76
+ ? block.source.url
77
+ : `data:${block.source.mediaType};base64,${block.source.data}`,
78
+ },
79
+ };
80
+ }
81
+ return { type: 'text', text: JSON.stringify(block) };
82
+ }),
83
+ }));
84
+ const fireworksRequest = {
85
+ model: request.parameters?.model ||
86
+ this.config.defaultModel ||
87
+ 'accounts/fireworks/models/llama-v3p1-8b-instruct',
88
+ messages: fireworksMessages,
89
+ temperature: request.parameters?.temperature,
90
+ max_tokens: request.parameters?.maxTokens,
91
+ top_p: request.parameters?.topP,
92
+ top_k: request.parameters?.topK, // Pass through topK
93
+ frequency_penalty: request.parameters?.frequencyPenalty,
94
+ presence_penalty: request.parameters?.presencePenalty,
95
+ stop: request.parameters?.stopSequences ? [...request.parameters.stopSequences] : undefined,
96
+ stream: request.stream || false,
97
+ };
98
+ // Add reasoning_effort for reasoning models (if specified in custom parameters)
99
+ if (request.parameters?.custom?.reasoning_effort) {
100
+ fireworksRequest.reasoning_effort = request.parameters.custom.reasoning_effort;
101
+ }
102
+ return fireworksRequest;
103
+ }
104
+ /**
105
+ * Convert Fireworks AI response to IR.
106
+ */
107
+ toIR(response, originalRequest, latencyMs) {
108
+ const choice = response.choices[0];
109
+ if (!choice) {
110
+ throw new ProviderError({
111
+ code: ErrorCode.PROVIDER_ERROR,
112
+ message: 'No choices returned in response',
113
+ isRetryable: false,
114
+ provenance: { backend: this.metadata.name },
115
+ });
116
+ }
117
+ const message = {
118
+ role: choice.message.role === 'assistant' ? 'assistant' : 'user',
119
+ content: typeof choice.message.content === 'string'
120
+ ? choice.message.content
121
+ : choice.message.content.map((c) => (c.type === 'text' ? c.text : '')).join(''),
122
+ };
123
+ const finishReasonMap = {
124
+ stop: 'stop',
125
+ length: 'length',
126
+ tool_calls: 'tool_calls',
127
+ };
128
+ return {
129
+ message,
130
+ finishReason: finishReasonMap[choice.finish_reason || 'stop'] || 'stop',
131
+ usage: {
132
+ // Usage always present in Fireworks AI
133
+ promptTokens: response.usage.prompt_tokens,
134
+ completionTokens: response.usage.completion_tokens,
135
+ totalTokens: response.usage.total_tokens,
136
+ },
137
+ metadata: {
138
+ ...originalRequest.metadata,
139
+ providerResponseId: response.id,
140
+ provenance: {
141
+ ...originalRequest.metadata.provenance,
142
+ backend: this.metadata.name,
143
+ },
144
+ custom: {
145
+ ...originalRequest.metadata.custom,
146
+ latencyMs,
147
+ },
148
+ },
149
+ raw: response,
150
+ };
151
+ }
152
+ /**
153
+ * Execute non-streaming request.
154
+ */
155
+ async execute(request, signal) {
156
+ try {
157
+ const fireworksRequest = this.fromIR(request);
158
+ fireworksRequest.stream = false;
159
+ const startTime = Date.now();
160
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
161
+ method: 'POST',
162
+ headers: this.getHeaders(),
163
+ body: JSON.stringify(fireworksRequest),
164
+ signal,
165
+ });
166
+ if (!response.ok) {
167
+ throw createErrorFromHttpResponse(response.status, response.statusText, await response.text(), { backend: this.metadata.name });
168
+ }
169
+ const data = (await response.json());
170
+ return this.toIR(data, request, Date.now() - startTime);
171
+ }
172
+ catch (error) {
173
+ if (error instanceof NetworkError || error instanceof ProviderError) {
174
+ throw error;
175
+ }
176
+ throw new ProviderError({
177
+ code: ErrorCode.PROVIDER_ERROR,
178
+ message: `Fireworks AI request failed: ${error instanceof Error ? error.message : String(error)}`,
179
+ isRetryable: true,
180
+ provenance: { backend: this.metadata.name },
181
+ cause: error instanceof Error ? error : undefined,
182
+ });
183
+ }
184
+ }
185
+ /**
186
+ * Execute streaming request.
187
+ */
188
+ async *executeStream(request, signal) {
189
+ try {
190
+ const fireworksRequest = this.fromIR(request);
191
+ fireworksRequest.stream = true;
192
+ const streamingConfig = mergeStreamingConfig(this.config.streaming);
193
+ const effectiveMode = getEffectiveStreamMode(request.streamMode, undefined, streamingConfig);
194
+ const includeBoth = streamingConfig.includeBoth || effectiveMode === 'accumulated';
195
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
196
+ method: 'POST',
197
+ headers: this.getHeaders(),
198
+ body: JSON.stringify(fireworksRequest),
199
+ signal,
200
+ });
201
+ if (!response.ok) {
202
+ throw createErrorFromHttpResponse(response.status, response.statusText, await response.text(), { backend: this.metadata.name });
203
+ }
204
+ if (!response.body) {
205
+ throw new StreamError({
206
+ code: ErrorCode.STREAM_ERROR,
207
+ message: 'No response body',
208
+ provenance: { backend: this.metadata.name },
209
+ });
210
+ }
211
+ let sequence = 0;
212
+ let contentBuffer = '';
213
+ let usage;
214
+ yield {
215
+ type: 'start',
216
+ sequence: sequence++,
217
+ metadata: {
218
+ ...request.metadata,
219
+ provenance: {
220
+ ...request.metadata.provenance,
221
+ backend: this.metadata.name,
222
+ },
223
+ },
224
+ };
225
+ const reader = response.body.getReader();
226
+ const decoder = new TextDecoder();
227
+ let buffer = '';
228
+ try {
229
+ while (true) {
230
+ const { done, value } = await reader.read();
231
+ if (done) {
232
+ break;
233
+ }
234
+ buffer += decoder.decode(value, { stream: true });
235
+ const lines = buffer.split('\n');
236
+ buffer = lines.pop() || '';
237
+ for (const line of lines) {
238
+ if (!line.trim() || !line.startsWith('data: ')) {
239
+ continue;
240
+ }
241
+ const data = line.slice(6).trim();
242
+ if (data === '[DONE]') {
243
+ continue;
244
+ }
245
+ try {
246
+ const chunk = JSON.parse(data);
247
+ const delta = chunk.choices[0]?.delta?.content;
248
+ // Capture usage stats from streaming chunks
249
+ if (chunk.usage) {
250
+ usage = {
251
+ promptTokens: chunk.usage.prompt_tokens,
252
+ completionTokens: chunk.usage.completion_tokens,
253
+ totalTokens: chunk.usage.total_tokens,
254
+ };
255
+ }
256
+ if (delta) {
257
+ contentBuffer += delta;
258
+ const contentChunk = {
259
+ type: 'content',
260
+ sequence: sequence++,
261
+ delta: delta,
262
+ role: 'assistant',
263
+ };
264
+ if (includeBoth) {
265
+ contentChunk.accumulated = contentBuffer;
266
+ }
267
+ yield contentChunk;
268
+ }
269
+ if (chunk.choices[0]?.finish_reason) {
270
+ const finishReasonMap = {
271
+ stop: 'stop',
272
+ length: 'length',
273
+ };
274
+ const doneChunk = {
275
+ type: 'done',
276
+ sequence: sequence++,
277
+ finishReason: finishReasonMap[chunk.choices[0].finish_reason] || 'stop',
278
+ message: { role: 'assistant', content: contentBuffer },
279
+ };
280
+ // Include usage stats in done chunk
281
+ if (usage) {
282
+ doneChunk.usage = usage;
283
+ }
284
+ yield doneChunk;
285
+ }
286
+ }
287
+ catch (parseError) {
288
+ console.warn('Failed to parse SSE chunk:', data, parseError);
289
+ }
290
+ }
291
+ }
292
+ }
293
+ finally {
294
+ reader.releaseLock();
295
+ }
296
+ }
297
+ catch (error) {
298
+ yield {
299
+ type: 'error',
300
+ sequence: 0,
301
+ error: {
302
+ code: error instanceof Error ? error.name : 'UNKNOWN_ERROR',
303
+ message: error instanceof Error ? error.message : String(error),
304
+ },
305
+ };
306
+ }
307
+ }
308
+ /**
309
+ * Get HTTP headers.
310
+ */
311
+ getHeaders() {
312
+ const headers = {
313
+ 'Content-Type': 'application/json',
314
+ Authorization: `Bearer ${this.config.apiKey}`,
315
+ };
316
+ return { ...headers, ...this.config.headers };
317
+ }
318
+ /**
319
+ * Health check.
320
+ */
321
+ async healthCheck() {
322
+ try {
323
+ const response = await fetch(`${this.baseURL}/models`, {
324
+ method: 'GET',
325
+ headers: this.getHeaders(),
326
+ signal: AbortSignal.timeout(5000),
327
+ });
328
+ return response.ok;
329
+ }
330
+ catch {
331
+ return false;
332
+ }
333
+ }
334
+ /**
335
+ * Estimate cost.
336
+ */
337
+ estimateCost(request) {
338
+ const pricing = {
339
+ 'accounts/fireworks/models/llama-v3p1-8b-instruct': { input: 0.2, output: 0.2 },
340
+ 'accounts/fireworks/models/llama-v3p1-70b-instruct': { input: 0.9, output: 0.9 },
341
+ 'accounts/fireworks/models/qwen2p5-72b-instruct': { input: 0.9, output: 0.9 },
342
+ 'accounts/fireworks/models/deepseek-v3': { input: 0.9, output: 2.0 },
343
+ };
344
+ const model = request.parameters?.model || this.config.defaultModel || '';
345
+ const modelPricing = pricing[model];
346
+ if (!modelPricing) {
347
+ return Promise.resolve(null);
348
+ }
349
+ const inputTokens = request.messages.reduce((sum, msg) => {
350
+ const content = typeof msg.content === 'string' ? msg.content : '';
351
+ return sum + Math.ceil(content.length / 4);
352
+ }, 0);
353
+ const outputTokens = request.parameters?.maxTokens || 1024;
354
+ const inputCost = (inputTokens / 1_000_000) * modelPricing.input;
355
+ const outputCost = (outputTokens / 1_000_000) * modelPricing.output;
356
+ return Promise.resolve(inputCost + outputCost);
357
+ }
358
+ }
359
+ //# sourceMappingURL=fireworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworks.js","sourceRoot":"","sources":["../../../src/providers/fireworks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AA6E9E,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,yBAAyB;IAI3B,QAAQ,CAAkB;IAClB,MAAM,CAAuB;IAC7B,OAAO,CAAS;IAEjC,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,uCAAuC,CAAC;QACzE,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,IAAI,EAAE,0BAA0B;gBAC5C,KAAK,EAAE,IAAI,EAAE,mBAAmB;gBAChC,gBAAgB,EAAE,MAAM;gBACxB,qBAAqB,EAAE,aAAa;gBACpC,8BAA8B,EAAE,IAAI;gBACpC,mBAAmB,EAAE,IAAI;gBACzB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI,EAAE,6BAA6B;gBACjD,YAAY,EAAE,KAAK;gBACnB,wBAAwB,EAAE,IAAI;gBAC9B,uBAAuB,EAAE,IAAI;gBAC7B,gBAAgB,EAAE,CAAC;aACpB;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAsB;QAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAC1C,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,EAChD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,8BAA8B,CAC1D,CAAC;QAEF,MAAM,iBAAiB,GAAyB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBAC7B,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC5C,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAClC,OAAO;4BACL,IAAI,EAAE,WAAW;4BACjB,SAAS,EAAE;gCACT,GAAG,EACD,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK;oCACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;oCAClB,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,CAAC,SAAS,WAAW,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;6BACnE;yBACF,CAAC;oBACJ,CAAC;oBACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,CAAC,CAAC;SACT,CAAC,CAAC,CAAC;QAEJ,MAAM,gBAAgB,GAAuB;YAC3C,KAAK,EACH,OAAO,CAAC,UAAU,EAAE,KAAK;gBACzB,IAAI,CAAC,MAAM,CAAC,YAAY;gBACxB,kDAAkD;YACpD,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,WAAW;YAC5C,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS;YACzC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI;YAC/B,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,oBAAoB;YACrD,iBAAiB,EAAE,OAAO,CAAC,UAAU,EAAE,gBAAgB;YACvD,gBAAgB,EAAE,OAAO,CAAC,UAAU,EAAE,eAAe;YACrD,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3F,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;SAChC,CAAC;QAEF,gFAAgF;QAChF,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;YACjD,gBAAgB,CAAC,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,gBAGpD,CAAC;QACb,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,IAAI,CACT,QAA6B,EAC7B,eAA8B,EAC9B,SAAiB;QAEjB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,aAAa,CAAC;gBACtB,IAAI,EAAE,SAAS,CAAC,cAAc;gBAC9B,OAAO,EAAE,iCAAiC;gBAC1C,WAAW,EAAE,KAAK;gBAClB,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAc;YACzB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YAChE,OAAO,EACL,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;gBACxC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;gBACxB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SACzF,CAAC;QAEF,MAAM,eAAe,GAAiC;YACpD,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,YAAY;SACzB,CAAC;QAEF,OAAO;YACL,OAAO;YACP,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,MAAM;YACvE,KAAK,EAAE;gBACL,uCAAuC;gBACvC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAC1C,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB;gBAClD,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;aACzC;YACD,QAAQ,EAAE;gBACR,GAAG,eAAe,CAAC,QAAQ;gBAC3B,kBAAkB,EAAE,QAAQ,CAAC,EAAE;gBAC/B,UAAU,EAAE;oBACV,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU;oBACtC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;iBAC5B;gBACD,MAAM,EAAE;oBACN,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM;oBAClC,SAAS;iBACV;aACF;YACD,GAAG,EAAE,QAA8C;SACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAAsB,EAAE,MAAoB;QACxD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9C,gBAAgB,CAAC,MAAM,GAAG,KAAK,CAAC;YAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACtC,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,2BAA2B,CAC/B,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,MAAM,QAAQ,CAAC,IAAI,EAAE,EACrB,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAChC,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;YAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACpE,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,aAAa,CAAC;gBACtB,IAAI,EAAE,SAAS,CAAC,cAAc;gBAC9B,OAAO,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjG,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC3C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,aAAa,CAAC,OAAsB,EAAE,MAAoB;QAC/D,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9C,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC;YAE/B,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAC7F,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,aAAa,KAAK,aAAa,CAAC;YAEnF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACtC,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,2BAA2B,CAC/B,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,MAAM,QAAQ,CAAC,IAAI,EAAE,EACrB,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAChC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,WAAW,CAAC;oBACpB,IAAI,EAAE,SAAS,CAAC,YAAY;oBAC5B,OAAO,EAAE,kBAAkB;oBAC3B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,KAES,CAAC;YAEd,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ,EAAE;gBACpB,QAAQ,EAAE;oBACR,GAAG,OAAO,CAAC,QAAQ;oBACnB,UAAU,EAAE;wBACV,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU;wBAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;qBAC5B;iBACF;aACe,CAAC;YAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM;oBACR,CAAC;oBAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC/C,SAAS;wBACX,CAAC;wBAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAClC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACtB,SAAS;wBACX,CAAC;wBAED,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;4BACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC;4BAE/C,4CAA4C;4BAC5C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gCAChB,KAAK,GAAG;oCACN,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;oCACvC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;oCAC/C,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY;iCACtC,CAAC;4BACJ,CAAC;4BAED,IAAI,KAAK,EAAE,CAAC;gCACV,aAAa,IAAI,KAAK,CAAC;gCAEvB,MAAM,YAAY,GAAkB;oCAClC,IAAI,EAAE,SAAS;oCACf,QAAQ,EAAE,QAAQ,EAAE;oCACpB,KAAK,EAAE,KAAK;oCACZ,IAAI,EAAE,WAAW;iCAClB,CAAC;gCAEF,IAAI,WAAW,EAAE,CAAC;oCACf,YAAoB,CAAC,WAAW,GAAG,aAAa,CAAC;gCACpD,CAAC;gCAED,MAAM,YAAY,CAAC;4BACrB,CAAC;4BAED,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;gCACpC,MAAM,eAAe,GAAiC;oCACpD,IAAI,EAAE,MAAM;oCACZ,MAAM,EAAE,QAAQ;iCACjB,CAAC;gCAEF,MAAM,SAAS,GAAkB;oCAC/B,IAAI,EAAE,MAAM;oCACZ,QAAQ,EAAE,QAAQ,EAAE;oCACpB,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,MAAM;oCACvE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE;iCACvD,CAAC;gCAEF,oCAAoC;gCACpC,IAAI,KAAK,EAAE,CAAC;oCACT,SAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;gCACnC,CAAC;gCAED,MAAM,SAAS,CAAC;4BAClB,CAAC;wBACH,CAAC;wBAAC,OAAO,UAAU,EAAE,CAAC;4BACpB,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;wBAC/D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;oBAC3D,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE;aACe,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;SAC9C,CAAC;QAEF,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;gBACrD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAsB;QACjC,MAAM,OAAO,GAAsD;YACjE,kDAAkD,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YAC/E,mDAAmD,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YAChF,gDAAgD,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YAC7E,uCAAuC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;SACrE,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,IAAI,IAAI,CAAC;QAE3D,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;QACjE,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QAEpE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Google Gemini Backend Adapter
3
+ *
4
+ * Adapts Universal IR to Google Gemini API.
5
+ * Handles Gemini's systemInstruction field and content array format.
6
+ *
7
+ * @module
8
+ */
9
+ import { AdapterConversionError, NetworkError, ProviderError, StreamError, ErrorCode, createErrorFromHttpResponse, } from 'ai.matey.errors';
10
+ import { normalizeSystemMessages } from 'ai.matey.utils';
11
+ import { getEffectiveStreamMode, mergeStreamingConfig } from 'ai.matey.utils';
12
+ // ============================================================================
13
+ // Gemini Backend Adapter
14
+ // ============================================================================
15
+ export class GeminiBackendAdapter {
16
+ metadata;
17
+ config;
18
+ baseURL;
19
+ constructor(config) {
20
+ this.config = config;
21
+ this.baseURL = config.baseURL || 'https://generativelanguage.googleapis.com/v1beta';
22
+ // Note: Gemini is already browser-compatible by default (API key in URL query parameter)
23
+ // The browserMode flag has no effect for this adapter
24
+ this.metadata = {
25
+ name: 'gemini-backend',
26
+ version: '1.0.0',
27
+ provider: 'Google Gemini',
28
+ capabilities: {
29
+ streaming: true,
30
+ multiModal: true,
31
+ tools: true,
32
+ maxContextTokens: 2000000,
33
+ systemMessageStrategy: 'separate-parameter',
34
+ supportsMultipleSystemMessages: false,
35
+ supportsTemperature: true,
36
+ supportsTopP: true,
37
+ supportsTopK: true,
38
+ supportsSeed: false,
39
+ supportsFrequencyPenalty: false,
40
+ supportsPresencePenalty: false,
41
+ maxStopSequences: 5,
42
+ },
43
+ config: { baseURL: this.baseURL },
44
+ };
45
+ }
46
+ async execute(request, signal) {
47
+ try {
48
+ const geminiRequest = this.fromIR(request);
49
+ const model = request.parameters?.model || 'gemini-pro';
50
+ const endpoint = `${this.baseURL}/models/${model}:generateContent?key=${this.config.apiKey}`;
51
+ const startTime = Date.now();
52
+ const response = await fetch(endpoint, {
53
+ method: 'POST',
54
+ headers: { 'Content-Type': 'application/json', ...this.config.headers },
55
+ body: JSON.stringify(geminiRequest),
56
+ signal,
57
+ });
58
+ if (!response.ok) {
59
+ const errorBody = await response.text();
60
+ throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
61
+ backend: this.metadata.name,
62
+ });
63
+ }
64
+ const data = (await response.json());
65
+ return this.toIR(data, request, Date.now() - startTime);
66
+ }
67
+ catch (error) {
68
+ if (error instanceof NetworkError || error instanceof ProviderError) {
69
+ throw error;
70
+ }
71
+ throw new ProviderError({
72
+ code: ErrorCode.PROVIDER_ERROR,
73
+ message: `Gemini request failed: ${error instanceof Error ? error.message : String(error)}`,
74
+ isRetryable: true,
75
+ provenance: { backend: this.metadata.name },
76
+ cause: error instanceof Error ? error : undefined,
77
+ });
78
+ }
79
+ }
80
+ async *executeStream(request, signal) {
81
+ try {
82
+ const geminiRequest = this.fromIR(request);
83
+ const model = request.parameters?.model || 'gemini-pro';
84
+ const endpoint = `${this.baseURL}/models/${model}:streamGenerateContent?key=${this.config.apiKey}`;
85
+ // Get effective streaming configuration
86
+ const streamingConfig = mergeStreamingConfig(this.config.streaming);
87
+ const effectiveMode = getEffectiveStreamMode(request.streamMode, undefined, streamingConfig);
88
+ const includeBoth = streamingConfig.includeBoth || effectiveMode === 'accumulated';
89
+ const response = await fetch(endpoint, {
90
+ method: 'POST',
91
+ headers: { 'Content-Type': 'application/json', ...this.config.headers },
92
+ body: JSON.stringify(geminiRequest),
93
+ signal,
94
+ });
95
+ if (!response.ok) {
96
+ const errorBody = await response.text();
97
+ throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
98
+ backend: this.metadata.name,
99
+ });
100
+ }
101
+ if (!response.body) {
102
+ throw new StreamError({
103
+ code: ErrorCode.STREAM_ERROR,
104
+ message: 'No response body',
105
+ provenance: { backend: this.metadata.name },
106
+ });
107
+ }
108
+ let sequence = 0;
109
+ yield {
110
+ type: 'start',
111
+ sequence: sequence++,
112
+ metadata: {
113
+ ...request.metadata,
114
+ provenance: { ...request.metadata.provenance, backend: this.metadata.name },
115
+ },
116
+ };
117
+ const reader = response.body.getReader();
118
+ const decoder = new TextDecoder();
119
+ let buffer = '';
120
+ let contentBuffer = '';
121
+ try {
122
+ while (true) {
123
+ const { done, value } = await reader.read();
124
+ if (done) {
125
+ break;
126
+ }
127
+ buffer += decoder.decode(value, { stream: true });
128
+ const lines = buffer.split('\n');
129
+ buffer = lines.pop() || '';
130
+ for (const line of lines) {
131
+ if (!line.trim() || !line.startsWith('data: ')) {
132
+ continue;
133
+ }
134
+ const data = line.slice(6).trim();
135
+ try {
136
+ const chunk = JSON.parse(data);
137
+ const candidate = chunk.candidates?.[0];
138
+ if (!candidate) {
139
+ continue;
140
+ }
141
+ const content = candidate.content?.parts?.[0];
142
+ if (content && 'text' in content) {
143
+ contentBuffer += content.text;
144
+ // Build content chunk with optional accumulated field
145
+ const contentChunk = {
146
+ type: 'content',
147
+ sequence: sequence++,
148
+ delta: content.text,
149
+ role: 'assistant',
150
+ };
151
+ // Add accumulated field if configured
152
+ if (includeBoth) {
153
+ contentChunk.accumulated = contentBuffer;
154
+ }
155
+ yield contentChunk;
156
+ }
157
+ if (candidate.finishReason) {
158
+ const message = { role: 'assistant', content: contentBuffer };
159
+ yield {
160
+ type: 'done',
161
+ sequence: sequence++,
162
+ finishReason: this.mapFinishReason(candidate.finishReason),
163
+ usage: chunk.usageMetadata
164
+ ? {
165
+ promptTokens: chunk.usageMetadata.promptTokenCount,
166
+ completionTokens: chunk.usageMetadata.candidatesTokenCount,
167
+ totalTokens: chunk.usageMetadata.totalTokenCount,
168
+ }
169
+ : undefined,
170
+ message,
171
+ };
172
+ }
173
+ }
174
+ catch (parseError) {
175
+ console.warn('Failed to parse Gemini SSE chunk:', data, parseError);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ finally {
181
+ reader.releaseLock();
182
+ }
183
+ }
184
+ catch (error) {
185
+ yield {
186
+ type: 'error',
187
+ sequence: 0,
188
+ error: {
189
+ code: error instanceof Error ? error.name : 'UNKNOWN_ERROR',
190
+ message: error instanceof Error ? error.message : String(error),
191
+ },
192
+ };
193
+ }
194
+ }
195
+ async healthCheck() {
196
+ try {
197
+ const response = await fetch(`${this.baseURL}/models?key=${this.config.apiKey}`, {
198
+ method: 'GET',
199
+ signal: AbortSignal.timeout(5000),
200
+ });
201
+ return response.ok;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ estimateCost(_request) {
208
+ return Promise.resolve(null); // Cost estimation not implemented for Gemini
209
+ }
210
+ /**
211
+ * Convert IR request to Gemini format.
212
+ *
213
+ * Public method for testing and debugging - see what will be sent to Gemini.
214
+ */
215
+ fromIR(request) {
216
+ const { messages, systemParameter } = normalizeSystemMessages(request.messages, this.metadata.capabilities.systemMessageStrategy, this.metadata.capabilities.supportsMultipleSystemMessages);
217
+ const contents = messages.map((msg) => ({
218
+ role: msg.role === 'assistant' ? 'model' : 'user',
219
+ parts: typeof msg.content === 'string'
220
+ ? [{ text: msg.content }]
221
+ : msg.content.map((c) => c.type === 'text' ? { text: c.text } : { text: JSON.stringify(c) }),
222
+ }));
223
+ const systemInstruction = systemParameter ? { parts: [{ text: systemParameter }] } : undefined;
224
+ return {
225
+ contents,
226
+ systemInstruction,
227
+ generationConfig: {
228
+ temperature: request.parameters?.temperature
229
+ ? request.parameters.temperature / 2
230
+ : undefined,
231
+ topP: request.parameters?.topP,
232
+ topK: request.parameters?.topK,
233
+ maxOutputTokens: request.parameters?.maxTokens,
234
+ stopSequences: request.parameters?.stopSequences
235
+ ? [...request.parameters.stopSequences]
236
+ : undefined,
237
+ },
238
+ };
239
+ }
240
+ /**
241
+ * Convert Gemini response to IR format.
242
+ *
243
+ * Public method for testing and debugging - parse Gemini responses manually.
244
+ */
245
+ toIR(response, originalRequest, latencyMs) {
246
+ const candidate = response.candidates[0];
247
+ if (!candidate) {
248
+ throw new AdapterConversionError({
249
+ code: ErrorCode.ADAPTER_CONVERSION_ERROR,
250
+ message: 'No candidates in Gemini response',
251
+ provenance: { backend: this.metadata.name },
252
+ });
253
+ }
254
+ const content = candidate.content.parts.map((p) => ('text' in p ? p.text : '')).join('');
255
+ const message = { role: 'assistant', content };
256
+ return {
257
+ message,
258
+ finishReason: this.mapFinishReason(candidate.finishReason),
259
+ usage: response.usageMetadata
260
+ ? {
261
+ promptTokens: response.usageMetadata.promptTokenCount,
262
+ completionTokens: response.usageMetadata.candidatesTokenCount,
263
+ totalTokens: response.usageMetadata.totalTokenCount,
264
+ }
265
+ : undefined,
266
+ metadata: {
267
+ ...originalRequest.metadata,
268
+ providerResponseId: undefined, // Gemini does not provide a response ID
269
+ provenance: { ...originalRequest.metadata.provenance, backend: this.metadata.name },
270
+ custom: { ...originalRequest.metadata.custom, latencyMs },
271
+ },
272
+ raw: response,
273
+ };
274
+ }
275
+ mapFinishReason(reason) {
276
+ switch (reason) {
277
+ case 'STOP':
278
+ return 'stop';
279
+ case 'MAX_TOKENS':
280
+ return 'length';
281
+ case 'SAFETY':
282
+ return 'content_filter';
283
+ default:
284
+ return 'stop';
285
+ }
286
+ }
287
+ }
288
+ //# sourceMappingURL=gemini.js.map