@workglow/openai 0.3.38 → 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.
Files changed (40) hide show
  1. package/dist/ai/OpenAiProvider.d.ts +2 -64
  2. package/dist/ai/OpenAiProvider.d.ts.map +1 -1
  3. package/dist/ai/OpenAiQueuedProvider.d.ts +2 -64
  4. package/dist/ai/OpenAiQueuedProvider.d.ts.map +1 -1
  5. package/dist/ai/common/OpenAI_CacheCheckpoint.d.ts +48 -0
  6. package/dist/ai/common/OpenAI_CacheCheckpoint.d.ts.map +1 -0
  7. package/dist/ai/common/OpenAI_Capabilities.d.ts +1 -1
  8. package/dist/ai/common/OpenAI_Capabilities.d.ts.map +1 -1
  9. package/dist/ai/common/OpenAI_CapabilitySets.d.ts +2 -1
  10. package/dist/ai/common/OpenAI_CapabilitySets.d.ts.map +1 -1
  11. package/dist/ai/common/OpenAI_Client.d.ts +34 -8
  12. package/dist/ai/common/OpenAI_Client.d.ts.map +1 -1
  13. package/dist/ai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
  14. package/dist/ai/common/OpenAI_JobRunFns.d.ts.map +1 -1
  15. package/dist/ai/common/OpenAI_ModelInfo.d.ts +4 -3
  16. package/dist/ai/common/OpenAI_ModelInfo.d.ts.map +1 -1
  17. package/dist/ai/common/OpenAI_ModelSchema.d.ts +70 -3
  18. package/dist/ai/common/OpenAI_ModelSchema.d.ts.map +1 -1
  19. package/dist/ai/common/OpenAI_StructuredGeneration.d.ts.map +1 -1
  20. package/dist/ai/common/OpenAI_TextEmbedding.d.ts.map +1 -1
  21. package/dist/ai/common/OpenAI_TextGeneration.d.ts.map +1 -1
  22. package/dist/ai/common/OpenAI_TextRewriter.d.ts.map +1 -1
  23. package/dist/ai/common/OpenAI_TextSummary.d.ts.map +1 -1
  24. package/dist/ai/common/OpenAI_ToolCalling.d.ts +3 -2
  25. package/dist/ai/common/OpenAI_ToolCalling.d.ts.map +1 -1
  26. package/dist/ai/index.d.ts +5 -24
  27. package/dist/ai/index.d.ts.map +1 -1
  28. package/dist/ai/runtime.browser.d.ts +1 -0
  29. package/dist/ai/runtime.browser.d.ts.map +1 -1
  30. package/dist/ai/runtime.d.ts +1 -0
  31. package/dist/ai/runtime.d.ts.map +1 -1
  32. package/dist/ai-runtime.browser.js +238 -74
  33. package/dist/ai-runtime.browser.js.map +16 -15
  34. package/dist/ai-runtime.js +235 -69
  35. package/dist/ai-runtime.js.map +15 -14
  36. package/dist/ai.browser.js +31 -5
  37. package/dist/ai.browser.js.map +6 -6
  38. package/dist/ai.js +235 -72
  39. package/dist/ai.js.map +17 -16
  40. 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 (!reasoning || reasoning.effort === undefined && reasoning.mode === undefined) {
55
- return;
80
+ if (reasoning && (reasoning.effort !== undefined || reasoning.mode !== undefined)) {
81
+ return reasoning;
56
82
  }
57
- return reasoning;
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
- var OpenAI_ModelInfo_Stream = async (input, model, _signal, emit) => {
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
- model: input.model,
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 { firstNonStrictReason, isStrictCompatibleSchema } from "@workglow/ai/provider-utils";
458
- import { parsePartialJson } from "@workglow/util/worker";
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
- let accumulatedJson = "";
608
+ const json = createPartialJsonStream();
507
609
  let refusal = "";
610
+ let usage;
508
611
  for await (const event of stream) {
509
- if (event.type === "response.output_text.delta") {
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
- accumulatedJson += delta;
513
- const partial = parsePartialJson(accumulatedJson);
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
- let finalObject;
526
- try {
527
- finalObject = JSON.parse(accumulatedJson);
528
- } catch {
529
- finalObject = parsePartialJson(accumulatedJson) ?? {};
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
- emit({ type: "finish", data: result });
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 { accumulateOpenAIResponsesStream, buildResponsesInput } from "@workglow/ai/provider-utils";
558
- import { toOpenAIMessages } from "@workglow/ai/worker";
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 ? toOpenAIMessages({
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 } = buildResponsesInput({
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 params = finalizeResponsesRequest(model, buildResponsesParams(input, model));
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
- emit({ type: "finish", data: {} });
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 { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream2 } from "@workglow/ai/provider-utils";
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
- emit({ type: "finish", data: {} });
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 { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream3 } from "@workglow/ai/provider-utils";
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
- emit({ type: "finish", data: {} });
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 buildResponsesInput2,
643
- buildResponsesTools,
644
- mapResponsesToolChoice
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 toOpenAIMessages2 } from "@workglow/ai/worker";
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 tools = buildResponsesTools(input.tools);
651
- const { input: responsesInput, instructions } = buildResponsesInput2({
652
- messages: toOpenAIMessages2(input)
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, input.tools);
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=C399FC18B471D7D964756E2164756E21
959
+ //# debugId=2797153093DFC5B564756E2164756E21