@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;
82
+ }
83
+ if (isModelEffort(model?.effort)) {
84
+ return { effort: EFFORT_TO_OPENAI[model.effort] };
56
85
  }
57
- return reasoning;
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
- var OpenAI_ModelInfo_Stream = async (input, model, _signal, emit) => {
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
- model: input.model,
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 { firstNonStrictReason, isStrictCompatibleSchema } from "@workglow/ai/provider-utils";
472
- import { parsePartialJson } from "@workglow/util/worker";
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
- let accumulatedJson = "";
628
+ const json = createPartialJsonStream();
525
629
  let refusal = "";
630
+ let usage;
526
631
  for await (const event of stream) {
527
- if (event.type === "response.output_text.delta") {
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
- accumulatedJson += delta;
531
- const partial = parsePartialJson(accumulatedJson);
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
- let finalObject;
544
- try {
545
- finalObject = JSON.parse(accumulatedJson);
546
- } catch {
547
- finalObject = parsePartialJson(accumulatedJson) ?? {};
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
- emit({ type: "finish", data: result });
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 { accumulateOpenAIResponsesStream, buildResponsesInput } from "@workglow/ai/provider-utils";
576
- import { toOpenAIMessages } from "@workglow/ai/worker";
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 ? toOpenAIMessages({
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 } = buildResponsesInput({
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 params = finalizeResponsesRequest(model, buildResponsesParams(input, model));
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
- emit({ type: "finish", data: {} });
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 { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream2 } from "@workglow/ai/provider-utils";
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
- emit({ type: "finish", data: {} });
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 { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream3 } from "@workglow/ai/provider-utils";
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
- emit({ type: "finish", data: {} });
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 buildResponsesInput2,
661
- buildResponsesTools,
662
- mapResponsesToolChoice
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 toOpenAIMessages2 } from "@workglow/ai/worker";
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 tools = buildResponsesTools(input.tools);
669
- const { input: responsesInput, instructions } = buildResponsesInput2({
670
- messages: toOpenAIMessages2(input)
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, input.tools);
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=9CC090871A0DB04F64756E2164756E21
980
+ //# debugId=76D4D07BFEAF6C7464756E2164756E21