@workglow/ai-provider 0.0.105 → 0.0.107
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/README.md +39 -13
- package/dist/{HFT_JobRunFns-bpedvh0r.js → HFT_JobRunFns-c40ex37f.js} +12 -4
- package/dist/{HFT_JobRunFns-bpedvh0r.js.map → HFT_JobRunFns-c40ex37f.js.map} +1 -1
- 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.map +1 -1
- package/dist/anthropic/index.js +142 -4
- package/dist/anthropic/index.js.map +3 -3
- 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.map +1 -1
- package/dist/google-gemini/index.js +116 -4
- package/dist/google-gemini/index.js.map +3 -3
- package/dist/hf-transformers/HuggingFaceTransformersProvider.d.ts +5 -5
- package/dist/hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts +113 -3
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/hf-transformers/index.js +16 -8
- package/dist/hf-transformers/index.js.map +2 -2
- package/dist/{index-w496eeda.js → index-14pbwsc9.js} +3 -2
- package/dist/{index-w496eeda.js.map → index-14pbwsc9.js.map} +3 -3
- package/dist/{index-3345vk2h.js → index-4fr8p4gy.js} +303 -5
- package/dist/index-4fr8p4gy.js.map +10 -0
- package/dist/{index-gjc388y4.js → index-5hjgs1z7.js} +3 -2
- package/dist/{index-gjc388y4.js.map → index-5hjgs1z7.js.map} +4 -4
- package/dist/{index-c5z3v9gn.js → index-5qjdc78z.js} +3 -2
- package/dist/{index-c5z3v9gn.js.map → index-5qjdc78z.js.map} +4 -4
- package/dist/{index-t54dgrfj.js → index-aef54vq3.js} +3 -2
- package/dist/{index-t54dgrfj.js.map → index-aef54vq3.js.map} +4 -4
- package/dist/index-cejxxqcz.js +55 -0
- package/dist/index-cejxxqcz.js.map +10 -0
- package/dist/{index-79rqre58.js → index-drcnh4z5.js} +3 -2
- package/dist/{index-79rqre58.js.map → index-drcnh4z5.js.map} +4 -4
- package/dist/{index-cfd8ne0j.js → index-xc6m9mcp.js} +3 -2
- package/dist/{index-cfd8ne0j.js.map → index-xc6m9mcp.js.map} +3 -3
- package/dist/{index-5e3yw7mb.js → index-zqq3kw0n.js} +55 -54
- package/dist/index-zqq3kw0n.js.map +11 -0
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts +1 -1
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts +3 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_ModelSchema.d.ts.map +1 -1
- package/dist/provider-hf-inference/index.js +165 -5
- package/dist/provider-hf-inference/index.js.map +3 -3
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts +1 -1
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts +3 -1
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
- package/dist/provider-llamacpp/index.js +138 -4
- package/dist/provider-llamacpp/index.js.map +3 -3
- package/dist/provider-ollama/OllamaProvider.d.ts +1 -1
- package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +3 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +3 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
- package/dist/provider-ollama/index.browser.js +122 -4
- package/dist/provider-ollama/index.browser.js.map +4 -4
- package/dist/provider-ollama/index.js +121 -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.map +1 -1
- package/dist/provider-openai/index.js +162 -4
- package/dist/provider-openai/index.js.map +3 -3
- package/package.json +11 -11
- package/dist/index-3345vk2h.js.map +0 -10
- package/dist/index-5e3yw7mb.js.map +0 -11
- package/dist/index-m0r2hvfz.js +0 -57
- package/dist/index-m0r2hvfz.js.map +0 -10
|
@@ -5,11 +5,13 @@ import {
|
|
|
5
5
|
OllamaModelRecordSchema,
|
|
6
6
|
OllamaModelSchema,
|
|
7
7
|
OllamaProvider
|
|
8
|
-
} from "../index-
|
|
8
|
+
} from "../index-14pbwsc9.js";
|
|
9
9
|
import {
|
|
10
10
|
__require
|
|
11
11
|
} from "../index-6j5pq722.js";
|
|
12
12
|
// src/provider-ollama/common/Ollama_JobRunFns.ts
|
|
13
|
+
import { buildToolDescription, filterValidToolCalls } from "@workglow/ai";
|
|
14
|
+
import { parsePartialJson } from "@workglow/util";
|
|
13
15
|
var _sdk;
|
|
14
16
|
async function loadOllamaSDK() {
|
|
15
17
|
if (!_sdk) {
|
|
@@ -175,16 +177,129 @@ var Ollama_TextSummary_Stream = async function* (input, model, signal) {
|
|
|
175
177
|
signal.removeEventListener("abort", onAbort);
|
|
176
178
|
}
|
|
177
179
|
};
|
|
180
|
+
function mapOllamaTools(tools) {
|
|
181
|
+
return tools.map((t) => ({
|
|
182
|
+
type: "function",
|
|
183
|
+
function: {
|
|
184
|
+
name: t.name,
|
|
185
|
+
description: buildToolDescription(t),
|
|
186
|
+
parameters: t.inputSchema
|
|
187
|
+
}
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
var Ollama_ToolCalling = async (input, model, update_progress, signal) => {
|
|
191
|
+
update_progress(0, "Starting Ollama tool calling");
|
|
192
|
+
const client = await getClient(model);
|
|
193
|
+
const modelName = getModelName(model);
|
|
194
|
+
const messages = [];
|
|
195
|
+
if (input.systemPrompt) {
|
|
196
|
+
messages.push({ role: "system", content: input.systemPrompt });
|
|
197
|
+
}
|
|
198
|
+
messages.push({ role: "user", content: input.prompt });
|
|
199
|
+
const tools = input.toolChoice === "none" ? undefined : mapOllamaTools(input.tools);
|
|
200
|
+
const response = await client.chat({
|
|
201
|
+
model: modelName,
|
|
202
|
+
messages,
|
|
203
|
+
tools,
|
|
204
|
+
options: {
|
|
205
|
+
temperature: input.temperature,
|
|
206
|
+
num_predict: input.maxTokens
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
const text = response.message.content ?? "";
|
|
210
|
+
const toolCalls = {};
|
|
211
|
+
(response.message.tool_calls ?? []).forEach((tc, index) => {
|
|
212
|
+
let parsedInput = {};
|
|
213
|
+
const fnArgs = tc.function.arguments;
|
|
214
|
+
if (typeof fnArgs === "string") {
|
|
215
|
+
try {
|
|
216
|
+
parsedInput = JSON.parse(fnArgs);
|
|
217
|
+
} catch {
|
|
218
|
+
const partial = parsePartialJson(fnArgs);
|
|
219
|
+
parsedInput = partial ?? {};
|
|
220
|
+
}
|
|
221
|
+
} else if (fnArgs != null) {
|
|
222
|
+
parsedInput = fnArgs;
|
|
223
|
+
}
|
|
224
|
+
const id = `call_${index}`;
|
|
225
|
+
toolCalls[id] = { id, name: tc.function.name, input: parsedInput };
|
|
226
|
+
});
|
|
227
|
+
update_progress(100, "Completed Ollama tool calling");
|
|
228
|
+
return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };
|
|
229
|
+
};
|
|
230
|
+
var Ollama_ToolCalling_Stream = async function* (input, model, signal) {
|
|
231
|
+
const client = await getClient(model);
|
|
232
|
+
const modelName = getModelName(model);
|
|
233
|
+
const messages = [];
|
|
234
|
+
if (input.systemPrompt) {
|
|
235
|
+
messages.push({ role: "system", content: input.systemPrompt });
|
|
236
|
+
}
|
|
237
|
+
messages.push({ role: "user", content: input.prompt });
|
|
238
|
+
const tools = input.toolChoice === "none" ? undefined : mapOllamaTools(input.tools);
|
|
239
|
+
const stream = await client.chat({
|
|
240
|
+
model: modelName,
|
|
241
|
+
messages,
|
|
242
|
+
tools,
|
|
243
|
+
options: {
|
|
244
|
+
temperature: input.temperature,
|
|
245
|
+
num_predict: input.maxTokens
|
|
246
|
+
},
|
|
247
|
+
stream: true
|
|
248
|
+
});
|
|
249
|
+
const onAbort = () => stream.abort();
|
|
250
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
251
|
+
let accumulatedText = "";
|
|
252
|
+
const toolCalls = {};
|
|
253
|
+
let callIndex = 0;
|
|
254
|
+
try {
|
|
255
|
+
for await (const chunk of stream) {
|
|
256
|
+
const delta = chunk.message.content;
|
|
257
|
+
if (delta) {
|
|
258
|
+
accumulatedText += delta;
|
|
259
|
+
yield { type: "text-delta", port: "text", textDelta: delta };
|
|
260
|
+
}
|
|
261
|
+
const chunkToolCalls = chunk.message.tool_calls;
|
|
262
|
+
if (Array.isArray(chunkToolCalls) && chunkToolCalls.length > 0) {
|
|
263
|
+
for (const tc of chunkToolCalls) {
|
|
264
|
+
let parsedInput = {};
|
|
265
|
+
const fnArgs = tc.function.arguments;
|
|
266
|
+
if (typeof fnArgs === "string") {
|
|
267
|
+
try {
|
|
268
|
+
parsedInput = JSON.parse(fnArgs);
|
|
269
|
+
} catch {
|
|
270
|
+
const partial = parsePartialJson(fnArgs);
|
|
271
|
+
parsedInput = partial ?? {};
|
|
272
|
+
}
|
|
273
|
+
} else if (fnArgs != null) {
|
|
274
|
+
parsedInput = fnArgs;
|
|
275
|
+
}
|
|
276
|
+
const id = `call_${callIndex++}`;
|
|
277
|
+
toolCalls[id] = { id, name: tc.function.name, input: parsedInput };
|
|
278
|
+
}
|
|
279
|
+
yield { type: "object-delta", port: "toolCalls", objectDelta: { ...toolCalls } };
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const validToolCalls = filterValidToolCalls(toolCalls, input.tools);
|
|
283
|
+
yield {
|
|
284
|
+
type: "finish",
|
|
285
|
+
data: { text: accumulatedText, toolCalls: validToolCalls }
|
|
286
|
+
};
|
|
287
|
+
} finally {
|
|
288
|
+
signal.removeEventListener("abort", onAbort);
|
|
289
|
+
}
|
|
290
|
+
};
|
|
178
291
|
var OLLAMA_TASKS = {
|
|
179
292
|
TextGenerationTask: Ollama_TextGeneration,
|
|
180
293
|
TextEmbeddingTask: Ollama_TextEmbedding,
|
|
181
294
|
TextRewriterTask: Ollama_TextRewriter,
|
|
182
|
-
TextSummaryTask: Ollama_TextSummary
|
|
295
|
+
TextSummaryTask: Ollama_TextSummary,
|
|
296
|
+
ToolCallingTask: Ollama_ToolCalling
|
|
183
297
|
};
|
|
184
298
|
var OLLAMA_STREAM_TASKS = {
|
|
185
299
|
TextGenerationTask: Ollama_TextGeneration_Stream,
|
|
186
300
|
TextRewriterTask: Ollama_TextRewriter_Stream,
|
|
187
|
-
TextSummaryTask: Ollama_TextSummary_Stream
|
|
301
|
+
TextSummaryTask: Ollama_TextSummary_Stream,
|
|
302
|
+
ToolCallingTask: Ollama_ToolCalling_Stream
|
|
188
303
|
};
|
|
189
304
|
// src/provider-ollama/Ollama_Worker.ts
|
|
190
305
|
import { getLogger, globalServiceRegistry, WORKER_SERVER } from "@workglow/util";
|
|
@@ -195,6 +310,8 @@ function OLLAMA_WORKER_JOBRUN_REGISTER() {
|
|
|
195
310
|
getLogger().info("OLLAMA_WORKER_JOBRUN registered");
|
|
196
311
|
}
|
|
197
312
|
export {
|
|
313
|
+
Ollama_ToolCalling_Stream,
|
|
314
|
+
Ollama_ToolCalling,
|
|
198
315
|
Ollama_TextSummary_Stream,
|
|
199
316
|
Ollama_TextSummary,
|
|
200
317
|
Ollama_TextRewriter_Stream,
|
|
@@ -213,4 +330,4 @@ export {
|
|
|
213
330
|
OLLAMA
|
|
214
331
|
};
|
|
215
332
|
|
|
216
|
-
//# debugId=
|
|
333
|
+
//# debugId=84E58DFA1D8C596764756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/provider-ollama/common/Ollama_JobRunFns.ts", "../src/provider-ollama/Ollama_Worker.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 type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { OLLAMA_DEFAULT_BASE_URL } from \"./Ollama_Constants\";\nimport type { OllamaModelConfig } from \"./Ollama_ModelSchema\";\n\nlet _sdk: typeof import(\"ollama\") | undefined;\nasync function loadOllamaSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"ollama\");\n } catch {\n throw new Error(\"ollama is required for Ollama tasks. Install it with: bun add ollama\");\n }\n }\n return _sdk.Ollama;\n}\n\nasync function getClient(model: OllamaModelConfig | undefined) {\n const Ollama = await loadOllamaSDK();\n const host = model?.provider_config?.base_url || OLLAMA_DEFAULT_BASE_URL;\n return new Ollama({ host });\n}\n\nfunction getModelName(model: OllamaModelConfig | 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\nexport const Ollama_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n });\n\n update_progress(100, \"Completed Ollama text generation\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n\n const response = await client.embed({\n model: modelName,\n input: texts,\n });\n\n update_progress(100, \"Completed Ollama text embedding\");\n\n if (Array.isArray(input.text)) {\n return {\n vector: response.embeddings.map((e) => new Float32Array(e)),\n };\n }\n return { vector: new Float32Array(response.embeddings[0]) };\n};\n\nexport const Ollama_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text rewriting\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text summarization\");\n return { text: response.message.content };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Ollama_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const OLLAMA_TASKS: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>> = {\n TextGenerationTask: Ollama_TextGeneration,\n TextEmbeddingTask: Ollama_TextEmbedding,\n TextRewriterTask: Ollama_TextRewriter,\n TextSummaryTask: Ollama_TextSummary,\n};\n\nexport const OLLAMA_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, OllamaModelConfig>\n> = {\n TextGenerationTask: Ollama_TextGeneration_Stream,\n TextRewriterTask: Ollama_TextRewriter_Stream,\n TextSummaryTask: Ollama_TextSummary_Stream,\n};\n",
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport { buildToolDescription, filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util\";\nimport { OLLAMA_DEFAULT_BASE_URL } from \"./Ollama_Constants\";\nimport type { OllamaModelConfig } from \"./Ollama_ModelSchema\";\n\nlet _sdk: typeof import(\"ollama\") | undefined;\nasync function loadOllamaSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"ollama\");\n } catch {\n throw new Error(\"ollama is required for Ollama tasks. Install it with: bun add ollama\");\n }\n }\n return _sdk.Ollama;\n}\n\nasync function getClient(model: OllamaModelConfig | undefined) {\n const Ollama = await loadOllamaSDK();\n const host = model?.provider_config?.base_url || OLLAMA_DEFAULT_BASE_URL;\n return new Ollama({ host });\n}\n\nfunction getModelName(model: OllamaModelConfig | 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\nexport const Ollama_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n });\n\n update_progress(100, \"Completed Ollama text generation\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n\n const response = await client.embed({\n model: modelName,\n input: texts,\n });\n\n update_progress(100, \"Completed Ollama text embedding\");\n\n if (Array.isArray(input.text)) {\n return {\n vector: response.embeddings.map((e) => new Float32Array(e)),\n };\n }\n return { vector: new Float32Array(response.embeddings[0]) };\n};\n\nexport const Ollama_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text rewriting\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text summarization\");\n return { text: response.message.content };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Ollama_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapOllamaTools(tools: ReadonlyArray<ToolDefinition>) {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n}\n\nexport const Ollama_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const messages: Array<{ role: string; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt });\n\n const tools = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const response = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n });\n\n const text = response.message.content ?? \"\";\n const toolCalls: Record<string, unknown> = {};\n (response.message.tool_calls ?? []).forEach((tc: any, index: number) => {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${index}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n });\n\n update_progress(100, \"Completed Ollama tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const Ollama_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const messages: Array<{ role: string; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt });\n\n const tools = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const stream = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let accumulatedText = \"\";\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n accumulatedText += delta;\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n\n const chunkToolCalls = (chunk.message as any).tool_calls;\n if (Array.isArray(chunkToolCalls) && chunkToolCalls.length > 0) {\n for (const tc of chunkToolCalls) {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${callIndex++}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n }\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: { ...toolCalls } };\n }\n }\n\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n yield {\n type: \"finish\",\n data: { text: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const OLLAMA_TASKS: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>> = {\n TextGenerationTask: Ollama_TextGeneration,\n TextEmbeddingTask: Ollama_TextEmbedding,\n TextRewriterTask: Ollama_TextRewriter,\n TextSummaryTask: Ollama_TextSummary,\n ToolCallingTask: Ollama_ToolCalling,\n};\n\nexport const OLLAMA_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, OllamaModelConfig>\n> = {\n TextGenerationTask: Ollama_TextGeneration_Stream,\n TextRewriterTask: Ollama_TextRewriter_Stream,\n TextSummaryTask: Ollama_TextSummary_Stream,\n ToolCallingTask: Ollama_ToolCalling_Stream,\n};\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { getLogger, globalServiceRegistry, WORKER_SERVER } from \"@workglow/util\";\nimport { OLLAMA_STREAM_TASKS, OLLAMA_TASKS } from \"./common/Ollama_JobRunFns\";\nimport { OllamaProvider } from \"./OllamaProvider\";\n\nexport function OLLAMA_WORKER_JOBRUN_REGISTER() {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new OllamaProvider(OLLAMA_TASKS, OLLAMA_STREAM_TASKS).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n getLogger().info(\"OLLAMA_WORKER_JOBRUN registered\");\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": ";;;;;;;;;;;;AAqBA;AAEA;AAIA,IAAI;AACJ,eAAe,aAAa,GAAG;AAAA,EAC7B,IAAI,CAAC,MAAM;AAAA,IACT,IAAI;AAAA,MACF,OAAO,MAAa;AAAA,MACpB,MAAM;AAAA,MACN,MAAM,IAAI,MAAM,sEAAsE;AAAA;AAAA,EAE1F;AAAA,EACA,OAAO,KAAK;AAAA;AAGd,eAAe,SAAS,CAAC,OAAsC;AAAA,EAC7D,MAAM,SAAS,MAAM,cAAc;AAAA,EACnC,MAAM,OAAO,OAAO,iBAAiB,YAAY;AAAA,EACjD,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA;AAG5B,SAAS,YAAY,CAAC,OAA8C;AAAA,EAClE,MAAM,OAAO,OAAO,iBAAiB;AAAA,EACrC,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAAA,EACA,OAAO;AAAA;AAGF,IAAM,wBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,iCAAiC;AAAA,EACpD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,IACjC,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,SAAS;AAAA,MACP,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,mBAAmB,MAAM;AAAA,MACzB,kBAAkB,MAAM;AAAA,IAC1B;AAAA,EACF,CAAC;AAAA,EAED,gBAAgB,KAAK,kCAAkC;AAAA,EACvD,OAAO,EAAE,MAAM,SAAS,QAAQ,QAAQ;AAAA;AAGnC,IAAM,uBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,gCAAgC;AAAA,EACnD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,IAAI;AAAA,EAElE,MAAM,WAAW,MAAM,OAAO,MAAM;AAAA,IAClC,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAAA,EAED,gBAAgB,KAAK,iCAAiC;AAAA,EAEtD,IAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAAA,IAC7B,OAAO;AAAA,MACL,QAAQ,SAAS,WAAW,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA,EACA,OAAO,EAAE,QAAQ,IAAI,aAAa,SAAS,WAAW,EAAE,EAAE;AAAA;AAGrD,IAAM,sBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,gCAAgC;AAAA,EACnD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,IACjC,OAAO;AAAA,IACP,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO;AAAA,MACxC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK;AAAA,IACtC;AAAA,EACF,CAAC;AAAA,EAED,gBAAgB,KAAK,iCAAiC;AAAA,EACtD,OAAO,EAAE,MAAM,SAAS,QAAQ,QAAQ;AAAA;AAGnC,IAAM,qBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,oCAAoC;AAAA,EACvD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,IACjC,OAAO;AAAA,IACP,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,0CAA0C;AAAA,MACrE,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK;AAAA,IACtC;AAAA,EACF,CAAC;AAAA,EAED,gBAAgB,KAAK,qCAAqC;AAAA,EAC1D,OAAO,EAAE,MAAM,SAAS,QAAQ,QAAQ;AAAA;AAOnC,IAAM,+BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA8D;AAAA,EAC/F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,IAClD,SAAS;AAAA,MACP,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,mBAAmB,MAAM;AAAA,MACzB,kBAAkB,MAAM;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,OAAO,MAAM;AAAA,EACnC,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EACxD,IAAI;AAAA,IACF,iBAAiB,SAAS,QAAQ;AAAA,MAChC,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC5B,IAAI,OAAO;AAAA,QACT,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA8B;AAAA,YAC7D;AAAA,IACA,OAAO,oBAAoB,SAAS,OAAO;AAAA;AAAA;AAIxC,IAAM,6BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA4D;AAAA,EAC7F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO;AAAA,MACxC,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK;AAAA,IACtC;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,OAAO,MAAM;AAAA,EACnC,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EACxD,IAAI;AAAA,IACF,iBAAiB,SAAS,QAAQ;AAAA,MAChC,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC5B,IAAI,OAAO;AAAA,QACT,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA4B;AAAA,YAC3D;AAAA,IACA,OAAO,oBAAoB,SAAS,OAAO;AAAA;AAAA;AAIxC,IAAM,4BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,0CAA0C;AAAA,MACrE,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK;AAAA,IACtC;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,OAAO,MAAM;AAAA,EACnC,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EACxD,IAAI;AAAA,IACF,iBAAiB,SAAS,QAAQ;AAAA,MAChC,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC5B,IAAI,OAAO;AAAA,QACT,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA2B;AAAA,YAC1D;AAAA,IACA,OAAO,oBAAoB,SAAS,OAAO;AAAA;AAAA;AAQ/C,SAAS,cAAc,CAAC,OAAsC;AAAA,EAC5D,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,qBAAqB,CAAC;AAAA,MACnC,YAAY,EAAE;AAAA,IAChB;AAAA,EACF,EAAE;AAAA;AAGG,IAAM,qBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,gBAAgB,GAAG,8BAA8B;AAAA,EACjD,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAqD,CAAC;AAAA,EAC5D,IAAI,MAAM,cAAc;AAAA,IACtB,SAAS,KAAK,EAAE,MAAM,UAAU,SAAS,MAAM,aAAa,CAAC;AAAA,EAC/D;AAAA,EACA,SAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,EAErD,MAAM,QAAQ,MAAM,eAAe,SAAS,YAAY,eAAe,MAAM,KAAK;AAAA,EAElF,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,IACjC,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,IACrB;AAAA,EACF,CAAC;AAAA,EAED,MAAM,OAAO,SAAS,QAAQ,WAAW;AAAA,EACzC,MAAM,YAAqC,CAAC;AAAA,GAC3C,SAAS,QAAQ,cAAc,CAAC,GAAG,QAAQ,CAAC,IAAS,UAAkB;AAAA,IACtE,IAAI,cAAuC,CAAC;AAAA,IAC5C,MAAM,SAAS,GAAG,SAAS;AAAA,IAC3B,IAAI,OAAO,WAAW,UAAU;AAAA,MAC9B,IAAI;AAAA,QACF,cAAc,KAAK,MAAM,MAAM;AAAA,QAC/B,MAAM;AAAA,QACN,MAAM,UAAU,iBAAiB,MAAM;AAAA,QACvC,cAAe,WAAuC,CAAC;AAAA;AAAA,IAE3D,EAAO,SAAI,UAAU,MAAM;AAAA,MACzB,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,KAAK,QAAQ;AAAA,IACnB,UAAU,MAAM,EAAE,IAAI,MAAM,GAAG,SAAS,MAAgB,OAAO,YAAY;AAAA,GAC5E;AAAA,EAED,gBAAgB,KAAK,+BAA+B;AAAA,EACpD,OAAO,EAAE,MAAM,WAAW,qBAAqB,WAAW,MAAM,KAAK,EAAE;AAAA;AAGlE,IAAM,4BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,EACpC,MAAM,YAAY,aAAa,KAAK;AAAA,EAEpC,MAAM,WAAqD,CAAC;AAAA,EAC5D,IAAI,MAAM,cAAc;AAAA,IACtB,SAAS,KAAK,EAAE,MAAM,UAAU,SAAS,MAAM,aAAa,CAAC;AAAA,EAC/D;AAAA,EACA,SAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,EAErD,MAAM,QAAQ,MAAM,eAAe,SAAS,YAAY,eAAe,MAAM,KAAK;AAAA,EAElF,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,OAAO,MAAM;AAAA,EACnC,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAExD,IAAI,kBAAkB;AAAA,EACtB,MAAM,YAAqC,CAAC;AAAA,EAC5C,IAAI,YAAY;AAAA,EAEhB,IAAI;AAAA,IACF,iBAAiB,SAAS,QAAQ;AAAA,MAChC,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC5B,IAAI,OAAO;AAAA,QACT,mBAAmB;AAAA,QACnB,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7D;AAAA,MAEA,MAAM,iBAAkB,MAAM,QAAgB;AAAA,MAC9C,IAAI,MAAM,QAAQ,cAAc,KAAK,eAAe,SAAS,GAAG;AAAA,QAC9D,WAAW,MAAM,gBAAgB;AAAA,UAC/B,IAAI,cAAuC,CAAC;AAAA,UAC5C,MAAM,SAAS,GAAG,SAAS;AAAA,UAC3B,IAAI,OAAO,WAAW,UAAU;AAAA,YAC9B,IAAI;AAAA,cACF,cAAc,KAAK,MAAM,MAAM;AAAA,cAC/B,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,MAAM;AAAA,cACvC,cAAe,WAAuC,CAAC;AAAA;AAAA,UAE3D,EAAO,SAAI,UAAU,MAAM;AAAA,YACzB,cAAc;AAAA,UAChB;AAAA,UACA,MAAM,KAAK,QAAQ;AAAA,UACnB,UAAU,MAAM,EAAE,IAAI,MAAM,GAAG,SAAS,MAAgB,OAAO,YAAY;AAAA,QAC7E;AAAA,QACA,MAAM,EAAE,MAAM,gBAAgB,MAAM,aAAa,aAAa,KAAK,UAAU,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB,qBAAqB,WAAW,MAAM,KAAK;AAAA,IAClE,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,iBAAiB,WAAW,eAAe;AAAA,IAC3D;AAAA,YACA;AAAA,IACA,OAAO,oBAAoB,SAAS,OAAO;AAAA;AAAA;AAQxC,IAAM,eAA6E;AAAA,EACxF,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEO,IAAM,sBAGT;AAAA,EACF,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;;ACnZA;AAIO,SAAS,6BAA6B,GAAG;AAAA,EAC9C,MAAM,eAAe,sBAAsB,IAAI,aAAa;AAAA,EAC5D,IAAI,eAAe,cAAc,mBAAmB,EAAE,uBAAuB,YAAY;AAAA,EACzF,aAAa,UAAU;AAAA,EACvB,UAAU,EAAE,KAAK,iCAAiC;AAAA;",
|
|
9
|
+
"debugId": "84E58DFA1D8C596764756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -34,7 +34,7 @@ import type { OpenAiModelConfig } from "./common/OpenAI_ModelSchema";
|
|
|
34
34
|
*/
|
|
35
35
|
export declare class OpenAiProvider extends AiProvider<OpenAiModelConfig> {
|
|
36
36
|
readonly name = "OPENAI";
|
|
37
|
-
readonly taskTypes: readonly ["TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "CountTokensTask", "StructuredGenerationTask"];
|
|
37
|
+
readonly taskTypes: readonly ["TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "CountTokensTask", "StructuredGenerationTask", "ToolCallingTask"];
|
|
38
38
|
constructor(tasks?: Record<string, AiProviderRunFn<any, any, OpenAiModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, OpenAiModelConfig>>, reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, OpenAiModelConfig>>);
|
|
39
39
|
}
|
|
40
40
|
//# sourceMappingURL=OpenAiProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAiProvider.d.ts","sourceRoot":"","sources":["../../src/provider-openai/OpenAiProvider.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;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IAC/D,QAAQ,CAAC,IAAI,YAAU;IAEvB,QAAQ,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"OpenAiProvider.d.ts","sourceRoot":"","sources":["../../src/provider-openai/OpenAiProvider.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;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IAC/D,QAAQ,CAAC,IAAI,YAAU;IAEvB,QAAQ,CAAC,SAAS,gKAQP;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, StructuredGenerationTaskInput, StructuredGenerationTaskOutput, 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, ToolCallingTaskInput, ToolCallingTaskOutput } from "@workglow/ai";
|
|
7
7
|
import type { OpenAiModelConfig } from "./OpenAI_ModelSchema";
|
|
8
8
|
export declare const OpenAI_TextGeneration: AiProviderRunFn<TextGenerationTaskInput, TextGenerationTaskOutput, OpenAiModelConfig>;
|
|
9
9
|
export declare const OpenAI_TextEmbedding: AiProviderRunFn<TextEmbeddingTaskInput, TextEmbeddingTaskOutput, OpenAiModelConfig>;
|
|
@@ -22,6 +22,8 @@ export declare const OpenAI_CountTokens: AiProviderRunFn<CountTokensTaskInput, C
|
|
|
22
22
|
export declare const OpenAI_CountTokens_Reactive: AiProviderReactiveRunFn<CountTokensTaskInput, CountTokensTaskOutput, OpenAiModelConfig>;
|
|
23
23
|
export declare const OpenAI_StructuredGeneration: AiProviderRunFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, OpenAiModelConfig>;
|
|
24
24
|
export declare const OpenAI_StructuredGeneration_Stream: AiProviderStreamFn<StructuredGenerationTaskInput, StructuredGenerationTaskOutput, OpenAiModelConfig>;
|
|
25
|
+
export declare const OpenAI_ToolCalling: AiProviderRunFn<ToolCallingTaskInput, ToolCallingTaskOutput, OpenAiModelConfig>;
|
|
26
|
+
export declare const OpenAI_ToolCalling_Stream: AiProviderStreamFn<ToolCallingTaskInput, ToolCallingTaskOutput, OpenAiModelConfig>;
|
|
25
27
|
export declare const OPENAI_TASKS: Record<string, AiProviderRunFn<any, any, OpenAiModelConfig>>;
|
|
26
28
|
export declare const OPENAI_STREAM_TASKS: Record<string, AiProviderStreamFn<any, any, OpenAiModelConfig>>;
|
|
27
29
|
export declare const OPENAI_REACTIVE_TASKS: Record<string, AiProviderReactiveRunFn<any, any, OpenAiModelConfig>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAI_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-openai/common/OpenAI_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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,
|
|
1
|
+
{"version":3,"file":"OpenAI_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-openai/common/OpenAI_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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,EACrB,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAkD9D,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,CA6BlB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAC/C,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CAmBlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAmBlB,CAAC;AAMF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CA0BlB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CACzD,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CAwBlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAwBlB,CAAC;AAuBF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,cAAc,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,CAGvF;AAsBD,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAKlB,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,CA6BlB,CAAC;AAEF,eAAO,MAAM,kCAAkC,EAAE,kBAAkB,CACjE,6BAA6B,EAC7B,8BAA8B,EAC9B,iBAAiB,CAkDlB,CAAC;AAeF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAiElB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAsGlB,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAQrF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAOhD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAGrD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAI_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/provider-openai/common/OpenAI_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"OpenAI_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/provider-openai/common/OpenAI_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCW,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
|
OpenAiModelRecordSchema,
|
|
5
5
|
OpenAiModelSchema,
|
|
6
6
|
OpenAiProvider
|
|
7
|
-
} from "../index-
|
|
7
|
+
} from "../index-drcnh4z5.js";
|
|
8
8
|
import {
|
|
9
9
|
__require
|
|
10
10
|
} from "../index-6j5pq722.js";
|
|
11
11
|
// src/provider-openai/common/OpenAI_JobRunFns.ts
|
|
12
|
+
import { buildToolDescription, filterValidToolCalls } from "@workglow/ai";
|
|
12
13
|
import { getLogger, parsePartialJson } from "@workglow/util";
|
|
13
14
|
var _sdk;
|
|
14
15
|
async function loadOpenAISDK() {
|
|
@@ -269,19 +270,174 @@ var OpenAI_StructuredGeneration_Stream = async function* (input, model, signal,
|
|
|
269
270
|
}
|
|
270
271
|
yield { type: "finish", data: { object: finalObject } };
|
|
271
272
|
};
|
|
273
|
+
function mapOpenAIToolChoice(toolChoice) {
|
|
274
|
+
if (!toolChoice || toolChoice === "auto")
|
|
275
|
+
return "auto";
|
|
276
|
+
if (toolChoice === "none")
|
|
277
|
+
return "none";
|
|
278
|
+
if (toolChoice === "required")
|
|
279
|
+
return "required";
|
|
280
|
+
return { type: "function", function: { name: toolChoice } };
|
|
281
|
+
}
|
|
282
|
+
var OpenAI_ToolCalling = async (input, model, update_progress, signal) => {
|
|
283
|
+
update_progress(0, "Starting OpenAI tool calling");
|
|
284
|
+
const client = await getClient(model);
|
|
285
|
+
const modelName = getModelName(model);
|
|
286
|
+
const tools = input.tools.map((t) => ({
|
|
287
|
+
type: "function",
|
|
288
|
+
function: {
|
|
289
|
+
name: t.name,
|
|
290
|
+
description: buildToolDescription(t),
|
|
291
|
+
parameters: t.inputSchema
|
|
292
|
+
}
|
|
293
|
+
}));
|
|
294
|
+
const messages = [];
|
|
295
|
+
if (input.systemPrompt) {
|
|
296
|
+
messages.push({ role: "system", content: input.systemPrompt });
|
|
297
|
+
}
|
|
298
|
+
messages.push({ role: "user", content: input.prompt });
|
|
299
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
300
|
+
const params = {
|
|
301
|
+
model: modelName,
|
|
302
|
+
messages,
|
|
303
|
+
max_completion_tokens: input.maxTokens,
|
|
304
|
+
temperature: input.temperature
|
|
305
|
+
};
|
|
306
|
+
if (toolChoice !== undefined) {
|
|
307
|
+
params.tools = tools;
|
|
308
|
+
params.tool_choice = toolChoice;
|
|
309
|
+
}
|
|
310
|
+
const response = await client.chat.completions.create(params, { signal });
|
|
311
|
+
const text = response.choices[0]?.message?.content ?? "";
|
|
312
|
+
const toolCalls = {};
|
|
313
|
+
for (const tc of response.choices[0]?.message?.tool_calls ?? []) {
|
|
314
|
+
if (!("function" in tc))
|
|
315
|
+
continue;
|
|
316
|
+
const id = tc.id;
|
|
317
|
+
const name = tc.function.name;
|
|
318
|
+
let input2 = {};
|
|
319
|
+
const rawArgs = tc.function.arguments;
|
|
320
|
+
if (typeof rawArgs === "string") {
|
|
321
|
+
try {
|
|
322
|
+
input2 = JSON.parse(rawArgs);
|
|
323
|
+
} catch {
|
|
324
|
+
try {
|
|
325
|
+
const partial = parsePartialJson(rawArgs);
|
|
326
|
+
if (partial && typeof partial === "object") {
|
|
327
|
+
input2 = partial;
|
|
328
|
+
}
|
|
329
|
+
} catch {
|
|
330
|
+
input2 = {};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
toolCalls[id] = { id, name, input: input2 };
|
|
335
|
+
}
|
|
336
|
+
update_progress(100, "Completed OpenAI tool calling");
|
|
337
|
+
return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };
|
|
338
|
+
};
|
|
339
|
+
var OpenAI_ToolCalling_Stream = async function* (input, model, signal) {
|
|
340
|
+
const client = await getClient(model);
|
|
341
|
+
const modelName = getModelName(model);
|
|
342
|
+
const tools = input.tools.map((t) => ({
|
|
343
|
+
type: "function",
|
|
344
|
+
function: {
|
|
345
|
+
name: t.name,
|
|
346
|
+
description: buildToolDescription(t),
|
|
347
|
+
parameters: t.inputSchema
|
|
348
|
+
}
|
|
349
|
+
}));
|
|
350
|
+
const messages = [];
|
|
351
|
+
if (input.systemPrompt) {
|
|
352
|
+
messages.push({ role: "system", content: input.systemPrompt });
|
|
353
|
+
}
|
|
354
|
+
messages.push({ role: "user", content: input.prompt });
|
|
355
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
356
|
+
const stream = await client.chat.completions.create({
|
|
357
|
+
model: modelName,
|
|
358
|
+
messages,
|
|
359
|
+
max_completion_tokens: input.maxTokens,
|
|
360
|
+
temperature: input.temperature,
|
|
361
|
+
stream: true,
|
|
362
|
+
...toolChoice !== undefined ? { tools, tool_choice: toolChoice } : {}
|
|
363
|
+
}, { signal });
|
|
364
|
+
let accumulatedText = "";
|
|
365
|
+
const toolCallAccumulator = new Map;
|
|
366
|
+
for await (const chunk of stream) {
|
|
367
|
+
const choice = chunk.choices[0];
|
|
368
|
+
if (!choice)
|
|
369
|
+
continue;
|
|
370
|
+
const contentDelta = choice.delta?.content ?? "";
|
|
371
|
+
if (contentDelta) {
|
|
372
|
+
accumulatedText += contentDelta;
|
|
373
|
+
yield { type: "text-delta", port: "text", textDelta: contentDelta };
|
|
374
|
+
}
|
|
375
|
+
const tcDeltas = choice.delta?.tool_calls;
|
|
376
|
+
if (Array.isArray(tcDeltas)) {
|
|
377
|
+
for (const tcDelta of tcDeltas) {
|
|
378
|
+
const idx = tcDelta.index;
|
|
379
|
+
if (!toolCallAccumulator.has(idx)) {
|
|
380
|
+
toolCallAccumulator.set(idx, {
|
|
381
|
+
id: tcDelta.id ?? "",
|
|
382
|
+
name: tcDelta.function?.name ?? "",
|
|
383
|
+
arguments: ""
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
const acc = toolCallAccumulator.get(idx);
|
|
387
|
+
if (tcDelta.id)
|
|
388
|
+
acc.id = tcDelta.id;
|
|
389
|
+
if (tcDelta.function?.name)
|
|
390
|
+
acc.name = tcDelta.function.name;
|
|
391
|
+
if (tcDelta.function?.arguments)
|
|
392
|
+
acc.arguments += tcDelta.function.arguments;
|
|
393
|
+
}
|
|
394
|
+
const snapshotObject = {};
|
|
395
|
+
Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {
|
|
396
|
+
let parsedInput;
|
|
397
|
+
try {
|
|
398
|
+
parsedInput = JSON.parse(tc.arguments);
|
|
399
|
+
} catch {
|
|
400
|
+
const partial = parsePartialJson(tc.arguments);
|
|
401
|
+
parsedInput = partial ?? {};
|
|
402
|
+
}
|
|
403
|
+
const key = tc.id || String(idx);
|
|
404
|
+
snapshotObject[key] = { id: tc.id, name: tc.name, input: parsedInput };
|
|
405
|
+
});
|
|
406
|
+
yield { type: "object-delta", port: "toolCalls", objectDelta: snapshotObject };
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const toolCalls = {};
|
|
410
|
+
Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {
|
|
411
|
+
let finalInput;
|
|
412
|
+
try {
|
|
413
|
+
finalInput = JSON.parse(tc.arguments);
|
|
414
|
+
} catch {
|
|
415
|
+
finalInput = parsePartialJson(tc.arguments) ?? {};
|
|
416
|
+
}
|
|
417
|
+
const key = tc.id || String(idx);
|
|
418
|
+
toolCalls[key] = { id: tc.id, name: tc.name, input: finalInput };
|
|
419
|
+
});
|
|
420
|
+
const validToolCalls = filterValidToolCalls(toolCalls, input.tools);
|
|
421
|
+
yield {
|
|
422
|
+
type: "finish",
|
|
423
|
+
data: { text: accumulatedText, toolCalls: validToolCalls }
|
|
424
|
+
};
|
|
425
|
+
};
|
|
272
426
|
var OPENAI_TASKS = {
|
|
273
427
|
TextGenerationTask: OpenAI_TextGeneration,
|
|
274
428
|
TextEmbeddingTask: OpenAI_TextEmbedding,
|
|
275
429
|
TextRewriterTask: OpenAI_TextRewriter,
|
|
276
430
|
TextSummaryTask: OpenAI_TextSummary,
|
|
277
431
|
CountTokensTask: OpenAI_CountTokens,
|
|
278
|
-
StructuredGenerationTask: OpenAI_StructuredGeneration
|
|
432
|
+
StructuredGenerationTask: OpenAI_StructuredGeneration,
|
|
433
|
+
ToolCallingTask: OpenAI_ToolCalling
|
|
279
434
|
};
|
|
280
435
|
var OPENAI_STREAM_TASKS = {
|
|
281
436
|
TextGenerationTask: OpenAI_TextGeneration_Stream,
|
|
282
437
|
TextRewriterTask: OpenAI_TextRewriter_Stream,
|
|
283
438
|
TextSummaryTask: OpenAI_TextSummary_Stream,
|
|
284
|
-
StructuredGenerationTask: OpenAI_StructuredGeneration_Stream
|
|
439
|
+
StructuredGenerationTask: OpenAI_StructuredGeneration_Stream,
|
|
440
|
+
ToolCallingTask: OpenAI_ToolCalling_Stream
|
|
285
441
|
};
|
|
286
442
|
var OPENAI_REACTIVE_TASKS = {
|
|
287
443
|
CountTokensTask: OpenAI_CountTokens_Reactive
|
|
@@ -300,6 +456,8 @@ export {
|
|
|
300
456
|
OpenAiModelSchema,
|
|
301
457
|
OpenAiModelRecordSchema,
|
|
302
458
|
OpenAiModelConfigSchema,
|
|
459
|
+
OpenAI_ToolCalling_Stream,
|
|
460
|
+
OpenAI_ToolCalling,
|
|
303
461
|
OpenAI_TextSummary_Stream,
|
|
304
462
|
OpenAI_TextSummary,
|
|
305
463
|
OpenAI_TextRewriter_Stream,
|
|
@@ -318,4 +476,4 @@ export {
|
|
|
318
476
|
OPENAI
|
|
319
477
|
};
|
|
320
478
|
|
|
321
|
-
//# debugId=
|
|
479
|
+
//# debugId=96B60AB8E75A6C2364756E2164756E21
|