@simulacra-ai/fireworksai 0.0.5

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.
@@ -0,0 +1,57 @@
1
+ import { OpenAI } from 'openai';
2
+ import { ModelProvider, ProviderContextTransformer, ModelRequest, StreamReceiver, CancellationToken } from '@simulacra-ai/core';
3
+
4
+ declare const FIREWORKS_BASE_URL = "https://api.fireworks.ai/inference/v1";
5
+ /**
6
+ * Configuration options for the FireworksAI provider.
7
+ */
8
+ type FireworksAIProviderConfig = Record<string, unknown> & {
9
+ /** The model identifier to use (e.g., "accounts/fireworks/models/llama-v3p1-8b-instruct"). */
10
+ model: string;
11
+ /** The maximum number of tokens to generate in the response. */
12
+ max_tokens?: number;
13
+ };
14
+ /**
15
+ * Creates an OpenAI SDK client configured to target the FireworksAI API.
16
+ *
17
+ * @param apiKey - Your Fireworks AI API key.
18
+ * @returns A configured OpenAI client instance pointed at the Fireworks endpoint.
19
+ */
20
+ declare function createFireworksAIClient(apiKey: string): OpenAI;
21
+ /**
22
+ * Model provider implementation for FireworksAI's OpenAI-compatible chat completion API.
23
+ *
24
+ * FireworksAI exposes an OpenAI-compatible endpoint, so this provider uses the
25
+ * OpenAI SDK under the hood (pointed at the Fireworks base URL via `createFireworksAIClient`).
26
+ * It handles message formatting, content streaming, and usage tracking according to
27
+ * the ModelProvider interface. System prompts always use the standard `system` role.
28
+ */
29
+ declare class FireworksAIProvider implements ModelProvider {
30
+ #private;
31
+ readonly context_transformers: ProviderContextTransformer[];
32
+ /**
33
+ * Creates a new FireworksAI provider instance.
34
+ *
35
+ * @param sdk - An OpenAI SDK client configured for the Fireworks endpoint (see `createFireworksAIClient`).
36
+ * @param config - Configuration options for the provider.
37
+ * @param context_transformers - Provider-level context transformers.
38
+ */
39
+ constructor(sdk: OpenAI, config: FireworksAIProviderConfig, context_transformers?: ProviderContextTransformer[]);
40
+ /**
41
+ * Executes a model request and streams the response through the provided receiver.
42
+ *
43
+ * @param request - The request containing messages, tools, and system prompt.
44
+ * @param receiver - The receiver that handles streaming events.
45
+ * @param cancellation - Token to signal cancellation of the request.
46
+ * @returns A promise that resolves when the request completes.
47
+ */
48
+ execute_request(request: ModelRequest, receiver: StreamReceiver, cancellation: CancellationToken): Promise<void>;
49
+ /**
50
+ * Creates a clone of this provider with the same configuration.
51
+ *
52
+ * @returns A new provider instance with identical configuration.
53
+ */
54
+ clone(): ModelProvider;
55
+ }
56
+
57
+ export { FIREWORKS_BASE_URL, FireworksAIProvider, type FireworksAIProviderConfig, createFireworksAIClient };
@@ -0,0 +1,57 @@
1
+ import { OpenAI } from 'openai';
2
+ import { ModelProvider, ProviderContextTransformer, ModelRequest, StreamReceiver, CancellationToken } from '@simulacra-ai/core';
3
+
4
+ declare const FIREWORKS_BASE_URL = "https://api.fireworks.ai/inference/v1";
5
+ /**
6
+ * Configuration options for the FireworksAI provider.
7
+ */
8
+ type FireworksAIProviderConfig = Record<string, unknown> & {
9
+ /** The model identifier to use (e.g., "accounts/fireworks/models/llama-v3p1-8b-instruct"). */
10
+ model: string;
11
+ /** The maximum number of tokens to generate in the response. */
12
+ max_tokens?: number;
13
+ };
14
+ /**
15
+ * Creates an OpenAI SDK client configured to target the FireworksAI API.
16
+ *
17
+ * @param apiKey - Your Fireworks AI API key.
18
+ * @returns A configured OpenAI client instance pointed at the Fireworks endpoint.
19
+ */
20
+ declare function createFireworksAIClient(apiKey: string): OpenAI;
21
+ /**
22
+ * Model provider implementation for FireworksAI's OpenAI-compatible chat completion API.
23
+ *
24
+ * FireworksAI exposes an OpenAI-compatible endpoint, so this provider uses the
25
+ * OpenAI SDK under the hood (pointed at the Fireworks base URL via `createFireworksAIClient`).
26
+ * It handles message formatting, content streaming, and usage tracking according to
27
+ * the ModelProvider interface. System prompts always use the standard `system` role.
28
+ */
29
+ declare class FireworksAIProvider implements ModelProvider {
30
+ #private;
31
+ readonly context_transformers: ProviderContextTransformer[];
32
+ /**
33
+ * Creates a new FireworksAI provider instance.
34
+ *
35
+ * @param sdk - An OpenAI SDK client configured for the Fireworks endpoint (see `createFireworksAIClient`).
36
+ * @param config - Configuration options for the provider.
37
+ * @param context_transformers - Provider-level context transformers.
38
+ */
39
+ constructor(sdk: OpenAI, config: FireworksAIProviderConfig, context_transformers?: ProviderContextTransformer[]);
40
+ /**
41
+ * Executes a model request and streams the response through the provided receiver.
42
+ *
43
+ * @param request - The request containing messages, tools, and system prompt.
44
+ * @param receiver - The receiver that handles streaming events.
45
+ * @param cancellation - Token to signal cancellation of the request.
46
+ * @returns A promise that resolves when the request completes.
47
+ */
48
+ execute_request(request: ModelRequest, receiver: StreamReceiver, cancellation: CancellationToken): Promise<void>;
49
+ /**
50
+ * Creates a clone of this provider with the same configuration.
51
+ *
52
+ * @returns A new provider instance with identical configuration.
53
+ */
54
+ clone(): ModelProvider;
55
+ }
56
+
57
+ export { FIREWORKS_BASE_URL, FireworksAIProvider, type FireworksAIProviderConfig, createFireworksAIClient };
package/dist/index.js ADDED
@@ -0,0 +1,564 @@
1
+ // src/fireworksai-provider.ts
2
+ import { OpenAI } from "openai";
3
+ var FIREWORKS_BASE_URL = "https://api.fireworks.ai/inference/v1";
4
+ function createFireworksAIClient(apiKey) {
5
+ return new OpenAI({
6
+ apiKey,
7
+ baseURL: FIREWORKS_BASE_URL
8
+ });
9
+ }
10
+ var FireworksAIProvider = class _FireworksAIProvider {
11
+ #sdk;
12
+ #config;
13
+ context_transformers;
14
+ /**
15
+ * Creates a new FireworksAI provider instance.
16
+ *
17
+ * @param sdk - An OpenAI SDK client configured for the Fireworks endpoint (see `createFireworksAIClient`).
18
+ * @param config - Configuration options for the provider.
19
+ * @param context_transformers - Provider-level context transformers.
20
+ */
21
+ constructor(sdk, config, context_transformers = []) {
22
+ this.#sdk = sdk;
23
+ this.#config = config;
24
+ this.context_transformers = context_transformers;
25
+ }
26
+ /**
27
+ * Executes a model request and streams the response through the provided receiver.
28
+ *
29
+ * @param request - The request containing messages, tools, and system prompt.
30
+ * @param receiver - The receiver that handles streaming events.
31
+ * @param cancellation - Token to signal cancellation of the request.
32
+ * @returns A promise that resolves when the request completes.
33
+ */
34
+ async execute_request(request, receiver, cancellation) {
35
+ const { model, max_tokens, ...api_extras } = this.#config;
36
+ const params = {
37
+ ...api_extras,
38
+ model,
39
+ stream: true,
40
+ max_tokens,
41
+ ...request.tools.length > 0 ? {
42
+ tool_choice: "auto",
43
+ tools: request.tools.map((t) => to_fireworksai_tool(t))
44
+ } : {},
45
+ messages: [
46
+ ...get_system_message(request.system),
47
+ ...request.messages.flatMap((m) => to_fireworksai_messages(m))
48
+ ],
49
+ stream_options: {
50
+ include_usage: true
51
+ }
52
+ };
53
+ receiver.before_request({ params });
54
+ receiver.request_raw(params);
55
+ const stream = await this.#sdk.chat.completions.create(params);
56
+ this.#stream_response(stream, receiver, cancellation);
57
+ }
58
+ /**
59
+ * Creates a clone of this provider with the same configuration.
60
+ *
61
+ * @returns A new provider instance with identical configuration.
62
+ */
63
+ clone() {
64
+ return new _FireworksAIProvider(this.#sdk, this.#config, this.context_transformers);
65
+ }
66
+ async #stream_response(stream, receiver, cancellation) {
67
+ try {
68
+ let response;
69
+ for await (const response_chunk of stream) {
70
+ if (cancellation.is_cancellation_requested) {
71
+ receiver.cancel();
72
+ return;
73
+ }
74
+ receiver.stream_raw(response_chunk);
75
+ const { choices: choices_chunk, ...rest } = response_chunk;
76
+ response = {
77
+ ...response,
78
+ ...rest,
79
+ choices: response?.choices ?? []
80
+ };
81
+ for (const choice_chunk of choices_chunk) {
82
+ if (!response.choices[choice_chunk.index]) {
83
+ response.choices[choice_chunk.index] = choice_chunk;
84
+ const message2 = from_fireworksai_completion(response_chunk, choice_chunk);
85
+ for (const content of message2.content) {
86
+ receiver.start_content({ content, message: message2, usage: {} });
87
+ }
88
+ receiver.start_message({ message: message2, usage: {} });
89
+ continue;
90
+ }
91
+ const { delta: delta_chunk, ...rest2 } = choice_chunk;
92
+ const choice = response.choices[choice_chunk.index] = {
93
+ ...response.choices[choice_chunk.index],
94
+ ...rest2,
95
+ delta: {
96
+ ...response.choices[choice_chunk.index]?.delta
97
+ }
98
+ };
99
+ if (delta_chunk.role) {
100
+ choice.delta.role = delta_chunk.role;
101
+ }
102
+ if (delta_chunk.refusal) {
103
+ if (!choice.delta.refusal) {
104
+ choice.delta.refusal = "";
105
+ }
106
+ choice.delta.refusal += delta_chunk.refusal;
107
+ }
108
+ if (delta_chunk.content) {
109
+ if (!choice.delta.content) {
110
+ choice.delta.content = delta_chunk.content;
111
+ receiver.start_content({
112
+ content: from_fireworksai_content(choice.delta),
113
+ message: from_fireworksai_completion(response_chunk, choice),
114
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
115
+ });
116
+ receiver.update_message({
117
+ message: from_fireworksai_completion(response_chunk, choice),
118
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
119
+ });
120
+ } else {
121
+ choice.delta.content += delta_chunk.content;
122
+ receiver.update_content({
123
+ content: from_fireworksai_content(choice.delta),
124
+ message: from_fireworksai_completion(response_chunk, choice),
125
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
126
+ });
127
+ }
128
+ }
129
+ if (delta_chunk.tool_calls) {
130
+ if (!choice.delta.tool_calls) {
131
+ choice.delta.tool_calls = [];
132
+ }
133
+ for (const tool_call_chunk of delta_chunk.tool_calls) {
134
+ if (!choice.delta.tool_calls[tool_call_chunk.index]) {
135
+ choice.delta.tool_calls[tool_call_chunk.index] = tool_call_chunk;
136
+ receiver.start_content({
137
+ content: from_fireworksai_tool_call(tool_call_chunk),
138
+ message: from_fireworksai_completion(response_chunk, choice),
139
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
140
+ });
141
+ receiver.update_message({
142
+ message: from_fireworksai_completion(response_chunk, choice),
143
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
144
+ });
145
+ } else {
146
+ const tool_call = choice.delta.tool_calls[tool_call_chunk.index];
147
+ if (tool_call_chunk.id) {
148
+ tool_call.id = tool_call_chunk.id;
149
+ }
150
+ if (tool_call_chunk.type) {
151
+ tool_call.type = tool_call_chunk.type;
152
+ }
153
+ if (tool_call_chunk.function) {
154
+ if (!tool_call.function) {
155
+ tool_call.function = tool_call_chunk.function;
156
+ } else {
157
+ if (tool_call_chunk.function.name) {
158
+ tool_call.function.name = tool_call_chunk.function.name;
159
+ }
160
+ if (tool_call_chunk.function.arguments) {
161
+ if (!tool_call.function.arguments) {
162
+ tool_call.function.arguments = "";
163
+ }
164
+ tool_call.function.arguments += tool_call_chunk.function.arguments;
165
+ }
166
+ }
167
+ }
168
+ receiver.update_content({
169
+ content: from_fireworksai_tool_call(tool_call),
170
+ message: from_fireworksai_completion(response_chunk, choice),
171
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
172
+ });
173
+ receiver.update_message({
174
+ message: from_fireworksai_completion(response_chunk, choice),
175
+ usage: response?.usage ? from_fireworksai_usage(response.usage) : {}
176
+ });
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ if (!response || !response.choices?.[0]) {
183
+ throw new Error("no data");
184
+ }
185
+ receiver.response_raw({ ...response });
186
+ const message = from_fireworksai_completion(response, response.choices[0]);
187
+ const usage = response?.usage ? from_fireworksai_usage(response.usage) : {};
188
+ for (const content of message.content) {
189
+ receiver.complete_content({ content, message, usage });
190
+ }
191
+ receiver.complete_message({ message, usage, ...map_stop_reason(response) });
192
+ } catch (error) {
193
+ receiver.error(error);
194
+ }
195
+ }
196
+ };
197
+ function get_system_message(system) {
198
+ if (!system) {
199
+ return [];
200
+ }
201
+ return [
202
+ {
203
+ role: "system",
204
+ content: system
205
+ }
206
+ ];
207
+ }
208
+ function to_fireworksai_tool(tool) {
209
+ function map_parameter_type(parameter) {
210
+ switch (parameter.type) {
211
+ case "object":
212
+ return {
213
+ type: parameter.required ? parameter.type : [parameter.type, "null"],
214
+ description: parameter.description,
215
+ properties: Object.fromEntries(
216
+ Object.entries(parameter.properties).map(([k, v]) => [k, map_parameter_type(v)])
217
+ ),
218
+ additionalProperties: false,
219
+ required: Object.entries(parameter.properties).map(([k]) => k)
220
+ };
221
+ case "array":
222
+ return {
223
+ type: parameter.required ? parameter.type : [parameter.type, "null"],
224
+ description: parameter.description,
225
+ items: map_parameter_type(parameter.items)
226
+ };
227
+ default:
228
+ return {
229
+ type: parameter.required ? parameter.type : [parameter.type, "null"],
230
+ description: parameter.default !== void 0 ? parameter.description ? `${parameter.description} (default: ${parameter.default})` : `default: ${parameter.default}` : parameter.description,
231
+ enum: "enum" in parameter ? parameter.enum : void 0
232
+ };
233
+ }
234
+ }
235
+ return {
236
+ type: "function",
237
+ function: {
238
+ name: tool.name,
239
+ description: tool.description,
240
+ parameters: map_parameter_type({
241
+ type: "object",
242
+ required: true,
243
+ properties: Object.fromEntries(
244
+ tool.parameters.map(({ name, ...parameter }) => [name, parameter])
245
+ )
246
+ })
247
+ }
248
+ };
249
+ }
250
+ function from_fireworksai_completion(completion, choice) {
251
+ let contents = [];
252
+ for (const k in choice.delta) {
253
+ const key = k;
254
+ if (key === "role") {
255
+ continue;
256
+ }
257
+ if (key === "content" && choice.delta.content) {
258
+ contents = [...contents, from_fireworksai_content(choice.delta)];
259
+ } else if (key === "refusal" && choice.delta.refusal) {
260
+ contents = [...contents, from_fireworksai_refusal(choice.delta)];
261
+ } else if (key === "tool_calls" && choice.delta.tool_calls) {
262
+ contents = [
263
+ ...contents,
264
+ ...choice.delta.tool_calls.map((t) => from_fireworksai_tool_call(t))
265
+ ];
266
+ } else if (choice.delta[key] !== void 0 && choice.delta[key] !== null) {
267
+ const { [key]: data } = choice.delta;
268
+ contents = [
269
+ ...contents,
270
+ {
271
+ type: "raw",
272
+ model_kind: "fireworksai",
273
+ data: JSON.stringify({ [key]: data })
274
+ }
275
+ ];
276
+ }
277
+ }
278
+ return {
279
+ id: completion.id,
280
+ timestamp: completion.created,
281
+ role: map_role(choice),
282
+ content: contents
283
+ };
284
+ }
285
+ function from_fireworksai_refusal(content) {
286
+ const { refusal, tool_calls: _, function_call: __, content: ___, role: ____, ...rest } = content;
287
+ return {
288
+ type: "text",
289
+ text: refusal,
290
+ extended: {
291
+ ...rest,
292
+ fireworksai_refusal: true
293
+ }
294
+ };
295
+ }
296
+ function from_fireworksai_content(content) {
297
+ const {
298
+ content: c,
299
+ tool_calls: _,
300
+ function_call: __,
301
+ refusal: ___,
302
+ role: ____,
303
+ ...rest
304
+ } = content;
305
+ return {
306
+ type: "text",
307
+ text: c,
308
+ extended: rest
309
+ };
310
+ }
311
+ function from_fireworksai_tool_call(tool_call) {
312
+ const { id: tool_request_id, function: fn, type: _, index: __, ...extended } = tool_call;
313
+ let params;
314
+ try {
315
+ params = JSON.parse(fn?.arguments ?? "{}");
316
+ } catch {
317
+ params = fn?.arguments;
318
+ }
319
+ return {
320
+ tool_request_id,
321
+ type: "tool",
322
+ tool: fn?.name,
323
+ params,
324
+ extended
325
+ };
326
+ }
327
+ function to_fireworksai_messages(message) {
328
+ if (message.role === "assistant") {
329
+ return [to_fireworksai_assistant_message(message)];
330
+ }
331
+ const tool_result_content = message.content.filter((c) => c.type === "tool_result");
332
+ const other_content = message.content.filter((c) => c.type !== "tool_result");
333
+ const ordered_content = [...tool_result_content, ...other_content];
334
+ const results = [];
335
+ let result;
336
+ for (const content of ordered_content) {
337
+ if (content.type === "text") {
338
+ if (!result) {
339
+ result = {
340
+ role: "user",
341
+ content: content.text
342
+ };
343
+ } else if (result.role === "tool") {
344
+ results.push(result);
345
+ result = {
346
+ role: "user",
347
+ content: content.text
348
+ };
349
+ } else {
350
+ if (typeof result.content === "string") {
351
+ result.content = [
352
+ {
353
+ type: "text",
354
+ text: result.content
355
+ }
356
+ ];
357
+ }
358
+ if (!result.content) {
359
+ result.content = [
360
+ {
361
+ type: "text",
362
+ text: content.text
363
+ }
364
+ ];
365
+ } else {
366
+ result.content.push({
367
+ type: "text",
368
+ text: content.text
369
+ });
370
+ }
371
+ }
372
+ } else if (content.type === "tool_result") {
373
+ if (!result) {
374
+ result = {
375
+ role: "tool",
376
+ tool_call_id: content.tool_request_id,
377
+ content: JSON.stringify(content.result)
378
+ };
379
+ } else if (result.role !== "tool" || result.tool_call_id !== content.tool_request_id) {
380
+ results.push(result);
381
+ result = {
382
+ role: "tool",
383
+ tool_call_id: content.tool_request_id,
384
+ content: JSON.stringify(content.result)
385
+ };
386
+ } else {
387
+ if (typeof result.content === "string") {
388
+ result.content = [
389
+ {
390
+ type: "text",
391
+ text: result.content
392
+ }
393
+ ];
394
+ }
395
+ result.content.push({
396
+ type: "text",
397
+ text: JSON.stringify(content.result)
398
+ });
399
+ }
400
+ } else if (content.type === "raw") {
401
+ result = {
402
+ ...result ?? {},
403
+ ...JSON.parse(content.data)
404
+ };
405
+ }
406
+ }
407
+ if (result) {
408
+ results.push(result);
409
+ }
410
+ return results;
411
+ }
412
+ function to_fireworksai_assistant_message(message) {
413
+ let result = {
414
+ role: "assistant"
415
+ };
416
+ for (const content of message.content) {
417
+ switch (content.type) {
418
+ case "text":
419
+ if (content.extended && (content.extended.fireworksai_refusal === true || content.extended.openai_refusal === true)) {
420
+ result.refusal = content.text;
421
+ } else {
422
+ if (typeof result.content === "string") {
423
+ result.content = [
424
+ {
425
+ type: "text",
426
+ text: result.content
427
+ }
428
+ ];
429
+ }
430
+ if (!result.content) {
431
+ result.content = content.text;
432
+ } else {
433
+ result.content.push({
434
+ type: "text",
435
+ text: content.text
436
+ });
437
+ }
438
+ }
439
+ break;
440
+ case "tool":
441
+ if (!result.tool_calls) {
442
+ result.tool_calls = [];
443
+ }
444
+ result.tool_calls.push({
445
+ id: content.tool_request_id,
446
+ type: "function",
447
+ function: {
448
+ name: content.tool,
449
+ arguments: JSON.stringify(content.params)
450
+ }
451
+ });
452
+ break;
453
+ case "raw":
454
+ if (content.model_kind !== "fireworksai" && content.model_kind !== "openai") {
455
+ if (typeof result.content === "string") {
456
+ result.content = [
457
+ {
458
+ type: "text",
459
+ text: result.content
460
+ }
461
+ ];
462
+ }
463
+ if (!result.content) {
464
+ result.content = content.data;
465
+ } else {
466
+ result.content.push({
467
+ type: "text",
468
+ text: content.data
469
+ });
470
+ }
471
+ break;
472
+ }
473
+ result = {
474
+ ...result,
475
+ ...JSON.parse(content.data)
476
+ };
477
+ break;
478
+ case "thinking":
479
+ if (typeof result.content === "string") {
480
+ result.content = [
481
+ {
482
+ type: "text",
483
+ text: result.content
484
+ }
485
+ ];
486
+ }
487
+ if (!result.content) {
488
+ result.content = content.thought;
489
+ } else {
490
+ result.content.push({
491
+ type: "text",
492
+ text: content.thought
493
+ });
494
+ }
495
+ break;
496
+ default:
497
+ throw new Error("unexpected content type");
498
+ }
499
+ }
500
+ if (result.tool_calls && result.content === void 0) {
501
+ result.content = null;
502
+ }
503
+ return result;
504
+ }
505
+ function from_fireworksai_usage(usage) {
506
+ return {
507
+ input_tokens: usage?.prompt_tokens,
508
+ output_tokens: usage?.completion_tokens
509
+ };
510
+ }
511
+ function map_stop_reason(completion) {
512
+ for (const choice of completion.choices) {
513
+ switch (choice.finish_reason) {
514
+ case "content_filter":
515
+ return {
516
+ stop_reason: "error",
517
+ stop_details: choice.finish_reason
518
+ };
519
+ case "function_call":
520
+ return {
521
+ stop_reason: "tool_use"
522
+ };
523
+ case "length":
524
+ return {
525
+ stop_reason: "max_tokens"
526
+ };
527
+ case "stop":
528
+ return {
529
+ stop_reason: "end_turn"
530
+ };
531
+ case "tool_calls":
532
+ return {
533
+ stop_reason: "tool_use"
534
+ };
535
+ default:
536
+ return {
537
+ stop_reason: "other",
538
+ stop_details: `${choice.finish_reason}`
539
+ };
540
+ }
541
+ }
542
+ return {
543
+ stop_reason: "other"
544
+ };
545
+ }
546
+ function map_role(choice) {
547
+ switch (choice.delta.role) {
548
+ case "user":
549
+ case "developer":
550
+ case "system":
551
+ return "user";
552
+ case "assistant":
553
+ case "tool":
554
+ return "assistant";
555
+ default:
556
+ throw new Error("invalid role");
557
+ }
558
+ }
559
+ export {
560
+ FIREWORKS_BASE_URL,
561
+ FireworksAIProvider,
562
+ createFireworksAIClient
563
+ };
564
+ //# sourceMappingURL=index.js.map