@happyvertical/ai 0.78.3 → 0.79.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 (54) hide show
  1. package/README.md +63 -5
  2. package/dist/chunks/{anthropic-BRwbhwIl.js → anthropic-2z-82zgr.js} +75 -8
  3. package/dist/chunks/anthropic-2z-82zgr.js.map +1 -0
  4. package/dist/chunks/{bedrock-Cf1xUerN.js → bedrock-Dc2eVPUD.js} +153 -41
  5. package/dist/chunks/bedrock-Dc2eVPUD.js.map +1 -0
  6. package/dist/chunks/{bifrost-3mXtQsTj.js → bifrost-CEnCsciy.js} +36 -11
  7. package/dist/chunks/bifrost-CEnCsciy.js.map +1 -0
  8. package/dist/chunks/{claude-cli-BrHRfkry.js → claude-cli-X1ONjE8K.js} +3 -3
  9. package/dist/chunks/{claude-cli-BrHRfkry.js.map → claude-cli-X1ONjE8K.js.map} +1 -1
  10. package/dist/chunks/{gateway-admin-C4GFPbZF.js → gateway-admin-BUhBzXZb.js} +2 -2
  11. package/dist/chunks/{gateway-admin-C4GFPbZF.js.map → gateway-admin-BUhBzXZb.js.map} +1 -1
  12. package/dist/chunks/{gemini-BfpHXDIQ.js → gemini-CS56gY0D.js} +138 -32
  13. package/dist/chunks/gemini-CS56gY0D.js.map +1 -0
  14. package/dist/chunks/{huggingface-280qv9iv.js → huggingface-wQSfO5xA.js} +64 -19
  15. package/dist/chunks/huggingface-wQSfO5xA.js.map +1 -0
  16. package/dist/chunks/{index-BT4thAvS.js → index-DCXO0nZA.js} +383 -24
  17. package/dist/chunks/index-DCXO0nZA.js.map +1 -0
  18. package/dist/chunks/{litellm-DhPKa_Jz.js → litellm-BMFTYbWc.js} +36 -11
  19. package/dist/chunks/litellm-BMFTYbWc.js.map +1 -0
  20. package/dist/chunks/{ollama-Di1ldur0.js → ollama-DsGDrA-c.js} +171 -60
  21. package/dist/chunks/ollama-DsGDrA-c.js.map +1 -0
  22. package/dist/chunks/{openai-5snI2diE.js → openai-CJEo69jb.js} +145 -12
  23. package/dist/chunks/openai-CJEo69jb.js.map +1 -0
  24. package/dist/chunks/{qwen-tts-DgPgdXxG.js → qwen-tts-BLYZ6d9s.js} +2 -2
  25. package/dist/chunks/{qwen-tts-DgPgdXxG.js.map → qwen-tts-BLYZ6d9s.js.map} +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +15 -12
  29. package/dist/shared/factory.d.ts.map +1 -1
  30. package/dist/shared/providers/anthropic.d.ts.map +1 -1
  31. package/dist/shared/providers/bedrock.d.ts.map +1 -1
  32. package/dist/shared/providers/bifrost.d.ts.map +1 -1
  33. package/dist/shared/providers/gemini.d.ts +0 -5
  34. package/dist/shared/providers/gemini.d.ts.map +1 -1
  35. package/dist/shared/providers/huggingface.d.ts.map +1 -1
  36. package/dist/shared/providers/litellm.d.ts.map +1 -1
  37. package/dist/shared/providers/ollama.d.ts +0 -1
  38. package/dist/shared/providers/ollama.d.ts.map +1 -1
  39. package/dist/shared/providers/openai.d.ts +2 -2
  40. package/dist/shared/providers/openai.d.ts.map +1 -1
  41. package/dist/shared/safety.d.ts +55 -0
  42. package/dist/shared/safety.d.ts.map +1 -0
  43. package/dist/shared/types.d.ts +74 -6
  44. package/dist/shared/types.d.ts.map +1 -1
  45. package/package.json +2 -2
  46. package/dist/chunks/anthropic-BRwbhwIl.js.map +0 -1
  47. package/dist/chunks/bedrock-Cf1xUerN.js.map +0 -1
  48. package/dist/chunks/bifrost-3mXtQsTj.js.map +0 -1
  49. package/dist/chunks/gemini-BfpHXDIQ.js.map +0 -1
  50. package/dist/chunks/huggingface-280qv9iv.js.map +0 -1
  51. package/dist/chunks/index-BT4thAvS.js.map +0 -1
  52. package/dist/chunks/litellm-DhPKa_Jz.js.map +0 -1
  53. package/dist/chunks/ollama-Di1ldur0.js.map +0 -1
  54. package/dist/chunks/openai-5snI2diE.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import OpenAI from "openai";
2
- import { A as AIError, C as ContentFilterError, a as ContextLengthError, M as ModelNotFoundError, R as RateLimitError, e as extractRetryAfterSeconds, b as AuthenticationError } from "./index-BT4thAvS.js";
2
+ import { b as normalizeBaseAIOptions, n as normalizeChatOptions, p as prepareRequestControls, A as AIError, a as normalizeImageGenerationOptions, C as ContentFilterError, c as ContextLengthError, M as ModelNotFoundError, R as RateLimitError, e as extractRetryAfterSeconds, d as AuthenticationError } from "./index-DCXO0nZA.js";
3
3
  import { e as emitUsage } from "./usage-DMWiJ2oB.js";
4
4
  const OPENAI_PROFILE = {
5
5
  providerLabel: "OpenAI",
@@ -73,10 +73,10 @@ class OpenAIProvider {
73
73
  */
74
74
  constructor(options, profile = OPENAI_PROFILE) {
75
75
  this.profile = profile;
76
- this.options = {
76
+ this.options = normalizeBaseAIOptions({
77
77
  defaultModel: this.profile.defaultModel,
78
78
  ...options
79
- };
79
+ });
80
80
  this.client = new OpenAI({
81
81
  apiKey: this.options.apiKey,
82
82
  baseURL: this.options.baseUrl,
@@ -108,9 +108,17 @@ class OpenAIProvider {
108
108
  */
109
109
  async chat(messages, options = {}) {
110
110
  const startTime = Date.now();
111
+ let controls;
111
112
  try {
112
113
  const model = options.model || this.options.defaultModel || this.profile.defaultModel;
113
- const response = await this.client.chat.completions.create({
114
+ options = normalizeChatOptions(
115
+ this.options,
116
+ options,
117
+ this.profile.providerName,
118
+ model
119
+ );
120
+ controls = prepareRequestControls(this.options, options);
121
+ const request = {
114
122
  model,
115
123
  messages: this.mapMessagesToOpenAI(messages),
116
124
  max_tokens: options.maxTokens,
@@ -133,6 +141,17 @@ class OpenAIProvider {
133
141
  response_format: options.responseFormat,
134
142
  seed: options.seed,
135
143
  stream: false
144
+ };
145
+ if ((this.profile.providerName === "bifrost" || this.profile.providerName === "litellm") && (options.reasoning?.maxTokens || 0) > 0) {
146
+ request.reasoning = {
147
+ effort: options.reasoning?.effort,
148
+ max_tokens: options.reasoning?.maxTokens,
149
+ include_thoughts: options.reasoning?.includeThoughts
150
+ };
151
+ }
152
+ const response = await this.client.chat.completions.create(request, {
153
+ signal: controls.signal,
154
+ timeout: controls.timeout
136
155
  });
137
156
  const choice = response.choices[0];
138
157
  if (!choice) {
@@ -167,7 +186,25 @@ class OpenAIProvider {
167
186
  }))
168
187
  };
169
188
  } catch (error) {
189
+ if (controls?.didTimeout()) {
190
+ throw new AIError(
191
+ `AI request timed out after ${controls.timeout}ms`,
192
+ "AI_TIMEOUT",
193
+ this.profile.providerName,
194
+ options.model
195
+ );
196
+ }
197
+ if (options.signal?.aborted) {
198
+ throw new AIError(
199
+ "AI request aborted by caller",
200
+ "AI_ABORTED",
201
+ this.profile.providerName,
202
+ options.model
203
+ );
204
+ }
170
205
  throw this.mapError(error);
206
+ } finally {
207
+ controls?.cleanup();
171
208
  }
172
209
  }
173
210
  /**
@@ -196,6 +233,9 @@ class OpenAIProvider {
196
233
  stop: options.stop,
197
234
  stream: options.stream,
198
235
  onProgress: options.onProgress,
236
+ signal: options.signal,
237
+ timeout: options.timeout,
238
+ reasoning: options.reasoning,
199
239
  usageTags: options.usageTags
200
240
  });
201
241
  }
@@ -245,6 +285,9 @@ class OpenAIProvider {
245
285
  tools: options.tools,
246
286
  toolChoice: options.toolChoice,
247
287
  onProgress: options.onProgress,
288
+ signal: options.signal,
289
+ timeout: options.timeout,
290
+ reasoning: options.reasoning,
248
291
  usageTags: options.usageTags
249
292
  });
250
293
  return response.content;
@@ -304,14 +347,14 @@ class OpenAIProvider {
304
347
  * @returns base64 data URL string
305
348
  * @private
306
349
  */
307
- async imageToBase64(image) {
350
+ async imageToBase64(image, signal) {
308
351
  if (Buffer.isBuffer(image)) {
309
352
  return `data:image/png;base64,${image.toString("base64")}`;
310
353
  }
311
354
  if (image.startsWith("data:")) {
312
355
  return image;
313
356
  }
314
- const response = await fetch(image);
357
+ const response = await fetch(image, { signal });
315
358
  if (!response.ok) {
316
359
  throw new AIError(
317
360
  `Failed to fetch image: ${response.status} ${response.statusText}`,
@@ -337,9 +380,11 @@ class OpenAIProvider {
337
380
  * ```
338
381
  */
339
382
  async describeImage(image, prompt, options = {}) {
383
+ let controls;
340
384
  try {
341
385
  const defaultPrompt = "Describe this image for a search index. Include objects, mood, lighting, and any visible text.";
342
- const imageUrl = await this.imageToBase64(image);
386
+ controls = prepareRequestControls(this.options, options);
387
+ const imageUrl = await this.imageToBase64(image, controls.signal);
343
388
  const response = await this.chat(
344
389
  [
345
390
  {
@@ -358,12 +403,34 @@ class OpenAIProvider {
358
403
  ],
359
404
  {
360
405
  model: options.model || this.options.defaultModel || this.profile.defaultModel,
361
- maxTokens: options.maxTokens || 500
406
+ maxTokens: options.maxTokens ?? 500,
407
+ signal: controls.signal,
408
+ timeout: controls.timeout,
409
+ reasoning: options.reasoning,
410
+ usageTags: options.usageTags
362
411
  }
363
412
  );
364
413
  return response.content;
365
414
  } catch (error) {
415
+ if (controls?.didTimeout()) {
416
+ throw new AIError(
417
+ `AI request timed out after ${controls.timeout}ms`,
418
+ "AI_TIMEOUT",
419
+ this.profile.providerName,
420
+ options.model
421
+ );
422
+ }
423
+ if (options.signal?.aborted) {
424
+ throw new AIError(
425
+ "AI request aborted by caller",
426
+ "AI_ABORTED",
427
+ this.profile.providerName,
428
+ options.model
429
+ );
430
+ }
366
431
  throw this.mapError(error);
432
+ } finally {
433
+ controls?.cleanup();
367
434
  }
368
435
  }
369
436
  /**
@@ -405,12 +472,20 @@ class OpenAIProvider {
405
472
  * ```
406
473
  */
407
474
  async generateImage(prompt, options = {}) {
475
+ let controls;
408
476
  try {
409
477
  const model = options.model || "dall-e-3";
478
+ options = normalizeImageGenerationOptions(
479
+ this.options,
480
+ options,
481
+ this.profile.providerName,
482
+ model
483
+ );
484
+ controls = prepareRequestControls(this.options, options);
410
485
  const requestParams = {
411
486
  model,
412
487
  prompt,
413
- n: model === "dall-e-3" ? 1 : options.n || 1,
488
+ n: model === "dall-e-3" ? 1 : options.n,
414
489
  size: options.size || "1024x1024",
415
490
  response_format: options.outputFormat === "url" ? "url" : "b64_json"
416
491
  };
@@ -422,7 +497,10 @@ class OpenAIProvider {
422
497
  requestParams.quality = options.quality;
423
498
  }
424
499
  }
425
- const response = await this.client.images.generate(requestParams);
500
+ const response = await this.client.images.generate(requestParams, {
501
+ signal: controls.signal,
502
+ timeout: controls.timeout
503
+ });
426
504
  const images = (response.data || []).map((item) => {
427
505
  let data;
428
506
  const mimeType = "image/png";
@@ -444,7 +522,25 @@ class OpenAIProvider {
444
522
  model
445
523
  };
446
524
  } catch (error) {
525
+ if (controls?.didTimeout()) {
526
+ throw new AIError(
527
+ `AI request timed out after ${controls.timeout}ms`,
528
+ "AI_TIMEOUT",
529
+ this.profile.providerName,
530
+ options.model
531
+ );
532
+ }
533
+ if (options.signal?.aborted) {
534
+ throw new AIError(
535
+ "AI request aborted by caller",
536
+ "AI_ABORTED",
537
+ this.profile.providerName,
538
+ options.model
539
+ );
540
+ }
447
541
  throw this.mapError(error);
542
+ } finally {
543
+ controls?.cleanup();
448
544
  }
449
545
  }
450
546
  /**
@@ -465,9 +561,17 @@ class OpenAIProvider {
465
561
  */
466
562
  async *stream(messages, options = {}) {
467
563
  const startTime = Date.now();
564
+ let controls;
468
565
  try {
469
566
  const model = options.model || this.options.defaultModel || this.profile.defaultModel;
470
- const stream = await this.client.chat.completions.create({
567
+ options = normalizeChatOptions(
568
+ this.options,
569
+ options,
570
+ this.profile.providerName,
571
+ model
572
+ );
573
+ controls = prepareRequestControls(this.options, options);
574
+ const request = {
471
575
  model,
472
576
  messages: this.mapMessagesToOpenAI(messages),
473
577
  max_tokens: options.maxTokens,
@@ -478,6 +582,17 @@ class OpenAIProvider {
478
582
  presence_penalty: options.presencePenalty,
479
583
  user: options.user,
480
584
  stream: true
585
+ };
586
+ if ((this.profile.providerName === "bifrost" || this.profile.providerName === "litellm") && (options.reasoning?.maxTokens || 0) > 0) {
587
+ request.reasoning = {
588
+ effort: options.reasoning?.effort,
589
+ max_tokens: options.reasoning?.maxTokens,
590
+ include_thoughts: options.reasoning?.includeThoughts
591
+ };
592
+ }
593
+ const stream = await this.client.chat.completions.create(request, {
594
+ signal: controls.signal,
595
+ timeout: controls.timeout
481
596
  });
482
597
  for await (const chunk of stream) {
483
598
  const content = chunk.choices[0]?.delta?.content;
@@ -498,7 +613,25 @@ class OpenAIProvider {
498
613
  options.usageTags
499
614
  );
500
615
  } catch (error) {
616
+ if (controls?.didTimeout()) {
617
+ throw new AIError(
618
+ `AI request timed out after ${controls.timeout}ms`,
619
+ "AI_TIMEOUT",
620
+ this.profile.providerName,
621
+ options.model
622
+ );
623
+ }
624
+ if (options.signal?.aborted) {
625
+ throw new AIError(
626
+ "AI request aborted by caller",
627
+ "AI_ABORTED",
628
+ this.profile.providerName,
629
+ options.model
630
+ );
631
+ }
501
632
  throw this.mapError(error);
633
+ } finally {
634
+ controls?.cleanup();
502
635
  }
503
636
  }
504
637
  /**
@@ -746,4 +879,4 @@ class OpenAIProvider {
746
879
  export {
747
880
  OpenAIProvider
748
881
  };
749
- //# sourceMappingURL=openai-5snI2diE.js.map
882
+ //# sourceMappingURL=openai-CJEo69jb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-CJEo69jb.js","sources":["../../src/shared/providers/openai.ts"],"sourcesContent":["/**\n * OpenAI provider implementation\n *\n * Provides a standardized interface for interacting with OpenAI's GPT models,\n * including chat completions, text completions, embeddings, and streaming responses.\n * Supports all major OpenAI features including function calling, vision models,\n * and custom fine-tuned models.\n */\n\nimport OpenAI from 'openai';\nimport { extractRetryAfterSeconds } from '../rate-limit';\nimport {\n normalizeBaseAIOptions,\n normalizeChatOptions,\n normalizeImageGenerationOptions,\n type PreparedRequestControls,\n prepareRequestControls,\n} from '../safety';\nimport type {\n AICapabilities,\n AIInterface,\n AIMessage,\n AIModel,\n AIResponse,\n BaseAIOptions,\n ChatOptions,\n CompletionOptions,\n ContentPart,\n EmbeddingOptions,\n EmbeddingResponse,\n ImageDescriptionOptions,\n ImageEmbeddingOptions,\n ImageGenerationOptions,\n ImageGenerationResponse,\n MessageOptions,\n TokenUsage,\n TTSOptions,\n TTSResponse,\n Voice,\n VoiceCloneOptions,\n VoiceDesignOptions,\n VoiceListOptions,\n} from '../types';\nimport {\n AIError,\n AuthenticationError,\n ContentFilterError,\n ContextLengthError,\n ModelNotFoundError,\n RateLimitError,\n} from '../types';\nimport { emitUsage } from './usage';\n\n/**\n * Shared profile for OpenAI-compatible providers\n */\nexport interface OpenAICompatibleProfile {\n providerLabel: string;\n providerName: string;\n defaultModel: string;\n capabilities: AICapabilities;\n describeModel(modelId: string): string;\n getContextLength(modelId: string): number;\n getModelCapabilities(modelId: string): string[];\n shouldIncludeModel(modelId: string): boolean;\n supportsFunctions(modelId: string): boolean;\n supportsVision(modelId: string): boolean;\n}\n\nconst OPENAI_PROFILE: OpenAICompatibleProfile = {\n providerLabel: 'OpenAI',\n providerName: 'openai',\n defaultModel: 'gpt-4o',\n capabilities: {\n chat: true,\n completion: true,\n embeddings: true,\n streaming: true,\n functions: true,\n vision: true,\n fineTuning: true,\n imageEmbeddings: true,\n imageGeneration: true,\n tts: false,\n voiceCloning: false,\n voiceDesign: false,\n maxContextLength: 128000,\n supportedOperations: [\n 'chat',\n 'completion',\n 'embedding',\n 'streaming',\n 'functions',\n 'vision',\n 'image_embedding',\n 'image_generation',\n ],\n },\n describeModel: (modelId) => `OpenAI model: ${modelId}`,\n getContextLength(modelId) {\n if (modelId.includes('gpt-4o')) return 128000;\n if (modelId.includes('gpt-4.1')) return 128000;\n if (modelId.includes('gpt-4-turbo')) return 128000;\n if (modelId.includes('gpt-4')) return 8192;\n if (modelId.includes('gpt-3.5-turbo')) return 16385;\n if (modelId.includes('text-embedding')) return 8192;\n return 4096;\n },\n getModelCapabilities(modelId) {\n const capabilities = ['text'];\n if (modelId.includes('gpt')) {\n capabilities.push('chat', 'functions');\n }\n if (\n modelId.includes('vision') ||\n modelId === 'gpt-4o' ||\n modelId.includes('gpt-4.1')\n ) {\n capabilities.push('vision');\n }\n if (modelId.includes('embedding')) {\n capabilities.push('embeddings');\n }\n return capabilities;\n },\n shouldIncludeModel(modelId) {\n return modelId.includes('gpt') || modelId.includes('text-embedding');\n },\n supportsFunctions(modelId) {\n return modelId.includes('gpt-4') || modelId.includes('gpt-3.5');\n },\n supportsVision(modelId) {\n return (\n modelId.includes('vision') ||\n modelId === 'gpt-4o' ||\n modelId.includes('gpt-4.1')\n );\n },\n};\n\nexport interface OpenAICompatibleOptions extends BaseAIOptions {\n type?: string;\n apiKey?: string;\n baseUrl?: string;\n organization?: string;\n}\n\n/**\n * OpenAI provider implementation that handles all interactions with OpenAI's API.\n * Supports GPT models, embeddings, function calling, streaming, and vision capabilities.\n */\nexport class OpenAIProvider implements AIInterface {\n private client: OpenAI;\n protected options: OpenAICompatibleOptions;\n protected readonly profile: OpenAICompatibleProfile;\n\n /**\n * Creates a new OpenAI provider instance\n * @param options - Configuration options for the OpenAI provider\n */\n constructor(\n options: OpenAICompatibleOptions,\n profile: OpenAICompatibleProfile = OPENAI_PROFILE,\n ) {\n this.profile = profile;\n this.options = normalizeBaseAIOptions({\n defaultModel: this.profile.defaultModel,\n ...options,\n });\n\n this.client = new OpenAI({\n apiKey: this.options.apiKey,\n baseURL: this.options.baseUrl,\n organization: this.options.organization,\n timeout: this.options.timeout,\n maxRetries: this.options.maxRetries,\n defaultHeaders: this.options.headers,\n });\n }\n\n /**\n * Generate a chat completion using OpenAI's chat models\n * @param messages - Array of conversation messages\n * @param options - Optional configuration for the chat completion\n * @returns Promise resolving to the AI response with content and metadata\n * @throws {AIError} When the API request fails or returns invalid data\n *\n * @example\n * ```typescript\n * const response = await provider.chat([\n * { role: 'system', content: 'You are a helpful assistant.' },\n * { role: 'user', content: 'What is the capital of France?' }\n * ], {\n * model: 'gpt-4o',\n * temperature: 0.7,\n * maxTokens: 150\n * });\n * console.log(response.content); // \"Paris is the capital of France.\"\n * ```\n */\n async chat(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): Promise<AIResponse> {\n const startTime = Date.now();\n let controls: PreparedRequestControls | undefined;\n try {\n const model =\n options.model || this.options.defaultModel || this.profile.defaultModel;\n options = normalizeChatOptions(\n this.options,\n options,\n this.profile.providerName,\n model,\n );\n controls = prepareRequestControls(this.options, options);\n const request = {\n model,\n messages: this.mapMessagesToOpenAI(messages),\n max_tokens: options.maxTokens,\n temperature: options.temperature,\n top_p: options.topP,\n n: options.n,\n stop: options.stop,\n frequency_penalty: options.frequencyPenalty,\n presence_penalty: options.presencePenalty,\n user: options.user,\n tools: options.tools?.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n },\n })),\n tool_choice: this.mapToolChoice(options.toolChoice),\n response_format: options.responseFormat,\n seed: options.seed,\n stream: false,\n } as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming & {\n reasoning?: {\n effort?: string;\n max_tokens?: number;\n include_thoughts?: boolean;\n };\n };\n if (\n (this.profile.providerName === 'bifrost' ||\n this.profile.providerName === 'litellm') &&\n (options.reasoning?.maxTokens || 0) > 0\n ) {\n request.reasoning = {\n effort: options.reasoning?.effort,\n max_tokens: options.reasoning?.maxTokens,\n include_thoughts: options.reasoning?.includeThoughts,\n };\n }\n const response = await this.client.chat.completions.create(request, {\n signal: controls.signal,\n timeout: controls.timeout,\n });\n\n const choice = response.choices[0];\n if (!choice) {\n throw new AIError(\n `No choices returned from ${this.profile.providerLabel}`,\n 'NO_CHOICES',\n this.profile.providerName,\n );\n }\n\n const usage = this.mapUsage(response.usage);\n emitUsage(\n this.options,\n this.profile.providerName,\n 'chat',\n response.model || model,\n usage,\n startTime,\n options.usageTags,\n );\n\n return {\n content: choice.message.content || '',\n usage,\n model: response.model,\n finishReason: this.mapFinishReason(choice.finish_reason),\n toolCalls: choice.message.tool_calls\n ?.filter((call) => call.type === 'function')\n .map((call) => ({\n id: call.id,\n type: 'function' as const,\n function: {\n name: call.function.name,\n arguments: call.function.arguments,\n },\n })),\n };\n } catch (error) {\n if (controls?.didTimeout()) {\n throw new AIError(\n `AI request timed out after ${controls.timeout}ms`,\n 'AI_TIMEOUT',\n this.profile.providerName,\n options.model,\n );\n }\n if (options.signal?.aborted) {\n throw new AIError(\n 'AI request aborted by caller',\n 'AI_ABORTED',\n this.profile.providerName,\n options.model,\n );\n }\n throw this.mapError(error);\n } finally {\n controls?.cleanup();\n }\n }\n\n /**\n * Generate a text completion for a given prompt\n * @param prompt - The text prompt to complete\n * @param options - Optional configuration for the completion\n * @returns Promise resolving to the AI response\n * @throws {AIError} When the API request fails\n *\n * @example\n * ```typescript\n * const response = await provider.complete('The weather today is', {\n * model: 'gpt-4o',\n * maxTokens: 50,\n * temperature: 0.5\n * });\n * ```\n */\n async complete(\n prompt: string,\n options: CompletionOptions = {},\n ): Promise<AIResponse> {\n return this.chat([{ role: 'user', content: prompt }], {\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n n: options.n,\n stop: options.stop,\n stream: options.stream,\n onProgress: options.onProgress,\n signal: options.signal,\n timeout: options.timeout,\n reasoning: options.reasoning,\n usageTags: options.usageTags,\n });\n }\n\n /**\n * Simple message interface for single-turn interactions with optional history\n *\n * @param text - The message text to send\n * @param options - Configuration options including history, model, etc.\n * @returns Promise resolving to the response content string\n *\n * @example\n * ```typescript\n * // Simple usage\n * const response = await provider.message('Hello!');\n *\n * // With options\n * const response = await provider.message('Analyze this', {\n * model: 'gpt-4o',\n * responseFormat: { type: 'json_object' }\n * });\n *\n * // With history\n * const response = await provider.message('What was my question?', {\n * history: [\n * { role: 'user', content: 'What is 2+2?' },\n * { role: 'assistant', content: '4' }\n * ]\n * });\n * ```\n */\n async message(text: string, options: MessageOptions = {}): Promise<string> {\n // Build messages array from history + current message\n const messages: AIMessage[] = [\n ...(options.history || []),\n { role: options.role || 'user', content: text },\n ];\n\n const response = await this.chat(messages, {\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n stop: options.stop,\n stream: options.stream,\n frequencyPenalty: options.frequencyPenalty,\n presencePenalty: options.presencePenalty,\n responseFormat: options.responseFormat,\n seed: options.seed,\n tools: options.tools,\n toolChoice: options.toolChoice,\n onProgress: options.onProgress,\n signal: options.signal,\n timeout: options.timeout,\n reasoning: options.reasoning,\n usageTags: options.usageTags,\n });\n\n return response.content;\n }\n\n /**\n * Generate embeddings for the given text(s)\n * @param text - Single text string or array of texts to embed\n * @param options - Optional configuration for embeddings\n * @returns Promise resolving to embeddings response with vector arrays\n * @throws {AIError} When the API request fails\n *\n * @example\n * ```typescript\n * // Single text embedding\n * const response1 = await provider.embed('Hello world');\n * console.log(response1.embeddings[0]); // Array of numbers\n *\n * // Multiple text embeddings\n * const response2 = await provider.embed(['Text 1', 'Text 2']);\n * console.log(response2.embeddings.length); // 2\n * ```\n */\n async embed(\n text: string | string[],\n options: EmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n const startTime = Date.now();\n try {\n const model = options.model || 'text-embedding-3-small';\n const input = Array.isArray(text) ? text : [text];\n const response = await this.client.embeddings.create({\n model,\n input,\n encoding_format: options.encodingFormat,\n dimensions: options.dimensions,\n user: options.user,\n });\n\n const usage = this.mapUsage(response.usage);\n emitUsage(\n this.options,\n this.profile.providerName,\n 'embed',\n response.model || model,\n usage,\n startTime,\n options.usageTags,\n );\n\n return {\n embeddings: response.data.map((item) => item.embedding),\n usage,\n model: response.model,\n };\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Convert an image to a base64 data URL\n * @param image - Image as URL, base64 data URL, or Buffer\n * @returns base64 data URL string\n * @private\n */\n private async imageToBase64(\n image: string | Buffer,\n signal?: AbortSignal,\n ): Promise<string> {\n if (Buffer.isBuffer(image)) {\n return `data:image/png;base64,${image.toString('base64')}`;\n }\n if (image.startsWith('data:')) {\n return image; // Already base64 data URL\n }\n // It's a URL - fetch and convert\n const response = await fetch(image, { signal });\n if (!response.ok) {\n throw new AIError(\n `Failed to fetch image: ${response.status} ${response.statusText}`,\n 'IMAGE_FETCH_ERROR',\n this.profile.providerName,\n );\n }\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const contentType = response.headers.get('content-type') || 'image/png';\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n }\n\n /**\n * Generate a text description of an image\n * @param image - Image as URL, base64 data URL, or Buffer\n * @param prompt - Custom prompt for description (optional)\n * @param options - Optional configuration\n * @returns Promise resolving to the description string\n *\n * @example\n * ```typescript\n * const description = await provider.describeImage('https://example.com/image.jpg');\n * ```\n */\n async describeImage(\n image: string | Buffer,\n prompt?: string,\n options: ImageDescriptionOptions = {},\n ): Promise<string> {\n let controls: PreparedRequestControls | undefined;\n try {\n const defaultPrompt =\n 'Describe this image for a search index. Include objects, mood, lighting, and any visible text.';\n\n controls = prepareRequestControls(this.options, options);\n const imageUrl = await this.imageToBase64(image, controls.signal);\n\n const response = await this.chat(\n [\n {\n role: 'user',\n content: [\n { type: 'text', text: prompt || defaultPrompt },\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: options.detail || 'auto',\n },\n },\n ],\n },\n ],\n {\n model:\n options.model ||\n this.options.defaultModel ||\n this.profile.defaultModel,\n maxTokens: options.maxTokens ?? 500,\n signal: controls.signal,\n timeout: controls.timeout,\n reasoning: options.reasoning,\n usageTags: options.usageTags,\n },\n );\n\n return response.content;\n } catch (error) {\n if (controls?.didTimeout()) {\n throw new AIError(\n `AI request timed out after ${controls.timeout}ms`,\n 'AI_TIMEOUT',\n this.profile.providerName,\n options.model,\n );\n }\n if (options.signal?.aborted) {\n throw new AIError(\n 'AI request aborted by caller',\n 'AI_ABORTED',\n this.profile.providerName,\n options.model,\n );\n }\n throw this.mapError(error);\n } finally {\n controls?.cleanup();\n }\n }\n\n /**\n * Generate embeddings for an image using describe-then-embed pattern\n * @param image - Image as URL, base64 data URL, or Buffer\n * @param options - Optional configuration for image embeddings\n * @returns Promise resolving to embeddings response\n *\n * @example\n * ```typescript\n * const embedding = await provider.embedImage('https://example.com/image.jpg');\n * ```\n */\n async embedImage(\n image: string | Buffer,\n options: ImageEmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n try {\n // OpenAI doesn't have native image embeddings - use describe-then-embed\n const description = await this.describeImage(\n image,\n 'Describe this image in detail for semantic embedding. Include all visible objects, colors, textures, composition, text, people, actions, and overall scene context.',\n );\n\n return this.embed(description, {\n model: options.model || 'text-embedding-3-small',\n dimensions: options.dimensions,\n user: options.user,\n });\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Generate an image from a text prompt using DALL-E\n * @param prompt - Text description of the image to generate\n * @param options - Optional configuration for image generation\n * @returns Promise resolving to generated image(s)\n *\n * @example\n * ```typescript\n * const result = await provider.generateImage('A sunset over mountains');\n * fs.writeFileSync('image.png', result.images[0].data);\n * ```\n */\n async generateImage(\n prompt: string,\n options: ImageGenerationOptions = {},\n ): Promise<ImageGenerationResponse> {\n let controls: PreparedRequestControls | undefined;\n try {\n const model = options.model || 'dall-e-3';\n options = normalizeImageGenerationOptions(\n this.options,\n options,\n this.profile.providerName,\n model,\n );\n controls = prepareRequestControls(this.options, options);\n\n const requestParams: OpenAI.Images.ImageGenerateParams = {\n model,\n prompt,\n n: model === 'dall-e-3' ? 1 : options.n,\n size:\n (options.size as OpenAI.Images.ImageGenerateParams['size']) ||\n '1024x1024',\n response_format: options.outputFormat === 'url' ? 'url' : 'b64_json',\n };\n\n if (model === 'dall-e-3') {\n if (options.style) {\n requestParams.style = options.style;\n }\n if (options.quality) {\n requestParams.quality =\n options.quality as OpenAI.Images.ImageGenerateParams['quality'];\n }\n }\n\n const response = await this.client.images.generate(requestParams, {\n signal: controls.signal,\n timeout: controls.timeout,\n });\n\n const images = (response.data || []).map((item) => {\n let data: Buffer | string;\n const mimeType = 'image/png';\n\n if (options.outputFormat === 'url') {\n data = item.url || '';\n } else if (options.outputFormat === 'base64') {\n data = item.b64_json || '';\n } else {\n // Default: buffer\n data = Buffer.from(item.b64_json || '', 'base64');\n }\n\n return {\n data,\n mimeType,\n revisedPrompt: item.revised_prompt,\n };\n });\n\n return {\n images,\n model,\n };\n } catch (error) {\n if (controls?.didTimeout()) {\n throw new AIError(\n `AI request timed out after ${controls.timeout}ms`,\n 'AI_TIMEOUT',\n this.profile.providerName,\n options.model,\n );\n }\n if (options.signal?.aborted) {\n throw new AIError(\n 'AI request aborted by caller',\n 'AI_ABORTED',\n this.profile.providerName,\n options.model,\n );\n }\n throw this.mapError(error);\n } finally {\n controls?.cleanup();\n }\n }\n\n /**\n * Stream a chat completion response in real-time\n * @param messages - Array of conversation messages\n * @param options - Optional configuration for the chat completion\n * @yields Individual content chunks as they arrive\n * @throws {AIError} When the streaming request fails\n *\n * @example\n * ```typescript\n * for await (const chunk of provider.stream([\n * { role: 'user', content: 'Write a story about AI' }\n * ])) {\n * process.stdout.write(chunk);\n * }\n * ```\n */\n async *stream(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): AsyncIterable<string> {\n const startTime = Date.now();\n let controls: PreparedRequestControls | undefined;\n try {\n const model =\n options.model || this.options.defaultModel || this.profile.defaultModel;\n options = normalizeChatOptions(\n this.options,\n options,\n this.profile.providerName,\n model,\n );\n controls = prepareRequestControls(this.options, options);\n const request = {\n model,\n messages: this.mapMessagesToOpenAI(messages),\n max_tokens: options.maxTokens,\n temperature: options.temperature,\n top_p: options.topP,\n stop: options.stop,\n frequency_penalty: options.frequencyPenalty,\n presence_penalty: options.presencePenalty,\n user: options.user,\n stream: true,\n } as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming & {\n reasoning?: {\n effort?: string;\n max_tokens?: number;\n include_thoughts?: boolean;\n };\n };\n if (\n (this.profile.providerName === 'bifrost' ||\n this.profile.providerName === 'litellm') &&\n (options.reasoning?.maxTokens || 0) > 0\n ) {\n request.reasoning = {\n effort: options.reasoning?.effort,\n max_tokens: options.reasoning?.maxTokens,\n include_thoughts: options.reasoning?.includeThoughts,\n };\n }\n const stream = await this.client.chat.completions.create(request, {\n signal: controls.signal,\n timeout: controls.timeout,\n });\n\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (content) {\n if (options.onProgress) {\n options.onProgress(content);\n }\n yield content;\n }\n }\n\n emitUsage(\n this.options,\n this.profile.providerName,\n 'stream',\n model,\n undefined,\n startTime,\n options.usageTags,\n );\n } catch (error) {\n if (controls?.didTimeout()) {\n throw new AIError(\n `AI request timed out after ${controls.timeout}ms`,\n 'AI_TIMEOUT',\n this.profile.providerName,\n options.model,\n );\n }\n if (options.signal?.aborted) {\n throw new AIError(\n 'AI request aborted by caller',\n 'AI_ABORTED',\n this.profile.providerName,\n options.model,\n );\n }\n throw this.mapError(error);\n } finally {\n controls?.cleanup();\n }\n }\n\n /**\n * Count the number of tokens in the given text\n * @param text - The text to count tokens for\n * @returns Promise resolving to the estimated token count\n *\n * @remarks\n * OpenAI doesn't provide a direct token counting API, so this is an approximation\n * based on the general rule of ~4 characters per token. For precise counting,\n * consider using a dedicated tokenizer library.\n *\n * @example\n * ```typescript\n * const count = await provider.countTokens('Hello, world!');\n * console.log(count); // Approximately 4 tokens\n * ```\n */\n async countTokens(text: string): Promise<number> {\n // OpenAI doesn't provide a direct token counting API\n // This is an approximation based on the general rule of ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Get a list of available OpenAI models\n * @returns Promise resolving to an array of model information\n * @throws {AIError} When the API request fails\n *\n * @example\n * ```typescript\n * const models = await provider.getModels();\n * const gptModels = models.filter(m => m.id.includes('gpt'));\n * ```\n */\n async getModels(): Promise<AIModel[]> {\n try {\n const response = await this.client.models.list();\n return response.data\n .filter((model) => this.profile.shouldIncludeModel(model.id))\n .map((model) => ({\n id: model.id,\n name: model.id,\n description: this.profile.describeModel(model.id),\n contextLength: this.profile.getContextLength(model.id),\n capabilities: this.profile.getModelCapabilities(model.id),\n supportsFunctions: this.profile.supportsFunctions(model.id),\n supportsVision: this.profile.supportsVision(model.id),\n }));\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Get the capabilities supported by this OpenAI provider\n * @returns Promise resolving to provider capabilities\n *\n * @example\n * ```typescript\n * const caps = await provider.getCapabilities();\n * if (caps.functions) {\n * // Provider supports function calling\n * }\n * ```\n */\n async getCapabilities(): Promise<AICapabilities> {\n return { ...this.profile.capabilities };\n }\n\n // ============================================================================\n // TTS Methods (Not supported - use Qwen3-TTS provider)\n // ============================================================================\n\n async synthesizeSpeech(\n _text: string,\n _options?: TTSOptions,\n ): Promise<TTSResponse> {\n throw new AIError(\n `TTS is not supported by ${this.profile.providerLabel} provider. Use Qwen3-TTS provider.`,\n 'NOT_IMPLEMENTED',\n this.profile.providerName,\n );\n }\n\n streamSpeech(_text: string, _options?: TTSOptions): AsyncIterable<Buffer> {\n const error = new AIError(\n `TTS streaming is not supported by ${this.profile.providerLabel} provider. Use Qwen3-TTS provider.`,\n 'NOT_IMPLEMENTED',\n this.profile.providerName,\n );\n return {\n [Symbol.asyncIterator]: () => ({\n next: () => Promise.reject(error),\n }),\n };\n }\n\n async cloneVoice(_options: VoiceCloneOptions): Promise<Voice> {\n throw new AIError(\n `Voice cloning is not supported by ${this.profile.providerLabel} provider. Use Qwen3-TTS provider.`,\n 'NOT_IMPLEMENTED',\n this.profile.providerName,\n );\n }\n\n async designVoice(_options: VoiceDesignOptions): Promise<Voice> {\n throw new AIError(\n `Voice design is not supported by ${this.profile.providerLabel} provider. Use Qwen3-TTS provider.`,\n 'NOT_IMPLEMENTED',\n this.profile.providerName,\n );\n }\n\n async getVoices(_options?: VoiceListOptions): Promise<Voice[]> {\n throw new AIError(\n `Voice listing is not supported by ${this.profile.providerLabel} provider. Use Qwen3-TTS provider.`,\n 'NOT_IMPLEMENTED',\n this.profile.providerName,\n );\n }\n\n /**\n * Maps internal AI messages to OpenAI's message format\n * @param messages - Array of internal AI messages\n * @returns Array of OpenAI-compatible message parameters\n * @private\n */\n private mapMessagesToOpenAI(\n messages: AIMessage[],\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((message) => {\n // Handle content that can be string or ContentPart[]\n let content: string | OpenAI.Chat.ChatCompletionContentPart[];\n\n if (typeof message.content === 'string') {\n content = message.content;\n } else {\n // Array of content parts - map to OpenAI format\n content = message.content.map((part: ContentPart) => {\n if (part.type === 'text') {\n return { type: 'text' as const, text: part.text };\n }\n // Image content part\n return {\n type: 'image_url' as const,\n image_url: {\n url: part.image_url.url,\n detail: part.image_url.detail,\n },\n };\n });\n }\n\n // Build message based on role and content\n const baseMessage = {\n role: message.role as OpenAI.Chat.ChatCompletionRole,\n content,\n };\n\n // Add optional fields based on role and availability\n if (\n message.name &&\n (message.role === 'system' ||\n message.role === 'user' ||\n message.role === 'function')\n ) {\n (baseMessage as any).name = message.name;\n }\n\n if (message.tool_calls && message.role === 'assistant') {\n (baseMessage as any).tool_calls = message.tool_calls;\n }\n\n return baseMessage as OpenAI.Chat.ChatCompletionMessageParam;\n });\n }\n\n /**\n * Maps internal tool choice format to OpenAI's tool choice format\n * @param toolChoice - Internal tool choice specification\n * @returns OpenAI-compatible tool choice option or undefined\n * @private\n */\n private mapToolChoice(\n toolChoice?:\n | 'auto'\n | 'none'\n | { type: 'function'; function: { name: string } },\n ): OpenAI.Chat.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) return undefined;\n if (typeof toolChoice === 'string') return toolChoice;\n return {\n type: 'function',\n function: { name: toolChoice.function.name },\n };\n }\n\n /**\n * Maps OpenAI usage information to internal token usage format\n * @param usage - OpenAI usage object from API response\n * @returns Internal token usage object or undefined\n * @private\n */\n private mapUsage(\n usage?:\n | OpenAI.CompletionUsage\n | OpenAI.Completions.CompletionUsage\n | OpenAI.Embeddings.CreateEmbeddingResponse.Usage,\n ): TokenUsage | undefined {\n if (!usage) return undefined;\n return {\n promptTokens: usage.prompt_tokens || 0,\n completionTokens: (usage as any).completion_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n };\n }\n\n /**\n * Maps OpenAI finish reason to internal finish reason format\n * @param reason - OpenAI finish reason from API response\n * @returns Internal finish reason\n * @private\n */\n private mapFinishReason(reason: string | null): AIResponse['finishReason'] {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'tool_calls':\n return 'tool_calls';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'stop';\n }\n }\n\n /**\n * Gets the context length for a given OpenAI model\n * @param modelId - The OpenAI model identifier\n * @returns Maximum context length in tokens\n * @private\n */\n /**\n * Maps OpenAI API errors to internal AI error types\n * @param error - The error object from OpenAI API\n * @returns Appropriate internal AI error instance\n * @private\n */\n\n private mapError(error: unknown): AIError {\n if (error instanceof OpenAI.APIError) {\n switch (error.status) {\n case 401:\n return new AuthenticationError(this.profile.providerName);\n case 429: {\n return new RateLimitError(\n this.profile.providerName,\n extractRetryAfterSeconds(error),\n );\n }\n case 404:\n return new ModelNotFoundError(\n error.message,\n this.profile.providerName,\n );\n case 413:\n return new ContextLengthError(this.profile.providerName);\n default:\n if (error.message.includes('content_filter')) {\n return new ContentFilterError(this.profile.providerName);\n }\n return new AIError(\n error.message,\n 'API_ERROR',\n this.profile.providerName,\n );\n }\n }\n\n if (error instanceof AIError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred';\n return new AIError(\n errorMessage,\n 'UNKNOWN_ERROR',\n this.profile.providerName,\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { A as AIError } from "./index-BT4thAvS.js";
1
+ import { A as AIError } from "./index-DCXO0nZA.js";
2
2
  class RateLimiter {
3
3
  tokens;
4
4
  lastRefill;
@@ -362,4 +362,4 @@ class Qwen3TTSProvider {
362
362
  export {
363
363
  Qwen3TTSProvider
364
364
  };
365
- //# sourceMappingURL=qwen-tts-DgPgdXxG.js.map
365
+ //# sourceMappingURL=qwen-tts-BLYZ6d9s.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"qwen-tts-DgPgdXxG.js","sources":["../../src/shared/providers/qwen-tts.ts"],"sourcesContent":["/**\n * Qwen3-TTS provider implementation\n *\n * Provides text-to-speech synthesis using Qwen3-TTS models.\n * Supports voice cloning from 3-second audio samples and\n * voice design via natural language descriptions.\n *\n * TTS service is typically co-located with ComfyUI for GPU sharing efficiency.\n *\n * @see https://github.com/QwenLM/Qwen3-TTS\n */\n\nimport type {\n AICapabilities,\n AIInterface,\n AIMessage,\n AIModel,\n AIResponse,\n ChatOptions,\n CompletionOptions,\n EmbeddingOptions,\n EmbeddingResponse,\n ImageDescriptionOptions,\n ImageEmbeddingOptions,\n ImageGenerationOptions,\n ImageGenerationResponse,\n MessageOptions,\n Qwen3TTSOptions,\n TTSOptions,\n TTSResponse,\n Voice,\n VoiceCloneOptions,\n VoiceDesignOptions,\n VoiceListOptions,\n} from '../types';\nimport { AIError } from '../types';\n\n/**\n * Request body for TTS synthesis\n */\ninterface TTSSynthesizeRequest {\n text: string;\n voice?: string;\n language?: string;\n speed?: number;\n pitch?: number;\n output_format?: 'wav' | 'mp3' | 'ogg';\n include_word_timings?: boolean;\n}\n\n/**\n * Response from TTS synthesis\n */\ninterface TTSSynthesizeResponse {\n audio: string; // Base64 encoded audio\n mime_type: string;\n duration: number;\n sample_rate: number;\n word_timings?: Array<{\n word: string;\n start: number;\n end: number;\n }>;\n}\n\n/**\n * Request body for voice cloning\n */\ninterface VoiceCloneRequest {\n sample_audio: string; // Base64 encoded audio\n sample_mime_type?: string;\n name?: string;\n description?: string;\n language?: string;\n}\n\n/**\n * Request body for voice design\n */\ninterface VoiceDesignRequest {\n description: string;\n language?: string;\n gender?: 'male' | 'female' | 'neutral';\n}\n\n/**\n * Voice response from the API\n */\ninterface VoiceResponse {\n id: string;\n name: string;\n language: string;\n gender?: 'male' | 'female' | 'neutral';\n description?: string;\n is_cloned?: boolean;\n is_designed?: boolean;\n sample_url?: string;\n voice_data?: Record<string, any>;\n}\n\n/**\n * Rate limiter for controlling request frequency\n */\nclass RateLimiter {\n private tokens: number;\n private lastRefill: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per second\n private activeRequests: number = 0;\n private readonly maxConcurrent: number;\n\n constructor(options: {\n requestsPerMinute?: number;\n maxConcurrent?: number;\n }) {\n this.maxTokens = options.requestsPerMinute ?? 60;\n this.refillRate = this.maxTokens / 60; // Convert to per-second\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n this.maxConcurrent = options.maxConcurrent ?? 5;\n }\n\n async acquire(): Promise<void> {\n // Refill tokens based on elapsed time\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1000;\n this.tokens = Math.min(\n this.maxTokens,\n this.tokens + elapsed * this.refillRate,\n );\n this.lastRefill = now;\n\n // Wait for concurrent slot\n while (this.activeRequests >= this.maxConcurrent) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // Wait for token\n while (this.tokens < 1) {\n const waitTime = ((1 - this.tokens) / this.refillRate) * 1000;\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n const elapsed = (Date.now() - this.lastRefill) / 1000;\n this.tokens = Math.min(\n this.maxTokens,\n this.tokens + elapsed * this.refillRate,\n );\n this.lastRefill = Date.now();\n }\n\n this.tokens -= 1;\n this.activeRequests += 1;\n }\n\n release(): void {\n this.activeRequests = Math.max(0, this.activeRequests - 1);\n }\n}\n\n/**\n * Qwen3-TTS provider implementation for text-to-speech synthesis.\n *\n * This provider focuses on TTS capabilities and throws NOT_IMPLEMENTED\n * for text generation methods. Use alongside another provider for full\n * AI capabilities.\n *\n * @example\n * ```typescript\n * import { getAI } from '@happyvertical/ai';\n *\n * // Create TTS-only provider\n * const tts = await getAI({\n * type: 'qwen3-tts',\n * endpoint: 'http://localhost:8880'\n * });\n *\n * // Synthesize speech\n * const result = await tts.synthesizeSpeech('Hello, world!', {\n * voice: 'news-anchor',\n * includeWordTimings: true\n * });\n *\n * // Clone a voice\n * const sample = fs.readFileSync('voice-sample.wav');\n * const voice = await tts.cloneVoice({\n * sampleAudio: sample,\n * name: 'My Custom Voice'\n * });\n * ```\n */\nexport class Qwen3TTSProvider implements AIInterface {\n private options: Qwen3TTSOptions;\n private rateLimiter: RateLimiter;\n\n /**\n * Creates a new Qwen3-TTS provider instance\n * @param options - Configuration options for the TTS provider\n */\n constructor(options: Qwen3TTSOptions) {\n this.options = {\n defaultModel: 'qwen3-tts-1.7b',\n endpoint: 'http://localhost:8880',\n ...options,\n };\n\n this.rateLimiter = new RateLimiter(options.rateLimit ?? {});\n }\n\n /**\n * Get the TTS endpoint URL\n */\n private get endpoint(): string {\n return this.options.endpoint || 'http://localhost:8880';\n }\n\n /**\n * Make an HTTP request to the TTS service\n */\n private async request<T>(\n path: string,\n options: {\n method?: 'GET' | 'POST' | 'DELETE';\n body?: unknown;\n } = {},\n ): Promise<T> {\n await this.rateLimiter.acquire();\n\n try {\n const url = `${this.endpoint}${path}`;\n const response = await fetch(url, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.options.headers || {}),\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: this.options.timeout\n ? AbortSignal.timeout(this.options.timeout)\n : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new AIError(\n `TTS request to ${url} failed: ${response.status} ${errorText}`,\n 'TTS_REQUEST_FAILED',\n 'qwen3-tts',\n );\n }\n\n return await response.json();\n } finally {\n this.rateLimiter.release();\n }\n }\n\n // ============================================================================\n // TTS Methods (Implemented)\n // ============================================================================\n\n /**\n * Synthesize speech from text\n */\n async synthesizeSpeech(\n text: string,\n options: TTSOptions = {},\n ): Promise<TTSResponse> {\n const request: TTSSynthesizeRequest = {\n text,\n voice: options.voice || this.options.defaultVoice,\n language: options.language || this.options.defaultLanguage,\n speed: options.speed,\n pitch: options.pitch,\n output_format: options.outputFormat,\n include_word_timings: options.includeWordTimings,\n };\n\n const response = await this.request<TTSSynthesizeResponse>(\n '/v1/tts/synthesize',\n {\n method: 'POST',\n body: request,\n },\n );\n\n return {\n audio: Buffer.from(response.audio, 'base64'),\n mimeType: response.mime_type,\n duration: response.duration,\n sampleRate: response.sample_rate,\n model: options.model || this.options.defaultModel,\n wordTimings: response.word_timings?.map((wt) => ({\n word: wt.word,\n start: wt.start,\n end: wt.end,\n })),\n };\n }\n\n /**\n * Stream speech synthesis for real-time playback\n */\n async *streamSpeech(\n text: string,\n options: TTSOptions = {},\n ): AsyncIterable<Buffer> {\n await this.rateLimiter.acquire();\n\n try {\n const request: TTSSynthesizeRequest = {\n text,\n voice: options.voice || this.options.defaultVoice,\n language: options.language || this.options.defaultLanguage,\n speed: options.speed,\n pitch: options.pitch,\n output_format: options.outputFormat,\n };\n\n const url = `${this.endpoint}/v1/tts/stream`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.options.headers || {}),\n },\n body: JSON.stringify(request),\n signal: this.options.timeout\n ? AbortSignal.timeout(this.options.timeout)\n : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new AIError(\n `TTS stream request failed: ${response.status} ${errorText}`,\n 'TTS_STREAM_FAILED',\n 'qwen3-tts',\n );\n }\n\n if (!response.body) {\n throw new AIError(\n 'No response body for TTS stream',\n 'TTS_STREAM_NO_BODY',\n 'qwen3-tts',\n );\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield Buffer.from(value);\n }\n } finally {\n reader.releaseLock();\n }\n } finally {\n this.rateLimiter.release();\n }\n }\n\n /**\n * Clone a voice from an audio sample\n */\n async cloneVoice(options: VoiceCloneOptions): Promise<Voice> {\n const sampleBase64 =\n typeof options.sampleAudio === 'string'\n ? options.sampleAudio\n : options.sampleAudio.toString('base64');\n\n const request: VoiceCloneRequest = {\n sample_audio: sampleBase64,\n sample_mime_type: options.sampleMimeType,\n name: options.name,\n description: options.description,\n language: options.language,\n };\n\n const response = await this.request<VoiceResponse>('/v1/voices/clone', {\n method: 'POST',\n body: request,\n });\n\n return this.mapVoice(response);\n }\n\n /**\n * Design a voice using natural language description\n */\n async designVoice(options: VoiceDesignOptions): Promise<Voice> {\n const request: VoiceDesignRequest = {\n description: options.description,\n language: options.language,\n gender: options.gender,\n };\n\n const response = await this.request<VoiceResponse>('/v1/voices/design', {\n method: 'POST',\n body: request,\n });\n\n return this.mapVoice(response);\n }\n\n /**\n * List available voices\n */\n async getVoices(options: VoiceListOptions = {}): Promise<Voice[]> {\n const params = new URLSearchParams();\n if (options.language) params.set('language', options.language);\n if (options.gender) params.set('gender', options.gender);\n if (options.includeCloned !== undefined)\n params.set('include_cloned', String(options.includeCloned));\n if (options.includeDesigned !== undefined)\n params.set('include_designed', String(options.includeDesigned));\n\n const queryString = params.toString();\n const path = queryString ? `/v1/voices?${queryString}` : '/v1/voices';\n\n const response = await this.request<{ voices: VoiceResponse[] }>(path);\n return response.voices.map((v) => this.mapVoice(v));\n }\n\n /**\n * Map API voice response to Voice interface\n */\n private mapVoice(response: VoiceResponse): Voice {\n return {\n id: response.id,\n name: response.name,\n language: response.language,\n gender: response.gender,\n description: response.description,\n isCloned: response.is_cloned,\n isDesigned: response.is_designed,\n sampleUrl: response.sample_url,\n voiceData: response.voice_data,\n };\n }\n\n // ============================================================================\n // Text Generation Methods (Not Implemented - Use another provider)\n // ============================================================================\n\n async chat(\n _messages: AIMessage[],\n _options?: ChatOptions,\n ): Promise<AIResponse> {\n throw new AIError(\n 'Chat is not supported by Qwen3-TTS provider. Use OpenAI, Anthropic, or another provider for text generation.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async complete(\n _prompt: string,\n _options?: CompletionOptions,\n ): Promise<AIResponse> {\n throw new AIError(\n 'Complete is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async message(_text: string, _options?: MessageOptions): Promise<string> {\n throw new AIError(\n 'Message is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async embed(\n _text: string | string[],\n _options?: EmbeddingOptions,\n ): Promise<EmbeddingResponse> {\n throw new AIError(\n 'Embeddings are not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async embedImage(\n _image: string | Buffer,\n _options?: ImageEmbeddingOptions,\n ): Promise<EmbeddingResponse> {\n throw new AIError(\n 'Image embeddings are not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async describeImage(\n _image: string | Buffer,\n _prompt?: string,\n _options?: ImageDescriptionOptions,\n ): Promise<string> {\n throw new AIError(\n 'Image description is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async generateImage(\n _prompt: string,\n _options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResponse> {\n throw new AIError(\n 'Image generation is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async *stream(\n _messages: AIMessage[],\n _options?: ChatOptions,\n ): AsyncIterable<string> {\n throw new AIError(\n 'Chat streaming is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async countTokens(_text: string): Promise<number> {\n throw new AIError(\n 'Token counting is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async getModels(): Promise<AIModel[]> {\n return [\n {\n id: 'qwen3-tts-1.7b',\n name: 'Qwen3-TTS 1.7B',\n description: 'Higher quality TTS model (4.54GB VRAM)',\n contextLength: 0,\n capabilities: ['tts', 'voice-cloning', 'voice-design'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: 'qwen3-tts-0.6b',\n name: 'Qwen3-TTS 0.6B',\n description: 'Faster TTS model with lower VRAM (2.52GB)',\n contextLength: 0,\n capabilities: ['tts', 'voice-cloning', 'voice-design'],\n supportsFunctions: false,\n supportsVision: false,\n },\n ];\n }\n\n async getCapabilities(): Promise<AICapabilities> {\n return {\n chat: false,\n completion: false,\n embeddings: false,\n streaming: false,\n functions: false,\n vision: false,\n fineTuning: false,\n imageEmbeddings: false,\n imageGeneration: false,\n tts: true,\n voiceCloning: true,\n voiceDesign: true,\n maxContextLength: 0,\n supportedOperations: [\n 'synthesizeSpeech',\n 'streamSpeech',\n 'cloneVoice',\n 'designVoice',\n 'getVoices',\n ],\n };\n }\n}\n"],"names":["elapsed"],"mappings":";AAuGA,MAAM,YAAY;AAAA,EACR;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA;AAAA,EACT,iBAAyB;AAAA,EAChB;AAAA,EAEjB,YAAY,SAGT;AACD,SAAK,YAAY,QAAQ,qBAAqB;AAC9C,SAAK,aAAa,KAAK,YAAY;AACnC,SAAK,SAAS,KAAK;AACnB,SAAK,aAAa,KAAK,IAAA;AACvB,SAAK,gBAAgB,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EAEA,MAAM,UAAyB;AAE7B,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,WAAW,MAAM,KAAK,cAAc;AAC1C,SAAK,SAAS,KAAK;AAAA,MACjB,KAAK;AAAA,MACL,KAAK,SAAS,UAAU,KAAK;AAAA,IAAA;AAE/B,SAAK,aAAa;AAGlB,WAAO,KAAK,kBAAkB,KAAK,eAAe;AAChD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,IACzD;AAGA,WAAO,KAAK,SAAS,GAAG;AACtB,YAAM,YAAa,IAAI,KAAK,UAAU,KAAK,aAAc;AACzD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,QAAQ,CAAC;AAC5D,YAAMA,YAAW,KAAK,IAAA,IAAQ,KAAK,cAAc;AACjD,WAAK,SAAS,KAAK;AAAA,QACjB,KAAK;AAAA,QACL,KAAK,SAASA,WAAU,KAAK;AAAA,MAAA;AAE/B,WAAK,aAAa,KAAK,IAAA;AAAA,IACzB;AAEA,SAAK,UAAU;AACf,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,SAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,iBAAiB,CAAC;AAAA,EAC3D;AACF;AAiCO,MAAM,iBAAwC;AAAA,EAC3C;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,SAA0B;AACpC,SAAK,UAAU;AAAA,MACb,cAAc;AAAA,MACd,UAAU;AAAA,MACV,GAAG;AAAA,IAAA;AAGL,SAAK,cAAc,IAAI,YAAY,QAAQ,aAAa,CAAA,CAAE;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,WAAmB;AAC7B,WAAO,KAAK,QAAQ,YAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QACZ,MACA,UAGI,IACQ;AACZ,UAAM,KAAK,YAAY,QAAA;AAEvB,QAAI;AACF,YAAM,MAAM,GAAG,KAAK,QAAQ,GAAG,IAAI;AACnC,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ,QAAQ,UAAU;AAAA,QAC1B,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAI,KAAK,QAAQ,WAAW,CAAA;AAAA,QAAC;AAAA,QAE/B,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,QACpD,QAAQ,KAAK,QAAQ,UACjB,YAAY,QAAQ,KAAK,QAAQ,OAAO,IACxC;AAAA,MAAA,CACL;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAA;AACjC,cAAM,IAAI;AAAA,UACR,kBAAkB,GAAG,YAAY,SAAS,MAAM,IAAI,SAAS;AAAA,UAC7D;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,aAAO,MAAM,SAAS,KAAA;AAAA,IACxB,UAAA;AACE,WAAK,YAAY,QAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBACJ,MACA,UAAsB,IACA;AACtB,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA,OAAO,QAAQ,SAAS,KAAK,QAAQ;AAAA,MACrC,UAAU,QAAQ,YAAY,KAAK,QAAQ;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,eAAe,QAAQ;AAAA,MACvB,sBAAsB,QAAQ;AAAA,IAAA;AAGhC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,IACR;AAGF,WAAO;AAAA,MACL,OAAO,OAAO,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC3C,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,OAAO,QAAQ,SAAS,KAAK,QAAQ;AAAA,MACrC,aAAa,SAAS,cAAc,IAAI,CAAC,QAAQ;AAAA,QAC/C,MAAM,GAAG;AAAA,QACT,OAAO,GAAG;AAAA,QACV,KAAK,GAAG;AAAA,MAAA,EACR;AAAA,IAAA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aACL,MACA,UAAsB,IACC;AACvB,UAAM,KAAK,YAAY,QAAA;AAEvB,QAAI;AACF,YAAM,UAAgC;AAAA,QACpC;AAAA,QACA,OAAO,QAAQ,SAAS,KAAK,QAAQ;AAAA,QACrC,UAAU,QAAQ,YAAY,KAAK,QAAQ;AAAA,QAC3C,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,eAAe,QAAQ;AAAA,MAAA;AAGzB,YAAM,MAAM,GAAG,KAAK,QAAQ;AAC5B,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAI,KAAK,QAAQ,WAAW,CAAA;AAAA,QAAC;AAAA,QAE/B,MAAM,KAAK,UAAU,OAAO;AAAA,QAC5B,QAAQ,KAAK,QAAQ,UACjB,YAAY,QAAQ,KAAK,QAAQ,OAAO,IACxC;AAAA,MAAA,CACL;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAA;AACjC,cAAM,IAAI;AAAA,UACR,8BAA8B,SAAS,MAAM,IAAI,SAAS;AAAA,UAC1D;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,CAAC,SAAS,MAAM;AAClB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,YAAM,SAAS,SAAS,KAAK,UAAA;AAE7B,UAAI;AACF,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,cAAI,KAAM;AACV,gBAAM,OAAO,KAAK,KAAK;AAAA,QACzB;AAAA,MACF,UAAA;AACE,eAAO,YAAA;AAAA,MACT;AAAA,IACF,UAAA;AACE,WAAK,YAAY,QAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAA4C;AAC3D,UAAM,eACJ,OAAO,QAAQ,gBAAgB,WAC3B,QAAQ,cACR,QAAQ,YAAY,SAAS,QAAQ;AAE3C,UAAM,UAA6B;AAAA,MACjC,cAAc;AAAA,MACd,kBAAkB,QAAQ;AAAA,MAC1B,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,UAAU,QAAQ;AAAA,IAAA;AAGpB,UAAM,WAAW,MAAM,KAAK,QAAuB,oBAAoB;AAAA,MACrE,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA,CACP;AAED,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAA6C;AAC7D,UAAM,UAA8B;AAAA,MAClC,aAAa,QAAQ;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,IAAA;AAGlB,UAAM,WAAW,MAAM,KAAK,QAAuB,qBAAqB;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA,CACP;AAED,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,UAA4B,IAAsB;AAChE,UAAM,SAAS,IAAI,gBAAA;AACnB,QAAI,QAAQ,SAAU,QAAO,IAAI,YAAY,QAAQ,QAAQ;AAC7D,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,QAAI,QAAQ,kBAAkB;AAC5B,aAAO,IAAI,kBAAkB,OAAO,QAAQ,aAAa,CAAC;AAC5D,QAAI,QAAQ,oBAAoB;AAC9B,aAAO,IAAI,oBAAoB,OAAO,QAAQ,eAAe,CAAC;AAEhE,UAAM,cAAc,OAAO,SAAA;AAC3B,UAAM,OAAO,cAAc,cAAc,WAAW,KAAK;AAEzD,UAAM,WAAW,MAAM,KAAK,QAAqC,IAAI;AACrE,WAAO,SAAS,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,UAAgC;AAC/C,WAAO;AAAA,MACL,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,MACnB,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,IAAA;AAAA,EAExB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KACJ,WACA,UACqB;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,SACJ,SACA,UACqB;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,QAAQ,OAAe,UAA4C;AACvE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,MACJ,OACA,UAC4B;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,WACJ,QACA,UAC4B;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,cACJ,QACA,SACA,UACiB;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,cACJ,SACA,UACkC;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,OACL,WACA,UACuB;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,YAAY,OAAgC;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,YAAgC;AACpC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc,CAAC,OAAO,iBAAiB,cAAc;AAAA,QACrD,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,MAAA;AAAA,MAElB;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc,CAAC,OAAO,iBAAiB,cAAc;AAAA,QACrD,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,EAEJ;AAAA,EAEA,MAAM,kBAA2C;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,KAAK;AAAA,MACL,cAAc;AAAA,MACd,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"qwen-tts-BLYZ6d9s.js","sources":["../../src/shared/providers/qwen-tts.ts"],"sourcesContent":["/**\n * Qwen3-TTS provider implementation\n *\n * Provides text-to-speech synthesis using Qwen3-TTS models.\n * Supports voice cloning from 3-second audio samples and\n * voice design via natural language descriptions.\n *\n * TTS service is typically co-located with ComfyUI for GPU sharing efficiency.\n *\n * @see https://github.com/QwenLM/Qwen3-TTS\n */\n\nimport type {\n AICapabilities,\n AIInterface,\n AIMessage,\n AIModel,\n AIResponse,\n ChatOptions,\n CompletionOptions,\n EmbeddingOptions,\n EmbeddingResponse,\n ImageDescriptionOptions,\n ImageEmbeddingOptions,\n ImageGenerationOptions,\n ImageGenerationResponse,\n MessageOptions,\n Qwen3TTSOptions,\n TTSOptions,\n TTSResponse,\n Voice,\n VoiceCloneOptions,\n VoiceDesignOptions,\n VoiceListOptions,\n} from '../types';\nimport { AIError } from '../types';\n\n/**\n * Request body for TTS synthesis\n */\ninterface TTSSynthesizeRequest {\n text: string;\n voice?: string;\n language?: string;\n speed?: number;\n pitch?: number;\n output_format?: 'wav' | 'mp3' | 'ogg';\n include_word_timings?: boolean;\n}\n\n/**\n * Response from TTS synthesis\n */\ninterface TTSSynthesizeResponse {\n audio: string; // Base64 encoded audio\n mime_type: string;\n duration: number;\n sample_rate: number;\n word_timings?: Array<{\n word: string;\n start: number;\n end: number;\n }>;\n}\n\n/**\n * Request body for voice cloning\n */\ninterface VoiceCloneRequest {\n sample_audio: string; // Base64 encoded audio\n sample_mime_type?: string;\n name?: string;\n description?: string;\n language?: string;\n}\n\n/**\n * Request body for voice design\n */\ninterface VoiceDesignRequest {\n description: string;\n language?: string;\n gender?: 'male' | 'female' | 'neutral';\n}\n\n/**\n * Voice response from the API\n */\ninterface VoiceResponse {\n id: string;\n name: string;\n language: string;\n gender?: 'male' | 'female' | 'neutral';\n description?: string;\n is_cloned?: boolean;\n is_designed?: boolean;\n sample_url?: string;\n voice_data?: Record<string, any>;\n}\n\n/**\n * Rate limiter for controlling request frequency\n */\nclass RateLimiter {\n private tokens: number;\n private lastRefill: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per second\n private activeRequests: number = 0;\n private readonly maxConcurrent: number;\n\n constructor(options: {\n requestsPerMinute?: number;\n maxConcurrent?: number;\n }) {\n this.maxTokens = options.requestsPerMinute ?? 60;\n this.refillRate = this.maxTokens / 60; // Convert to per-second\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n this.maxConcurrent = options.maxConcurrent ?? 5;\n }\n\n async acquire(): Promise<void> {\n // Refill tokens based on elapsed time\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1000;\n this.tokens = Math.min(\n this.maxTokens,\n this.tokens + elapsed * this.refillRate,\n );\n this.lastRefill = now;\n\n // Wait for concurrent slot\n while (this.activeRequests >= this.maxConcurrent) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // Wait for token\n while (this.tokens < 1) {\n const waitTime = ((1 - this.tokens) / this.refillRate) * 1000;\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n const elapsed = (Date.now() - this.lastRefill) / 1000;\n this.tokens = Math.min(\n this.maxTokens,\n this.tokens + elapsed * this.refillRate,\n );\n this.lastRefill = Date.now();\n }\n\n this.tokens -= 1;\n this.activeRequests += 1;\n }\n\n release(): void {\n this.activeRequests = Math.max(0, this.activeRequests - 1);\n }\n}\n\n/**\n * Qwen3-TTS provider implementation for text-to-speech synthesis.\n *\n * This provider focuses on TTS capabilities and throws NOT_IMPLEMENTED\n * for text generation methods. Use alongside another provider for full\n * AI capabilities.\n *\n * @example\n * ```typescript\n * import { getAI } from '@happyvertical/ai';\n *\n * // Create TTS-only provider\n * const tts = await getAI({\n * type: 'qwen3-tts',\n * endpoint: 'http://localhost:8880'\n * });\n *\n * // Synthesize speech\n * const result = await tts.synthesizeSpeech('Hello, world!', {\n * voice: 'news-anchor',\n * includeWordTimings: true\n * });\n *\n * // Clone a voice\n * const sample = fs.readFileSync('voice-sample.wav');\n * const voice = await tts.cloneVoice({\n * sampleAudio: sample,\n * name: 'My Custom Voice'\n * });\n * ```\n */\nexport class Qwen3TTSProvider implements AIInterface {\n private options: Qwen3TTSOptions;\n private rateLimiter: RateLimiter;\n\n /**\n * Creates a new Qwen3-TTS provider instance\n * @param options - Configuration options for the TTS provider\n */\n constructor(options: Qwen3TTSOptions) {\n this.options = {\n defaultModel: 'qwen3-tts-1.7b',\n endpoint: 'http://localhost:8880',\n ...options,\n };\n\n this.rateLimiter = new RateLimiter(options.rateLimit ?? {});\n }\n\n /**\n * Get the TTS endpoint URL\n */\n private get endpoint(): string {\n return this.options.endpoint || 'http://localhost:8880';\n }\n\n /**\n * Make an HTTP request to the TTS service\n */\n private async request<T>(\n path: string,\n options: {\n method?: 'GET' | 'POST' | 'DELETE';\n body?: unknown;\n } = {},\n ): Promise<T> {\n await this.rateLimiter.acquire();\n\n try {\n const url = `${this.endpoint}${path}`;\n const response = await fetch(url, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.options.headers || {}),\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: this.options.timeout\n ? AbortSignal.timeout(this.options.timeout)\n : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new AIError(\n `TTS request to ${url} failed: ${response.status} ${errorText}`,\n 'TTS_REQUEST_FAILED',\n 'qwen3-tts',\n );\n }\n\n return await response.json();\n } finally {\n this.rateLimiter.release();\n }\n }\n\n // ============================================================================\n // TTS Methods (Implemented)\n // ============================================================================\n\n /**\n * Synthesize speech from text\n */\n async synthesizeSpeech(\n text: string,\n options: TTSOptions = {},\n ): Promise<TTSResponse> {\n const request: TTSSynthesizeRequest = {\n text,\n voice: options.voice || this.options.defaultVoice,\n language: options.language || this.options.defaultLanguage,\n speed: options.speed,\n pitch: options.pitch,\n output_format: options.outputFormat,\n include_word_timings: options.includeWordTimings,\n };\n\n const response = await this.request<TTSSynthesizeResponse>(\n '/v1/tts/synthesize',\n {\n method: 'POST',\n body: request,\n },\n );\n\n return {\n audio: Buffer.from(response.audio, 'base64'),\n mimeType: response.mime_type,\n duration: response.duration,\n sampleRate: response.sample_rate,\n model: options.model || this.options.defaultModel,\n wordTimings: response.word_timings?.map((wt) => ({\n word: wt.word,\n start: wt.start,\n end: wt.end,\n })),\n };\n }\n\n /**\n * Stream speech synthesis for real-time playback\n */\n async *streamSpeech(\n text: string,\n options: TTSOptions = {},\n ): AsyncIterable<Buffer> {\n await this.rateLimiter.acquire();\n\n try {\n const request: TTSSynthesizeRequest = {\n text,\n voice: options.voice || this.options.defaultVoice,\n language: options.language || this.options.defaultLanguage,\n speed: options.speed,\n pitch: options.pitch,\n output_format: options.outputFormat,\n };\n\n const url = `${this.endpoint}/v1/tts/stream`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.options.headers || {}),\n },\n body: JSON.stringify(request),\n signal: this.options.timeout\n ? AbortSignal.timeout(this.options.timeout)\n : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new AIError(\n `TTS stream request failed: ${response.status} ${errorText}`,\n 'TTS_STREAM_FAILED',\n 'qwen3-tts',\n );\n }\n\n if (!response.body) {\n throw new AIError(\n 'No response body for TTS stream',\n 'TTS_STREAM_NO_BODY',\n 'qwen3-tts',\n );\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield Buffer.from(value);\n }\n } finally {\n reader.releaseLock();\n }\n } finally {\n this.rateLimiter.release();\n }\n }\n\n /**\n * Clone a voice from an audio sample\n */\n async cloneVoice(options: VoiceCloneOptions): Promise<Voice> {\n const sampleBase64 =\n typeof options.sampleAudio === 'string'\n ? options.sampleAudio\n : options.sampleAudio.toString('base64');\n\n const request: VoiceCloneRequest = {\n sample_audio: sampleBase64,\n sample_mime_type: options.sampleMimeType,\n name: options.name,\n description: options.description,\n language: options.language,\n };\n\n const response = await this.request<VoiceResponse>('/v1/voices/clone', {\n method: 'POST',\n body: request,\n });\n\n return this.mapVoice(response);\n }\n\n /**\n * Design a voice using natural language description\n */\n async designVoice(options: VoiceDesignOptions): Promise<Voice> {\n const request: VoiceDesignRequest = {\n description: options.description,\n language: options.language,\n gender: options.gender,\n };\n\n const response = await this.request<VoiceResponse>('/v1/voices/design', {\n method: 'POST',\n body: request,\n });\n\n return this.mapVoice(response);\n }\n\n /**\n * List available voices\n */\n async getVoices(options: VoiceListOptions = {}): Promise<Voice[]> {\n const params = new URLSearchParams();\n if (options.language) params.set('language', options.language);\n if (options.gender) params.set('gender', options.gender);\n if (options.includeCloned !== undefined)\n params.set('include_cloned', String(options.includeCloned));\n if (options.includeDesigned !== undefined)\n params.set('include_designed', String(options.includeDesigned));\n\n const queryString = params.toString();\n const path = queryString ? `/v1/voices?${queryString}` : '/v1/voices';\n\n const response = await this.request<{ voices: VoiceResponse[] }>(path);\n return response.voices.map((v) => this.mapVoice(v));\n }\n\n /**\n * Map API voice response to Voice interface\n */\n private mapVoice(response: VoiceResponse): Voice {\n return {\n id: response.id,\n name: response.name,\n language: response.language,\n gender: response.gender,\n description: response.description,\n isCloned: response.is_cloned,\n isDesigned: response.is_designed,\n sampleUrl: response.sample_url,\n voiceData: response.voice_data,\n };\n }\n\n // ============================================================================\n // Text Generation Methods (Not Implemented - Use another provider)\n // ============================================================================\n\n async chat(\n _messages: AIMessage[],\n _options?: ChatOptions,\n ): Promise<AIResponse> {\n throw new AIError(\n 'Chat is not supported by Qwen3-TTS provider. Use OpenAI, Anthropic, or another provider for text generation.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async complete(\n _prompt: string,\n _options?: CompletionOptions,\n ): Promise<AIResponse> {\n throw new AIError(\n 'Complete is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async message(_text: string, _options?: MessageOptions): Promise<string> {\n throw new AIError(\n 'Message is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async embed(\n _text: string | string[],\n _options?: EmbeddingOptions,\n ): Promise<EmbeddingResponse> {\n throw new AIError(\n 'Embeddings are not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async embedImage(\n _image: string | Buffer,\n _options?: ImageEmbeddingOptions,\n ): Promise<EmbeddingResponse> {\n throw new AIError(\n 'Image embeddings are not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async describeImage(\n _image: string | Buffer,\n _prompt?: string,\n _options?: ImageDescriptionOptions,\n ): Promise<string> {\n throw new AIError(\n 'Image description is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async generateImage(\n _prompt: string,\n _options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResponse> {\n throw new AIError(\n 'Image generation is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async *stream(\n _messages: AIMessage[],\n _options?: ChatOptions,\n ): AsyncIterable<string> {\n throw new AIError(\n 'Chat streaming is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async countTokens(_text: string): Promise<number> {\n throw new AIError(\n 'Token counting is not supported by Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'qwen3-tts',\n );\n }\n\n async getModels(): Promise<AIModel[]> {\n return [\n {\n id: 'qwen3-tts-1.7b',\n name: 'Qwen3-TTS 1.7B',\n description: 'Higher quality TTS model (4.54GB VRAM)',\n contextLength: 0,\n capabilities: ['tts', 'voice-cloning', 'voice-design'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: 'qwen3-tts-0.6b',\n name: 'Qwen3-TTS 0.6B',\n description: 'Faster TTS model with lower VRAM (2.52GB)',\n contextLength: 0,\n capabilities: ['tts', 'voice-cloning', 'voice-design'],\n supportsFunctions: false,\n supportsVision: false,\n },\n ];\n }\n\n async getCapabilities(): Promise<AICapabilities> {\n return {\n chat: false,\n completion: false,\n embeddings: false,\n streaming: false,\n functions: false,\n vision: false,\n fineTuning: false,\n imageEmbeddings: false,\n imageGeneration: false,\n tts: true,\n voiceCloning: true,\n voiceDesign: true,\n maxContextLength: 0,\n supportedOperations: [\n 'synthesizeSpeech',\n 'streamSpeech',\n 'cloneVoice',\n 'designVoice',\n 'getVoices',\n ],\n };\n }\n}\n"],"names":["elapsed"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@
13
13
  export * from './shared/client';
14
14
  export * from './shared/factory';
15
15
  export { AIMessage as AIMessageClass } from './shared/message';
16
+ export { DEFAULT_AI_GENERATION_LIMITS, DEFAULT_AI_MAX_RETRIES, DEFAULT_AI_TIMEOUT_MS, } from './shared/safety';
16
17
  export * from './shared/thread';
17
18
  export * from './shared/types';
18
19
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,eAAO,MAAM,2BAA2B,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,eAAO,MAAM,2BAA2B,OAAO,CAAC"}
package/dist/index.js CHANGED
@@ -1,21 +1,24 @@
1
- import { d, A, f, g, h, b, C, a, M, O, P, R, c, i, j, k, l } from "./chunks/index-BT4thAvS.js";
1
+ import { g, A, h, i, j, d, C, c, D, k, l, M, O, P, R, f, m, o, q, r } from "./chunks/index-DCXO0nZA.js";
2
2
  export {
3
- d as AIClient,
3
+ g as AIClient,
4
4
  A as AIError,
5
- f as AIMessageClass,
6
- g as AIThread,
7
- h as AI_PROVIDER_TYPES,
8
- b as AuthenticationError,
5
+ h as AIMessageClass,
6
+ i as AIThread,
7
+ j as AI_PROVIDER_TYPES,
8
+ d as AuthenticationError,
9
9
  C as ContentFilterError,
10
- a as ContextLengthError,
10
+ c as ContextLengthError,
11
+ D as DEFAULT_AI_GENERATION_LIMITS,
12
+ k as DEFAULT_AI_MAX_RETRIES,
13
+ l as DEFAULT_AI_TIMEOUT_MS,
11
14
  M as ModelNotFoundError,
12
15
  O as OpenAIClient,
13
16
  P as PACKAGE_VERSION_INITIALIZED,
14
17
  R as RateLimitError,
15
- c as extractTextContent,
16
- i as getAI,
17
- j as getAIAuto,
18
- k as getAIClient,
19
- l as getOpenAI
18
+ f as extractTextContent,
19
+ m as getAI,
20
+ o as getAIAuto,
21
+ q as getAIClient,
22
+ r as getOpenAI
20
23
  };
21
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/shared/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EACV,WAAW,EAOX,YAAY,EAMb,MAAM,SAAS,CAAC;AAqHjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,KAAK,CACzB,OAAO,GAAE,YAAY,GAAG,eAAoB,GAC3C,OAAO,CAAC,WAAW,CAAC,CAwEtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/shared/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,KAAK,EACV,WAAW,EAOX,YAAY,EAMb,MAAM,SAAS,CAAC;AAqHjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,KAAK,CACzB,OAAO,GAAE,YAAY,GAAG,eAAoB,GAC3C,OAAO,CAAC,WAAW,CAAC,CA0EtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAclB;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAM;IAEpB;;;OAGG;gBACS,OAAO,EAAE,gBAAgB;IAWrC,OAAO,CAAC,oBAAoB;IAwB5B;;;;OAIG;YACW,YAAY;IAwB1B;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IA0FhB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IActB;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BpE,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,iBAAiB,CAAC;IASvB,UAAU,CACd,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,GAAE,qBAA0B,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAQvB,aAAa,CACjB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,GAAE,uBAA4B,GACrC,OAAO,CAAC,MAAM,CAAC;IAUZ,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,sBAA2B,GACpC,OAAO,CAAC,uBAAuB,CAAC;IAQ5B,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IAmDlB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1C,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAmD/B,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IA6B1C,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,WAAW,CAAC;IAQvB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IAanE,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQvD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQzD,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAQ9D,OAAO,CAAC,sBAAsB;IA2B9B,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,QAAQ;CAgCjB"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAclB;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAM;IAEpB;;;OAGG;gBACS,OAAO,EAAE,gBAAgB;IAWrC,OAAO,CAAC,oBAAoB;IAwB5B;;;;OAIG;YACW,YAAY;IAwB1B;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAwHhB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IAiBtB;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BpE,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,iBAAiB,CAAC;IASvB,UAAU,CACd,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,GAAE,qBAA0B,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAQvB,aAAa,CACjB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,GAAE,uBAA4B,GACrC,OAAO,CAAC,MAAM,CAAC;IAUZ,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,sBAA2B,GACpC,OAAO,CAAC,uBAAuB,CAAC;IAQ5B,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IAkFlB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1C,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAmD/B,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IA6B1C,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,WAAW,CAAC;IAQvB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IAanE,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQvD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQzD,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAQ9D,OAAO,CAAC,sBAAsB;IA2B9B,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,QAAQ;CAgCjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/bedrock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,OAAO,EACP,UAAU,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAgBlB,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,cAAc;IAUnC,OAAO,CAAC,oBAAoB;YAmBd,YAAY;IAqBpB,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IA4BhB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IActB;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BpE,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAgEvB,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAyCvB,aAAa,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC;IA6BZ,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,uBAAuB,CAAC;IAsD5B,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IA4ClB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB1C,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA4F/B,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IAgC1C,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,WAAW,CAAC;IAQvB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IAanE,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQvD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQzD,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAQhD,oBAAoB;YA6CpB,oBAAoB;IAyDlC,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;YAqBP,oBAAoB;IAYlC,OAAO,CAAC,sBAAsB;YAoBhB,sBAAsB;YAQtB,cAAc;YAYd,aAAa;YAoBb,YAAY;IAmC1B,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,QAAQ;CAoCjB"}
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/bedrock.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,OAAO,EACP,UAAU,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAgBlB,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,cAAc;IAUnC,OAAO,CAAC,oBAAoB;YAoBd,YAAY;IAsBpB,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAuDhB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IAiBtB;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BpE,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAgEvB,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAyCvB,aAAa,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC;IAiCZ,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,uBAAuB,CAAC;IAsF5B,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IAuElB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB1C,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA4F/B,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IAgC1C,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,WAAW,CAAC;IAQvB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IAanE,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQvD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQzD,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAQhD,oBAAoB;YAwDpB,oBAAoB;IA+DlC,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;YAqBP,oBAAoB;IAYlC,OAAO,CAAC,sBAAsB;YAoBhB,sBAAsB;YAWtB,cAAc;YAed,aAAa;YAuBb,YAAY;IAoC1B,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,QAAQ;CAoCjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"bifrost.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/bifrost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,SAAS,EAET,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAgC,cAAc,EAAE,MAAM,UAAU,CAAC;AAsKxE;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAG/B;gBAEQ,OAAO,EAAE,cAAc;YA4BrB,YAAY;YA4BZ,WAAW;IAsBnB,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAOf,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IAOlB,aAAa,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC;IAOZ,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAOvB,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAOvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,uBAAuB,CAAC;CAMpC"}
1
+ {"version":3,"file":"bifrost.d.ts","sourceRoot":"","sources":["../../../src/shared/providers/bifrost.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,SAAS,EAET,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAgC,cAAc,EAAE,MAAM,UAAU,CAAC;AAsKxE;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAG/B;gBAEQ,OAAO,EAAE,cAAc;YA4BrB,YAAY;YA4BZ,WAAW;IAsBnB,IAAI,CACR,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAaf,MAAM,CACX,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,WAAgB,GACxB,aAAa,CAAC,MAAM,CAAC;IAalB,aAAa,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC;IAaZ,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAOvB,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAOvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,uBAAuB,CAAC;CAYpC"}