@workglow/openai 0.3.38 → 0.3.40
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
|
@@ -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;
|
|
56
82
|
}
|
|
57
|
-
|
|
83
|
+
if (isModelEffort(model?.effort)) {
|
|
84
|
+
return { effort: EFFORT_TO_OPENAI[model.effort] };
|
|
85
|
+
}
|
|
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.browser.ts
|
|
87
160
|
import { registerProviderInline } from "@workglow/ai/provider-utils";
|
|
88
161
|
|
|
@@ -98,6 +171,7 @@ var OPENAI_IMAGE_EDITING = ["image.editing"];
|
|
|
98
171
|
var OPENAI_COUNT_TOKENS = ["model.count-tokens"];
|
|
99
172
|
var OPENAI_MODEL_SEARCH = ["model.search"];
|
|
100
173
|
var OPENAI_MODEL_INFO = ["model.info"];
|
|
174
|
+
var OPENAI_CACHE_CHECKPOINT = ["cache.checkpoint"];
|
|
101
175
|
var OPENAI_CAPABILITY_SETS = [
|
|
102
176
|
OPENAI_TEXT_GENERATION,
|
|
103
177
|
OPENAI_TOOL_USE,
|
|
@@ -109,7 +183,8 @@ var OPENAI_CAPABILITY_SETS = [
|
|
|
109
183
|
OPENAI_IMAGE_EDITING,
|
|
110
184
|
OPENAI_COUNT_TOKENS,
|
|
111
185
|
OPENAI_MODEL_SEARCH,
|
|
112
|
-
OPENAI_MODEL_INFO
|
|
186
|
+
OPENAI_MODEL_INFO,
|
|
187
|
+
OPENAI_CACHE_CHECKPOINT
|
|
113
188
|
];
|
|
114
189
|
|
|
115
190
|
// src/ai/common/OpenAI_CountTokens.browser.ts
|
|
@@ -323,19 +398,63 @@ var OpenAI_ImageGenerate_Stream = async (input, model, signal, emit) => {
|
|
|
323
398
|
}
|
|
324
399
|
};
|
|
325
400
|
|
|
401
|
+
// src/ai/common/OpenAI_Constants.ts
|
|
402
|
+
var OPENAI = "OPENAI";
|
|
403
|
+
|
|
326
404
|
// src/ai/common/OpenAI_ModelInfo.ts
|
|
327
405
|
var OPENAI_EMBEDDING_DIMENSIONS = {
|
|
328
406
|
"text-embedding-3-small": { native_dimensions: 1536, mrl: true },
|
|
329
407
|
"text-embedding-3-large": { native_dimensions: 3072, mrl: true },
|
|
330
408
|
"text-embedding-ada-002": { native_dimensions: 1536, mrl: false }
|
|
331
409
|
};
|
|
332
|
-
|
|
410
|
+
function modelNameOf(model) {
|
|
411
|
+
const name = model?.provider_config?.model_name;
|
|
412
|
+
if (!name) {
|
|
413
|
+
throw new Error("Missing model name in provider_config.model_name.");
|
|
414
|
+
}
|
|
415
|
+
return name;
|
|
416
|
+
}
|
|
417
|
+
function isNotFoundError(err) {
|
|
418
|
+
if (!err || typeof err !== "object")
|
|
419
|
+
return false;
|
|
420
|
+
const status = err.status;
|
|
421
|
+
const code = err.code;
|
|
422
|
+
const statusCode = err.statusCode;
|
|
423
|
+
return status === 404 || statusCode === 404 || code === "model_not_found";
|
|
424
|
+
}
|
|
425
|
+
async function assertOpenAiModelExists(model, signal) {
|
|
426
|
+
const modelName = modelNameOf(model);
|
|
427
|
+
const client = await getClient(model);
|
|
428
|
+
try {
|
|
429
|
+
await client.models.retrieve(modelName, signal ? { signal } : undefined);
|
|
430
|
+
} catch (err) {
|
|
431
|
+
if (isNotFoundError(err)) {
|
|
432
|
+
throw new Error(`${OPENAI} model "${modelName}" was not found (provider API returned not found)`);
|
|
433
|
+
}
|
|
434
|
+
throw err;
|
|
435
|
+
}
|
|
436
|
+
return modelName;
|
|
437
|
+
}
|
|
438
|
+
function remoteInfoBase(input) {
|
|
439
|
+
return {
|
|
440
|
+
model: input.model,
|
|
441
|
+
is_local: false,
|
|
442
|
+
is_remote: true,
|
|
443
|
+
supports_browser: true,
|
|
444
|
+
supports_node: true,
|
|
445
|
+
is_cached: false,
|
|
446
|
+
is_loaded: false,
|
|
447
|
+
file_sizes: null
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
var OpenAI_ModelInfo_Stream = async (input, model, signal, emit) => {
|
|
451
|
+
const modelName = await assertOpenAiModelExists(model, signal);
|
|
452
|
+
const base = remoteInfoBase(input);
|
|
333
453
|
if (input.detail === "dimensions") {
|
|
334
454
|
const pc = model?.provider_config;
|
|
335
455
|
let native_dimensions = typeof pc?.native_dimensions === "number" ? pc.native_dimensions : undefined;
|
|
336
456
|
let mrl = typeof pc?.mrl === "boolean" ? pc.mrl : undefined;
|
|
337
457
|
if (native_dimensions === undefined) {
|
|
338
|
-
const modelName = pc?.model_name ?? "";
|
|
339
458
|
const known = OPENAI_EMBEDDING_DIMENSIONS[modelName];
|
|
340
459
|
if (known) {
|
|
341
460
|
native_dimensions = known.native_dimensions;
|
|
@@ -345,42 +464,18 @@ var OpenAI_ModelInfo_Stream = async (input, model, _signal, emit) => {
|
|
|
345
464
|
emit({
|
|
346
465
|
type: "finish",
|
|
347
466
|
data: {
|
|
348
|
-
|
|
349
|
-
is_local: false,
|
|
350
|
-
is_remote: true,
|
|
351
|
-
supports_browser: true,
|
|
352
|
-
supports_node: true,
|
|
353
|
-
is_cached: false,
|
|
354
|
-
is_loaded: false,
|
|
355
|
-
file_sizes: null,
|
|
467
|
+
...base,
|
|
356
468
|
...native_dimensions !== undefined ? { native_dimensions } : {},
|
|
357
469
|
...mrl !== undefined ? { mrl } : {}
|
|
358
470
|
}
|
|
359
471
|
});
|
|
360
472
|
return;
|
|
361
473
|
}
|
|
362
|
-
emit({
|
|
363
|
-
type: "finish",
|
|
364
|
-
data: {
|
|
365
|
-
model: input.model,
|
|
366
|
-
is_local: false,
|
|
367
|
-
is_remote: true,
|
|
368
|
-
supports_browser: true,
|
|
369
|
-
supports_node: true,
|
|
370
|
-
is_cached: false,
|
|
371
|
-
is_loaded: false,
|
|
372
|
-
file_sizes: null
|
|
373
|
-
}
|
|
374
|
-
});
|
|
474
|
+
emit({ type: "finish", data: base });
|
|
375
475
|
};
|
|
376
476
|
|
|
377
477
|
// src/ai/common/OpenAI_ModelSearch.ts
|
|
378
478
|
import { filterLabeledModelsByQuery } from "@workglow/ai/provider-utils";
|
|
379
|
-
|
|
380
|
-
// src/ai/common/OpenAI_Constants.ts
|
|
381
|
-
var OPENAI = "OPENAI";
|
|
382
|
-
|
|
383
|
-
// src/ai/common/OpenAI_ModelSearch.ts
|
|
384
479
|
var OPENAI_FALLBACK = [
|
|
385
480
|
{ label: "gpt-image-2", value: "gpt-image-2" },
|
|
386
481
|
{ label: "dall-e-3", value: "dall-e-3" },
|
|
@@ -454,8 +549,13 @@ var OpenAI_ModelSearch_Stream = async (input, _model, _signal, emit) => {
|
|
|
454
549
|
};
|
|
455
550
|
|
|
456
551
|
// src/ai/common/OpenAI_StructuredGeneration.ts
|
|
457
|
-
import {
|
|
458
|
-
|
|
552
|
+
import {
|
|
553
|
+
createEstimatedOutputUsageReporter,
|
|
554
|
+
firstNonStrictReason,
|
|
555
|
+
isStrictCompatibleSchema,
|
|
556
|
+
mapOpenAIResponsesUsage as mapOpenAIResponsesUsage2
|
|
557
|
+
} from "@workglow/ai/provider-utils";
|
|
558
|
+
import { createPartialJsonStream } from "@workglow/util/worker";
|
|
459
559
|
|
|
460
560
|
// src/ai/common/OpenAI_ResponsesWarnings.ts
|
|
461
561
|
import { getLogger } from "@workglow/util/worker";
|
|
@@ -502,15 +602,20 @@ var OpenAI_StructuredGeneration_Stream = async (input, model, signal, emit, outp
|
|
|
502
602
|
if (input.temperature !== undefined)
|
|
503
603
|
params.temperature = input.temperature;
|
|
504
604
|
finalizeResponsesRequest(model, params);
|
|
605
|
+
const provisionalUsage = createEstimatedOutputUsageReporter(emit);
|
|
606
|
+
provisionalUsage.onPrompt(typeof input.prompt === "string" ? input.prompt : "");
|
|
505
607
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
506
|
-
|
|
608
|
+
const json = createPartialJsonStream();
|
|
507
609
|
let refusal = "";
|
|
610
|
+
let usage;
|
|
508
611
|
for await (const event of stream) {
|
|
509
|
-
if (event.type === "response.
|
|
612
|
+
if (event.type === "response.completed" || event.type === "response.incomplete" || event.type === "response.failed") {
|
|
613
|
+
usage = mapOpenAIResponsesUsage2(event.response?.usage) ?? usage;
|
|
614
|
+
} else if (event.type === "response.output_text.delta") {
|
|
510
615
|
const delta = event.delta ?? "";
|
|
511
616
|
if (delta) {
|
|
512
|
-
|
|
513
|
-
const partial =
|
|
617
|
+
provisionalUsage.onText(delta);
|
|
618
|
+
const partial = json.push(delta);
|
|
514
619
|
if (partial !== undefined) {
|
|
515
620
|
emit({ type: "object-delta", port: "object", objectDelta: partial });
|
|
516
621
|
}
|
|
@@ -519,19 +624,19 @@ var OpenAI_StructuredGeneration_Stream = async (input, model, signal, emit, outp
|
|
|
519
624
|
refusal += event.delta ?? "";
|
|
520
625
|
}
|
|
521
626
|
}
|
|
627
|
+
provisionalUsage.flush();
|
|
522
628
|
if (refusal) {
|
|
523
629
|
emit({ type: "refusal", refusal });
|
|
524
630
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
}
|
|
531
|
-
emit({ type: "finish", data: { object: finalObject } });
|
|
631
|
+
emit({
|
|
632
|
+
type: "finish",
|
|
633
|
+
data: { object: json.finishObject() },
|
|
634
|
+
usage
|
|
635
|
+
});
|
|
532
636
|
};
|
|
533
637
|
|
|
534
638
|
// src/ai/common/OpenAI_TextEmbedding.ts
|
|
639
|
+
import { toUsageCount, usageOrUndefined } from "@workglow/ai/provider-utils";
|
|
535
640
|
import { getLogger as getLogger2 } from "@workglow/util/worker";
|
|
536
641
|
var OpenAI_TextEmbedding_Stream = async (input, model, signal, emit) => {
|
|
537
642
|
const logger = getLogger2();
|
|
@@ -547,25 +652,41 @@ var OpenAI_TextEmbedding_Stream = async (input, model, signal, emit) => {
|
|
|
547
652
|
const result = Array.isArray(input.text) ? {
|
|
548
653
|
vector: response.data.map((item) => new Float32Array(item.embedding))
|
|
549
654
|
} : { vector: new Float32Array(response.data[0].embedding) };
|
|
550
|
-
|
|
655
|
+
const rawUsage = response.usage;
|
|
656
|
+
const usage = usageOrUndefined({
|
|
657
|
+
input: toUsageCount(rawUsage?.prompt_tokens),
|
|
658
|
+
output: undefined,
|
|
659
|
+
cached: undefined,
|
|
660
|
+
cacheWrite: undefined,
|
|
661
|
+
reasoning: undefined,
|
|
662
|
+
total: toUsageCount(rawUsage?.total_tokens),
|
|
663
|
+
extra: undefined
|
|
664
|
+
});
|
|
665
|
+
emit({ type: "finish", data: result, usage });
|
|
551
666
|
} finally {
|
|
552
667
|
logger.timeEnd(timerLabel, { model: getModelName(model) });
|
|
553
668
|
}
|
|
554
669
|
};
|
|
555
670
|
|
|
556
671
|
// src/ai/common/OpenAI_TextGeneration.ts
|
|
557
|
-
import {
|
|
558
|
-
|
|
672
|
+
import {
|
|
673
|
+
accumulateOpenAIResponsesStream,
|
|
674
|
+
buildResponsesInput as buildResponsesInput2,
|
|
675
|
+
buildResponsesTools as buildResponsesTools2,
|
|
676
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter2,
|
|
677
|
+
promptTextForResponsesUsageEstimate
|
|
678
|
+
} from "@workglow/ai/provider-utils";
|
|
679
|
+
import { toOpenAIMessages as toOpenAIMessages2 } from "@workglow/ai/worker";
|
|
559
680
|
import { getLogger as getLogger3 } from "@workglow/util/worker";
|
|
560
681
|
function buildResponsesParams(input, model) {
|
|
561
682
|
const hasMessages = Array.isArray(input.messages) && input.messages.length > 0;
|
|
562
|
-
const messages = hasMessages ?
|
|
683
|
+
const messages = hasMessages ? toOpenAIMessages2({
|
|
563
684
|
messages: input.messages,
|
|
564
685
|
systemPrompt: input.systemPrompt,
|
|
565
686
|
prompt: "",
|
|
566
687
|
tools: []
|
|
567
688
|
}) : undefined;
|
|
568
|
-
const { input: responsesInput, instructions } =
|
|
689
|
+
const { input: responsesInput, instructions } = buildResponsesInput2({
|
|
569
690
|
messages,
|
|
570
691
|
prompt: hasMessages ? undefined : input.prompt,
|
|
571
692
|
systemPrompt: hasMessages ? undefined : input.systemPrompt
|
|
@@ -591,23 +712,38 @@ function buildResponsesParams(input, model) {
|
|
|
591
712
|
}
|
|
592
713
|
return params;
|
|
593
714
|
}
|
|
594
|
-
var OpenAI_TextGeneration_Stream = async (input, model, signal, emit) => {
|
|
715
|
+
var OpenAI_TextGeneration_Stream = async (input, model, signal, emit, _outputSchema, sessionContext) => {
|
|
595
716
|
const logger = getLogger3();
|
|
596
717
|
const timerLabel = `openai:TextGeneration:${getModelName(model)}`;
|
|
597
718
|
logger.time(timerLabel, { model: getModelName(model) });
|
|
598
719
|
try {
|
|
599
720
|
const client = await getClient(model);
|
|
600
|
-
const
|
|
721
|
+
const unified = input;
|
|
722
|
+
const merged = mergeOpenAICheckpointPrefix(sessionContext, unified);
|
|
723
|
+
const effective = merged ? { ...unified, messages: merged.messages, systemPrompt: merged.systemPrompt, prompt: "" } : unified;
|
|
724
|
+
const params = buildResponsesParams(effective, model);
|
|
725
|
+
if (merged?.tools && merged.tools.length > 0) {
|
|
726
|
+
params.tools = buildResponsesTools2(merged.tools);
|
|
727
|
+
}
|
|
728
|
+
finalizeResponsesRequest(model, params);
|
|
729
|
+
const promptText = promptTextForResponsesUsageEstimate(params);
|
|
730
|
+
createEstimatedOutputUsageReporter2(emit).onPrompt(promptText);
|
|
601
731
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
602
|
-
await accumulateOpenAIResponsesStream(stream, emit
|
|
603
|
-
|
|
732
|
+
const usage = await accumulateOpenAIResponsesStream(stream, emit, {
|
|
733
|
+
promptText
|
|
734
|
+
});
|
|
735
|
+
emit({ type: "finish", data: {}, usage });
|
|
604
736
|
} finally {
|
|
605
737
|
logger.timeEnd(timerLabel, { model: getModelName(model) });
|
|
606
738
|
}
|
|
607
739
|
};
|
|
608
740
|
|
|
609
741
|
// src/ai/common/OpenAI_TextRewriter.ts
|
|
610
|
-
import {
|
|
742
|
+
import {
|
|
743
|
+
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream2,
|
|
744
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter3,
|
|
745
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate2
|
|
746
|
+
} from "@workglow/ai/provider-utils";
|
|
611
747
|
var OpenAI_TextRewriter_Stream = async (input, model, signal, emit) => {
|
|
612
748
|
const client = await getClient(model);
|
|
613
749
|
const params = {
|
|
@@ -616,13 +752,21 @@ var OpenAI_TextRewriter_Stream = async (input, model, signal, emit) => {
|
|
|
616
752
|
input: input.text
|
|
617
753
|
};
|
|
618
754
|
finalizeResponsesRequest(model, params);
|
|
755
|
+
const promptText = promptTextForResponsesUsageEstimate2(params);
|
|
756
|
+
createEstimatedOutputUsageReporter3(emit).onPrompt(promptText);
|
|
619
757
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
620
|
-
await accumulateOpenAIResponsesStream2(stream, emit
|
|
621
|
-
|
|
758
|
+
const usage = await accumulateOpenAIResponsesStream2(stream, emit, {
|
|
759
|
+
promptText
|
|
760
|
+
});
|
|
761
|
+
emit({ type: "finish", data: {}, usage });
|
|
622
762
|
};
|
|
623
763
|
|
|
624
764
|
// src/ai/common/OpenAI_TextSummary.ts
|
|
625
|
-
import {
|
|
765
|
+
import {
|
|
766
|
+
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream3,
|
|
767
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter4,
|
|
768
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate3
|
|
769
|
+
} from "@workglow/ai/provider-utils";
|
|
626
770
|
var OpenAI_TextSummary_Stream = async (input, model, signal, emit) => {
|
|
627
771
|
const client = await getClient(model);
|
|
628
772
|
const params = {
|
|
@@ -631,25 +775,38 @@ var OpenAI_TextSummary_Stream = async (input, model, signal, emit) => {
|
|
|
631
775
|
input: input.text
|
|
632
776
|
};
|
|
633
777
|
finalizeResponsesRequest(model, params);
|
|
778
|
+
const promptText = promptTextForResponsesUsageEstimate3(params);
|
|
779
|
+
createEstimatedOutputUsageReporter4(emit).onPrompt(promptText);
|
|
634
780
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
635
|
-
await accumulateOpenAIResponsesStream3(stream, emit
|
|
636
|
-
|
|
781
|
+
const usage = await accumulateOpenAIResponsesStream3(stream, emit, {
|
|
782
|
+
promptText
|
|
783
|
+
});
|
|
784
|
+
emit({ type: "finish", data: {}, usage });
|
|
637
785
|
};
|
|
638
786
|
|
|
639
787
|
// src/ai/common/OpenAI_ToolCalling.ts
|
|
640
788
|
import {
|
|
641
789
|
accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream4,
|
|
642
|
-
buildResponsesInput as
|
|
643
|
-
buildResponsesTools,
|
|
644
|
-
|
|
790
|
+
buildResponsesInput as buildResponsesInput3,
|
|
791
|
+
buildResponsesTools as buildResponsesTools3,
|
|
792
|
+
createEstimatedOutputUsageReporter as createEstimatedOutputUsageReporter5,
|
|
793
|
+
mapResponsesToolChoice,
|
|
794
|
+
promptTextForResponsesUsageEstimate as promptTextForResponsesUsageEstimate4
|
|
645
795
|
} from "@workglow/ai/provider-utils";
|
|
646
|
-
import { filterValidToolCalls, toOpenAIMessages as
|
|
647
|
-
var OpenAI_ToolCalling_Stream = async (input, model, signal, emit) => {
|
|
796
|
+
import { filterValidToolCalls, toOpenAIMessages as toOpenAIMessages3 } from "@workglow/ai/worker";
|
|
797
|
+
var OpenAI_ToolCalling_Stream = async (input, model, signal, emit, _outputSchema, sessionContext) => {
|
|
648
798
|
const client = await getClient(model);
|
|
649
799
|
const modelName = getModelName(model);
|
|
650
|
-
const
|
|
651
|
-
const
|
|
652
|
-
|
|
800
|
+
const merged = mergeOpenAICheckpointPrefix(sessionContext, input);
|
|
801
|
+
const toolDefinitions = merged?.tools ?? input.tools;
|
|
802
|
+
const tools = buildResponsesTools3(toolDefinitions);
|
|
803
|
+
const { input: responsesInput, instructions } = buildResponsesInput3({
|
|
804
|
+
messages: toOpenAIMessages3(merged ? {
|
|
805
|
+
...input,
|
|
806
|
+
messages: merged.messages,
|
|
807
|
+
systemPrompt: merged.systemPrompt,
|
|
808
|
+
prompt: ""
|
|
809
|
+
} : input)
|
|
653
810
|
});
|
|
654
811
|
const toolChoice = mapResponsesToolChoice(input.toolChoice);
|
|
655
812
|
const params = {
|
|
@@ -665,18 +822,20 @@ var OpenAI_ToolCalling_Stream = async (input, model, signal, emit) => {
|
|
|
665
822
|
if (input.temperature !== undefined)
|
|
666
823
|
params.temperature = input.temperature;
|
|
667
824
|
finalizeResponsesRequest(model, params);
|
|
825
|
+
const promptText = promptTextForResponsesUsageEstimate4(params);
|
|
826
|
+
createEstimatedOutputUsageReporter5(emit).onPrompt(promptText);
|
|
668
827
|
const stream = await client.responses.create({ ...params, stream: true }, { signal });
|
|
669
|
-
await accumulateOpenAIResponsesStream4(stream, (event) => {
|
|
828
|
+
const usage = await accumulateOpenAIResponsesStream4(stream, (event) => {
|
|
670
829
|
if (event.type === "object-delta" && event.port === "toolCalls") {
|
|
671
|
-
const validated = filterValidToolCalls(event.objectDelta,
|
|
830
|
+
const validated = filterValidToolCalls(event.objectDelta, toolDefinitions);
|
|
672
831
|
if (validated.length > 0) {
|
|
673
832
|
emit({ type: "object-delta", port: "toolCalls", objectDelta: validated });
|
|
674
833
|
}
|
|
675
834
|
return;
|
|
676
835
|
}
|
|
677
836
|
emit(event);
|
|
678
|
-
});
|
|
679
|
-
emit({ type: "finish", data: { text: "", toolCalls: [] } });
|
|
837
|
+
}, { promptText });
|
|
838
|
+
emit({ type: "finish", data: { text: "", toolCalls: [] }, usage });
|
|
680
839
|
};
|
|
681
840
|
|
|
682
841
|
// src/ai/common/OpenAI_JobRunFns.browser.ts
|
|
@@ -691,7 +850,8 @@ var OPENAI_RUN_FNS = [
|
|
|
691
850
|
{ serves: OPENAI_IMAGE_EDITING, runFn: OpenAI_ImageEdit_Stream },
|
|
692
851
|
{ serves: OPENAI_COUNT_TOKENS, runFn: OpenAI_CountTokens_Stream },
|
|
693
852
|
{ serves: OPENAI_MODEL_SEARCH, runFn: OpenAI_ModelSearch_Stream },
|
|
694
|
-
{ serves: OPENAI_MODEL_INFO, runFn: OpenAI_ModelInfo_Stream }
|
|
853
|
+
{ serves: OPENAI_MODEL_INFO, runFn: OpenAI_ModelInfo_Stream },
|
|
854
|
+
{ serves: OPENAI_CACHE_CHECKPOINT, runFn: OpenAI_CacheCheckpoint_Stream }
|
|
695
855
|
];
|
|
696
856
|
var OPENAI_PREVIEW_TASKS = {
|
|
697
857
|
CountTokensTask: OpenAI_CountTokens_Preview
|
|
@@ -724,6 +884,7 @@ function inferOpenAiCapabilities(model) {
|
|
|
724
884
|
"text.summary",
|
|
725
885
|
"tool-use",
|
|
726
886
|
"json-mode",
|
|
887
|
+
"cache.checkpoint",
|
|
727
888
|
"model.count-tokens",
|
|
728
889
|
"model.info",
|
|
729
890
|
"model.search"
|
|
@@ -784,12 +945,15 @@ export {
|
|
|
784
945
|
resolvePromptCacheKey,
|
|
785
946
|
registerOpenAiWorker,
|
|
786
947
|
registerOpenAiInline,
|
|
948
|
+
mergeOpenAICheckpointPrefix,
|
|
787
949
|
loadOpenAISDK,
|
|
788
950
|
getReasoningConfig,
|
|
789
951
|
getModelName,
|
|
790
952
|
getClient,
|
|
791
953
|
finalizeResponsesRequest,
|
|
954
|
+
_testOnly,
|
|
955
|
+
OpenAI_CacheCheckpoint_Stream,
|
|
792
956
|
OPENAI_ALLOWED_HOSTS
|
|
793
957
|
};
|
|
794
958
|
|
|
795
|
-
//# debugId=
|
|
959
|
+
//# debugId=2797153093DFC5B564756E2164756E21
|