@llumiverse/drivers 0.23.0 → 0.24.0-dev.20260203.164053Z

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 (230) hide show
  1. package/README.md +141 -218
  2. package/package.json +12 -12
  3. package/src/azure/azure_foundry.ts +56 -7
  4. package/src/bedrock/index.ts +188 -24
  5. package/src/groq/index.ts +120 -94
  6. package/src/index.ts +1 -0
  7. package/src/openai/index.ts +363 -136
  8. package/src/openai/openai_compatible.ts +74 -0
  9. package/src/openai/openai_format.ts +44 -54
  10. package/src/vertexai/index.ts +186 -0
  11. package/src/vertexai/models/claude.ts +97 -2
  12. package/src/vertexai/models/gemini.ts +78 -27
  13. package/src/xai/index.ts +10 -17
  14. package/lib/cjs/adobe/firefly.js +0 -120
  15. package/lib/cjs/adobe/firefly.js.map +0 -1
  16. package/lib/cjs/azure/azure_foundry.js +0 -388
  17. package/lib/cjs/azure/azure_foundry.js.map +0 -1
  18. package/lib/cjs/bedrock/converse.js +0 -285
  19. package/lib/cjs/bedrock/converse.js.map +0 -1
  20. package/lib/cjs/bedrock/index.js +0 -966
  21. package/lib/cjs/bedrock/index.js.map +0 -1
  22. package/lib/cjs/bedrock/nova-image-payload.js +0 -207
  23. package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
  24. package/lib/cjs/bedrock/payloads.js +0 -3
  25. package/lib/cjs/bedrock/payloads.js.map +0 -1
  26. package/lib/cjs/bedrock/s3.js +0 -107
  27. package/lib/cjs/bedrock/s3.js.map +0 -1
  28. package/lib/cjs/bedrock/twelvelabs.js +0 -87
  29. package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
  30. package/lib/cjs/groq/index.js +0 -293
  31. package/lib/cjs/groq/index.js.map +0 -1
  32. package/lib/cjs/huggingface_ie.js +0 -201
  33. package/lib/cjs/huggingface_ie.js.map +0 -1
  34. package/lib/cjs/index.js +0 -30
  35. package/lib/cjs/index.js.map +0 -1
  36. package/lib/cjs/mistral/index.js +0 -173
  37. package/lib/cjs/mistral/index.js.map +0 -1
  38. package/lib/cjs/mistral/types.js +0 -83
  39. package/lib/cjs/mistral/types.js.map +0 -1
  40. package/lib/cjs/openai/azure_openai.js +0 -72
  41. package/lib/cjs/openai/azure_openai.js.map +0 -1
  42. package/lib/cjs/openai/index.js +0 -469
  43. package/lib/cjs/openai/index.js.map +0 -1
  44. package/lib/cjs/openai/openai.js +0 -21
  45. package/lib/cjs/openai/openai.js.map +0 -1
  46. package/lib/cjs/openai/openai_format.js +0 -138
  47. package/lib/cjs/openai/openai_format.js.map +0 -1
  48. package/lib/cjs/package.json +0 -3
  49. package/lib/cjs/replicate.js +0 -275
  50. package/lib/cjs/replicate.js.map +0 -1
  51. package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
  52. package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
  53. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
  54. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  55. package/lib/cjs/test-driver/index.js +0 -109
  56. package/lib/cjs/test-driver/index.js.map +0 -1
  57. package/lib/cjs/test-driver/utils.js +0 -30
  58. package/lib/cjs/test-driver/utils.js.map +0 -1
  59. package/lib/cjs/togetherai/index.js +0 -126
  60. package/lib/cjs/togetherai/index.js.map +0 -1
  61. package/lib/cjs/togetherai/interfaces.js +0 -3
  62. package/lib/cjs/togetherai/interfaces.js.map +0 -1
  63. package/lib/cjs/vertexai/debug.js +0 -12
  64. package/lib/cjs/vertexai/debug.js.map +0 -1
  65. package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
  66. package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
  67. package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
  68. package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
  69. package/lib/cjs/vertexai/index.js +0 -429
  70. package/lib/cjs/vertexai/index.js.map +0 -1
  71. package/lib/cjs/vertexai/models/claude.js +0 -399
  72. package/lib/cjs/vertexai/models/claude.js.map +0 -1
  73. package/lib/cjs/vertexai/models/gemini.js +0 -832
  74. package/lib/cjs/vertexai/models/gemini.js.map +0 -1
  75. package/lib/cjs/vertexai/models/imagen.js +0 -303
  76. package/lib/cjs/vertexai/models/imagen.js.map +0 -1
  77. package/lib/cjs/vertexai/models/llama.js +0 -183
  78. package/lib/cjs/vertexai/models/llama.js.map +0 -1
  79. package/lib/cjs/vertexai/models.js +0 -35
  80. package/lib/cjs/vertexai/models.js.map +0 -1
  81. package/lib/cjs/watsonx/index.js +0 -161
  82. package/lib/cjs/watsonx/index.js.map +0 -1
  83. package/lib/cjs/watsonx/interfaces.js +0 -3
  84. package/lib/cjs/watsonx/interfaces.js.map +0 -1
  85. package/lib/cjs/xai/index.js +0 -71
  86. package/lib/cjs/xai/index.js.map +0 -1
  87. package/lib/esm/adobe/firefly.js +0 -116
  88. package/lib/esm/adobe/firefly.js.map +0 -1
  89. package/lib/esm/azure/azure_foundry.js +0 -382
  90. package/lib/esm/azure/azure_foundry.js.map +0 -1
  91. package/lib/esm/bedrock/converse.js +0 -278
  92. package/lib/esm/bedrock/converse.js.map +0 -1
  93. package/lib/esm/bedrock/index.js +0 -962
  94. package/lib/esm/bedrock/index.js.map +0 -1
  95. package/lib/esm/bedrock/nova-image-payload.js +0 -203
  96. package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
  97. package/lib/esm/bedrock/payloads.js +0 -2
  98. package/lib/esm/bedrock/payloads.js.map +0 -1
  99. package/lib/esm/bedrock/s3.js +0 -99
  100. package/lib/esm/bedrock/s3.js.map +0 -1
  101. package/lib/esm/bedrock/twelvelabs.js +0 -84
  102. package/lib/esm/bedrock/twelvelabs.js.map +0 -1
  103. package/lib/esm/groq/index.js +0 -286
  104. package/lib/esm/groq/index.js.map +0 -1
  105. package/lib/esm/huggingface_ie.js +0 -197
  106. package/lib/esm/huggingface_ie.js.map +0 -1
  107. package/lib/esm/index.js +0 -14
  108. package/lib/esm/index.js.map +0 -1
  109. package/lib/esm/mistral/index.js +0 -169
  110. package/lib/esm/mistral/index.js.map +0 -1
  111. package/lib/esm/mistral/types.js +0 -80
  112. package/lib/esm/mistral/types.js.map +0 -1
  113. package/lib/esm/openai/azure_openai.js +0 -68
  114. package/lib/esm/openai/azure_openai.js.map +0 -1
  115. package/lib/esm/openai/index.js +0 -464
  116. package/lib/esm/openai/index.js.map +0 -1
  117. package/lib/esm/openai/openai.js +0 -14
  118. package/lib/esm/openai/openai.js.map +0 -1
  119. package/lib/esm/openai/openai_format.js +0 -134
  120. package/lib/esm/openai/openai_format.js.map +0 -1
  121. package/lib/esm/replicate.js +0 -268
  122. package/lib/esm/replicate.js.map +0 -1
  123. package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
  124. package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
  125. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js +0 -20
  126. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  127. package/lib/esm/test-driver/index.js +0 -91
  128. package/lib/esm/test-driver/index.js.map +0 -1
  129. package/lib/esm/test-driver/utils.js +0 -25
  130. package/lib/esm/test-driver/utils.js.map +0 -1
  131. package/lib/esm/togetherai/index.js +0 -122
  132. package/lib/esm/togetherai/index.js.map +0 -1
  133. package/lib/esm/togetherai/interfaces.js +0 -2
  134. package/lib/esm/togetherai/interfaces.js.map +0 -1
  135. package/lib/esm/vertexai/debug.js +0 -6
  136. package/lib/esm/vertexai/debug.js.map +0 -1
  137. package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
  138. package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
  139. package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
  140. package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
  141. package/lib/esm/vertexai/index.js +0 -424
  142. package/lib/esm/vertexai/index.js.map +0 -1
  143. package/lib/esm/vertexai/models/claude.js +0 -394
  144. package/lib/esm/vertexai/models/claude.js.map +0 -1
  145. package/lib/esm/vertexai/models/gemini.js +0 -827
  146. package/lib/esm/vertexai/models/gemini.js.map +0 -1
  147. package/lib/esm/vertexai/models/imagen.js +0 -299
  148. package/lib/esm/vertexai/models/imagen.js.map +0 -1
  149. package/lib/esm/vertexai/models/llama.js +0 -179
  150. package/lib/esm/vertexai/models/llama.js.map +0 -1
  151. package/lib/esm/vertexai/models.js +0 -32
  152. package/lib/esm/vertexai/models.js.map +0 -1
  153. package/lib/esm/watsonx/index.js +0 -157
  154. package/lib/esm/watsonx/index.js.map +0 -1
  155. package/lib/esm/watsonx/interfaces.js +0 -2
  156. package/lib/esm/watsonx/interfaces.js.map +0 -1
  157. package/lib/esm/xai/index.js +0 -64
  158. package/lib/esm/xai/index.js.map +0 -1
  159. package/lib/types/adobe/firefly.d.ts +0 -30
  160. package/lib/types/adobe/firefly.d.ts.map +0 -1
  161. package/lib/types/azure/azure_foundry.d.ts +0 -50
  162. package/lib/types/azure/azure_foundry.d.ts.map +0 -1
  163. package/lib/types/bedrock/converse.d.ts +0 -9
  164. package/lib/types/bedrock/converse.d.ts.map +0 -1
  165. package/lib/types/bedrock/index.d.ts +0 -63
  166. package/lib/types/bedrock/index.d.ts.map +0 -1
  167. package/lib/types/bedrock/nova-image-payload.d.ts +0 -74
  168. package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
  169. package/lib/types/bedrock/payloads.d.ts +0 -12
  170. package/lib/types/bedrock/payloads.d.ts.map +0 -1
  171. package/lib/types/bedrock/s3.d.ts +0 -23
  172. package/lib/types/bedrock/s3.d.ts.map +0 -1
  173. package/lib/types/bedrock/twelvelabs.d.ts +0 -50
  174. package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
  175. package/lib/types/groq/index.d.ts +0 -27
  176. package/lib/types/groq/index.d.ts.map +0 -1
  177. package/lib/types/huggingface_ie.d.ts +0 -35
  178. package/lib/types/huggingface_ie.d.ts.map +0 -1
  179. package/lib/types/index.d.ts +0 -14
  180. package/lib/types/index.d.ts.map +0 -1
  181. package/lib/types/mistral/index.d.ts +0 -25
  182. package/lib/types/mistral/index.d.ts.map +0 -1
  183. package/lib/types/mistral/types.d.ts +0 -132
  184. package/lib/types/mistral/types.d.ts.map +0 -1
  185. package/lib/types/openai/azure_openai.d.ts +0 -25
  186. package/lib/types/openai/azure_openai.d.ts.map +0 -1
  187. package/lib/types/openai/index.d.ts +0 -25
  188. package/lib/types/openai/index.d.ts.map +0 -1
  189. package/lib/types/openai/openai.d.ts +0 -15
  190. package/lib/types/openai/openai.d.ts.map +0 -1
  191. package/lib/types/openai/openai_format.d.ts +0 -19
  192. package/lib/types/openai/openai_format.d.ts.map +0 -1
  193. package/lib/types/replicate.d.ts +0 -48
  194. package/lib/types/replicate.d.ts.map +0 -1
  195. package/lib/types/test-driver/TestErrorCompletionStream.d.ts +0 -9
  196. package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
  197. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts +0 -9
  198. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
  199. package/lib/types/test-driver/index.d.ts +0 -24
  200. package/lib/types/test-driver/index.d.ts.map +0 -1
  201. package/lib/types/test-driver/utils.d.ts +0 -5
  202. package/lib/types/test-driver/utils.d.ts.map +0 -1
  203. package/lib/types/togetherai/index.d.ts +0 -23
  204. package/lib/types/togetherai/index.d.ts.map +0 -1
  205. package/lib/types/togetherai/interfaces.d.ts +0 -96
  206. package/lib/types/togetherai/interfaces.d.ts.map +0 -1
  207. package/lib/types/vertexai/debug.d.ts +0 -2
  208. package/lib/types/vertexai/debug.d.ts.map +0 -1
  209. package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
  210. package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
  211. package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
  212. package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
  213. package/lib/types/vertexai/index.d.ts +0 -54
  214. package/lib/types/vertexai/index.d.ts.map +0 -1
  215. package/lib/types/vertexai/models/claude.d.ts +0 -20
  216. package/lib/types/vertexai/models/claude.d.ts.map +0 -1
  217. package/lib/types/vertexai/models/gemini.d.ts +0 -18
  218. package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
  219. package/lib/types/vertexai/models/imagen.d.ts +0 -75
  220. package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
  221. package/lib/types/vertexai/models/llama.d.ts +0 -20
  222. package/lib/types/vertexai/models/llama.d.ts.map +0 -1
  223. package/lib/types/vertexai/models.d.ts +0 -15
  224. package/lib/types/vertexai/models.d.ts.map +0 -1
  225. package/lib/types/watsonx/index.d.ts +0 -27
  226. package/lib/types/watsonx/index.d.ts.map +0 -1
  227. package/lib/types/watsonx/interfaces.d.ts +0 -65
  228. package/lib/types/watsonx/interfaces.d.ts.map +0 -1
  229. package/lib/types/xai/index.d.ts +0 -19
  230. package/lib/types/xai/index.d.ts.map +0 -1
@@ -5,12 +5,20 @@ import {
5
5
  } from "@google/genai";
6
6
  import {
7
7
  AIModel, Completion, CompletionChunkObject, CompletionResult, ExecutionOptions,
8
- ExecutionTokenUsage, getMaxTokensLimitVertexAi, JSONObject, JSONSchema, ModelType, PromptOptions, PromptRole,
9
- PromptSegment, readStreamAsBase64, StatelessExecutionOptions, ToolDefinition, ToolUse,
8
+ ExecutionTokenUsage,
9
+ getConversationMeta,
10
+ getMaxTokensLimitVertexAi,
11
+ incrementConversationTurn,
12
+ JSONObject, JSONSchema, ModelType, PromptOptions, PromptRole,
13
+ PromptSegment, readStreamAsBase64, StatelessExecutionOptions,
14
+ stripBase64ImagesFromConversation,
15
+ ToolDefinition, ToolUse,
16
+ truncateLargeTextInConversation,
17
+ unwrapConversationArray,
10
18
  VertexAIGeminiOptions
11
19
  } from "@llumiverse/core";
12
20
  import { asyncMap } from "@llumiverse/core/async";
13
- import { VertexAIDriver, GenerateContentPrompt } from "../index.js";
21
+ import { GenerateContentPrompt, VertexAIDriver } from "../index.js";
14
22
  import { ModelDefinition } from "../models.js";
15
23
 
16
24
  function supportsStructuredOutput(options: PromptOptions): boolean {
@@ -467,11 +475,17 @@ function collectToolUseParts(content: Content): ToolUse[] | undefined {
467
475
  const parts = content.parts ?? [];
468
476
  for (const part of parts) {
469
477
  if (part.functionCall) {
470
- out.push({
478
+ const toolUse: ToolUse = {
471
479
  id: part.functionCall.name ?? '',
472
480
  tool_name: part.functionCall.name ?? '',
473
481
  tool_input: part.functionCall.args as JSONObject,
474
- });
482
+ };
483
+ // Capture thought_signature for Gemini thinking models (2.5+/3.0+)
484
+ // This must be passed back with the function response
485
+ if (part.thoughtSignature) {
486
+ toolUse.thought_signature = part.thoughtSignature;
487
+ }
488
+ out.push(toolUse);
475
489
  }
476
490
  }
477
491
  return out.length > 0 ? out : undefined;
@@ -545,7 +559,7 @@ function geminiThinkingConfig(option: StatelessExecutionOptions): ThinkingConfig
545
559
  const model_options = option.model_options as VertexAIGeminiOptions | undefined;
546
560
  const include_thoughts = model_options?.include_thoughts ?? false;
547
561
  if (model_options?.thinking_budget_tokens) {
548
- return {includeThoughts: include_thoughts, thinkingBudget: model_options.thinking_budget_tokens};
562
+ return { includeThoughts: include_thoughts, thinkingBudget: model_options.thinking_budget_tokens };
549
563
  }
550
564
 
551
565
  // Set minimum thinking level by default.
@@ -623,16 +637,18 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
623
637
  if (!msg.tool_use_id) {
624
638
  throw new Error("Tool response missing tool_use_id");
625
639
  }
640
+ // Build functionResponse part with optional thought_signature for Gemini thinking models
641
+ const functionResponsePart: Part = {
642
+ functionResponse: {
643
+ name: msg.tool_use_id,
644
+ response: formatFunctionResponse(msg.content || ''),
645
+ },
646
+ // Include thought_signature if provided (required for Gemini 2.5+/3.0+ thinking models)
647
+ thoughtSignature: msg.thought_signature,
648
+ };
626
649
  contents.push({
627
650
  role: 'user',
628
- parts: [
629
- {
630
- functionResponse: {
631
- name: msg.tool_use_id,
632
- response: formatFunctionResponse(msg.content || ''),
633
- }
634
- }
635
- ]
651
+ parts: [functionResponsePart]
636
652
  });
637
653
  } else { // PromptRole.user, PromptRole.assistant, PromptRole.safety
638
654
  const parts: Part[] = [];
@@ -646,14 +662,27 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
646
662
  // File content handling
647
663
  if (msg.files) {
648
664
  for (const f of msg.files) {
649
- const stream = await f.getStream();
650
- const data = await readStreamAsBase64(stream);
651
- parts.push({
652
- inlineData: {
653
- data,
654
- mimeType: f.mime_type
655
- }
656
- });
665
+ let fileUrl = await f.getURL();
666
+ const isGsUrl = fileUrl.startsWith('gs://') || fileUrl.startsWith('https://storage.googleapis.com/');
667
+
668
+ if (isGsUrl) {
669
+ parts.push({
670
+ fileData: {
671
+ fileUri: fileUrl,
672
+ mimeType: f.mime_type
673
+ }
674
+ });
675
+ } else {
676
+ // Inline data handling
677
+ const stream = await f.getStream();
678
+ const data = await readStreamAsBase64(stream);
679
+ parts.push({
680
+ inlineData: {
681
+ data,
682
+ mimeType: f.mime_type
683
+ }
684
+ });
685
+ }
657
686
  }
658
687
  }
659
688
 
@@ -742,7 +771,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
742
771
  const modelName = splits[splits.length - 1];
743
772
  options = { ...options, model: modelName };
744
773
 
745
- let conversation = updateConversation(options.conversation as Content[], prompt.contents);
774
+ let conversation = updateConversation(options.conversation, prompt.contents);
746
775
  prompt.contents = conversation;
747
776
 
748
777
  // TODO: Remove hack, use global endpoint manually if needed.
@@ -792,12 +821,27 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
792
821
  finish_reason = "tool_use";
793
822
  }
794
823
 
824
+ // Increment turn counter for deferred stripping
825
+ conversation = incrementConversationTurn(conversation) as Content[];
826
+
827
+ // Strip large base64 image data based on options.stripImagesAfterTurns
828
+ const currentTurn = getConversationMeta(conversation).turnNumber;
829
+ const stripOptions = {
830
+ keepForTurns: options.stripImagesAfterTurns ?? Infinity,
831
+ currentTurn,
832
+ textMaxTokens: options.stripTextMaxTokens
833
+ };
834
+ let processedConversation = stripBase64ImagesFromConversation(conversation, stripOptions);
835
+
836
+ // Truncate large text content if configured
837
+ processedConversation = truncateLargeTextInConversation(processedConversation, stripOptions);
838
+
795
839
  return {
796
840
  result: result && result.length > 0 ? result : [{ type: "text" as const, value: '' }],
797
841
  token_usage: token_usage,
798
842
  finish_reason: finish_reason,
799
843
  original_response: options.include_original_response ? response : undefined,
800
- conversation,
844
+ conversation: processedConversation,
801
845
  tool_use
802
846
  } satisfies Completion;
803
847
  }
@@ -811,6 +855,10 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
811
855
  const modelName = splits[splits.length - 1];
812
856
  options = { ...options, model: modelName };
813
857
 
858
+ // Include conversation history in prompt contents (same as non-streaming)
859
+ const conversation = updateConversation(options.conversation, prompt.contents);
860
+ prompt.contents = conversation;
861
+
814
862
  if (options.model.includes("gemini-2.5-flash-image")) {
815
863
  region = "global"; // Gemini Flash Image only available in global region, this is for nano-banana model
816
864
  }
@@ -897,16 +945,19 @@ function getToolFunction(tool: ToolDefinition): FunctionDeclaration {
897
945
  };
898
946
  }
899
947
 
900
-
901
948
  /**
902
949
  * Update the conversation messages
903
950
  * @param prompt
904
951
  * @param response
905
952
  * @returns
906
953
  */
907
- function updateConversation(conversation: Content[], prompt: Content[]): Content[] {
908
- return (conversation || [] satisfies Content[]).concat(prompt);
954
+ function updateConversation(conversation: unknown, prompt: Content[]): Content[] {
955
+ // Unwrap array if wrapped, otherwise treat as array
956
+ const unwrapped = unwrapConversationArray<Content>(conversation);
957
+ const convArray = unwrapped ?? (conversation as Content[] || []);
958
+ return convArray.concat(prompt);
909
959
  }
960
+
910
961
  /**
911
962
  *
912
963
  * Gemini supports JSON output in the response. so we test if the response is a valid JSON object. otherwise we treat the response as a string.
package/src/xai/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AIModel, Completion, DriverOptions, ExecutionOptions, PromptOptions, PromptSegment } from "@llumiverse/core";
1
+ import { AIModel, DriverOptions, PromptOptions, PromptSegment, Providers } from "@llumiverse/core";
2
2
  import { formatOpenAILikeMultimodalPrompt, OpenAIPromptFormatterOptions } from "../openai/openai_format.js";
3
3
  import { FetchClient } from "@vertesia/api-fetch-client";
4
4
  import OpenAI from "openai";
@@ -15,7 +15,7 @@ export interface xAiDriverOptions extends DriverOptions {
15
15
  export class xAIDriver extends BaseOpenAIDriver {
16
16
 
17
17
  service: OpenAI;
18
- provider: "xai";
18
+ readonly provider = Providers.xai;
19
19
  xai_service: FetchClient;
20
20
  DEFAULT_ENDPOINT = "https://api.x.ai/v1";
21
21
 
@@ -31,7 +31,6 @@ export class xAIDriver extends BaseOpenAIDriver {
31
31
  baseURL: opts.endpoint ?? this.DEFAULT_ENDPOINT,
32
32
  });
33
33
  this.xai_service = new FetchClient(opts.endpoint ?? this.DEFAULT_ENDPOINT).withAuthCallback(async () => `Bearer ${opts.apiKey}`);
34
- this.provider = "xai";
35
34
  //this.formatPrompt = this._formatPrompt; //TODO: fix xai prompt formatting
36
35
  }
37
36
 
@@ -49,17 +48,9 @@ export class xAIDriver extends BaseOpenAIDriver {
49
48
 
50
49
  }
51
50
 
52
- extractDataFromResponse(_options: ExecutionOptions, result: OpenAI.Chat.Completions.ChatCompletion): Completion {
53
- return {
54
- result: result.choices[0].message.content ? [{ type: "text", value: result.choices[0].message.content }] : [],
55
- finish_reason: result.choices[0].finish_reason,
56
- token_usage: {
57
- prompt: result.usage?.prompt_tokens,
58
- result: result.usage?.completion_tokens,
59
- total: result.usage?.total_tokens,
60
- }
61
- }
62
- }
51
+ // Note: We intentionally do NOT override extractDataFromResponse here.
52
+ // The base class implementation properly handles tool_calls extraction.
53
+ // xAI's API is OpenAI-compatible and returns tool_calls in the same format.
63
54
 
64
55
  async listModels(): Promise<AIModel[]> {
65
56
  const [lm, em] = await Promise.all([
@@ -76,10 +67,12 @@ export class xAIDriver extends BaseOpenAIDriver {
76
67
  return {
77
68
  id: model.id,
78
69
  provider: this.provider,
79
- name: model.object,
80
- description: model.object,
70
+ name: model.id,
71
+ description: `${model.id} by ${model.owned_by}`,
81
72
  is_multimodal: model.input_modalities.length > 1,
82
- tags: [...model.input_modalities.map(m => `ì:${m}`), ...model.output_modalities.map(m => `ì:${m}`)],
73
+ input_modalities: model.input_modalities,
74
+ output_modalities: model.output_modalities,
75
+ tags: [...model.input_modalities.map(m => `i:${m}`), ...model.output_modalities.map(m => `o:${m}`)],
83
76
  } satisfies AIModel;
84
77
  });
85
78
 
@@ -1,120 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FireflyDriver = void 0;
4
- const core_1 = require("@llumiverse/core");
5
- class FireflyDriver extends core_1.AbstractDriver {
6
- static PROVIDER = "firefly";
7
- provider = FireflyDriver.PROVIDER;
8
- endpoint;
9
- constructor(options) {
10
- super(options);
11
- if (!options.apiKey) {
12
- throw new Error("No API key provided for Firefly driver");
13
- }
14
- this.endpoint = options.endpoint || "https://firefly-api.adobe.io/v3";
15
- }
16
- async requestTextCompletion(_prompt, _options) {
17
- throw new Error("Text completion not supported by Firefly");
18
- }
19
- async requestTextCompletionStream(_prompt, _options) {
20
- throw new Error("Text completion streaming not supported by Firefly");
21
- }
22
- async requestImageGeneration(segments, options) {
23
- this.logger.debug(`[${this.provider}] Generating image with model ${options.model}`);
24
- const prompt = segments.map(s => s.content).join("\n\n");
25
- try {
26
- const payload = {
27
- prompt: prompt,
28
- };
29
- const response = await fetch(`${this.endpoint}/images/generate`, {
30
- method: 'POST',
31
- headers: {
32
- 'Content-Type': 'application/json',
33
- 'x-api-key': this.options.apiKey,
34
- },
35
- body: JSON.stringify(payload)
36
- });
37
- if (!response.ok) {
38
- const error = await response.json();
39
- throw new Error(`Firefly API error: ${error.message || response.statusText}`);
40
- }
41
- const result = await response.json();
42
- if (result.promptHasDeniedWords || result.promptHasBlockedArtists) {
43
- return {
44
- result: [],
45
- error: {
46
- message: "Prompt contains denied words or blocked artists",
47
- code: "content_policy_violation"
48
- }
49
- };
50
- }
51
- return {
52
- result: result.outputs.map(output => ({
53
- type: "image",
54
- value: output.image.url
55
- }))
56
- };
57
- }
58
- catch (error) {
59
- this.logger.error({ error }, "[Firefly] Image generation failed");
60
- return {
61
- result: [],
62
- error: {
63
- message: error.message,
64
- code: error.code || 'GENERATION_FAILED'
65
- }
66
- };
67
- }
68
- }
69
- mapSize(size) {
70
- // Default to 1024x1024 if no size specified
71
- if (!size)
72
- return { width: 1024, height: 1024 };
73
- const [width, height] = size.split('x').map(Number);
74
- return { width, height };
75
- }
76
- async listModels(_params) {
77
- return [
78
- {
79
- id: "firefly-v3-text-to-image",
80
- name: "Firefly v3 Text to Image",
81
- provider: this.provider,
82
- description: "Adobe Firefly v3 text to image generation model",
83
- tags: ["image-generation"]
84
- },
85
- {
86
- id: "firefly-v3-image-to-image",
87
- name: "Firefly v3 Image to Image",
88
- provider: this.provider,
89
- description: "Adobe Firefly v3 image to image generation model",
90
- tags: ["image-generation"]
91
- },
92
- {
93
- id: "firefly-v3-inpainting",
94
- name: "Firefly v3 Inpainting",
95
- provider: this.provider,
96
- description: "Adobe Firefly v3 inpainting model",
97
- tags: ["image-generation"]
98
- }
99
- ];
100
- }
101
- async validateConnection() {
102
- try {
103
- const response = await fetch(`${this.endpoint}/auth/validate`, {
104
- headers: {
105
- 'x-api-key': this.options.apiKey
106
- }
107
- });
108
- return response.ok;
109
- }
110
- catch (error) {
111
- this.logger.error({ error }, "[Firefly] Connection validation failed");
112
- return false;
113
- }
114
- }
115
- async generateEmbeddings(_options) {
116
- throw new Error("Embeddings not supported by Firefly");
117
- }
118
- }
119
- exports.FireflyDriver = FireflyDriver;
120
- //# sourceMappingURL=firefly.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"firefly.js","sourceRoot":"","sources":["../../../src/adobe/firefly.ts"],"names":[],"mappings":"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"}