@workglow/openai 0.3.37 → 0.3.39
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/ai/OpenAiProvider.d.ts +2 -64
- package/dist/ai/OpenAiProvider.d.ts.map +1 -1
- package/dist/ai/OpenAiQueuedProvider.d.ts +2 -64
- package/dist/ai/OpenAiQueuedProvider.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_CacheCheckpoint.d.ts +48 -0
- package/dist/ai/common/OpenAI_CacheCheckpoint.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_Capabilities.d.ts +1 -1
- package/dist/ai/common/OpenAI_Capabilities.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_CapabilitySets.d.ts +2 -1
- package/dist/ai/common/OpenAI_CapabilitySets.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_Client.d.ts +34 -8
- package/dist/ai/common/OpenAI_Client.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_ModelInfo.d.ts +4 -3
- package/dist/ai/common/OpenAI_ModelInfo.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_ModelSchema.d.ts +70 -3
- package/dist/ai/common/OpenAI_ModelSchema.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_StructuredGeneration.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_TextEmbedding.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_TextGeneration.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_TextRewriter.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_TextSummary.d.ts.map +1 -1
- package/dist/ai/common/OpenAI_ToolCalling.d.ts +3 -2
- package/dist/ai/common/OpenAI_ToolCalling.d.ts.map +1 -1
- package/dist/ai/index.d.ts +5 -24
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/runtime.browser.d.ts +1 -0
- package/dist/ai/runtime.browser.d.ts.map +1 -1
- package/dist/ai/runtime.d.ts +1 -0
- package/dist/ai/runtime.d.ts.map +1 -1
- package/dist/ai-runtime.browser.js +238 -74
- package/dist/ai-runtime.browser.js.map +16 -15
- package/dist/ai-runtime.js +235 -69
- package/dist/ai-runtime.js.map +15 -14
- package/dist/ai.browser.js +31 -5
- package/dist/ai.browser.js.map +6 -6
- package/dist/ai.js +235 -72
- package/dist/ai.js.map +17 -16
- package/package.json +13 -12
package/dist/ai-runtime.js
CHANGED
|
@@ -6,8 +6,25 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
+
// src/ai/common/OpenAI_CacheCheckpoint.ts
|
|
10
|
+
import {
|
|
11
|
+
buildResponsesInput,
|
|
12
|
+
buildResponsesTools,
|
|
13
|
+
mapOpenAIResponsesUsage
|
|
14
|
+
} from "@workglow/ai/provider-utils";
|
|
15
|
+
import { promptToTailMessages, toOpenAIMessages } from "@workglow/ai/worker";
|
|
16
|
+
|
|
9
17
|
// src/ai/common/OpenAI_Client.ts
|
|
18
|
+
import { isModelEffort } from "@workglow/ai";
|
|
10
19
|
import { isBrowserLike, resolveApiKey, validateProviderBaseUrl } from "@workglow/ai/provider-utils";
|
|
20
|
+
var EFFORT_TO_OPENAI = {
|
|
21
|
+
none: "none",
|
|
22
|
+
low: "low",
|
|
23
|
+
medium: "medium",
|
|
24
|
+
high: "high",
|
|
25
|
+
extra: "xhigh",
|
|
26
|
+
ultra: "max"
|
|
27
|
+
};
|
|
11
28
|
var OPENAI_ALLOWED_HOSTS = ["api.openai.com", ".openai.azure.com"];
|
|
12
29
|
var _loadPromise;
|
|
13
30
|
async function loadOpenAISDK() {
|
|
@@ -17,7 +34,16 @@ async function loadOpenAISDK() {
|
|
|
17
34
|
});
|
|
18
35
|
return _loadPromise;
|
|
19
36
|
}
|
|
37
|
+
var _testClient;
|
|
38
|
+
function setOpenAIClientForTests(client) {
|
|
39
|
+
_testClient = client;
|
|
40
|
+
}
|
|
41
|
+
var _testOnly = {
|
|
42
|
+
setOpenAIClientForTests
|
|
43
|
+
};
|
|
20
44
|
async function getClient(model) {
|
|
45
|
+
if (_testClient)
|
|
46
|
+
return _testClient;
|
|
21
47
|
const OpenAI = await loadOpenAISDK();
|
|
22
48
|
const config = model?.provider_config;
|
|
23
49
|
const apiKey = resolveApiKey({
|
|
@@ -51,10 +77,13 @@ function getModelName(model) {
|
|
|
51
77
|
}
|
|
52
78
|
function getReasoningConfig(model) {
|
|
53
79
|
const reasoning = model?.provider_config?.reasoning;
|
|
54
|
-
if (
|
|
55
|
-
return;
|
|
80
|
+
if (reasoning && (reasoning.effort !== undefined || reasoning.mode !== undefined)) {
|
|
81
|
+
return reasoning;
|
|
82
|
+
}
|
|
83
|
+
if (isModelEffort(model?.effort)) {
|
|
84
|
+
return { effort: EFFORT_TO_OPENAI[model.effort] };
|
|
56
85
|
}
|
|
57
|
-
return
|
|
86
|
+
return;
|
|
58
87
|
}
|
|
59
88
|
function fnv1aHex(input) {
|
|
60
89
|
let hash = 2166136261;
|
|
@@ -79,10 +108,54 @@ function finalizeResponsesRequest(model, params) {
|
|
|
79
108
|
const reasoning = getReasoningConfig(model);
|
|
80
109
|
if (reasoning !== undefined)
|
|
81
110
|
params.reasoning = reasoning;
|
|
111
|
+
else if (params.temperature !== undefined)
|
|
112
|
+
params.reasoning = { effort: "none" };
|
|
82
113
|
params.prompt_cache_key = resolvePromptCacheKey(model, params);
|
|
83
114
|
return params;
|
|
84
115
|
}
|
|
85
116
|
|
|
117
|
+
// src/ai/common/OpenAI_CacheCheckpoint.ts
|
|
118
|
+
function mergeOpenAICheckpointPrefix(session, input) {
|
|
119
|
+
const prefix = session?.prefix;
|
|
120
|
+
if (!prefix)
|
|
121
|
+
return;
|
|
122
|
+
const tail = Array.isArray(input.messages) && input.messages.length > 0 ? input.messages : promptToTailMessages(input.prompt);
|
|
123
|
+
return {
|
|
124
|
+
messages: [...prefix.messages ?? [], ...tail],
|
|
125
|
+
systemPrompt: input.systemPrompt || prefix.systemPrompt,
|
|
126
|
+
tools: input.tools && input.tools.length > 0 ? input.tools : prefix.tools
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
var OpenAI_CacheCheckpoint_Stream = async (_input, model, signal, emit, _outputSchema, session) => {
|
|
130
|
+
const prefix = session?.prefix ?? {};
|
|
131
|
+
const client = await getClient(model);
|
|
132
|
+
const messages = toOpenAIMessages({
|
|
133
|
+
messages: prefix.messages ?? [],
|
|
134
|
+
systemPrompt: prefix.systemPrompt,
|
|
135
|
+
prompt: ".",
|
|
136
|
+
tools: []
|
|
137
|
+
});
|
|
138
|
+
const { input: responsesInput, instructions } = buildResponsesInput({ messages });
|
|
139
|
+
const params = {
|
|
140
|
+
model: getModelName(model),
|
|
141
|
+
input: responsesInput,
|
|
142
|
+
max_output_tokens: 16
|
|
143
|
+
};
|
|
144
|
+
if (instructions !== undefined)
|
|
145
|
+
params.instructions = instructions;
|
|
146
|
+
if (prefix.tools && prefix.tools.length > 0) {
|
|
147
|
+
params.tools = buildResponsesTools(prefix.tools);
|
|
148
|
+
}
|
|
149
|
+
finalizeResponsesRequest(model, params);
|
|
150
|
+
const response = await client.responses.create(params, { signal });
|
|
151
|
+
const usage = mapOpenAIResponsesUsage(response?.usage);
|
|
152
|
+
emit({
|
|
153
|
+
type: "finish",
|
|
154
|
+
data: { checkpoint: session?.sessionId ?? "" },
|
|
155
|
+
...usage ? { usage } : {}
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
|
|
86
159
|
// src/ai/registerOpenAiInline.ts
|
|
87
160
|
import { registerProviderInline } from "@workglow/ai/provider-utils";
|
|
88
161
|
|
|
@@ -117,6 +190,7 @@ var OPENAI_IMAGE_EDITING = ["image.editing"];
|
|
|
117
190
|
var OPENAI_COUNT_TOKENS = ["model.count-tokens"];
|
|
118
191
|
var OPENAI_MODEL_SEARCH = ["model.search"];
|
|
119
192
|
var OPENAI_MODEL_INFO = ["model.info"];
|
|
193
|
+
var OPENAI_CACHE_CHECKPOINT = ["cache.checkpoint"];
|
|
120
194
|
var OPENAI_CAPABILITY_SETS = [
|
|
121
195
|
OPENAI_TEXT_GENERATION,
|
|
122
196
|
OPENAI_TOOL_USE,
|
|
@@ -128,7 +202,8 @@ var OPENAI_CAPABILITY_SETS = [
|
|
|
128
202
|
OPENAI_IMAGE_EDITING,
|
|
129
203
|
OPENAI_COUNT_TOKENS,
|
|
130
204
|
OPENAI_MODEL_SEARCH,
|
|
131
|
-
OPENAI_MODEL_INFO
|
|
205
|
+
OPENAI_MODEL_INFO,
|
|
206
|
+
OPENAI_CACHE_CHECKPOINT
|
|
132
207
|
];
|
|
133
208
|
|
|
134
209
|
// src/ai/common/OpenAI_CountTokens.ts
|
|
@@ -348,13 +423,54 @@ var OPENAI_EMBEDDING_DIMENSIONS = {
|
|
|
348
423
|
"text-embedding-3-large": { native_dimensions: 3072, mrl: true },
|
|
349
424
|
"text-embedding-ada-002": { native_dimensions: 1536, mrl: false }
|
|
350
425
|
};
|
|
351
|
-
|
|
426
|
+
function modelNameOf(model) {
|
|
427
|
+
const name = model?.provider_config?.model_name;
|
|
428
|
+
if (!name) {
|
|
429
|
+
throw new Error("Missing model name in provider_config.model_name.");
|
|
430
|
+
}
|
|
431
|
+
return name;
|
|
432
|
+
}
|
|
433
|
+
function isNotFoundError(err) {
|
|
434
|
+
if (!err || typeof err !== "object")
|
|
435
|
+
return false;
|
|
436
|
+
const status = err.status;
|
|
437
|
+
const code = err.code;
|
|
438
|
+
const statusCode = err.statusCode;
|
|
439
|
+
return status === 404 || statusCode === 404 || code === "model_not_found";
|
|
440
|
+
}
|
|
441
|
+
async function assertOpenAiModelExists(model, signal) {
|
|
442
|
+
const modelName = modelNameOf(model);
|
|
443
|
+
const client = await getClient(model);
|
|
444
|
+
try {
|
|
445
|
+
await client.models.retrieve(modelName, signal ? { signal } : undefined);
|
|
446
|
+
} catch (err) {
|
|
447
|
+
if (isNotFoundError(err)) {
|
|
448
|
+
throw new Error(`${OPENAI} model "${modelName}" was not found (provider API returned not found)`);
|
|
449
|
+
}
|
|
450
|
+
throw err;
|
|
451
|
+
}
|
|
452
|
+
return modelName;
|
|
453
|
+
}
|
|
454
|
+
function remoteInfoBase(input) {
|
|
455
|
+
return {
|
|
456
|
+
model: input.model,
|
|
457
|
+
is_local: false,
|
|
458
|
+
is_remote: true,
|
|
459
|
+
supports_browser: true,
|
|
460
|
+
supports_node: true,
|
|
461
|
+
is_cached: false,
|
|
462
|
+
is_loaded: false,
|
|
463
|
+
file_sizes: null
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
var OpenAI_ModelInfo_Stream = async (input, model, signal, emit) => {
|
|
467
|
+
const modelName = await assertOpenAiModelExists(model, signal);
|
|
468
|
+
const base = remoteInfoBase(input);
|
|
352
469
|
if (input.detail === "dimensions") {
|
|
353
470
|
const pc = model?.provider_config;
|
|
354
471
|
let native_dimensions = typeof pc?.native_dimensions === "number" ? pc.native_dimensions : undefined;
|
|
355
472
|
let mrl = typeof pc?.mrl === "boolean" ? pc.mrl : undefined;
|
|
356
473
|
if (native_dimensions === undefined) {
|
|
357
|
-
const modelName = pc?.model_name ?? "";
|
|
358
474
|
const known = OPENAI_EMBEDDING_DIMENSIONS[modelName];
|
|
359
475
|
if (known) {
|
|
360
476
|
native_dimensions = known.native_dimensions;
|
|
@@ -364,33 +480,14 @@ var OpenAI_ModelInfo_Stream = async (input, model, _signal, emit) => {
|
|
|
364
480
|
emit({
|
|
365
481
|
type: "finish",
|
|
366
482
|
data: {
|
|
367
|
-
|
|
368
|
-
is_local: false,
|
|
369
|
-
is_remote: true,
|
|
370
|
-
supports_browser: true,
|
|
371
|
-
supports_node: true,
|
|
372
|
-
is_cached: false,
|
|
373
|
-
is_loaded: false,
|
|
374
|
-
file_sizes: null,
|
|
483
|
+
...base,
|
|
375
484
|
...native_dimensions !== undefined ? { native_dimensions } : {},
|
|
376
485
|
...mrl !== undefined ? { mrl } : {}
|
|
377
486
|
}
|
|
378
487
|
});
|
|
379
488
|
return;
|
|
380
489
|
}
|
|
381
|
-
emit({
|
|
382
|
-
type: "finish",
|
|
383
|
-
data: {
|
|
384
|
-
model: input.model,
|
|
385
|
-
is_local: false,
|
|
386
|
-
is_remote: true,
|
|
387
|
-
supports_browser: true,
|
|
388
|
-
supports_node: true,
|
|
389
|
-
is_cached: false,
|
|
390
|
-
is_loaded: false,
|
|
391
|
-
file_sizes: null
|
|
392
|
-
}
|
|
393
|
-
});
|
|
490
|
+
emit({ type: "finish", data: base });
|
|
394
491
|
};
|
|
395
492
|
|
|
396
493
|
// src/ai/common/OpenAI_ModelSearch.ts
|
|
@@ -468,8 +565,13 @@ var OpenAI_ModelSearch_Stream = async (input, _model, _signal, emit) => {
|
|
|
468
565
|
};
|
|
469
566
|
|
|
470
567
|
// src/ai/common/OpenAI_StructuredGeneration.ts
|
|
471
|
-
import {
|
|
472
|
-
|
|
568
|
+
import {
|
|
569
|
+
createEstimatedOutputUsageReporter,
|
|
570
|
+
firstNonStrictReason,
|
|
571
|
+
isStrictCompatibleSchema,
|
|
572
|
+
mapOpenAIResponsesUsage as mapOpenAIResponsesUsage2
|
|
573
|
+
} from "@workglow/ai/provider-utils";
|
|
574
|
+
import { createPartialJsonStream } from "@workglow/util/worker";
|
|
473
575
|
|
|
474
576
|
// src/ai/common/OpenAI_ResponsesWarnings.ts
|
|
475
577
|
import { getLogger } from "@workglow/util/worker";
|
|
@@ -520,15 +622,20 @@ var OpenAI_StructuredGeneration_Stream = async (input, model, signal, emit, outp
|
|
|
520
622
|
if (input.temperature !== undefined)
|
|
521
623
|
params.temperature = input.temperature;
|
|
522
624
|
finalizeResponsesRequest(model, params);
|
|
625
|
+
const provisionalUsage = createEstimatedOutputUsageReporter(emit);
|
|
626
|
+
provisionalUsage.onPrompt(typeof input.prompt === "string" ? input.prompt : "");
|
|
523
627
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
524
|
-
|
|
628
|
+
const json = createPartialJsonStream();
|
|
525
629
|
let refusal = "";
|
|
630
|
+
let usage;
|
|
526
631
|
for await (const event of stream) {
|
|
527
|
-
if (event.type === "response.
|
|
632
|
+
if (event.type === "response.completed" || event.type === "response.incomplete" || event.type === "response.failed") {
|
|
633
|
+
usage = mapOpenAIResponsesUsage2(event.response?.usage) ?? usage;
|
|
634
|
+
} else if (event.type === "response.output_text.delta") {
|
|
528
635
|
const delta = event.delta ?? "";
|
|
529
636
|
if (delta) {
|
|
530
|
-
|
|
531
|
-
const partial =
|
|
637
|
+
provisionalUsage.onText(delta);
|
|
638
|
+
const partial = json.push(delta);
|
|
532
639
|
if (partial !== undefined) {
|
|
533
640
|
emit({ type: "object-delta", port: "object", objectDelta: partial });
|
|
534
641
|
}
|
|
@@ -537,19 +644,19 @@ var OpenAI_StructuredGeneration_Stream = async (input, model, signal, emit, outp
|
|
|
537
644
|
refusal += event.delta ?? "";
|
|
538
645
|
}
|
|
539
646
|
}
|
|
647
|
+
provisionalUsage.flush();
|
|
540
648
|
if (refusal) {
|
|
541
649
|
emit({ type: "refusal", refusal });
|
|
542
650
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
}
|
|
549
|
-
emit({ type: "finish", data: { object: finalObject } });
|
|
651
|
+
emit({
|
|
652
|
+
type: "finish",
|
|
653
|
+
data: { object: json.finishObject() },
|
|
654
|
+
usage
|
|
655
|
+
});
|
|
550
656
|
};
|
|
551
657
|
|
|
552
658
|
// src/ai/common/OpenAI_TextEmbedding.ts
|
|
659
|
+
import { toUsageCount, usageOrUndefined } from "@workglow/ai/provider-utils";
|
|
553
660
|
import { getLogger as getLogger2 } from "@workglow/util/worker";
|
|
554
661
|
var OpenAI_TextEmbedding_Stream = async (input, model, signal, emit) => {
|
|
555
662
|
const logger = getLogger2();
|
|
@@ -565,25 +672,41 @@ var OpenAI_TextEmbedding_Stream = async (input, model, signal, emit) => {
|
|
|
565
672
|
const result = Array.isArray(input.text) ? {
|
|
566
673
|
vector: response.data.map((item) => new Float32Array(item.embedding))
|
|
567
674
|
} : { vector: new Float32Array(response.data[0].embedding) };
|
|
568
|
-
|
|
675
|
+
const rawUsage = response.usage;
|
|
676
|
+
const usage = usageOrUndefined({
|
|
677
|
+
input: toUsageCount(rawUsage?.prompt_tokens),
|
|
678
|
+
output: undefined,
|
|
679
|
+
cached: undefined,
|
|
680
|
+
cacheWrite: undefined,
|
|
681
|
+
reasoning: undefined,
|
|
682
|
+
total: toUsageCount(rawUsage?.total_tokens),
|
|
683
|
+
extra: undefined
|
|
684
|
+
});
|
|
685
|
+
emit({ type: "finish", data: result, usage });
|
|
569
686
|
} finally {
|
|
570
687
|
logger.timeEnd(timerLabel, { model: getModelName(model) });
|
|
571
688
|
}
|
|
572
689
|
};
|
|
573
690
|
|
|
574
691
|
// src/ai/common/OpenAI_TextGeneration.ts
|
|
575
|
-
import {
|
|
576
|
-
|
|
692
|
+
import {
|
|
693
|
+
accumulateOpenAIResponsesStream,
|
|
694
|
+
buildResponsesInput as buildResponsesInput2,
|
|
695
|
+
buildResponsesTools as buildResponsesTools2,
|
|
696
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter2,
|
|
697
|
+
promptTextForResponsesUsageEstimate
|
|
698
|
+
} from "@workglow/ai/provider-utils";
|
|
699
|
+
import { toOpenAIMessages as toOpenAIMessages2 } from "@workglow/ai/worker";
|
|
577
700
|
import { getLogger as getLogger3 } from "@workglow/util/worker";
|
|
578
701
|
function buildResponsesParams(input, model) {
|
|
579
702
|
const hasMessages = Array.isArray(input.messages) && input.messages.length > 0;
|
|
580
|
-
const messages = hasMessages ?
|
|
703
|
+
const messages = hasMessages ? toOpenAIMessages2({
|
|
581
704
|
messages: input.messages,
|
|
582
705
|
systemPrompt: input.systemPrompt,
|
|
583
706
|
prompt: "",
|
|
584
707
|
tools: []
|
|
585
708
|
}) : undefined;
|
|
586
|
-
const { input: responsesInput, instructions } =
|
|
709
|
+
const { input: responsesInput, instructions } = buildResponsesInput2({
|
|
587
710
|
messages,
|
|
588
711
|
prompt: hasMessages ? undefined : input.prompt,
|
|
589
712
|
systemPrompt: hasMessages ? undefined : input.systemPrompt
|
|
@@ -609,23 +732,38 @@ function buildResponsesParams(input, model) {
|
|
|
609
732
|
}
|
|
610
733
|
return params;
|
|
611
734
|
}
|
|
612
|
-
var OpenAI_TextGeneration_Stream = async (input, model, signal, emit) => {
|
|
735
|
+
var OpenAI_TextGeneration_Stream = async (input, model, signal, emit, _outputSchema, sessionContext) => {
|
|
613
736
|
const logger = getLogger3();
|
|
614
737
|
const timerLabel = `openai:TextGeneration:${getModelName(model)}`;
|
|
615
738
|
logger.time(timerLabel, { model: getModelName(model) });
|
|
616
739
|
try {
|
|
617
740
|
const client = await getClient(model);
|
|
618
|
-
const
|
|
741
|
+
const unified = input;
|
|
742
|
+
const merged = mergeOpenAICheckpointPrefix(sessionContext, unified);
|
|
743
|
+
const effective = merged ? { ...unified, messages: merged.messages, systemPrompt: merged.systemPrompt, prompt: "" } : unified;
|
|
744
|
+
const params = buildResponsesParams(effective, model);
|
|
745
|
+
if (merged?.tools && merged.tools.length > 0) {
|
|
746
|
+
params.tools = buildResponsesTools2(merged.tools);
|
|
747
|
+
}
|
|
748
|
+
finalizeResponsesRequest(model, params);
|
|
749
|
+
const promptText = promptTextForResponsesUsageEstimate(params);
|
|
750
|
+
createEstimatedOutputUsageReporter2(emit).onPrompt(promptText);
|
|
619
751
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
620
|
-
await accumulateOpenAIResponsesStream(stream, emit
|
|
621
|
-
|
|
752
|
+
const usage = await accumulateOpenAIResponsesStream(stream, emit, {
|
|
753
|
+
promptText
|
|
754
|
+
});
|
|
755
|
+
emit({ type: "finish", data: {}, usage });
|
|
622
756
|
} finally {
|
|
623
757
|
logger.timeEnd(timerLabel, { model: getModelName(model) });
|
|
624
758
|
}
|
|
625
759
|
};
|
|
626
760
|
|
|
627
761
|
// src/ai/common/OpenAI_TextRewriter.ts
|
|
628
|
-
import {
|
|
762
|
+
import {
|
|
763
|
+
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream2,
|
|
764
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter3,
|
|
765
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate2
|
|
766
|
+
} from "@workglow/ai/provider-utils";
|
|
629
767
|
var OpenAI_TextRewriter_Stream = async (input, model, signal, emit) => {
|
|
630
768
|
const client = await getClient(model);
|
|
631
769
|
const params = {
|
|
@@ -634,13 +772,21 @@ var OpenAI_TextRewriter_Stream = async (input, model, signal, emit) => {
|
|
|
634
772
|
input: input.text
|
|
635
773
|
};
|
|
636
774
|
finalizeResponsesRequest(model, params);
|
|
775
|
+
const promptText = promptTextForResponsesUsageEstimate2(params);
|
|
776
|
+
createEstimatedOutputUsageReporter3(emit).onPrompt(promptText);
|
|
637
777
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
638
|
-
await accumulateOpenAIResponsesStream2(stream, emit
|
|
639
|
-
|
|
778
|
+
const usage = await accumulateOpenAIResponsesStream2(stream, emit, {
|
|
779
|
+
promptText
|
|
780
|
+
});
|
|
781
|
+
emit({ type: "finish", data: {}, usage });
|
|
640
782
|
};
|
|
641
783
|
|
|
642
784
|
// src/ai/common/OpenAI_TextSummary.ts
|
|
643
|
-
import {
|
|
785
|
+
import {
|
|
786
|
+
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream3,
|
|
787
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter4,
|
|
788
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate3
|
|
789
|
+
} from "@workglow/ai/provider-utils";
|
|
644
790
|
var OpenAI_TextSummary_Stream = async (input, model, signal, emit) => {
|
|
645
791
|
const client = await getClient(model);
|
|
646
792
|
const params = {
|
|
@@ -649,25 +795,38 @@ var OpenAI_TextSummary_Stream = async (input, model, signal, emit) => {
|
|
|
649
795
|
input: input.text
|
|
650
796
|
};
|
|
651
797
|
finalizeResponsesRequest(model, params);
|
|
798
|
+
const promptText = promptTextForResponsesUsageEstimate3(params);
|
|
799
|
+
createEstimatedOutputUsageReporter4(emit).onPrompt(promptText);
|
|
652
800
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
653
|
-
await accumulateOpenAIResponsesStream3(stream, emit
|
|
654
|
-
|
|
801
|
+
const usage = await accumulateOpenAIResponsesStream3(stream, emit, {
|
|
802
|
+
promptText
|
|
803
|
+
});
|
|
804
|
+
emit({ type: "finish", data: {}, usage });
|
|
655
805
|
};
|
|
656
806
|
|
|
657
807
|
// src/ai/common/OpenAI_ToolCalling.ts
|
|
658
808
|
import {
|
|
659
809
|
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream4,
|
|
660
|
-
buildResponsesInput as
|
|
661
|
-
buildResponsesTools,
|
|
662
|
-
|
|
810
|
+
buildResponsesInput as buildResponsesInput3,
|
|
811
|
+
buildResponsesTools as buildResponsesTools3,
|
|
812
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter5,
|
|
813
|
+
mapResponsesToolChoice,
|
|
814
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate4
|
|
663
815
|
} from "@workglow/ai/provider-utils";
|
|
664
|
-
import { filterValidToolCalls, toOpenAIMessages as
|
|
665
|
-
var OpenAI_ToolCalling_Stream = async (input, model, signal, emit) => {
|
|
816
|
+
import { filterValidToolCalls, toOpenAIMessages as toOpenAIMessages3 } from "@workglow/ai/worker";
|
|
817
|
+
var OpenAI_ToolCalling_Stream = async (input, model, signal, emit, _outputSchema, sessionContext) => {
|
|
666
818
|
const client = await getClient(model);
|
|
667
819
|
const modelName = getModelName(model);
|
|
668
|
-
const
|
|
669
|
-
const
|
|
670
|
-
|
|
820
|
+
const merged = mergeOpenAICheckpointPrefix(sessionContext, input);
|
|
821
|
+
const toolDefinitions = merged?.tools ?? input.tools;
|
|
822
|
+
const tools = buildResponsesTools3(toolDefinitions);
|
|
823
|
+
const { input: responsesInput, instructions } = buildResponsesInput3({
|
|
824
|
+
messages: toOpenAIMessages3(merged ? {
|
|
825
|
+
...input,
|
|
826
|
+
messages: merged.messages,
|
|
827
|
+
systemPrompt: merged.systemPrompt,
|
|
828
|
+
prompt: ""
|
|
829
|
+
} : input)
|
|
671
830
|
});
|
|
672
831
|
const toolChoice = mapResponsesToolChoice(input.toolChoice);
|
|
673
832
|
const params = {
|
|
@@ -683,18 +842,20 @@ var OpenAI_ToolCalling_Stream = async (input, model, signal, emit) => {
|
|
|
683
842
|
if (input.temperature !== undefined)
|
|
684
843
|
params.temperature = input.temperature;
|
|
685
844
|
finalizeResponsesRequest(model, params);
|
|
845
|
+
const promptText = promptTextForResponsesUsageEstimate4(params);
|
|
846
|
+
createEstimatedOutputUsageReporter5(emit).onPrompt(promptText);
|
|
686
847
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
687
|
-
await accumulateOpenAIResponsesStream4(stream, (event) => {
|
|
848
|
+
const usage = await accumulateOpenAIResponsesStream4(stream, (event) => {
|
|
688
849
|
if (event.type === "object-delta" && event.port === "toolCalls") {
|
|
689
|
-
const validated = filterValidToolCalls(event.objectDelta,
|
|
850
|
+
const validated = filterValidToolCalls(event.objectDelta, toolDefinitions);
|
|
690
851
|
if (validated.length > 0) {
|
|
691
852
|
emit({ type: "object-delta", port: "toolCalls", objectDelta: validated });
|
|
692
853
|
}
|
|
693
854
|
return;
|
|
694
855
|
}
|
|
695
856
|
emit(event);
|
|
696
|
-
});
|
|
697
|
-
emit({ type: "finish", data: { text: "", toolCalls: [] } });
|
|
857
|
+
}, { promptText });
|
|
858
|
+
emit({ type: "finish", data: { text: "", toolCalls: [] }, usage });
|
|
698
859
|
};
|
|
699
860
|
|
|
700
861
|
// src/ai/common/OpenAI_JobRunFns.ts
|
|
@@ -709,7 +870,8 @@ var OPENAI_RUN_FNS = [
|
|
|
709
870
|
{ serves: OPENAI_IMAGE_EDITING, runFn: OpenAI_ImageEdit_Stream },
|
|
710
871
|
{ serves: OPENAI_COUNT_TOKENS, runFn: OpenAI_CountTokens_Stream },
|
|
711
872
|
{ serves: OPENAI_MODEL_SEARCH, runFn: OpenAI_ModelSearch_Stream },
|
|
712
|
-
{ serves: OPENAI_MODEL_INFO, runFn: OpenAI_ModelInfo_Stream }
|
|
873
|
+
{ serves: OPENAI_MODEL_INFO, runFn: OpenAI_ModelInfo_Stream },
|
|
874
|
+
{ serves: OPENAI_CACHE_CHECKPOINT, runFn: OpenAI_CacheCheckpoint_Stream }
|
|
713
875
|
];
|
|
714
876
|
var OPENAI_PREVIEW_TASKS = {
|
|
715
877
|
CountTokensTask: OpenAI_CountTokens_Preview
|
|
@@ -742,6 +904,7 @@ function inferOpenAiCapabilities(model) {
|
|
|
742
904
|
"text.summary",
|
|
743
905
|
"tool-use",
|
|
744
906
|
"json-mode",
|
|
907
|
+
"cache.checkpoint",
|
|
745
908
|
"model.count-tokens",
|
|
746
909
|
"model.info",
|
|
747
910
|
"model.search"
|
|
@@ -803,12 +966,15 @@ export {
|
|
|
803
966
|
resolvePromptCacheKey,
|
|
804
967
|
registerOpenAiWorker,
|
|
805
968
|
registerOpenAiInline,
|
|
969
|
+
mergeOpenAICheckpointPrefix,
|
|
806
970
|
loadOpenAISDK,
|
|
807
971
|
getReasoningConfig,
|
|
808
972
|
getModelName,
|
|
809
973
|
getClient,
|
|
810
974
|
finalizeResponsesRequest,
|
|
975
|
+
_testOnly,
|
|
976
|
+
OpenAI_CacheCheckpoint_Stream,
|
|
811
977
|
OPENAI_ALLOWED_HOSTS
|
|
812
978
|
};
|
|
813
979
|
|
|
814
|
-
//# debugId=
|
|
980
|
+
//# debugId=76D4D07BFEAF6C7464756E2164756E21
|