@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.
- package/lib/cjs/azure/azure_foundry.js +9 -0
- package/lib/cjs/azure/azure_foundry.js.map +1 -1
- package/lib/cjs/bedrock/index.js +35 -22
- package/lib/cjs/bedrock/index.js.map +1 -1
- package/lib/cjs/vertexai/index.js +26 -18
- package/lib/cjs/vertexai/index.js.map +1 -1
- package/lib/cjs/vertexai/models/gemini.js +39 -12
- package/lib/cjs/vertexai/models/gemini.js.map +1 -1
- package/lib/esm/azure/azure_foundry.js +9 -0
- package/lib/esm/azure/azure_foundry.js.map +1 -1
- package/lib/esm/bedrock/index.js +35 -22
- package/lib/esm/bedrock/index.js.map +1 -1
- package/lib/esm/vertexai/index.js +26 -18
- package/lib/esm/vertexai/index.js.map +1 -1
- package/lib/esm/vertexai/models/gemini.js +39 -12
- package/lib/esm/vertexai/models/gemini.js.map +1 -1
- package/lib/types/azure/azure_foundry.d.ts.map +1 -1
- package/lib/types/bedrock/index.d.ts +2 -2
- package/lib/types/bedrock/index.d.ts.map +1 -1
- package/lib/types/vertexai/index.d.ts.map +1 -1
- package/lib/types/vertexai/models/gemini.d.ts +3 -2
- package/lib/types/vertexai/models/gemini.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/azure/azure_foundry.ts +9 -1
- package/src/bedrock/index.ts +36 -23
- package/src/vertexai/index.ts +29 -22
- package/src/vertexai/models/gemini.ts +50 -12
- package/lib/cjs/openai/azure.js +0 -31
- package/lib/cjs/openai/azure.js.map +0 -1
- package/lib/esm/openai/azure.js +0 -27
- package/lib/esm/openai/azure.js.map +0 -1
- package/lib/esm/src/adobe/firefly.js +0 -115
- package/lib/esm/src/adobe/firefly.js.map +0 -1
- package/lib/esm/src/bedrock/converse.js +0 -278
- package/lib/esm/src/bedrock/converse.js.map +0 -1
- package/lib/esm/src/bedrock/index.js +0 -797
- package/lib/esm/src/bedrock/index.js.map +0 -1
- package/lib/esm/src/bedrock/nova-image-payload.js +0 -203
- package/lib/esm/src/bedrock/nova-image-payload.js.map +0 -1
- package/lib/esm/src/bedrock/payloads.js +0 -2
- package/lib/esm/src/bedrock/payloads.js.map +0 -1
- package/lib/esm/src/bedrock/s3.js +0 -99
- package/lib/esm/src/bedrock/s3.js.map +0 -1
- package/lib/esm/src/groq/index.js +0 -130
- package/lib/esm/src/groq/index.js.map +0 -1
- package/lib/esm/src/huggingface_ie.js +0 -196
- package/lib/esm/src/huggingface_ie.js.map +0 -1
- package/lib/esm/src/index.js +0 -13
- package/lib/esm/src/index.js.map +0 -1
- package/lib/esm/src/mistral/index.js +0 -167
- package/lib/esm/src/mistral/index.js.map +0 -1
- package/lib/esm/src/mistral/types.js +0 -80
- package/lib/esm/src/mistral/types.js.map +0 -1
- package/lib/esm/src/openai/azure.js +0 -27
- package/lib/esm/src/openai/azure.js.map +0 -1
- package/lib/esm/src/openai/index.js +0 -463
- package/lib/esm/src/openai/index.js.map +0 -1
- package/lib/esm/src/openai/openai.js +0 -14
- package/lib/esm/src/openai/openai.js.map +0 -1
- package/lib/esm/src/replicate.js +0 -268
- package/lib/esm/src/replicate.js.map +0 -1
- package/lib/esm/src/test/TestErrorCompletionStream.js +0 -16
- package/lib/esm/src/test/TestErrorCompletionStream.js.map +0 -1
- package/lib/esm/src/test/TestValidationErrorCompletionStream.js +0 -20
- package/lib/esm/src/test/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/esm/src/test/index.js +0 -91
- package/lib/esm/src/test/index.js.map +0 -1
- package/lib/esm/src/test/utils.js +0 -25
- package/lib/esm/src/test/utils.js.map +0 -1
- package/lib/esm/src/togetherai/index.js +0 -122
- package/lib/esm/src/togetherai/index.js.map +0 -1
- package/lib/esm/src/togetherai/interfaces.js +0 -2
- package/lib/esm/src/togetherai/interfaces.js.map +0 -1
- package/lib/esm/src/vertexai/debug.js +0 -6
- package/lib/esm/src/vertexai/debug.js.map +0 -1
- package/lib/esm/src/vertexai/embeddings/embeddings-image.js +0 -24
- package/lib/esm/src/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/esm/src/vertexai/embeddings/embeddings-text.js +0 -20
- package/lib/esm/src/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/esm/src/vertexai/index.js +0 -270
- package/lib/esm/src/vertexai/index.js.map +0 -1
- package/lib/esm/src/vertexai/models/claude.js +0 -370
- package/lib/esm/src/vertexai/models/claude.js.map +0 -1
- package/lib/esm/src/vertexai/models/gemini.js +0 -700
- package/lib/esm/src/vertexai/models/gemini.js.map +0 -1
- package/lib/esm/src/vertexai/models/imagen.js +0 -310
- package/lib/esm/src/vertexai/models/imagen.js.map +0 -1
- package/lib/esm/src/vertexai/models/llama.js +0 -178
- package/lib/esm/src/vertexai/models/llama.js.map +0 -1
- package/lib/esm/src/vertexai/models.js +0 -21
- package/lib/esm/src/vertexai/models.js.map +0 -1
- package/lib/esm/src/watsonx/index.js +0 -157
- package/lib/esm/src/watsonx/index.js.map +0 -1
- package/lib/esm/src/watsonx/interfaces.js +0 -2
- package/lib/esm/src/watsonx/interfaces.js.map +0 -1
- package/lib/esm/src/xai/index.js +0 -64
- package/lib/esm/src/xai/index.js.map +0 -1
- package/lib/esm/tsconfig.tsbuildinfo +0 -1
- package/lib/types/openai/azure.d.ts +0 -20
- package/lib/types/openai/azure.d.ts.map +0 -1
- package/lib/types/src/adobe/firefly.d.ts +0 -29
- package/lib/types/src/bedrock/converse.d.ts +0 -8
- package/lib/types/src/bedrock/index.d.ts +0 -57
- package/lib/types/src/bedrock/nova-image-payload.d.ts +0 -73
- package/lib/types/src/bedrock/payloads.d.ts +0 -11
- package/lib/types/src/bedrock/s3.d.ts +0 -22
- package/lib/types/src/groq/index.d.ts +0 -23
- package/lib/types/src/huggingface_ie.d.ts +0 -31
- package/lib/types/src/index.d.ts +0 -12
- package/lib/types/src/mistral/index.d.ts +0 -24
- package/lib/types/src/mistral/types.d.ts +0 -131
- package/lib/types/src/openai/azure.d.ts +0 -19
- package/lib/types/src/openai/index.d.ts +0 -25
- package/lib/types/src/openai/openai.d.ts +0 -14
- package/lib/types/src/replicate.d.ts +0 -44
- package/lib/types/src/test/TestErrorCompletionStream.d.ts +0 -8
- package/lib/types/src/test/TestValidationErrorCompletionStream.d.ts +0 -8
- package/lib/types/src/test/index.d.ts +0 -23
- package/lib/types/src/test/utils.d.ts +0 -4
- package/lib/types/src/togetherai/index.d.ts +0 -22
- package/lib/types/src/togetherai/interfaces.d.ts +0 -95
- package/lib/types/src/vertexai/debug.d.ts +0 -1
- package/lib/types/src/vertexai/embeddings/embeddings-image.d.ts +0 -10
- package/lib/types/src/vertexai/embeddings/embeddings-text.d.ts +0 -9
- package/lib/types/src/vertexai/index.d.ts +0 -49
- package/lib/types/src/vertexai/models/claude.d.ts +0 -17
- package/lib/types/src/vertexai/models/gemini.d.ts +0 -16
- package/lib/types/src/vertexai/models/imagen.d.ts +0 -74
- package/lib/types/src/vertexai/models/llama.d.ts +0 -19
- package/lib/types/src/vertexai/models.d.ts +0 -14
- package/lib/types/src/watsonx/index.d.ts +0 -26
- package/lib/types/src/watsonx/interfaces.d.ts +0 -64
- 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
|
|
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
|
|
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
|
|
package/lib/cjs/openai/azure.js
DELETED
|
@@ -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"}
|
package/lib/esm/openai/azure.js
DELETED
|
@@ -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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"}
|