@llumiverse/drivers 0.21.0 → 0.22.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 (133) hide show
  1. package/lib/cjs/azure/azure_foundry.js +9 -0
  2. package/lib/cjs/azure/azure_foundry.js.map +1 -1
  3. package/lib/cjs/bedrock/index.js +35 -22
  4. package/lib/cjs/bedrock/index.js.map +1 -1
  5. package/lib/cjs/vertexai/index.js +26 -18
  6. package/lib/cjs/vertexai/index.js.map +1 -1
  7. package/lib/cjs/vertexai/models/gemini.js +39 -12
  8. package/lib/cjs/vertexai/models/gemini.js.map +1 -1
  9. package/lib/esm/azure/azure_foundry.js +9 -0
  10. package/lib/esm/azure/azure_foundry.js.map +1 -1
  11. package/lib/esm/bedrock/index.js +35 -22
  12. package/lib/esm/bedrock/index.js.map +1 -1
  13. package/lib/esm/vertexai/index.js +26 -18
  14. package/lib/esm/vertexai/index.js.map +1 -1
  15. package/lib/esm/vertexai/models/gemini.js +39 -12
  16. package/lib/esm/vertexai/models/gemini.js.map +1 -1
  17. package/lib/types/azure/azure_foundry.d.ts.map +1 -1
  18. package/lib/types/bedrock/index.d.ts +2 -2
  19. package/lib/types/bedrock/index.d.ts.map +1 -1
  20. package/lib/types/vertexai/index.d.ts.map +1 -1
  21. package/lib/types/vertexai/models/gemini.d.ts +3 -2
  22. package/lib/types/vertexai/models/gemini.d.ts.map +1 -1
  23. package/package.json +14 -14
  24. package/src/azure/azure_foundry.ts +9 -1
  25. package/src/bedrock/index.ts +36 -23
  26. package/src/vertexai/index.ts +29 -22
  27. package/src/vertexai/models/gemini.ts +50 -12
  28. package/lib/cjs/openai/azure.js +0 -31
  29. package/lib/cjs/openai/azure.js.map +0 -1
  30. package/lib/esm/openai/azure.js +0 -27
  31. package/lib/esm/openai/azure.js.map +0 -1
  32. package/lib/esm/src/adobe/firefly.js +0 -115
  33. package/lib/esm/src/adobe/firefly.js.map +0 -1
  34. package/lib/esm/src/bedrock/converse.js +0 -278
  35. package/lib/esm/src/bedrock/converse.js.map +0 -1
  36. package/lib/esm/src/bedrock/index.js +0 -797
  37. package/lib/esm/src/bedrock/index.js.map +0 -1
  38. package/lib/esm/src/bedrock/nova-image-payload.js +0 -203
  39. package/lib/esm/src/bedrock/nova-image-payload.js.map +0 -1
  40. package/lib/esm/src/bedrock/payloads.js +0 -2
  41. package/lib/esm/src/bedrock/payloads.js.map +0 -1
  42. package/lib/esm/src/bedrock/s3.js +0 -99
  43. package/lib/esm/src/bedrock/s3.js.map +0 -1
  44. package/lib/esm/src/groq/index.js +0 -130
  45. package/lib/esm/src/groq/index.js.map +0 -1
  46. package/lib/esm/src/huggingface_ie.js +0 -196
  47. package/lib/esm/src/huggingface_ie.js.map +0 -1
  48. package/lib/esm/src/index.js +0 -13
  49. package/lib/esm/src/index.js.map +0 -1
  50. package/lib/esm/src/mistral/index.js +0 -167
  51. package/lib/esm/src/mistral/index.js.map +0 -1
  52. package/lib/esm/src/mistral/types.js +0 -80
  53. package/lib/esm/src/mistral/types.js.map +0 -1
  54. package/lib/esm/src/openai/azure.js +0 -27
  55. package/lib/esm/src/openai/azure.js.map +0 -1
  56. package/lib/esm/src/openai/index.js +0 -463
  57. package/lib/esm/src/openai/index.js.map +0 -1
  58. package/lib/esm/src/openai/openai.js +0 -14
  59. package/lib/esm/src/openai/openai.js.map +0 -1
  60. package/lib/esm/src/replicate.js +0 -268
  61. package/lib/esm/src/replicate.js.map +0 -1
  62. package/lib/esm/src/test/TestErrorCompletionStream.js +0 -16
  63. package/lib/esm/src/test/TestErrorCompletionStream.js.map +0 -1
  64. package/lib/esm/src/test/TestValidationErrorCompletionStream.js +0 -20
  65. package/lib/esm/src/test/TestValidationErrorCompletionStream.js.map +0 -1
  66. package/lib/esm/src/test/index.js +0 -91
  67. package/lib/esm/src/test/index.js.map +0 -1
  68. package/lib/esm/src/test/utils.js +0 -25
  69. package/lib/esm/src/test/utils.js.map +0 -1
  70. package/lib/esm/src/togetherai/index.js +0 -122
  71. package/lib/esm/src/togetherai/index.js.map +0 -1
  72. package/lib/esm/src/togetherai/interfaces.js +0 -2
  73. package/lib/esm/src/togetherai/interfaces.js.map +0 -1
  74. package/lib/esm/src/vertexai/debug.js +0 -6
  75. package/lib/esm/src/vertexai/debug.js.map +0 -1
  76. package/lib/esm/src/vertexai/embeddings/embeddings-image.js +0 -24
  77. package/lib/esm/src/vertexai/embeddings/embeddings-image.js.map +0 -1
  78. package/lib/esm/src/vertexai/embeddings/embeddings-text.js +0 -20
  79. package/lib/esm/src/vertexai/embeddings/embeddings-text.js.map +0 -1
  80. package/lib/esm/src/vertexai/index.js +0 -270
  81. package/lib/esm/src/vertexai/index.js.map +0 -1
  82. package/lib/esm/src/vertexai/models/claude.js +0 -370
  83. package/lib/esm/src/vertexai/models/claude.js.map +0 -1
  84. package/lib/esm/src/vertexai/models/gemini.js +0 -700
  85. package/lib/esm/src/vertexai/models/gemini.js.map +0 -1
  86. package/lib/esm/src/vertexai/models/imagen.js +0 -310
  87. package/lib/esm/src/vertexai/models/imagen.js.map +0 -1
  88. package/lib/esm/src/vertexai/models/llama.js +0 -178
  89. package/lib/esm/src/vertexai/models/llama.js.map +0 -1
  90. package/lib/esm/src/vertexai/models.js +0 -21
  91. package/lib/esm/src/vertexai/models.js.map +0 -1
  92. package/lib/esm/src/watsonx/index.js +0 -157
  93. package/lib/esm/src/watsonx/index.js.map +0 -1
  94. package/lib/esm/src/watsonx/interfaces.js +0 -2
  95. package/lib/esm/src/watsonx/interfaces.js.map +0 -1
  96. package/lib/esm/src/xai/index.js +0 -64
  97. package/lib/esm/src/xai/index.js.map +0 -1
  98. package/lib/esm/tsconfig.tsbuildinfo +0 -1
  99. package/lib/types/openai/azure.d.ts +0 -20
  100. package/lib/types/openai/azure.d.ts.map +0 -1
  101. package/lib/types/src/adobe/firefly.d.ts +0 -29
  102. package/lib/types/src/bedrock/converse.d.ts +0 -8
  103. package/lib/types/src/bedrock/index.d.ts +0 -57
  104. package/lib/types/src/bedrock/nova-image-payload.d.ts +0 -73
  105. package/lib/types/src/bedrock/payloads.d.ts +0 -11
  106. package/lib/types/src/bedrock/s3.d.ts +0 -22
  107. package/lib/types/src/groq/index.d.ts +0 -23
  108. package/lib/types/src/huggingface_ie.d.ts +0 -31
  109. package/lib/types/src/index.d.ts +0 -12
  110. package/lib/types/src/mistral/index.d.ts +0 -24
  111. package/lib/types/src/mistral/types.d.ts +0 -131
  112. package/lib/types/src/openai/azure.d.ts +0 -19
  113. package/lib/types/src/openai/index.d.ts +0 -25
  114. package/lib/types/src/openai/openai.d.ts +0 -14
  115. package/lib/types/src/replicate.d.ts +0 -44
  116. package/lib/types/src/test/TestErrorCompletionStream.d.ts +0 -8
  117. package/lib/types/src/test/TestValidationErrorCompletionStream.d.ts +0 -8
  118. package/lib/types/src/test/index.d.ts +0 -23
  119. package/lib/types/src/test/utils.d.ts +0 -4
  120. package/lib/types/src/togetherai/index.d.ts +0 -22
  121. package/lib/types/src/togetherai/interfaces.d.ts +0 -95
  122. package/lib/types/src/vertexai/debug.d.ts +0 -1
  123. package/lib/types/src/vertexai/embeddings/embeddings-image.d.ts +0 -10
  124. package/lib/types/src/vertexai/embeddings/embeddings-text.d.ts +0 -9
  125. package/lib/types/src/vertexai/index.d.ts +0 -49
  126. package/lib/types/src/vertexai/models/claude.d.ts +0 -17
  127. package/lib/types/src/vertexai/models/gemini.d.ts +0 -16
  128. package/lib/types/src/vertexai/models/imagen.d.ts +0 -74
  129. package/lib/types/src/vertexai/models/llama.d.ts +0 -19
  130. package/lib/types/src/vertexai/models.d.ts +0 -14
  131. package/lib/types/src/watsonx/index.d.ts +0 -26
  132. package/lib/types/src/watsonx/interfaces.d.ts +0 -64
  133. package/lib/types/src/xai/index.d.ts +0 -18
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Content, FinishReason, FunctionCallingConfigMode, FunctionDeclaration, GenerateContentParameters,
3
+ GenerateContentResponseUsageMetadata,
3
4
  HarmBlockThreshold, HarmCategory, Part, SafetySetting, Schema, Tool, Type
4
5
  } from "@google/genai";
5
6
  import {
@@ -465,6 +466,12 @@ export function mergeConsecutiveRole(contents: Content[] | undefined): Content[]
465
466
  return result;
466
467
  }
467
468
 
469
+ const supportedFinishReasons: FinishReason[] = [
470
+ FinishReason.MAX_TOKENS,
471
+ FinishReason.STOP,
472
+ FinishReason.FINISH_REASON_UNSPECIFIED
473
+ ]
474
+
468
475
  export class GeminiModelDefinition implements ModelDefinition<GenerateContentPrompt> {
469
476
 
470
477
  model: AIModel
@@ -608,6 +615,32 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
608
615
  return { contents, system };
609
616
  }
610
617
 
618
+ usageMetadataToTokenUsage(usageMetadata: GenerateContentResponseUsageMetadata | undefined): ExecutionTokenUsage {
619
+ if (!usageMetadata || !usageMetadata.totalTokenCount) {
620
+ return {};
621
+ }
622
+ const tokenUsage: ExecutionTokenUsage = { total: usageMetadata.totalTokenCount, prompt: usageMetadata.promptTokenCount };
623
+
624
+ //Output/Response side
625
+ tokenUsage.result = (usageMetadata.candidatesTokenCount ?? 0)
626
+ + (usageMetadata.thoughtsTokenCount ?? 0)
627
+ + (usageMetadata.toolUsePromptTokenCount ?? 0);
628
+
629
+ if ((tokenUsage.total ?? 0) != (tokenUsage.prompt ?? 0) + tokenUsage.result) {
630
+ console.warn("[VertexAI] Gemini token usage mismatch: total does not equal prompt + result", {
631
+ total: tokenUsage.total,
632
+ prompt: tokenUsage.prompt,
633
+ result: tokenUsage.result
634
+ });
635
+ }
636
+
637
+ if (!tokenUsage.result) {
638
+ tokenUsage.result = undefined; // If no result, mark as undefined
639
+ }
640
+
641
+ return tokenUsage;
642
+ }
643
+
611
644
  async requestTextCompletion(driver: VertexAIDriver, prompt: GenerateContentPrompt, options: ExecutionOptions): Promise<Completion> {
612
645
  const splits = options.model.split("/");
613
646
  const modelName = splits[splits.length - 1];
@@ -621,12 +654,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
621
654
  const payload = getGeminiPayload(options, prompt);
622
655
  const response = await client.models.generateContent(payload);
623
656
 
624
- const usage = response.usageMetadata;
625
- const token_usage: ExecutionTokenUsage = {
626
- prompt: usage?.promptTokenCount,
627
- result: usage?.candidatesTokenCount,
628
- total: usage?.totalTokenCount,
629
- }
657
+ const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(response.usageMetadata);
630
658
 
631
659
  let tool_use: ToolUse[] | undefined;
632
660
  let finish_reason: string | undefined, result: any;
@@ -638,6 +666,13 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
638
666
  default: finish_reason = candidate.finishReason;
639
667
  }
640
668
  const content = candidate.content;
669
+
670
+ if (candidate.finishReason && !supportedFinishReasons.includes(candidate.finishReason)) {
671
+ throw new Error(`Unsupported finish reason: ${candidate.finishReason}, `
672
+ + `finish message: ${candidate.finishMessage}, `
673
+ + `content: ${JSON.stringify(content, null, 2)}, safety: ${JSON.stringify(candidate.safetyRatings, null, 2)}`);
674
+ }
675
+
641
676
  if (content) {
642
677
  tool_use = collectToolUseParts(content);
643
678
 
@@ -648,6 +683,8 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
648
683
  }
649
684
  }
650
685
 
686
+
687
+
651
688
  if (tool_use) {
652
689
  finish_reason = "tool_use";
653
690
  }
@@ -673,12 +710,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
673
710
  const response = await client.models.generateContentStream(payload);
674
711
 
675
712
  const stream = asyncMap(response, async (item) => {
676
- const usage = item.usageMetadata;
677
- const token_usage: ExecutionTokenUsage = {
678
- prompt: usage?.promptTokenCount,
679
- result: usage?.candidatesTokenCount,
680
- total: usage?.totalTokenCount,
681
- }
713
+ const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(item.usageMetadata);
682
714
  if (item.candidates && item.candidates.length > 0) {
683
715
  for (const candidate of item.candidates) {
684
716
  let tool_use: ToolUse[] | undefined;
@@ -688,6 +720,11 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
688
720
  case FinishReason.STOP: finish_reason = "stop"; break;
689
721
  default: finish_reason = candidate.finishReason;
690
722
  }
723
+ if (candidate.finishReason && !supportedFinishReasons.includes(candidate.finishReason)) {
724
+ throw new Error(`Unsupported finish reason: ${candidate.finishReason}, `
725
+ + `finish message: ${candidate.finishMessage}, `
726
+ + `content: ${JSON.stringify(candidate.content, null, 2)}, safety: ${JSON.stringify(candidate.safetyRatings, null, 2)}`);
727
+ }
691
728
  if (candidate.content?.role === 'model') {
692
729
  const text = collectTextParts(candidate.content);
693
730
  tool_use = collectToolUseParts(candidate.content);
@@ -707,6 +744,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
707
744
  return {
708
745
  result: item.promptFeedback?.blockReasonMessage ?? "",
709
746
  finish_reason: item.promptFeedback?.blockReason ?? "",
747
+ token_usage: token_usage,
710
748
  };
711
749
  });
712
750
 
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AzureOpenAIDriver = void 0;
4
- const identity_1 = require("@azure/identity");
5
- const openai_1 = require("openai");
6
- const index_js_1 = require("./index.js");
7
- class AzureOpenAIDriver extends index_js_1.BaseOpenAIDriver {
8
- service;
9
- provider;
10
- constructor(opts) {
11
- super(opts);
12
- if (!opts.azureADTokenProvider && !opts.apiKey) {
13
- opts.azureADTokenProvider = this.getDefaultAuth();
14
- }
15
- this.service = new openai_1.AzureOpenAI({
16
- apiKey: opts.apiKey,
17
- azureADTokenProvider: opts.azureADTokenProvider,
18
- endpoint: opts.endpoint,
19
- apiVersion: opts.apiVersion ?? "2024-10-21",
20
- deployment: opts.deployment
21
- });
22
- this.provider = "azure_openai";
23
- }
24
- getDefaultAuth() {
25
- const scope = "https://cognitiveservices.azure.com/.default";
26
- const azureADTokenProvider = (0, identity_1.getBearerTokenProvider)(new identity_1.DefaultAzureCredential(), scope);
27
- return azureADTokenProvider;
28
- }
29
- }
30
- exports.AzureOpenAIDriver = AzureOpenAIDriver;
31
- //# sourceMappingURL=azure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../src/openai/azure.ts"],"names":[],"mappings":";;;AAAA,8CAAiF;AAEjF,mCAAqC;AACrC,yCAA8C;AAmB9C,MAAa,iBAAkB,SAAQ,2BAAgB;IAGnD,OAAO,CAAc;IACrB,QAAQ,CAAiB;IAEzB,YAAY,IAA8B;QACtC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAW,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,YAAY;YAC3C,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;IACnC,CAAC;IAGD,cAAc;QACV,MAAM,KAAK,GAAG,8CAA8C,CAAC;QAC7D,MAAM,oBAAoB,GAAG,IAAA,iCAAsB,EAAC,IAAI,iCAAsB,EAAE,EAAE,KAAK,CAAC,CAAC;QACzF,OAAO,oBAAoB,CAAC;IAChC,CAAC;CAGJ;AA/BD,8CA+BC"}
@@ -1,27 +0,0 @@
1
- import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
2
- import { AzureOpenAI } from "openai";
3
- import { BaseOpenAIDriver } from "./index.js";
4
- export class AzureOpenAIDriver extends BaseOpenAIDriver {
5
- service;
6
- provider;
7
- constructor(opts) {
8
- super(opts);
9
- if (!opts.azureADTokenProvider && !opts.apiKey) {
10
- opts.azureADTokenProvider = this.getDefaultAuth();
11
- }
12
- this.service = new AzureOpenAI({
13
- apiKey: opts.apiKey,
14
- azureADTokenProvider: opts.azureADTokenProvider,
15
- endpoint: opts.endpoint,
16
- apiVersion: opts.apiVersion ?? "2024-10-21",
17
- deployment: opts.deployment
18
- });
19
- this.provider = "azure_openai";
20
- }
21
- getDefaultAuth() {
22
- const scope = "https://cognitiveservices.azure.com/.default";
23
- const azureADTokenProvider = getBearerTokenProvider(new DefaultAzureCredential(), scope);
24
- return azureADTokenProvider;
25
- }
26
- }
27
- //# sourceMappingURL=azure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../src/openai/azure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmB9C,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IAGnD,OAAO,CAAc;IACrB,QAAQ,CAAiB;IAEzB,YAAY,IAA8B;QACtC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,YAAY;YAC3C,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;IACnC,CAAC;IAGD,cAAc;QACV,MAAM,KAAK,GAAG,8CAA8C,CAAC;QAC7D,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,IAAI,sBAAsB,EAAE,EAAE,KAAK,CAAC,CAAC;QACzF,OAAO,oBAAoB,CAAC;IAChC,CAAC;CAGJ"}
@@ -1,115 +0,0 @@
1
- import { AbstractDriver } from "@llumiverse/core";
2
- export class FireflyDriver extends AbstractDriver {
3
- static PROVIDER = "firefly";
4
- provider = FireflyDriver.PROVIDER;
5
- endpoint;
6
- constructor(options) {
7
- super(options);
8
- if (!options.apiKey) {
9
- throw new Error("No API key provided for Firefly driver");
10
- }
11
- this.endpoint = options.endpoint || "https://firefly-api.adobe.io/v3";
12
- }
13
- async requestTextCompletion(_prompt, _options) {
14
- throw new Error("Text completion not supported by Firefly");
15
- }
16
- async requestTextCompletionStream(_prompt, _options) {
17
- throw new Error("Text completion streaming not supported by Firefly");
18
- }
19
- async requestImageGeneration(segments, options) {
20
- this.logger.debug(`[${this.provider}] Generating image with model ${options.model}`);
21
- const prompt = segments.map(s => s.content).join("\n\n");
22
- try {
23
- const payload = {
24
- prompt: prompt,
25
- };
26
- const response = await fetch(`${this.endpoint}/images/generate`, {
27
- method: 'POST',
28
- headers: {
29
- 'Content-Type': 'application/json',
30
- 'x-api-key': this.options.apiKey,
31
- },
32
- body: JSON.stringify(payload)
33
- });
34
- if (!response.ok) {
35
- const error = await response.json();
36
- throw new Error(`Firefly API error: ${error.message || response.statusText}`);
37
- }
38
- const result = await response.json();
39
- if (result.promptHasDeniedWords || result.promptHasBlockedArtists) {
40
- return {
41
- result: {},
42
- error: {
43
- message: "Prompt contains denied words or blocked artists",
44
- code: "content_policy_violation"
45
- }
46
- };
47
- }
48
- return {
49
- result: {
50
- images: result.outputs.map(output => output.image.url)
51
- }
52
- };
53
- }
54
- catch (error) {
55
- this.logger.error("[Firefly] Image generation failed", { error });
56
- return {
57
- result: {},
58
- error: {
59
- message: error.message,
60
- code: error.code || 'GENERATION_FAILED'
61
- }
62
- };
63
- }
64
- }
65
- mapSize(size) {
66
- // Default to 1024x1024 if no size specified
67
- if (!size)
68
- return { width: 1024, height: 1024 };
69
- const [width, height] = size.split('x').map(Number);
70
- return { width, height };
71
- }
72
- async listModels(_params) {
73
- return [
74
- {
75
- id: "firefly-v3-text-to-image",
76
- name: "Firefly v3 Text to Image",
77
- provider: this.provider,
78
- description: "Adobe Firefly v3 text to image generation model",
79
- tags: ["image-generation"]
80
- },
81
- {
82
- id: "firefly-v3-image-to-image",
83
- name: "Firefly v3 Image to Image",
84
- provider: this.provider,
85
- description: "Adobe Firefly v3 image to image generation model",
86
- tags: ["image-generation"]
87
- },
88
- {
89
- id: "firefly-v3-inpainting",
90
- name: "Firefly v3 Inpainting",
91
- provider: this.provider,
92
- description: "Adobe Firefly v3 inpainting model",
93
- tags: ["image-generation"]
94
- }
95
- ];
96
- }
97
- async validateConnection() {
98
- try {
99
- const response = await fetch(`${this.endpoint}/auth/validate`, {
100
- headers: {
101
- 'x-api-key': this.options.apiKey
102
- }
103
- });
104
- return response.ok;
105
- }
106
- catch (error) {
107
- this.logger.error("[Firefly] Connection validation failed", { error });
108
- return false;
109
- }
110
- }
111
- async generateEmbeddings(_options) {
112
- throw new Error("Embeddings not supported by Firefly");
113
- }
114
- }
115
- //# 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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"}
@@ -1,278 +0,0 @@
1
- import { readStreamAsString, readStreamAsUint8Array } from "@llumiverse/core";
2
- import { PromptRole } from "@llumiverse/core";
3
- import { ConversationRole, } from "@aws-sdk/client-bedrock-runtime";
4
- import { parseS3UrlToUri } from "./s3.js";
5
- function roleConversion(role) {
6
- return role === PromptRole.assistant ? ConversationRole.ASSISTANT : ConversationRole.USER;
7
- }
8
- function mimeToImageType(mime) {
9
- if (mime.startsWith("image/")) {
10
- return mime.split("/")[1];
11
- }
12
- return "png";
13
- }
14
- function mimeToDocType(mime) {
15
- if (mime.startsWith("application/") || mime.startsWith("text/")) {
16
- return mime.split("/")[1];
17
- }
18
- return "txt";
19
- }
20
- function mimeToVideoType(mime) {
21
- if (mime.startsWith("video/")) {
22
- return mime.split("/")[1];
23
- }
24
- return "mp4";
25
- }
26
- async function processFile(f, mode) {
27
- const source = await f.getStream();
28
- //Image file - "png" | "jpeg" | "gif" | "webp"
29
- if (f.mime_type && f.mime_type.startsWith("image")) {
30
- const imageBlock = {
31
- image: {
32
- format: mimeToImageType(f.mime_type),
33
- source: { bytes: await readStreamAsUint8Array(source) },
34
- }
35
- };
36
- return mode === 'content'
37
- ? imageBlock
38
- : imageBlock;
39
- }
40
- //Document file - "pdf | csv | doc | docx | xls | xlsx | html | txt | md"
41
- else if (f.mime_type && (f.mime_type.startsWith("text") || f.mime_type?.startsWith("application"))) {
42
- // Handle JSON files specially
43
- if (f.mime_type === "application/json" || (f.name && f.name.endsWith('.json'))) {
44
- const jsonContent = await readStreamAsString(source);
45
- try {
46
- const parsedJson = JSON.parse(jsonContent);
47
- if (mode === 'tool') {
48
- return { json: parsedJson };
49
- }
50
- else {
51
- // ContentBlock doesn't support JSON, so treat as text
52
- return { text: jsonContent };
53
- }
54
- }
55
- catch (error) {
56
- const textBlock = { text: jsonContent };
57
- return mode === 'content'
58
- ? textBlock
59
- : textBlock;
60
- }
61
- }
62
- else {
63
- const documentBlock = {
64
- document: {
65
- format: mimeToDocType(f.mime_type),
66
- name: f.name,
67
- source: { bytes: await readStreamAsUint8Array(source) },
68
- },
69
- };
70
- return mode === 'content'
71
- ? documentBlock
72
- : documentBlock;
73
- }
74
- }
75
- //Video file - "mov | mkv | mp4 | webm | flv | mpeg | mpg | wmv | three_gp"
76
- else if (f.mime_type && f.mime_type.startsWith("video")) {
77
- let url_string = (await f.getURL()).toLowerCase();
78
- let url_format = new URL(url_string);
79
- if (url_format.hostname.endsWith("amazonaws.com") &&
80
- (url_format.hostname.startsWith("s3.") || url_format.hostname.includes(".s3."))) {
81
- //Convert to s3:// format
82
- const parsedUrl = parseS3UrlToUri(new URL(url_string));
83
- url_string = parsedUrl;
84
- url_format = new URL(parsedUrl);
85
- }
86
- const videoBlock = url_format.protocol === "s3:" ? {
87
- video: {
88
- format: mimeToVideoType(f.mime_type),
89
- source: {
90
- s3Location: {
91
- uri: url_string, //S3 URL
92
- //bucketOwner: We don't have this additional information.
93
- }
94
- },
95
- },
96
- } : {
97
- video: {
98
- format: mimeToVideoType(f.mime_type),
99
- source: { bytes: await readStreamAsUint8Array(source) },
100
- },
101
- };
102
- return mode === 'content'
103
- ? videoBlock
104
- : videoBlock;
105
- }
106
- //Fallback, send as text
107
- else {
108
- const textBlock = { text: await readStreamAsString(source) };
109
- return mode === 'content'
110
- ? textBlock
111
- : textBlock;
112
- }
113
- }
114
- async function processFileToContentBlock(f) {
115
- try {
116
- return processFile(f, 'content');
117
- }
118
- catch (error) {
119
- throw new Error(`Failed to process file ${f.name} for prompt: ${error instanceof Error ? error.message : String(error)}`);
120
- }
121
- }
122
- async function processFileToToolContentBlock(f) {
123
- try {
124
- return processFile(f, 'tool');
125
- }
126
- catch (error) {
127
- throw new Error(`Failed to process file ${f.name} for tool response: ${error instanceof Error ? error.message : String(error)}`);
128
- }
129
- }
130
- export function converseConcatMessages(messages) {
131
- if (!messages || messages.length === 0)
132
- return [];
133
- const needsMerging = messages.some((message, i) => i < messages.length - 1 && message.role === messages[i + 1].role);
134
- // If no merging needed, return original array
135
- if (!needsMerging) {
136
- return messages;
137
- }
138
- const result = [];
139
- let currentMessage = { ...messages[0] };
140
- for (let i = 1; i < messages.length; i++) {
141
- if (currentMessage.role === messages[i].role) {
142
- // Same role - concatenate content
143
- currentMessage.content = (currentMessage.content || []).concat(...(messages[i].content || []));
144
- }
145
- else {
146
- // Different role - push current and start new
147
- result.push(currentMessage);
148
- currentMessage = { ...messages[i] };
149
- }
150
- }
151
- result.push(currentMessage);
152
- return result;
153
- }
154
- export function converseSystemToMessages(system) {
155
- return {
156
- content: [{ text: system.map(system => system.text).join('\n').trim() }],
157
- role: ConversationRole.USER
158
- };
159
- }
160
- export function converseRemoveJSONprefill(messages) {
161
- //Remove the "```json" stop message
162
- if (messages && messages.length > 0) {
163
- if (messages[messages.length - 1].content?.[0].text === "```json") {
164
- messages.pop();
165
- }
166
- }
167
- return messages ?? [];
168
- }
169
- export function converseJSONprefill(messages) {
170
- if (!messages) {
171
- messages = [];
172
- }
173
- //prefill the json
174
- messages.push({
175
- content: [{ text: "```json" }],
176
- role: ConversationRole.ASSISTANT,
177
- });
178
- return messages;
179
- }
180
- // Used to ignore unsupported roles. Typically these are things like image specific roles.
181
- const unsupportedRoles = [
182
- PromptRole.negative,
183
- PromptRole.mask,
184
- ];
185
- export async function formatConversePrompt(segments, options) {
186
- //Non-const for concat
187
- let system = [];
188
- const safety = [];
189
- let messages = [];
190
- for (const segment of segments) {
191
- // Role dependent processing
192
- if (segment.role === PromptRole.system) {
193
- system.push({ text: segment.content });
194
- }
195
- else if (segment.role === PromptRole.tool) {
196
- if (!segment.tool_use_id) {
197
- throw new Error("Tool use ID is required for tool segments");
198
- }
199
- //Tool use results (i.e. the model has requested a tool and this it the answer to that request)
200
- const toolContentBlocks = [];
201
- //Text segments
202
- if (segment.content) {
203
- toolContentBlocks.push({ text: segment.content });
204
- }
205
- //Handle attached files
206
- for (const file of segment.files ?? []) {
207
- toolContentBlocks.push(await processFileToToolContentBlock(file));
208
- }
209
- messages.push({
210
- content: [{
211
- toolResult: {
212
- toolUseId: segment.tool_use_id,
213
- content: toolContentBlocks,
214
- }
215
- }],
216
- role: ConversationRole.USER
217
- });
218
- }
219
- else if (!unsupportedRoles.includes(segment.role)) {
220
- //User, Assistant or safety roles
221
- const contentBlocks = [];
222
- //Text segments
223
- if (segment.content) {
224
- contentBlocks.push({ text: segment.content });
225
- }
226
- //Handle attached files
227
- for (const file of segment.files ?? []) {
228
- contentBlocks.push(await processFileToContentBlock(file));
229
- }
230
- //If there are no content blocks, skip this message
231
- if (contentBlocks.length !== 0) {
232
- const message = { content: contentBlocks, role: roleConversion(segment.role) };
233
- if (segment.role === PromptRole.safety) {
234
- safety.push(message);
235
- }
236
- else {
237
- messages.push(message);
238
- }
239
- }
240
- }
241
- }
242
- if (options.result_schema) {
243
- let schemaText;
244
- if (options.tools && options.tools.length > 0) {
245
- schemaText = "When not calling tools, the answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema, undefined, 2);
246
- }
247
- else {
248
- schemaText = "The answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema, undefined, 2);
249
- }
250
- system.push({ text: "IMPORTANT: " + schemaText });
251
- }
252
- // Safety messages are user messages that should be included at the end.
253
- if (safety.length > 0) {
254
- messages = messages.concat(safety);
255
- }
256
- //Conversations must start with a user message
257
- //Use the system messages if none are provided
258
- if (messages.length === 0) {
259
- const systemMessage = converseSystemToMessages(system);
260
- if (systemMessage?.content?.[0]?.text?.trim()) {
261
- messages.push(systemMessage);
262
- }
263
- else {
264
- throw new Error("Prompt must contain at least one message");
265
- }
266
- system = undefined;
267
- }
268
- if (system && system.length === 0) {
269
- system = undefined; // If no system messages, set to undefined
270
- }
271
- messages = converseConcatMessages(messages);
272
- return {
273
- modelId: undefined, //required property, but allowed to be undefined
274
- messages: messages,
275
- system: system,
276
- };
277
- }
278
- //# sourceMappingURL=converse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converse.js","sourceRoot":"","sources":["../../../../src/bedrock/converse.ts"],"names":[],"mappings":"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"}