@workglow/ai-provider 0.0.102 → 0.0.104
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/dist/{HFT_JobRunFns-aap9x58c.js → HFT_JobRunFns-66fave8m.js} +3 -3
- package/dist/anthropic/AnthropicProvider.d.ts +1 -1
- package/dist/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/anthropic/common/Anthropic_JobRunFns.d.ts +3 -1
- package/dist/anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
- package/dist/anthropic/common/Anthropic_ModelSchema.d.ts +9 -6
- package/dist/anthropic/common/Anthropic_ModelSchema.d.ts.map +1 -1
- package/dist/anthropic/index.js +78 -10
- package/dist/anthropic/index.js.map +4 -4
- package/dist/google-gemini/GoogleGeminiProvider.d.ts +1 -1
- package/dist/google-gemini/GoogleGeminiProvider.d.ts.map +1 -1
- package/dist/google-gemini/common/Gemini_JobRunFns.d.ts +3 -1
- package/dist/google-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
- package/dist/google-gemini/common/Gemini_ModelSchema.d.ts +12 -6
- package/dist/google-gemini/common/Gemini_ModelSchema.d.ts.map +1 -1
- package/dist/google-gemini/index.js +78 -9
- package/dist/google-gemini/index.js.map +4 -4
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts +21 -0
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/hf-transformers/index.js +10 -10
- package/dist/hf-transformers/index.js.map +3 -3
- package/dist/{index-jd3bbc2x.js → index-6j5pq722.js} +1 -1
- package/dist/{index-jd3bbc2x.js.map → index-6j5pq722.js.map} +1 -1
- package/dist/index-795ethaq.js +54 -0
- package/dist/index-795ethaq.js.map +10 -0
- package/dist/{index-fgp2zg78.js → index-79rqre58.js} +7 -4
- package/dist/{index-fgp2zg78.js.map → index-79rqre58.js.map} +4 -4
- package/dist/{index-8jqhbz1h.js → index-7et44e16.js} +41 -4
- package/dist/index-7et44e16.js.map +10 -0
- package/dist/{index-236gqvq1.js → index-c5z3v9gn.js} +6 -4
- package/dist/{index-236gqvq1.js.map → index-c5z3v9gn.js.map} +4 -4
- package/dist/{index-h5kwbbzq.js → index-gjc388y4.js} +7 -4
- package/dist/index-gjc388y4.js.map +12 -0
- package/dist/{index-3tvpdt0s.js → index-t54dgrfj.js} +5 -3
- package/dist/{index-3tvpdt0s.js.map → index-t54dgrfj.js.map} +3 -3
- package/dist/{index-b9310x5k.js → index-zqq3kw0n.js} +55 -54
- package/dist/index-zqq3kw0n.js.map +11 -0
- package/dist/{index.browser-jd3bbc2x.js → index.browser-6j5pq722.js} +1 -1
- package/dist/{index.browser-jd3bbc2x.js.map → index.browser-6j5pq722.js.map} +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_ModelSchema.d.ts +12 -6
- package/dist/provider-hf-inference/common/HFI_ModelSchema.d.ts.map +1 -1
- package/dist/provider-hf-inference/index.js +18 -7
- package/dist/provider-hf-inference/index.js.map +4 -4
- package/dist/provider-llamacpp/index.js +4 -4
- package/dist/provider-llamacpp/index.js.map +3 -3
- package/dist/provider-ollama/index.browser.js +4 -4
- package/dist/provider-ollama/index.browser.js.map +3 -3
- package/dist/provider-ollama/index.js +4 -4
- package/dist/provider-ollama/index.js.map +3 -3
- package/dist/provider-openai/OpenAiProvider.d.ts +1 -1
- package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts +3 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_ModelSchema.d.ts +12 -6
- package/dist/provider-openai/common/OpenAI_ModelSchema.d.ts.map +1 -1
- package/dist/provider-openai/index.js +86 -11
- package/dist/provider-openai/index.js.map +4 -4
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts +16 -0
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts.map +1 -1
- package/dist/tf-mediapipe/index.js +4 -4
- package/dist/tf-mediapipe/index.js.map +3 -3
- package/package.json +17 -17
- package/dist/index-8jqhbz1h.js.map +0 -10
- package/dist/index-b9310x5k.js.map +0 -11
- package/dist/index-h5kwbbzq.js.map +0 -12
- package/dist/index-m0r2hvfz.js +0 -57
- package/dist/index-m0r2hvfz.js.map +0 -10
- /package/dist/{HFT_JobRunFns-aap9x58c.js.map → HFT_JobRunFns-66fave8m.js.map} +0 -0
|
@@ -28,9 +28,9 @@ import {
|
|
|
28
28
|
HFT_TextTranslation_Stream,
|
|
29
29
|
HFT_Unload,
|
|
30
30
|
clearPipelineCache
|
|
31
|
-
} from "./index-
|
|
32
|
-
import"./index-
|
|
33
|
-
import"./index-
|
|
31
|
+
} from "./index-7et44e16.js";
|
|
32
|
+
import"./index-zqq3kw0n.js";
|
|
33
|
+
import"./index-6j5pq722.js";
|
|
34
34
|
export {
|
|
35
35
|
clearPipelineCache,
|
|
36
36
|
HFT_Unload,
|
|
@@ -33,7 +33,7 @@ import type { AnthropicModelConfig } from "./common/Anthropic_ModelSchema";
|
|
|
33
33
|
*/
|
|
34
34
|
export declare class AnthropicProvider extends AiProvider<AnthropicModelConfig> {
|
|
35
35
|
readonly name = "ANTHROPIC";
|
|
36
|
-
readonly taskTypes: readonly ["CountTokensTask", "TextGenerationTask", "TextRewriterTask", "TextSummaryTask"];
|
|
36
|
+
readonly taskTypes: readonly ["CountTokensTask", "TextGenerationTask", "TextRewriterTask", "TextSummaryTask", "StructuredGenerationTask"];
|
|
37
37
|
constructor(tasks?: Record<string, AiProviderRunFn<any, any, AnthropicModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, AnthropicModelConfig>>, reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, AnthropicModelConfig>>);
|
|
38
38
|
}
|
|
39
39
|
//# sourceMappingURL=AnthropicProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../src/anthropic/AnthropicProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,oBAAoB,CAAC;IACrE,QAAQ,CAAC,IAAI,eAAa;IAE1B,QAAQ,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../src/anthropic/AnthropicProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,oBAAoB,CAAC;IACrE,QAAQ,CAAC,IAAI,eAAa;IAE1B,QAAQ,CAAC,SAAS,wHAMP;gBAGT,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC,EACvE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAChF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;CAI1F"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn, CountTokensTaskInput, CountTokensTaskOutput, TextGenerationTaskInput, TextGenerationTaskOutput, TextRewriterTaskInput, TextRewriterTaskOutput, TextSummaryTaskInput, TextSummaryTaskOutput } from "@workglow/ai";
|
|
6
|
+
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn, CountTokensTaskInput, CountTokensTaskOutput, StructuredGenerationTaskInput, StructuredGenerationTaskOutput, TextGenerationTaskInput, TextGenerationTaskOutput, TextRewriterTaskInput, TextRewriterTaskOutput, TextSummaryTaskInput, TextSummaryTaskOutput } from "@workglow/ai";
|
|
7
7
|
import type { AnthropicModelConfig } from "./Anthropic_ModelSchema";
|
|
8
8
|
export declare const Anthropic_TextGeneration: AiProviderRunFn<TextGenerationTaskInput, TextGenerationTaskOutput, AnthropicModelConfig>;
|
|
9
9
|
export declare const Anthropic_TextRewriter: AiProviderRunFn<TextRewriterTaskInput, TextRewriterTaskOutput, AnthropicModelConfig>;
|
|
@@ -13,6 +13,8 @@ export declare const Anthropic_TextRewriter_Stream: AiProviderStreamFn<TextRewri
|
|
|
13
13
|
export declare const Anthropic_TextSummary_Stream: AiProviderStreamFn<TextSummaryTaskInput, TextSummaryTaskOutput, AnthropicModelConfig>;
|
|
14
14
|
export declare const Anthropic_CountTokens: AiProviderRunFn<CountTokensTaskInput, CountTokensTaskOutput, AnthropicModelConfig>;
|
|
15
15
|
export declare const Anthropic_CountTokens_Reactive: AiProviderReactiveRunFn<CountTokensTaskInput, CountTokensTaskOutput, AnthropicModelConfig>;
|
|
16
|
+
export declare const Anthropic_StructuredGeneration: AiProviderRunFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, AnthropicModelConfig>;
|
|
17
|
+
export declare const Anthropic_StructuredGeneration_Stream: AiProviderStreamFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, AnthropicModelConfig>;
|
|
16
18
|
export declare const ANTHROPIC_TASKS: Record<string, AiProviderRunFn<any, any, AnthropicModelConfig>>;
|
|
17
19
|
export declare const ANTHROPIC_STREAM_TASKS: Record<string, AiProviderStreamFn<any, any, AnthropicModelConfig>>;
|
|
18
20
|
export declare const ANTHROPIC_REACTIVE_TASKS: Record<string, AiProviderReactiveRunFn<any, any, AnthropicModelConfig>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anthropic_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/anthropic/common/Anthropic_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Anthropic_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/anthropic/common/Anthropic_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,6BAA6B,EAC7B,8BAA8B,EAC9B,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AA0DpE,eAAO,MAAM,wBAAwB,EAAE,eAAe,CACpD,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,CA0BrB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,CAClD,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,CAoBrB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,CAoBrB,CAAC;AAMF,eAAO,MAAM,+BAA+B,EAAE,kBAAkB,CAC9D,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,CAsBrB,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,kBAAkB,CAC5D,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,CAqBrB,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,CAqBrB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,CAQrB,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,uBAAuB,CAClE,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,CAGrB,CAAC;AAMF,eAAO,MAAM,8BAA8B,EAAE,eAAe,CAC1D,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,CA8BrB,CAAC;AAEF,eAAO,MAAM,qCAAqC,EAAE,kBAAkB,CACpE,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,CA+CrB,CAAC;AAMF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAM3F,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CACzC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAMnD,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAC3C,MAAM,EACN,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAGxD,CAAC"}
|
|
@@ -19,9 +19,10 @@ export declare const AnthropicModelSchema: {
|
|
|
19
19
|
readonly type: "string";
|
|
20
20
|
readonly description: "The Anthropic model identifier (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-haiku-20241022').";
|
|
21
21
|
};
|
|
22
|
-
readonly
|
|
22
|
+
readonly credential_key: {
|
|
23
23
|
readonly type: "string";
|
|
24
|
-
readonly
|
|
24
|
+
readonly format: "credential";
|
|
25
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
25
26
|
readonly "x-ui-hidden": true;
|
|
26
27
|
};
|
|
27
28
|
readonly base_url: {
|
|
@@ -57,9 +58,10 @@ export declare const AnthropicModelRecordSchema: {
|
|
|
57
58
|
readonly type: "string";
|
|
58
59
|
readonly description: "The Anthropic model identifier (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-haiku-20241022').";
|
|
59
60
|
};
|
|
60
|
-
readonly
|
|
61
|
+
readonly credential_key: {
|
|
61
62
|
readonly type: "string";
|
|
62
|
-
readonly
|
|
63
|
+
readonly format: "credential";
|
|
64
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
63
65
|
readonly "x-ui-hidden": true;
|
|
64
66
|
};
|
|
65
67
|
readonly base_url: {
|
|
@@ -118,9 +120,10 @@ export declare const AnthropicModelConfigSchema: {
|
|
|
118
120
|
readonly type: "string";
|
|
119
121
|
readonly description: "The Anthropic model identifier (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-haiku-20241022').";
|
|
120
122
|
};
|
|
121
|
-
readonly
|
|
123
|
+
readonly credential_key: {
|
|
122
124
|
readonly type: "string";
|
|
123
|
-
readonly
|
|
125
|
+
readonly format: "credential";
|
|
126
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
124
127
|
readonly "x-ui-hidden": true;
|
|
125
128
|
};
|
|
126
129
|
readonly base_url: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anthropic_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/anthropic/common/Anthropic_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"Anthropic_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/anthropic/common/Anthropic_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCQ,CAAC;AAE1C,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQE,CAAC;AAE1C,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEjF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQE,CAAC;AAE1C,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
package/dist/anthropic/index.js
CHANGED
|
@@ -4,15 +4,16 @@ import {
|
|
|
4
4
|
AnthropicModelRecordSchema,
|
|
5
5
|
AnthropicModelSchema,
|
|
6
6
|
AnthropicProvider
|
|
7
|
-
} from "../index-
|
|
7
|
+
} from "../index-c5z3v9gn.js";
|
|
8
8
|
import {
|
|
9
9
|
__require
|
|
10
|
-
} from "../index-
|
|
10
|
+
} from "../index-6j5pq722.js";
|
|
11
11
|
|
|
12
12
|
// src/anthropic/Anthropic_Worker.ts
|
|
13
|
-
import { globalServiceRegistry,
|
|
13
|
+
import { globalServiceRegistry, WORKER_SERVER } from "@workglow/util";
|
|
14
14
|
|
|
15
15
|
// src/anthropic/common/Anthropic_JobRunFns.ts
|
|
16
|
+
import { getLogger, parsePartialJson } from "@workglow/util";
|
|
16
17
|
var _sdk;
|
|
17
18
|
async function loadAnthropicSDK() {
|
|
18
19
|
if (!_sdk) {
|
|
@@ -26,13 +27,14 @@ async function loadAnthropicSDK() {
|
|
|
26
27
|
}
|
|
27
28
|
async function getClient(model) {
|
|
28
29
|
const Anthropic = await loadAnthropicSDK();
|
|
29
|
-
const
|
|
30
|
+
const config = model?.provider_config;
|
|
31
|
+
const apiKey = config?.credential_key || config?.api_key || (typeof process !== "undefined" ? process.env?.ANTHROPIC_API_KEY : undefined);
|
|
30
32
|
if (!apiKey) {
|
|
31
|
-
throw new Error("Missing Anthropic API key: set provider_config.
|
|
33
|
+
throw new Error("Missing Anthropic API key: set provider_config.credential_key or the ANTHROPIC_API_KEY environment variable.");
|
|
32
34
|
}
|
|
33
35
|
return new Anthropic({
|
|
34
36
|
apiKey,
|
|
35
|
-
baseURL:
|
|
37
|
+
baseURL: config?.base_url || undefined,
|
|
36
38
|
dangerouslyAllowBrowser: true
|
|
37
39
|
});
|
|
38
40
|
}
|
|
@@ -47,6 +49,9 @@ function getMaxTokens(input, model) {
|
|
|
47
49
|
return input.maxTokens ?? model?.provider_config?.max_tokens ?? 1024;
|
|
48
50
|
}
|
|
49
51
|
var Anthropic_TextGeneration = async (input, model, update_progress, signal) => {
|
|
52
|
+
const logger = getLogger();
|
|
53
|
+
const timerLabel = `anthropic:TextGeneration:${model?.provider_config?.model_name}`;
|
|
54
|
+
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
50
55
|
update_progress(0, "Starting Anthropic text generation");
|
|
51
56
|
const client = await getClient(model);
|
|
52
57
|
const modelName = getModelName(model);
|
|
@@ -59,6 +64,7 @@ var Anthropic_TextGeneration = async (input, model, update_progress, signal) =>
|
|
|
59
64
|
}, { signal });
|
|
60
65
|
const text = response.content[0]?.type === "text" ? response.content[0].text : "";
|
|
61
66
|
update_progress(100, "Completed Anthropic text generation");
|
|
67
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
|
|
62
68
|
return { text };
|
|
63
69
|
};
|
|
64
70
|
var Anthropic_TextRewriter = async (input, model, update_progress, signal) => {
|
|
@@ -149,16 +155,76 @@ var Anthropic_CountTokens = async (input, model, onProgress, signal) => {
|
|
|
149
155
|
var Anthropic_CountTokens_Reactive = async (input, _output, _model) => {
|
|
150
156
|
return { count: Math.ceil(input.text.length / 4) };
|
|
151
157
|
};
|
|
158
|
+
var Anthropic_StructuredGeneration = async (input, model, update_progress, signal, outputSchema) => {
|
|
159
|
+
update_progress(0, "Starting Anthropic structured generation");
|
|
160
|
+
const client = await getClient(model);
|
|
161
|
+
const modelName = getModelName(model);
|
|
162
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
163
|
+
const response = await client.messages.create({
|
|
164
|
+
model: modelName,
|
|
165
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
166
|
+
tools: [
|
|
167
|
+
{
|
|
168
|
+
name: "structured_output",
|
|
169
|
+
description: "Output structured data conforming to the schema",
|
|
170
|
+
input_schema: schema
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
tool_choice: { type: "tool", name: "structured_output" },
|
|
174
|
+
max_tokens: getMaxTokens(input, model)
|
|
175
|
+
}, { signal });
|
|
176
|
+
const toolBlock = response.content.find((b) => b.type === "tool_use");
|
|
177
|
+
const object = toolBlock?.input ?? {};
|
|
178
|
+
update_progress(100, "Completed Anthropic structured generation");
|
|
179
|
+
return { object };
|
|
180
|
+
};
|
|
181
|
+
var Anthropic_StructuredGeneration_Stream = async function* (input, model, signal, outputSchema) {
|
|
182
|
+
const client = await getClient(model);
|
|
183
|
+
const modelName = getModelName(model);
|
|
184
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
185
|
+
const stream = client.messages.stream({
|
|
186
|
+
model: modelName,
|
|
187
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
188
|
+
tools: [
|
|
189
|
+
{
|
|
190
|
+
name: "structured_output",
|
|
191
|
+
description: "Output structured data conforming to the schema",
|
|
192
|
+
input_schema: schema
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
tool_choice: { type: "tool", name: "structured_output" },
|
|
196
|
+
max_tokens: getMaxTokens(input, model)
|
|
197
|
+
}, { signal });
|
|
198
|
+
let accumulatedJson = "";
|
|
199
|
+
for await (const event of stream) {
|
|
200
|
+
if (event.type === "content_block_delta" && event.delta.type === "input_json_delta") {
|
|
201
|
+
accumulatedJson += event.delta.partial_json;
|
|
202
|
+
const partial = parsePartialJson(accumulatedJson);
|
|
203
|
+
if (partial !== undefined) {
|
|
204
|
+
yield { type: "object-delta", port: "object", objectDelta: partial };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
let finalObject;
|
|
209
|
+
try {
|
|
210
|
+
finalObject = JSON.parse(accumulatedJson);
|
|
211
|
+
} catch {
|
|
212
|
+
finalObject = parsePartialJson(accumulatedJson) ?? {};
|
|
213
|
+
}
|
|
214
|
+
yield { type: "finish", data: { object: finalObject } };
|
|
215
|
+
};
|
|
152
216
|
var ANTHROPIC_TASKS = {
|
|
153
217
|
CountTokensTask: Anthropic_CountTokens,
|
|
154
218
|
TextGenerationTask: Anthropic_TextGeneration,
|
|
155
219
|
TextRewriterTask: Anthropic_TextRewriter,
|
|
156
|
-
TextSummaryTask: Anthropic_TextSummary
|
|
220
|
+
TextSummaryTask: Anthropic_TextSummary,
|
|
221
|
+
StructuredGenerationTask: Anthropic_StructuredGeneration
|
|
157
222
|
};
|
|
158
223
|
var ANTHROPIC_STREAM_TASKS = {
|
|
159
224
|
TextGenerationTask: Anthropic_TextGeneration_Stream,
|
|
160
225
|
TextRewriterTask: Anthropic_TextRewriter_Stream,
|
|
161
|
-
TextSummaryTask: Anthropic_TextSummary_Stream
|
|
226
|
+
TextSummaryTask: Anthropic_TextSummary_Stream,
|
|
227
|
+
StructuredGenerationTask: Anthropic_StructuredGeneration_Stream
|
|
162
228
|
};
|
|
163
229
|
var ANTHROPIC_REACTIVE_TASKS = {
|
|
164
230
|
CountTokensTask: Anthropic_CountTokens_Reactive
|
|
@@ -168,7 +234,7 @@ var ANTHROPIC_REACTIVE_TASKS = {
|
|
|
168
234
|
function ANTHROPIC_WORKER_JOBRUN_REGISTER() {
|
|
169
235
|
const workerServer = globalServiceRegistry.get(WORKER_SERVER);
|
|
170
236
|
new AnthropicProvider(ANTHROPIC_TASKS, ANTHROPIC_STREAM_TASKS, ANTHROPIC_REACTIVE_TASKS).registerOnWorkerServer(workerServer);
|
|
171
|
-
|
|
237
|
+
workerServer.sendReady();
|
|
172
238
|
console.log("ANTHROPIC_WORKER_JOBRUN registered");
|
|
173
239
|
}
|
|
174
240
|
export {
|
|
@@ -178,6 +244,8 @@ export {
|
|
|
178
244
|
Anthropic_TextRewriter,
|
|
179
245
|
Anthropic_TextGeneration_Stream,
|
|
180
246
|
Anthropic_TextGeneration,
|
|
247
|
+
Anthropic_StructuredGeneration_Stream,
|
|
248
|
+
Anthropic_StructuredGeneration,
|
|
181
249
|
Anthropic_CountTokens_Reactive,
|
|
182
250
|
Anthropic_CountTokens,
|
|
183
251
|
AnthropicProvider,
|
|
@@ -191,4 +259,4 @@ export {
|
|
|
191
259
|
ANTHROPIC
|
|
192
260
|
};
|
|
193
261
|
|
|
194
|
-
//# debugId=
|
|
262
|
+
//# debugId=07CD1896A9224D4A64756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/anthropic/Anthropic_Worker.ts", "../src/anthropic/common/Anthropic_JobRunFns.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { globalServiceRegistry,
|
|
6
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { AnthropicModelConfig } from \"./Anthropic_ModelSchema\";\n\nlet _sdk: typeof import(\"@anthropic-ai/sdk\") | undefined;\nasync function loadAnthropicSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"@anthropic-ai/sdk\");\n } catch {\n throw new Error(\n \"@anthropic-ai/sdk is required for Anthropic tasks. Install it with: bun add @anthropic-ai/sdk\"\n );\n }\n }\n return _sdk.default;\n}\n\nasync function getClient(model: AnthropicModelConfig | undefined) {\n const Anthropic = await loadAnthropicSDK();\n const apiKey =\n model?.provider_config?.api_key ||\n (typeof process !== \"undefined\" ? process.env?.ANTHROPIC_API_KEY : undefined);\n if (!apiKey) {\n throw new Error(\n \"Missing Anthropic API key: set provider_config.api_key or the ANTHROPIC_API_KEY environment variable.\"\n );\n }\n return new Anthropic({\n apiKey,\n baseURL: model?.provider_config?.base_url || undefined,\n dangerouslyAllowBrowser: true,\n });\n}\n\nfunction getModelName(model: AnthropicModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n\nfunction getMaxTokens(\n input: { maxTokens?: number },\n model: AnthropicModelConfig | undefined\n): number {\n return input.maxTokens ?? model?.provider_config?.max_tokens ?? 1024;\n}\n\nexport const Anthropic_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Anthropic text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: getMaxTokens(input, model),\n temperature: input.temperature,\n top_p: input.topP,\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text generation\");\n return { text };\n};\n\nexport const Anthropic_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Anthropic text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n system: input.prompt,\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text rewriting\");\n return { text };\n};\n\nexport const Anthropic_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Anthropic text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n system: \"Summarize the following text concisely.\",\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text summarization\");\n return { text };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Anthropic_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: getMaxTokens(input, model),\n temperature: input.temperature,\n top_p: input.topP,\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n\nexport const Anthropic_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n system: input.prompt,\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n\nexport const Anthropic_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n system: \"Summarize the following text concisely.\",\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n\nexport const Anthropic_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n AnthropicModelConfig\n> = async (input, model, onProgress, signal) => {\n const client = await getClient(model);\n const result = await client.messages.countTokens({\n model: getModelName(model),\n messages: [{ role: \"user\", content: input.text }],\n });\n return { count: result.input_tokens };\n};\n\nexport const Anthropic_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n AnthropicModelConfig\n> = async (input, _output, _model) => {\n return { count: Math.ceil(input.text.length / 4) };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const ANTHROPIC_TASKS: Record<string, AiProviderRunFn<any, any, AnthropicModelConfig>> = {\n CountTokensTask: Anthropic_CountTokens,\n TextGenerationTask: Anthropic_TextGeneration,\n TextRewriterTask: Anthropic_TextRewriter,\n TextSummaryTask: Anthropic_TextSummary,\n};\n\nexport const ANTHROPIC_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, AnthropicModelConfig>\n> = {\n TextGenerationTask: Anthropic_TextGeneration_Stream,\n TextRewriterTask: Anthropic_TextRewriter_Stream,\n TextSummaryTask: Anthropic_TextSummary_Stream,\n};\n\nexport const ANTHROPIC_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, AnthropicModelConfig>\n> = {\n CountTokensTask: Anthropic_CountTokens_Reactive,\n};\n"
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { globalServiceRegistry, WORKER_SERVER } from \"@workglow/util\";\nimport { AnthropicProvider } from \"./AnthropicProvider\";\nimport {\n ANTHROPIC_REACTIVE_TASKS,\n ANTHROPIC_STREAM_TASKS,\n ANTHROPIC_TASKS,\n} from \"./common/Anthropic_JobRunFns\";\n\nexport function ANTHROPIC_WORKER_JOBRUN_REGISTER() {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new AnthropicProvider(\n ANTHROPIC_TASKS,\n ANTHROPIC_STREAM_TASKS,\n ANTHROPIC_REACTIVE_TASKS\n ).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n console.log(\"ANTHROPIC_WORKER_JOBRUN registered\");\n}\n",
|
|
6
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger, parsePartialJson } from \"@workglow/util\";\nimport type { AnthropicModelConfig } from \"./Anthropic_ModelSchema\";\n\nlet _sdk: typeof import(\"@anthropic-ai/sdk\") | undefined;\nasync function loadAnthropicSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"@anthropic-ai/sdk\");\n } catch {\n throw new Error(\n \"@anthropic-ai/sdk is required for Anthropic tasks. Install it with: bun add @anthropic-ai/sdk\"\n );\n }\n }\n return _sdk.default;\n}\n\ninterface ResolvedProviderConfig {\n readonly credential_key?: string;\n readonly api_key?: string;\n readonly model_name?: string;\n readonly base_url?: string;\n readonly max_tokens?: number;\n}\n\nasync function getClient(model: AnthropicModelConfig | undefined) {\n const Anthropic = await loadAnthropicSDK();\n const config = model?.provider_config as ResolvedProviderConfig | undefined;\n const apiKey =\n config?.credential_key ||\n config?.api_key ||\n (typeof process !== \"undefined\" ? process.env?.ANTHROPIC_API_KEY : undefined);\n if (!apiKey) {\n throw new Error(\n \"Missing Anthropic API key: set provider_config.credential_key or the ANTHROPIC_API_KEY environment variable.\"\n );\n }\n return new Anthropic({\n apiKey,\n baseURL: config?.base_url || undefined,\n dangerouslyAllowBrowser: true,\n });\n}\n\nfunction getModelName(model: AnthropicModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n\nfunction getMaxTokens(\n input: { maxTokens?: number },\n model: AnthropicModelConfig | undefined\n): number {\n return input.maxTokens ?? model?.provider_config?.max_tokens ?? 1024;\n}\n\nexport const Anthropic_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `anthropic:TextGeneration:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting Anthropic text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: getMaxTokens(input, model),\n temperature: input.temperature,\n top_p: input.topP,\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text generation\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { text };\n};\n\nexport const Anthropic_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Anthropic text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n system: input.prompt,\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text rewriting\");\n return { text };\n};\n\nexport const Anthropic_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Anthropic text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.messages.create(\n {\n model: modelName,\n system: \"Summarize the following text concisely.\",\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n const text = response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n update_progress(100, \"Completed Anthropic text summarization\");\n return { text };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Anthropic_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: getMaxTokens(input, model),\n temperature: input.temperature,\n top_p: input.topP,\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n\nexport const Anthropic_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n system: input.prompt,\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n\nexport const Anthropic_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n AnthropicModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = client.messages.stream(\n {\n model: modelName,\n system: \"Summarize the following text concisely.\",\n messages: [{ role: \"user\", content: input.text }],\n max_tokens: getMaxTokens({}, model),\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text-delta\", port: \"text\", textDelta: event.delta.text };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n\nexport const Anthropic_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n AnthropicModelConfig\n> = async (input, model, onProgress, signal) => {\n const client = await getClient(model);\n const result = await client.messages.countTokens({\n model: getModelName(model),\n messages: [{ role: \"user\", content: input.text }],\n });\n return { count: result.input_tokens };\n};\n\nexport const Anthropic_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n AnthropicModelConfig\n> = async (input, _output, _model) => {\n return { count: Math.ceil(input.text.length / 4) };\n};\n\n// ========================================================================\n// Structured output implementations (object mode)\n// ========================================================================\n\nexport const Anthropic_StructuredGeneration: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n AnthropicModelConfig\n> = async (input, model, update_progress, signal, outputSchema) => {\n update_progress(0, \"Starting Anthropic structured generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const schema = input.outputSchema ?? outputSchema;\n\n const response = await client.messages.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n tools: [\n {\n name: \"structured_output\",\n description: \"Output structured data conforming to the schema\",\n input_schema: schema as any,\n },\n ],\n tool_choice: { type: \"tool\" as const, name: \"structured_output\" },\n max_tokens: getMaxTokens(input, model),\n },\n { signal }\n );\n\n const toolBlock = response.content.find((b: any) => b.type === \"tool_use\") as any;\n const object = toolBlock?.input ?? {};\n\n update_progress(100, \"Completed Anthropic structured generation\");\n return { object };\n};\n\nexport const Anthropic_StructuredGeneration_Stream: AiProviderStreamFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n AnthropicModelConfig\n> = async function* (\n input,\n model,\n signal,\n outputSchema\n): AsyncIterable<StreamEvent<StructuredGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const schema = input.outputSchema ?? outputSchema;\n\n const stream = client.messages.stream(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n tools: [\n {\n name: \"structured_output\",\n description: \"Output structured data conforming to the schema\",\n input_schema: schema as any,\n },\n ],\n tool_choice: { type: \"tool\" as const, name: \"structured_output\" },\n max_tokens: getMaxTokens(input, model),\n },\n { signal }\n );\n\n let accumulatedJson = \"\";\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && (event.delta as any).type === \"input_json_delta\") {\n accumulatedJson += (event.delta as any).partial_json;\n const partial = parsePartialJson(accumulatedJson);\n if (partial !== undefined) {\n yield { type: \"object-delta\", port: \"object\", objectDelta: partial };\n }\n }\n }\n\n let finalObject: Record<string, unknown>;\n try {\n finalObject = JSON.parse(accumulatedJson);\n } catch {\n finalObject = parsePartialJson(accumulatedJson) ?? {};\n }\n yield { type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const ANTHROPIC_TASKS: Record<string, AiProviderRunFn<any, any, AnthropicModelConfig>> = {\n CountTokensTask: Anthropic_CountTokens,\n TextGenerationTask: Anthropic_TextGeneration,\n TextRewriterTask: Anthropic_TextRewriter,\n TextSummaryTask: Anthropic_TextSummary,\n StructuredGenerationTask: Anthropic_StructuredGeneration,\n};\n\nexport const ANTHROPIC_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, AnthropicModelConfig>\n> = {\n TextGenerationTask: Anthropic_TextGeneration_Stream,\n TextRewriterTask: Anthropic_TextRewriter_Stream,\n TextSummaryTask: Anthropic_TextSummary_Stream,\n StructuredGenerationTask: Anthropic_StructuredGeneration_Stream,\n};\n\nexport const ANTHROPIC_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, AnthropicModelConfig>\n> = {\n CountTokensTask: Anthropic_CountTokens_Reactive,\n};\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;AAMA;;;ACgBA,IAAI;AACJ,eAAe,gBAAgB,GAAG;AAAA,EAChC,IAAI,CAAC,MAAM;AAAA,IACT,IAAI;AAAA,MACF,OAAO,MAAa;AAAA,MACpB,MAAM;AAAA,MACN,MAAM,IAAI,MACR,+FACF;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO,KAAK;AAAA;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": ";;;;;;;;;;;;AAMA;;;ACgBA;AAGA,IAAI;AACJ,eAAe,gBAAgB,GAAG;AAAA,EAChC,IAAI,CAAC,MAAM;AAAA,IACT,IAAI;AAAA,MACF,OAAO,MAAa;AAAA,MACpB,MAAM;AAAA,MACN,MAAM,IAAI,MACR,+FACF;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO,KAAK;AAAA;AAWd,eAAe,SAAS,CAAC,OAAyC;AAAA,EAChE,MAAM,YAAY,MAAM,iBAAiB;AAAA,EACzC,MAAM,SAAS,OAAO;AAAA,EACtB,MAAM,SACJ,QAAQ,kBACR,QAAQ,YACP,OAAO,YAAY,cAAc,QAAQ,KAAK,oBAAoB;AAAA,EACrE,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MACR,8GACF;AAAA,EACF;AAAA,EACA,OAAO,IAAI,UAAU;AAAA,IACnB;AAAA,IACA,SAAS,QAAQ,YAAY;AAAA,IAC7B,yBAAyB;AAAA,EAC3B,CAAC;AAAA;AAGH,SAAS,YAAY,CAAC,OAAiD;AAAA,EACrE,MAAM,OAAO,OAAO,iBAAiB;AAAA,EACrC,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,YAAY,CACnB,OACA,OACQ;AAAA,EACR,OAAO,MAAM,aAAa,OAAO,iBAAiB,cAAc;AAAA;AAG3D,IAAM,2BAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,aAAa,4BAA4B,OAAO,iBAAiB;AAAA,EACvE,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,iBAAiB,WAAW,CAAC;AAAA,EAErE,gBAAgB,GAAG,oCAAoC;AAAA,EACvD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,SAAS,OACrC;AAAA,IACE,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,YAAY,aAAa,OAAO,KAAK;AAAA,IACrC,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,EACf,GACA,EAAE,OAAO,CACX;AAAA,EAEA,MAAM,OAAO,SAAS,QAAQ,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG,OAAO;AAAA,EAE/E,gBAAgB,KAAK,qCAAqC;AAAA,EAC1D,OAAO,QAAQ,YAAY,EAAE,OAAO,OAAO,iBAAiB,WAAW,CAAC;AAAA,EACxE,OAAO,EAAE,KAAK;AAAA;AAGT,IAAM,yBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,mCAAmC;AAAA,EACtD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,SAAS,OACrC;AAAA,IACE,OAAO;AAAA,IACP,QAAQ,MAAM;AAAA,IACd,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AAAA,IAChD,YAAY,aAAa,CAAC,GAAG,KAAK;AAAA,EACpC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,MAAM,OAAO,SAAS,QAAQ,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG,OAAO;AAAA,EAE/E,gBAAgB,KAAK,oCAAoC;AAAA,EACzD,OAAO,EAAE,KAAK;AAAA;AAGT,IAAM,wBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,uCAAuC;AAAA,EAC1D,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,SAAS,OACrC;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AAAA,IAChD,YAAY,aAAa,CAAC,GAAG,KAAK;AAAA,EACpC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,MAAM,OAAO,SAAS,QAAQ,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG,OAAO;AAAA,EAE/E,gBAAgB,KAAK,wCAAwC;AAAA,EAC7D,OAAO,EAAE,KAAK;AAAA;AAOT,IAAM,kCAIT,gBAAgB,CAAC,OAAO,OAAO,QAA8D;AAAA,EAC/F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,OAAO,SAAS,OAC7B;AAAA,IACE,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,YAAY,aAAa,OAAO,KAAK;AAAA,IACrC,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,EACf,GACA,EAAE,OAAO,CACX;AAAA,EAEA,iBAAiB,SAAS,QAAQ;AAAA,IAChC,IAAI,MAAM,SAAS,yBAAyB,MAAM,MAAM,SAAS,cAAc;AAAA,MAC7E,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM,MAAM,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA8B;AAAA;AAGxD,IAAM,gCAIT,gBAAgB,CAAC,OAAO,OAAO,QAA4D;AAAA,EAC7F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,OAAO,SAAS,OAC7B;AAAA,IACE,OAAO;AAAA,IACP,QAAQ,MAAM;AAAA,IACd,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AAAA,IAChD,YAAY,aAAa,CAAC,GAAG,KAAK;AAAA,EACpC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,iBAAiB,SAAS,QAAQ;AAAA,IAChC,IAAI,MAAM,SAAS,yBAAyB,MAAM,MAAM,SAAS,cAAc;AAAA,MAC7E,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM,MAAM,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA4B;AAAA;AAGtD,IAAM,+BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,OAAO,SAAS,OAC7B;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AAAA,IAChD,YAAY,aAAa,CAAC,GAAG,KAAK;AAAA,EACpC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,iBAAiB,SAAS,QAAQ;AAAA,IAChC,IAAI,MAAM,SAAS,yBAAyB,MAAM,MAAM,SAAS,cAAc;AAAA,MAC7E,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM,MAAM,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA2B;AAAA;AAGrD,IAAM,wBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,SAAS,MAAM,OAAO,SAAS,YAAY;AAAA,IAC/C,OAAO,aAAa,KAAK;AAAA,IACzB,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AAAA,EAClD,CAAC;AAAA,EACD,OAAO,EAAE,OAAO,OAAO,aAAa;AAAA;AAG/B,IAAM,iCAIT,OAAO,OAAO,SAAS,WAAW;AAAA,EACpC,OAAO,EAAE,OAAO,KAAK,KAAK,MAAM,KAAK,SAAS,CAAC,EAAE;AAAA;AAO5C,IAAM,iCAIT,OAAO,OAAO,OAAO,iBAAiB,QAAQ,iBAAiB;AAAA,EACjE,gBAAgB,GAAG,0CAA0C;AAAA,EAC7D,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,MAAM,gBAAgB;AAAA,EAErC,MAAM,WAAW,MAAM,OAAO,SAAS,OACrC;AAAA,IACE,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,aAAa,EAAE,MAAM,QAAiB,MAAM,oBAAoB;AAAA,IAChE,YAAY,aAAa,OAAO,KAAK;AAAA,EACvC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,MAAM,YAAY,SAAS,QAAQ,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU;AAAA,EACzE,MAAM,SAAS,WAAW,SAAS,CAAC;AAAA,EAEpC,gBAAgB,KAAK,2CAA2C;AAAA,EAChE,OAAO,EAAE,OAAO;AAAA;AAGX,IAAM,wCAIT,gBAAgB,CAClB,OACA,OACA,QACA,cAC4D;AAAA,EAC5D,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,MAAM,gBAAgB;AAAA,EAErC,MAAM,SAAS,OAAO,SAAS,OAC7B;AAAA,IACE,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,aAAa,EAAE,MAAM,QAAiB,MAAM,oBAAoB;AAAA,IAChE,YAAY,aAAa,OAAO,KAAK;AAAA,EACvC,GACA,EAAE,OAAO,CACX;AAAA,EAEA,IAAI,kBAAkB;AAAA,EACtB,iBAAiB,SAAS,QAAQ;AAAA,IAChC,IAAI,MAAM,SAAS,yBAA0B,MAAM,MAAc,SAAS,oBAAoB;AAAA,MAC5F,mBAAoB,MAAM,MAAc;AAAA,MACxC,MAAM,UAAU,iBAAiB,eAAe;AAAA,MAChD,IAAI,YAAY,WAAW;AAAA,QACzB,MAAM,EAAE,MAAM,gBAAgB,MAAM,UAAU,aAAa,QAAQ;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,cAAc,KAAK,MAAM,eAAe;AAAA,IACxC,MAAM;AAAA,IACN,cAAc,iBAAiB,eAAe,KAAK,CAAC;AAAA;AAAA,EAEtD,MAAM,EAAE,MAAM,UAAU,MAAM,EAAE,QAAQ,YAAY,EAAoC;AAAA;AAOnF,IAAM,kBAAmF;AAAA,EAC9F,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,0BAA0B;AAC5B;AAEO,IAAM,yBAGT;AAAA,EACF,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,0BAA0B;AAC5B;AAEO,IAAM,2BAGT;AAAA,EACF,iBAAiB;AACnB;;;ADlXO,SAAS,gCAAgC,GAAG;AAAA,EACjD,MAAM,eAAe,sBAAsB,IAAI,aAAa;AAAA,EAC5D,IAAI,kBACF,iBACA,wBACA,wBACF,EAAE,uBAAuB,YAAY;AAAA,EACrC,aAAa,UAAU;AAAA,EACvB,QAAQ,IAAI,oCAAoC;AAAA;",
|
|
9
|
+
"debugId": "07CD1896A9224D4A64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -30,7 +30,7 @@ import type { GeminiModelConfig } from "./common/Gemini_ModelSchema";
|
|
|
30
30
|
*/
|
|
31
31
|
export declare class GoogleGeminiProvider extends AiProvider<GeminiModelConfig> {
|
|
32
32
|
readonly name = "GOOGLE_GEMINI";
|
|
33
|
-
readonly taskTypes: readonly ["CountTokensTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask"];
|
|
33
|
+
readonly taskTypes: readonly ["CountTokensTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "StructuredGenerationTask"];
|
|
34
34
|
constructor(tasks?: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, GeminiModelConfig>>, reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, GeminiModelConfig>>);
|
|
35
35
|
}
|
|
36
36
|
//# sourceMappingURL=GoogleGeminiProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleGeminiProvider.d.ts","sourceRoot":"","sources":["../../src/google-gemini/GoogleGeminiProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IACrE,QAAQ,CAAC,IAAI,mBAAiB;IAE9B,QAAQ,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"GoogleGeminiProvider.d.ts","sourceRoot":"","sources":["../../src/google-gemini/GoogleGeminiProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IACrE,QAAQ,CAAC,IAAI,mBAAiB;IAE9B,QAAQ,CAAC,SAAS,6IAOP;gBAGT,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAC7E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;CAIvF"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn, CountTokensTaskInput, CountTokensTaskOutput, TextEmbeddingTaskInput, TextEmbeddingTaskOutput, TextGenerationTaskInput, TextGenerationTaskOutput, TextRewriterTaskInput, TextRewriterTaskOutput, TextSummaryTaskInput, TextSummaryTaskOutput } from "@workglow/ai";
|
|
6
|
+
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn, CountTokensTaskInput, CountTokensTaskOutput, StructuredGenerationTaskInput, StructuredGenerationTaskOutput, TextEmbeddingTaskInput, TextEmbeddingTaskOutput, TextGenerationTaskInput, TextGenerationTaskOutput, TextRewriterTaskInput, TextRewriterTaskOutput, TextSummaryTaskInput, TextSummaryTaskOutput } from "@workglow/ai";
|
|
7
7
|
import type { GeminiModelConfig } from "./Gemini_ModelSchema";
|
|
8
8
|
export declare const Gemini_TextGeneration: AiProviderRunFn<TextGenerationTaskInput, TextGenerationTaskOutput, GeminiModelConfig>;
|
|
9
9
|
export declare const Gemini_TextEmbedding: AiProviderRunFn<TextEmbeddingTaskInput, TextEmbeddingTaskOutput, GeminiModelConfig>;
|
|
@@ -14,6 +14,8 @@ export declare const Gemini_TextRewriter_Stream: AiProviderStreamFn<TextRewriter
|
|
|
14
14
|
export declare const Gemini_TextSummary_Stream: AiProviderStreamFn<TextSummaryTaskInput, TextSummaryTaskOutput, GeminiModelConfig>;
|
|
15
15
|
export declare const Gemini_CountTokens: AiProviderRunFn<CountTokensTaskInput, CountTokensTaskOutput, GeminiModelConfig>;
|
|
16
16
|
export declare const Gemini_CountTokens_Reactive: AiProviderReactiveRunFn<CountTokensTaskInput, CountTokensTaskOutput, GeminiModelConfig>;
|
|
17
|
+
export declare const Gemini_StructuredGeneration: AiProviderRunFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, GeminiModelConfig>;
|
|
18
|
+
export declare const Gemini_StructuredGeneration_Stream: AiProviderStreamFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, GeminiModelConfig>;
|
|
17
19
|
export declare const GEMINI_TASKS: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>>;
|
|
18
20
|
export declare const GEMINI_STREAM_TASKS: Record<string, AiProviderStreamFn<any, any, GeminiModelConfig>>;
|
|
19
21
|
export declare const GEMINI_REACTIVE_TASKS: Record<string, AiProviderReactiveRunFn<any, any, GeminiModelConfig>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/google-gemini/common/Gemini_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Gemini_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/google-gemini/common/Gemini_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,6BAA6B,EAC7B,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA+C9D,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CA0BlB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,CAsClB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAC/C,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CAiBlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAiBlB,CAAC;AAMF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CAyBlB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CACzD,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CAqBlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAqBlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAOlB,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,uBAAuB,CAC/D,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAGlB,CAAC;AAMF,eAAO,MAAM,2BAA2B,EAAE,eAAe,CACvD,6BAA6B,EAC7B,8BAA8B,EAC9B,iBAAiB,CAyBlB,CAAC;AAEF,eAAO,MAAM,kCAAkC,EAAE,kBAAkB,CACjE,6BAA6B,EAC7B,8BAA8B,EAC9B,iBAAiB,CA8ClB,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAOrF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAMhD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAGrD,CAAC"}
|
|
@@ -19,9 +19,11 @@ export declare const GeminiModelSchema: {
|
|
|
19
19
|
readonly type: "string";
|
|
20
20
|
readonly description: "The Gemini model identifier (e.g., 'gemini-2.0-flash', 'text-embedding-004').";
|
|
21
21
|
};
|
|
22
|
-
readonly
|
|
22
|
+
readonly credential_key: {
|
|
23
23
|
readonly type: "string";
|
|
24
|
-
readonly
|
|
24
|
+
readonly format: "credential";
|
|
25
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
26
|
+
readonly "x-ui-hidden": true;
|
|
25
27
|
};
|
|
26
28
|
readonly embedding_task_type: {
|
|
27
29
|
readonly oneOf: readonly [{
|
|
@@ -56,9 +58,11 @@ export declare const GeminiModelRecordSchema: {
|
|
|
56
58
|
readonly type: "string";
|
|
57
59
|
readonly description: "The Gemini model identifier (e.g., 'gemini-2.0-flash', 'text-embedding-004').";
|
|
58
60
|
};
|
|
59
|
-
readonly
|
|
61
|
+
readonly credential_key: {
|
|
60
62
|
readonly type: "string";
|
|
61
|
-
readonly
|
|
63
|
+
readonly format: "credential";
|
|
64
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
65
|
+
readonly "x-ui-hidden": true;
|
|
62
66
|
};
|
|
63
67
|
readonly embedding_task_type: {
|
|
64
68
|
readonly oneOf: readonly [{
|
|
@@ -116,9 +120,11 @@ export declare const GeminiModelConfigSchema: {
|
|
|
116
120
|
readonly type: "string";
|
|
117
121
|
readonly description: "The Gemini model identifier (e.g., 'gemini-2.0-flash', 'text-embedding-004').";
|
|
118
122
|
};
|
|
119
|
-
readonly
|
|
123
|
+
readonly credential_key: {
|
|
120
124
|
readonly type: "string";
|
|
121
|
-
readonly
|
|
125
|
+
readonly format: "credential";
|
|
126
|
+
readonly description: "Key to look up in the credential store for the API key.";
|
|
127
|
+
readonly "x-ui-hidden": true;
|
|
122
128
|
};
|
|
123
129
|
readonly embedding_task_type: {
|
|
124
130
|
readonly oneOf: readonly [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/google-gemini/common/Gemini_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"Gemini_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/google-gemini/common/Gemini_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CW,CAAC;AAE1C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQK,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE3E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQK,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
@@ -4,11 +4,12 @@ import {
|
|
|
4
4
|
GeminiModelRecordSchema,
|
|
5
5
|
GeminiModelSchema,
|
|
6
6
|
GoogleGeminiProvider
|
|
7
|
-
} from "../index-
|
|
7
|
+
} from "../index-gjc388y4.js";
|
|
8
8
|
import {
|
|
9
9
|
__require
|
|
10
|
-
} from "../index-
|
|
10
|
+
} from "../index-6j5pq722.js";
|
|
11
11
|
// src/google-gemini/common/Gemini_JobRunFns.ts
|
|
12
|
+
import { getLogger, parsePartialJson } from "@workglow/util";
|
|
12
13
|
var _sdk;
|
|
13
14
|
async function loadGeminiSDK() {
|
|
14
15
|
if (!_sdk) {
|
|
@@ -21,9 +22,10 @@ async function loadGeminiSDK() {
|
|
|
21
22
|
return _sdk.GoogleGenerativeAI;
|
|
22
23
|
}
|
|
23
24
|
function getApiKey(model) {
|
|
24
|
-
const
|
|
25
|
+
const config = model?.provider_config;
|
|
26
|
+
const apiKey = config?.credential_key || config?.api_key || (typeof process !== "undefined" ? process.env?.GOOGLE_API_KEY || process.env?.GEMINI_API_KEY : undefined);
|
|
25
27
|
if (!apiKey) {
|
|
26
|
-
throw new Error("Missing Google API key: set provider_config.
|
|
28
|
+
throw new Error("Missing Google API key: set provider_config.credential_key or the GOOGLE_API_KEY / GEMINI_API_KEY environment variable.");
|
|
27
29
|
}
|
|
28
30
|
return apiKey;
|
|
29
31
|
}
|
|
@@ -35,6 +37,9 @@ function getModelName(model) {
|
|
|
35
37
|
return name;
|
|
36
38
|
}
|
|
37
39
|
var Gemini_TextGeneration = async (input, model, update_progress, signal) => {
|
|
40
|
+
const logger = getLogger();
|
|
41
|
+
const timerLabel = `gemini:TextGeneration:${model?.provider_config?.model_name}`;
|
|
42
|
+
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
38
43
|
update_progress(0, "Starting Gemini text generation");
|
|
39
44
|
const GoogleGenerativeAI = await loadGeminiSDK();
|
|
40
45
|
const genAI = new GoogleGenerativeAI(getApiKey(model));
|
|
@@ -51,9 +56,13 @@ var Gemini_TextGeneration = async (input, model, update_progress, signal) => {
|
|
|
51
56
|
});
|
|
52
57
|
const text = result.response.text();
|
|
53
58
|
update_progress(100, "Completed Gemini text generation");
|
|
59
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
|
|
54
60
|
return { text };
|
|
55
61
|
};
|
|
56
62
|
var Gemini_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
63
|
+
const logger = getLogger();
|
|
64
|
+
const timerLabel = `gemini:TextEmbedding:${model?.provider_config?.model_name}`;
|
|
65
|
+
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
57
66
|
update_progress(0, "Starting Gemini text embedding");
|
|
58
67
|
const GoogleGenerativeAI = await loadGeminiSDK();
|
|
59
68
|
const genAI = new GoogleGenerativeAI(getApiKey(model));
|
|
@@ -69,6 +78,7 @@ var Gemini_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
|
69
78
|
}))
|
|
70
79
|
});
|
|
71
80
|
update_progress(100, "Completed Gemini text embedding");
|
|
81
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name, batch: true });
|
|
72
82
|
return {
|
|
73
83
|
vector: result2.embeddings.map((e) => new Float32Array(e.values))
|
|
74
84
|
};
|
|
@@ -78,6 +88,7 @@ var Gemini_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
|
78
88
|
taskType
|
|
79
89
|
});
|
|
80
90
|
update_progress(100, "Completed Gemini text embedding");
|
|
91
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
|
|
81
92
|
return { vector: new Float32Array(result.embedding.values) };
|
|
82
93
|
};
|
|
83
94
|
var Gemini_TextRewriter = async (input, model, update_progress, signal) => {
|
|
@@ -172,27 +183,83 @@ var Gemini_CountTokens = async (input, model, onProgress, signal) => {
|
|
|
172
183
|
var Gemini_CountTokens_Reactive = async (input, _output, _model) => {
|
|
173
184
|
return { count: Math.ceil(input.text.length / 4) };
|
|
174
185
|
};
|
|
186
|
+
var Gemini_StructuredGeneration = async (input, model, update_progress, signal, outputSchema) => {
|
|
187
|
+
update_progress(0, "Starting Gemini structured generation");
|
|
188
|
+
const GoogleGenerativeAI = await loadGeminiSDK();
|
|
189
|
+
const genAI = new GoogleGenerativeAI(getApiKey(model));
|
|
190
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
191
|
+
const genModel = genAI.getGenerativeModel({
|
|
192
|
+
model: getModelName(model),
|
|
193
|
+
generationConfig: {
|
|
194
|
+
responseMimeType: "application/json",
|
|
195
|
+
responseSchema: schema,
|
|
196
|
+
maxOutputTokens: input.maxTokens,
|
|
197
|
+
temperature: input.temperature
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
const result = await genModel.generateContent({
|
|
201
|
+
contents: [{ role: "user", parts: [{ text: input.prompt }] }]
|
|
202
|
+
});
|
|
203
|
+
const text = result.response.text();
|
|
204
|
+
update_progress(100, "Completed Gemini structured generation");
|
|
205
|
+
return { object: JSON.parse(text) };
|
|
206
|
+
};
|
|
207
|
+
var Gemini_StructuredGeneration_Stream = async function* (input, model, signal, outputSchema) {
|
|
208
|
+
const GoogleGenerativeAI = await loadGeminiSDK();
|
|
209
|
+
const genAI = new GoogleGenerativeAI(getApiKey(model));
|
|
210
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
211
|
+
const genModel = genAI.getGenerativeModel({
|
|
212
|
+
model: getModelName(model),
|
|
213
|
+
generationConfig: {
|
|
214
|
+
responseMimeType: "application/json",
|
|
215
|
+
responseSchema: schema,
|
|
216
|
+
maxOutputTokens: input.maxTokens,
|
|
217
|
+
temperature: input.temperature
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
const result = await genModel.generateContentStream({ contents: [{ role: "user", parts: [{ text: input.prompt }] }] }, { signal });
|
|
221
|
+
let accumulatedJson = "";
|
|
222
|
+
for await (const chunk of result.stream) {
|
|
223
|
+
const text = chunk.text();
|
|
224
|
+
if (text) {
|
|
225
|
+
accumulatedJson += text;
|
|
226
|
+
const partial = parsePartialJson(accumulatedJson);
|
|
227
|
+
if (partial !== undefined) {
|
|
228
|
+
yield { type: "object-delta", port: "object", objectDelta: partial };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
let finalObject;
|
|
233
|
+
try {
|
|
234
|
+
finalObject = JSON.parse(accumulatedJson);
|
|
235
|
+
} catch {
|
|
236
|
+
finalObject = parsePartialJson(accumulatedJson) ?? {};
|
|
237
|
+
}
|
|
238
|
+
yield { type: "finish", data: { object: finalObject } };
|
|
239
|
+
};
|
|
175
240
|
var GEMINI_TASKS = {
|
|
176
241
|
CountTokensTask: Gemini_CountTokens,
|
|
177
242
|
TextGenerationTask: Gemini_TextGeneration,
|
|
178
243
|
TextEmbeddingTask: Gemini_TextEmbedding,
|
|
179
244
|
TextRewriterTask: Gemini_TextRewriter,
|
|
180
|
-
TextSummaryTask: Gemini_TextSummary
|
|
245
|
+
TextSummaryTask: Gemini_TextSummary,
|
|
246
|
+
StructuredGenerationTask: Gemini_StructuredGeneration
|
|
181
247
|
};
|
|
182
248
|
var GEMINI_STREAM_TASKS = {
|
|
183
249
|
TextGenerationTask: Gemini_TextGeneration_Stream,
|
|
184
250
|
TextRewriterTask: Gemini_TextRewriter_Stream,
|
|
185
|
-
TextSummaryTask: Gemini_TextSummary_Stream
|
|
251
|
+
TextSummaryTask: Gemini_TextSummary_Stream,
|
|
252
|
+
StructuredGenerationTask: Gemini_StructuredGeneration_Stream
|
|
186
253
|
};
|
|
187
254
|
var GEMINI_REACTIVE_TASKS = {
|
|
188
255
|
CountTokensTask: Gemini_CountTokens_Reactive
|
|
189
256
|
};
|
|
190
257
|
// src/google-gemini/Gemini_Worker.ts
|
|
191
|
-
import { globalServiceRegistry,
|
|
258
|
+
import { globalServiceRegistry, WORKER_SERVER } from "@workglow/util";
|
|
192
259
|
function GEMINI_WORKER_JOBRUN_REGISTER() {
|
|
193
260
|
const workerServer = globalServiceRegistry.get(WORKER_SERVER);
|
|
194
261
|
new GoogleGeminiProvider(GEMINI_TASKS, GEMINI_STREAM_TASKS, GEMINI_REACTIVE_TASKS).registerOnWorkerServer(workerServer);
|
|
195
|
-
|
|
262
|
+
workerServer.sendReady();
|
|
196
263
|
console.log("GEMINI_WORKER_JOBRUN registered");
|
|
197
264
|
}
|
|
198
265
|
export {
|
|
@@ -204,6 +271,8 @@ export {
|
|
|
204
271
|
Gemini_TextGeneration_Stream,
|
|
205
272
|
Gemini_TextGeneration,
|
|
206
273
|
Gemini_TextEmbedding,
|
|
274
|
+
Gemini_StructuredGeneration_Stream,
|
|
275
|
+
Gemini_StructuredGeneration,
|
|
207
276
|
Gemini_CountTokens_Reactive,
|
|
208
277
|
Gemini_CountTokens,
|
|
209
278
|
GeminiModelSchema,
|
|
@@ -216,4 +285,4 @@ export {
|
|
|
216
285
|
GEMINI_REACTIVE_TASKS
|
|
217
286
|
};
|
|
218
287
|
|
|
219
|
-
//# debugId=
|
|
288
|
+
//# debugId=6734BACB9F812E2364756E2164756E21
|