@openclaw/ai 2026.9.8 → 2026.10.1-beta.1

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 (115) hide show
  1. package/README.md +4 -1
  2. package/dist/{anthropic-CTXJlfnS.mjs → anthropic-CZv6XFER.mjs} +52 -147
  3. package/dist/{anthropic-payload-policy-NIPVYXPq.d.mts → anthropic-payload-policy-BhCcgNdm.d.mts} +7 -4
  4. package/dist/{anthropic-stream-reducer-DrsBCsFY.mjs → anthropic-stream-reducer-BQ1tjd7x.mjs} +369 -233
  5. package/dist/{api-registry-D-nbmSqr.d.mts → api-registry-DpU0Rj-I.d.mts} +4 -4
  6. package/dist/{provider-transcript-transform-DjA5Fk2P.mjs → assistant-output-OLm-Oln0.mjs} +17 -17
  7. package/dist/{assistant-text-phase-C20rxWwP.mjs → assistant-text-phase-Bl1aDCB7.mjs} +2 -8
  8. package/dist/{azure-openai-responses-BBxv4QVI.mjs → azure-openai-responses-DH7bd3QT.mjs} +12 -17
  9. package/dist/{azure-openai-responses-client-compat-C7K7QfUE.mjs → azure-openai-responses-client-compat-D0dvJMbZ.mjs} +3 -10
  10. package/dist/{base64-C1PsYcRQ.mjs → base64-C8CdcsjU.mjs} +3 -45
  11. package/dist/cloudflare-5qSGvIUH.mjs +39 -0
  12. package/dist/{diagnostics-CJaB6g8J.mjs → diagnostics-Caj-4RBA.mjs} +19 -37
  13. package/dist/diagnostics.d.mts +4 -4
  14. package/dist/diagnostics.mjs +2 -2
  15. package/dist/{event-stream-vd9UnCAU.mjs → event-stream-C5AbCAaZ.mjs} +29 -1
  16. package/dist/event-stream-DqDQWqiy.d.mts +1 -0
  17. package/dist/{event-stream-DOPFYVqs.d.mts → event-stream-DrRM_90c.d.mts} +1 -1
  18. package/dist/event-stream.d.mts +2 -2
  19. package/dist/event-stream.mjs +1 -1
  20. package/dist/{github-copilot-request-facts-BTEBMeOv.mjs → github-copilot-request-facts-DEE6gcB9.mjs} +3 -1
  21. package/dist/{google-B3HEK0Ag.mjs → google-1WLOtb8w.mjs} +12 -9
  22. package/dist/{google-interactions-vMlEfPAA.mjs → google-interactions-wrnE6MLw.mjs} +39 -49
  23. package/dist/{google-messages-Dz2dAnGo.mjs → google-messages-BwPPycw6.mjs} +11 -17
  24. package/dist/{google-shared-B58i3c8H.mjs → google-shared-Eql1OMPU.mjs} +5 -6
  25. package/dist/{google-vertex-DYFXzEbh.mjs → google-vertex-0LrlRoO3.mjs} +11 -11
  26. package/dist/{host-rxlNaBwm.d.mts → host-BinBeGcQ.d.mts} +12 -4
  27. package/dist/{host-DwBmNMCC.mjs → host-DCW52iHe.mjs} +57 -9
  28. package/dist/{host-policy-wK-ay_RK.mjs → host-policy-B3jc4Rpn.mjs} +9 -2
  29. package/dist/{index-D6KsSE74.d.mts → index-a8e_oKnu.d.mts} +7 -5
  30. package/dist/index.d.mts +23 -7
  31. package/dist/index.mjs +7 -7
  32. package/dist/internal/anthropic.d.mts +6 -6
  33. package/dist/internal/anthropic.mjs +5 -5
  34. package/dist/internal/google-model-family.mjs +1 -1
  35. package/dist/internal/openai-completions-compat.d.mts +1 -1
  36. package/dist/internal/openai-completions-compat.mjs +1 -1
  37. package/dist/internal/openai-responses-payload-policy.d.mts +1 -1
  38. package/dist/internal/openai-responses-payload-policy.mjs +2 -2
  39. package/dist/internal/openai.d.mts +14 -10
  40. package/dist/internal/openai.mjs +12 -12
  41. package/dist/internal/runtime.d.mts +18 -9
  42. package/dist/internal/runtime.mjs +9 -9
  43. package/dist/internal/shared.d.mts +6 -4
  44. package/dist/internal/shared.mjs +6 -6
  45. package/dist/internal/tool-schema.mjs +1 -1
  46. package/dist/json-schema-Bp07Qui3.mjs +22 -0
  47. package/dist/{llm-request-activity-BjtkplhG.mjs → llm-request-activity-D8f_oxHj.mjs} +1 -2
  48. package/dist/{mistral-7wDWcjfF.mjs → mistral-DSt4vQAO.mjs} +18 -29
  49. package/dist/number-coercion-V8-BhME4.mjs +47 -0
  50. package/dist/{openai-chatgpt-responses-Bc7NZrQR.mjs → openai-chatgpt-responses-BC2x0Oqx.mjs} +215 -164
  51. package/dist/openai-completions-DNyHnXKg.mjs +25 -0
  52. package/dist/{openai-completions-compat-qJjmqQ71.d.mts → openai-completions-compat-BYdYpXhU.d.mts} +3 -3
  53. package/dist/{openai-completions-compat-BJf57ZxN.mjs → openai-completions-compat-BdmlhD4u.mjs} +30 -23
  54. package/dist/{openai-completions-stream-dju_5F3P.mjs → openai-completions-transport-DWM2mQDB.mjs} +389 -76
  55. package/dist/{openai-prompt-cache-CouErLh7.d.mts → openai-prompt-cache-45-AH_xv.d.mts} +2 -2
  56. package/dist/{openai-prompt-cache-BTMs80_O.mjs → openai-prompt-cache-I8YQTzf8.mjs} +1 -1
  57. package/dist/{openai-responses-compaction-replay-DiYn-gFM.d.mts → openai-responses-compaction-replay-BClApUIf.d.mts} +4 -4
  58. package/dist/{openai-responses-compaction-window-CYGCjAQz.mjs → openai-responses-compaction-window-m878aVpU.mjs} +25 -83
  59. package/dist/{openai-reasoning-effort-C_0p3psG.mjs → openai-responses-contracts-BKu8O7l4.mjs} +103 -4
  60. package/dist/{openai-responses-contracts-D1iZ0njF.d.mts → openai-responses-contracts-Br5IIw_h.d.mts} +16 -5
  61. package/dist/openai-responses-prompt-observer-internal-CCg7B6l4.mjs +32 -0
  62. package/dist/{openai-responses-shared-CIEHiKx7.mjs → openai-responses-shared-C7oVyjED.mjs} +297 -312
  63. package/dist/{openai-responses-terminal-usage-BE7lf7nW.d.mts → openai-responses-terminal-usage-DgImcyJu.d.mts} +2 -2
  64. package/dist/{openai-responses-DbPe3-Py.mjs → openai-responses-uZ5oWSp7.mjs} +12 -21
  65. package/dist/{openai-tool-schema-vsl-cE-n.mjs → openai-tool-schema-DYNePiF8.mjs} +66 -36
  66. package/dist/{openai-transport-params-DyFJ4cgR.mjs → openai-transport-params-JFsnIyto.mjs} +25 -30
  67. package/dist/openai-web-search-tools-Cfu0uLyN.mjs +14 -0
  68. package/dist/{positive-integer-CjN5OJbH.mjs → positive-integer-CwLi8LUL.mjs} +1 -1
  69. package/dist/{provider-error-CwT_j2v0.mjs → provider-error-DQBE1bUQ.mjs} +17 -28
  70. package/dist/{provider-options-Df7ov0K1.d.mts → provider-options-D5ABCV_l.d.mts} +2 -2
  71. package/dist/{provider-replay-context-Bs5aWE1d.mjs → provider-replay-context-C7Bmi84a.mjs} +6 -2
  72. package/dist/{provider-transport-turn-state-Dw7OtYUs.mjs → provider-transport-turn-state-_M2kLdUE.mjs} +25 -3
  73. package/dist/{provider-types-d4XnoZMd.d.mts → provider-types-F8Mqc9Ma.d.mts} +3 -3
  74. package/dist/provider-types.d.mts +6 -6
  75. package/dist/providers.d.mts +2 -2
  76. package/dist/providers.mjs +14 -26
  77. package/dist/{reasoning-tag-text-partitioner-B6FIIBt6.mjs → reasoning-tag-text-partitioner-Ju9VpUGl.mjs} +23 -37
  78. package/dist/required-api-key-D4kn3252.mjs +9 -0
  79. package/dist/sanitize-unicode-CjDG6jJx.d.mts +5 -0
  80. package/dist/{session-affinity-Bcunsn4I.mjs → session-affinity-DA4WHv1h.mjs} +2 -6
  81. package/dist/session-resources-D1wgDQ8C.mjs +40 -0
  82. package/dist/{simple-options-BkDPMuxw.mjs → simple-options-BkKTXxhp.mjs} +7 -11
  83. package/dist/{src-H4aXcFuX.mjs → src-B0NIt2UK.mjs} +7 -4
  84. package/dist/stream-DSdzKsDK.mjs +275 -0
  85. package/dist/{stream-first-event-timeout-B9o0S4SZ.mjs → stream-first-event-timeout-D9ZmL_s9.mjs} +3 -3
  86. package/dist/{string-coerce-fsri9iCu.mjs → string-coerce-CtgOVOSv.mjs} +5 -1
  87. package/dist/{string-normalization-J9ZiLfGO.mjs → string-normalization-PN10hf6d.mjs} +1 -1
  88. package/dist/{transport-utils-CqXzku3R.mjs → text-signature-MLwfi6fq.mjs} +18 -18
  89. package/dist/{transport-stream-shared-yYhXa4kX.d.mts → transport-stream-shared-BcAKh2XH.d.mts} +6 -19
  90. package/dist/{transport-stream-shared-BU5pwY6W.mjs → transport-stream-shared-CxXXz_Dd.mjs} +171 -56
  91. package/dist/transports.d.mts +22 -23
  92. package/dist/transports.mjs +251 -495
  93. package/dist/types-BuiEBM3u.d.mts +1 -0
  94. package/dist/types-CQc6JNG4.mjs +69 -0
  95. package/dist/{types-CLLR3eB4.d.mts → types-DvzmWW8J.d.mts} +58 -6
  96. package/dist/types.d.mts +6 -6
  97. package/dist/types.mjs +5 -5
  98. package/dist/usage-CJH5D6Ea.mjs +19 -0
  99. package/dist/{validation-Cat2wQsc.d.mts → validation-B3lQt_VE.d.mts} +1 -1
  100. package/dist/{validation-BFZc40Ig.mjs → validation-DbqlIfDn.mjs} +15 -30
  101. package/dist/validation.d.mts +1 -1
  102. package/dist/validation.mjs +1 -1
  103. package/package.json +4 -4
  104. package/dist/cache-retention-0x979a5V.mjs +0 -12
  105. package/dist/event-stream-CMQfX_yr.d.mts +0 -1
  106. package/dist/github-copilot-headers-B37TB3rB.mjs +0 -30
  107. package/dist/openai-completions-CHnwIV-W.mjs +0 -188
  108. package/dist/openai-provider-client-G8Otsq2Q.mjs +0 -24
  109. package/dist/openai-responses-contracts-CLxnqS9p.mjs +0 -81
  110. package/dist/openai-responses-prompt-observer-internal-BX3QTNSv.mjs +0 -198
  111. package/dist/sanitize-unicode-BZiVbGwK.d.mts +0 -24
  112. package/dist/session-resources-CkR4WWy1.mjs +0 -21
  113. package/dist/stream-DDsCBgd-.mjs +0 -68
  114. package/dist/types-CB-_vNyI.d.mts +0 -1
  115. package/dist/types-LFWwv0cF.mjs +0 -8
@@ -1,9 +1,8 @@
1
1
  import { o as isRecord } from "./record-coerce-CNDovvft.mjs";
2
- import { i as normalizeOptionalLowercaseString, n as normalizeLowercaseStringOrEmpty, s as readStringValue } from "./string-coerce-fsri9iCu.mjs";
3
- import { u as supportsOpenAIReasoningEffort } from "./openai-reasoning-effort-C_0p3psG.mjs";
4
- import { t as canonicalizeBase64 } from "./base64-C1PsYcRQ.mjs";
5
- import { t as parsePositiveInteger } from "./positive-integer-CjN5OJbH.mjs";
6
- import { i as OPENAI_RESPONSES_APIS } from "./openai-responses-contracts-CLxnqS9p.mjs";
2
+ import { c as readStringValue, i as normalizeOptionalLowercaseString, n as normalizeLowercaseStringOrEmpty } from "./string-coerce-CtgOVOSv.mjs";
3
+ import { E as supportsOpenAIReasoningEffort, i as OPENAI_RESPONSES_APIS } from "./openai-responses-contracts-BKu8O7l4.mjs";
4
+ import { t as canonicalizeBase64 } from "./base64-C8CdcsjU.mjs";
5
+ import { t as parsePositiveInteger } from "./positive-integer-CwLi8LUL.mjs";
7
6
  import { t as createSseByteGuard } from "./streaming-byte-guard-CC-HMn_u.mjs";
8
7
  //#region packages/model-catalog-core/src/provider-id.ts
9
8
  function normalizeProviderId(provider) {
@@ -24,15 +23,7 @@ const OPENAI_RESPONSES_PROVIDERS = /* @__PURE__ */ new Set([
24
23
  function resolveUrlHostname(value) {
25
24
  const trimmed = readStringValue(value)?.trim();
26
25
  if (!trimmed) return;
27
- try {
28
- return new URL(trimmed).hostname.toLowerCase();
29
- } catch {
30
- try {
31
- return new URL(`https://${trimmed}`).hostname.toLowerCase();
32
- } catch {
33
- return;
34
- }
35
- }
26
+ return (URL.parse(trimmed) ?? URL.parse(`https://${trimmed}`))?.hostname.toLowerCase();
36
27
  }
37
28
  function resolveOpenAIResponsesEndpointClass(baseUrl) {
38
29
  const trimmed = readStringValue(baseUrl)?.trim();
@@ -76,7 +67,7 @@ function resolveOpenAIResponsesPayloadCapabilities(model) {
76
67
  const supportsResponsesStoreField = readCompatPayloadBoolean(model.compat, "supportsStore") !== false && isResponsesApi;
77
68
  const explicitContinuationOptIn = (api === "openai-responses" || api === "openclaw-openai-responses-transport") && supportsResponsesStoreField && provider !== "azure-openai" && provider !== "azure-openai-responses" && readCompatPayloadBoolean(model.compat, "supportsResponsesContinuation") === true;
78
69
  return {
79
- allowsOpenAIServiceTier: provider === "openai" && (api === "openai-responses" || api === "openclaw-openai-responses-transport") && endpointClass === "openai-public" || isOpenAIProvider && (api === "openai-chatgpt-responses" || api === "openclaw-openai-chatgpt-responses-transport" || api === "openai-responses" || api === "openclaw-openai-responses-transport") && endpointClass === "openai",
70
+ allowsOpenAIServiceTier: provider === "openai" && (api === "openai-responses" || api === "openclaw-openai-responses-transport") || isOpenAIProvider && (api === "openai-chatgpt-responses" || api === "openclaw-openai-chatgpt-responses-transport") && endpointClass === "openai",
80
71
  allowsResponsesStore: supportsResponsesStoreField && api !== "openai-chatgpt-responses" && api !== "openclaw-openai-chatgpt-responses-transport" && provider !== void 0 && OPENAI_RESPONSES_PROVIDERS.has(provider) && usesKnownNativeOpenAIEndpoint,
81
72
  explicitContinuationOptIn,
82
73
  shouldStripResponsesPromptCache,
@@ -165,32 +156,6 @@ function applyOpenAIResponsesPayloadPolicy(payloadObj, policy) {
165
156
  if (policy.shouldStripDisabledReasoningPayload) stripDisabledOpenAIReasoningPayload(payloadObj);
166
157
  if (policy.shouldStripInputStatus) stripInputItemStatuses(payloadObj.input);
167
158
  }
168
- //#endregion
169
- //#region packages/media-core/src/inline-image-data-url.ts
170
- /** Prefix used to distinguish inline data URLs from remote/local image references. */
171
- const INLINE_IMAGE_DATA_URL_PREFIX = "data:";
172
- const IMAGE_SIGNATURES = [
173
- {
174
- mime: "image/png",
175
- matches: (buffer) => buffer.length >= 8 && buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71 && buffer[4] === 13 && buffer[5] === 10 && buffer[6] === 26 && buffer[7] === 10
176
- },
177
- {
178
- mime: "image/jpeg",
179
- matches: (buffer) => buffer.length >= 3 && buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255
180
- },
181
- {
182
- mime: "image/webp",
183
- matches: (buffer) => buffer.length >= 12 && buffer.subarray(0, 4).toString("ascii") === "RIFF" && buffer.subarray(8, 12).toString("ascii") === "WEBP"
184
- },
185
- {
186
- mime: "image/gif",
187
- matches: (buffer) => buffer.length >= 6 && (buffer.subarray(0, 6).toString("ascii") === "GIF87a" || buffer.subarray(0, 6).toString("ascii") === "GIF89a")
188
- },
189
- {
190
- mime: "image/bmp",
191
- matches: (buffer) => buffer.length >= 2 && buffer[0] === 66 && buffer[1] === 77
192
- }
193
- ];
194
159
  const HEIC_BRANDS = /* @__PURE__ */ new Set([
195
160
  "heic",
196
161
  "heix",
@@ -209,26 +174,22 @@ const INLINE_IMAGE_DATA_URL_MIMES = /* @__PURE__ */ new Set([
209
174
  "image/webp",
210
175
  "image/gif"
211
176
  ]);
212
- function startsWithDataUrl(value) {
213
- return value.slice(0, 5).toLowerCase() === INLINE_IMAGE_DATA_URL_PREFIX;
214
- }
215
- function sniffIsoBmffImageMime(buffer) {
177
+ /** Sniffs supported inline image formats from decoded bytes. */
178
+ function sniffInlineImageMime(buffer) {
179
+ if (buffer.length >= 8 && buffer.readBigUInt64BE(0) === 9894494448401390090n) return "image/png";
180
+ if (buffer.length >= 3 && buffer.readUIntBE(0, 3) === 16767231) return "image/jpeg";
181
+ if (buffer.length >= 12 && buffer.toString("ascii", 0, 4) === "RIFF" && buffer.toString("ascii", 8, 12) === "WEBP") return "image/webp";
182
+ if (buffer.length >= 6 && /^GIF8[79]a$/.test(buffer.toString("ascii", 0, 6))) return "image/gif";
183
+ if (buffer.length >= 2 && buffer.readUInt16BE(0) === 16973) return "image/bmp";
216
184
  if (buffer.length < 12 || buffer.subarray(4, 8).toString("ascii") !== "ftyp") return;
217
185
  const brands = [buffer.subarray(8, 12).toString("ascii")];
218
186
  for (let offset = 16; offset + 4 <= buffer.length; offset += 4) brands.push(buffer.subarray(offset, offset + 4).toString("ascii"));
219
187
  if (brands.some((brand) => HEIC_BRANDS.has(brand))) return "image/heic";
220
188
  if (brands.some((brand) => HEIF_BRANDS.has(brand))) return "image/heif";
221
189
  }
222
- /** Sniffs supported inline image formats from decoded bytes. */
223
- function sniffInlineImageMime(buffer) {
224
- return IMAGE_SIGNATURES.find((signature) => signature.matches(buffer))?.mime ?? sniffIsoBmffImageMime(buffer);
225
- }
226
- function isImageMimeType(value) {
227
- return value.trim().toLowerCase().startsWith("image/");
228
- }
229
190
  /** Canonicalizes trusted inline image base64 and rejects malformed or non-image payloads. */
230
191
  function sanitizeInlineImageBase64(params) {
231
- if (!isImageMimeType(params.mimeType)) return;
192
+ if (!params.mimeType.trim().toLowerCase().startsWith("image/")) return;
232
193
  const canonicalPayload = canonicalizeBase64(params.base64);
233
194
  if (!canonicalPayload) return;
234
195
  const sniffedMimeType = sniffInlineImageMime(Buffer.from(canonicalPayload.slice(0, IMAGE_SIGNATURE_PREFIX_BASE64_CHARS), "base64"));
@@ -238,31 +199,15 @@ function sanitizeInlineImageBase64(params) {
238
199
  base64: canonicalPayload
239
200
  };
240
201
  }
241
- function parseInlineImageDataUrl(value) {
242
- if (!startsWithDataUrl(value)) return {
243
- metadata: [],
244
- payload: value
245
- };
246
- const commaIndex = value.indexOf(",");
247
- if (commaIndex < 0) return;
248
- return {
249
- metadata: value.slice(5, commaIndex).split(";").map((part) => part.trim()),
250
- payload: value.slice(commaIndex + 1)
251
- };
252
- }
253
- function metadataAllowsImageBase64(metadata) {
254
- const [mimeType, ...options] = metadata;
255
- return mimeType !== void 0 && isImageMimeType(mimeType) && options.some((part) => part.toLowerCase() === "base64");
256
- }
257
202
  function sanitizeInlineImageDataUrlWithAllowedMimes(imageUrl, allowedMimes) {
258
- const parsed = parseInlineImageDataUrl(imageUrl);
259
- if (!parsed) return;
260
- if (parsed.metadata.length === 0) return imageUrl;
261
- if (!metadataAllowsImageBase64(parsed.metadata)) return;
262
- const [mimeType] = parsed.metadata;
203
+ if (imageUrl.slice(0, 5).toLowerCase() !== "data:") return imageUrl;
204
+ const commaIndex = imageUrl.indexOf(",");
205
+ if (commaIndex < 0) return;
206
+ const [mimeType, ...options] = imageUrl.slice(5, commaIndex).split(";").map((part) => part.trim());
207
+ if (!mimeType || !options.some((part) => part.toLowerCase() === "base64")) return;
263
208
  const sanitized = sanitizeInlineImageBase64({
264
- mimeType: mimeType ?? "",
265
- base64: parsed.payload
209
+ mimeType,
210
+ base64: imageUrl.slice(commaIndex + 1)
266
211
  });
267
212
  if (!sanitized) return;
268
213
  if (allowedMimes && !allowedMimes.has(sanitized.mimeType)) return;
@@ -280,12 +225,6 @@ function sanitizeInlineImageDataUrl(imageUrl) {
280
225
  * auditable.
281
226
  */
282
227
  const IMAGE_OMITTED_TEXT = "omitted image payload: invalid inline image data";
283
- function invalidSnakeImage() {
284
- return {
285
- type: "input_text",
286
- text: `[${IMAGE_OMITTED_TEXT}]`
287
- };
288
- }
289
228
  function sanitizeValue(value) {
290
229
  if (Array.isArray(value)) return value.map(sanitizeValue);
291
230
  if (!isRecord(value)) return value;
@@ -294,7 +233,10 @@ function sanitizeValue(value) {
294
233
  return imageUrl ? {
295
234
  ...value,
296
235
  image_url: imageUrl
297
- } : invalidSnakeImage();
236
+ } : {
237
+ type: "input_text",
238
+ text: `[${IMAGE_OMITTED_TEXT}]`
239
+ };
298
240
  }
299
241
  const next = {};
300
242
  for (const [key, child] of Object.entries(value)) next[key] = sanitizeValue(child);
@@ -1,6 +1,7 @@
1
- import { i as asOptionalRecord } from "./record-coerce-CNDovvft.mjs";
2
- import { n as normalizeLowercaseStringOrEmpty } from "./string-coerce-fsri9iCu.mjs";
3
- import { n as normalizeUniqueTrimmedStringList } from "./string-normalization-J9ZiLfGO.mjs";
1
+ import { i as PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE } from "./types-CQc6JNG4.mjs";
2
+ import { i as asOptionalRecord, o as isRecord } from "./record-coerce-CNDovvft.mjs";
3
+ import { n as normalizeLowercaseStringOrEmpty } from "./string-coerce-CtgOVOSv.mjs";
4
+ import { n as normalizeUniqueTrimmedStringList } from "./string-normalization-PN10hf6d.mjs";
4
5
  //#region packages/llm-core/src/model-data.ts
5
6
  const MODEL_DATA_APIS = [
6
7
  "openai-completions",
@@ -241,4 +242,102 @@ function resolveOpenAIReasoningEffortForModel(params) {
241
242
  return (requestedRank < 0 ? void 0 : ranked.findLast((effort) => ENABLED_REASONING_EFFORTS.indexOf(effort) <= requestedRank) ?? ranked[0]) ?? supported.find((effort) => !isDisabledReasoningEffort(normalizeOpenAIReasoningEffort(effort)));
242
243
  }
243
244
  //#endregion
244
- export { normalizeOpenAIReasoningEffort as a, resolveOpenAIReasoningEffortMapping as c, supportsOpenAITemperature as d, MODEL_CATALOG_THINKING_LEVELS as f, isOpenAIGpt6Model as i, resolveOpenAISupportedReasoningEfforts as l, resolveOpenAIThinkingApi as m, isOpenAIGpt55Model as n, resolveOpenAIModelReasoningEfforts as o, listMappedModelThinkingLevels as p, isOpenAIGpt56Model as r, resolveOpenAIReasoningEffortForModel as s, isOpenAIGpt54MiniModel as t, supportsOpenAIReasoningEffort as u };
245
+ //#region packages/ai/src/transports/openai-responses-contracts.ts
246
+ const DEFAULT_AZURE_OPENAI_API_VERSION = "preview";
247
+ const OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS = "Follow the user request.";
248
+ const AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS = 3e4;
249
+ const RESPONSE_FAILED_NO_DETAILS_MESSAGE = "Unknown error (no error details in response)";
250
+ const OPENAI_RESPONSES_REASONING_REPLAY_META_KEY = "__openclaw_replay";
251
+ const OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY = "openclawReasoningReplay";
252
+ const OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE = "openai-responses-compaction";
253
+ const OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE = "openai-responses-retained-compaction";
254
+ const OPENAI_RESPONSES_APIS = /* @__PURE__ */ new Set([
255
+ "openai-responses",
256
+ "azure-openai-responses",
257
+ "openai-chatgpt-responses",
258
+ "openclaw-openai-responses-transport",
259
+ "openclaw-openai-chatgpt-responses-transport",
260
+ "openclaw-azure-openai-responses-transport"
261
+ ]);
262
+ var OpenAIResponsesWebSocketPreDispatchError = class extends Error {
263
+ constructor(cause) {
264
+ super("OpenAI Responses WebSocket failed before request dispatch", { cause });
265
+ this.name = "OpenAIResponsesWebSocketPreDispatchError";
266
+ }
267
+ };
268
+ var OpenAIResponsesWebSocketPostDispatchError = class extends Error {
269
+ constructor(cause) {
270
+ super("OpenAI Responses WebSocket failed after request dispatch; outcome is unknown", { cause });
271
+ this.code = PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE;
272
+ this.name = "OpenAIResponsesWebSocketPostDispatchError";
273
+ }
274
+ };
275
+ var OpenAIResponsesWebSocketServerError = class extends Error {
276
+ constructor(code, status, param, message, cause) {
277
+ super(message, { cause });
278
+ this.code = code;
279
+ this.status = status;
280
+ this.param = param;
281
+ this.name = "OpenAIResponsesWebSocketServerError";
282
+ }
283
+ };
284
+ var OpenAIResponsesWebSocketSafeRetryError = class extends OpenAIResponsesWebSocketServerError {};
285
+ function readWebSocketServerError(value) {
286
+ if (!isRecord(value) || value.type !== "error") return;
287
+ const details = isRecord(value.error) ? value.error : value;
288
+ if (typeof details.code !== "string" || typeof details.message !== "string") return;
289
+ const rawStatus = value.status ?? value.status_code;
290
+ return {
291
+ code: details.code,
292
+ message: details.message,
293
+ param: typeof details.param === "string" ? details.param : null,
294
+ status: typeof rawStatus === "number" ? rawStatus : void 0
295
+ };
296
+ }
297
+ function isPreviousResponseRejection(error) {
298
+ return error.code === "previous_response_not_found" || error.code === "unsupported_parameter" && error.param === "previous_response_id";
299
+ }
300
+ function parseOpenAIResponsesWebSocketServerError(cause) {
301
+ if (!isRecord(cause)) return;
302
+ let details = readWebSocketServerError(cause.error) ?? readWebSocketServerError(cause);
303
+ if (!details && typeof cause.message === "string") try {
304
+ details = readWebSocketServerError(JSON.parse(cause.message));
305
+ } catch {}
306
+ if (!details) return;
307
+ return new (isPreviousResponseRejection(details) || details.code === "websocket_connection_limit_reached" || details.code === "invalid_encrypted_content" || details.code === "thinking_signature_invalid" ? OpenAIResponsesWebSocketSafeRetryError : OpenAIResponsesWebSocketServerError)(details.code, details.status, details.param, details.message, cause);
308
+ }
309
+ const PROMPT_OBSERVER = Symbol("openaiResponsesPromptObserver");
310
+ const responsesPromptObserver = {
311
+ set(options, observer) {
312
+ Reflect.set(options, PROMPT_OBSERVER, observer);
313
+ },
314
+ get(options) {
315
+ return Reflect.get(options, PROMPT_OBSERVER);
316
+ },
317
+ copy(source, target) {
318
+ const observer = source && responsesPromptObserver.get(source);
319
+ if (observer) responsesPromptObserver.set(target, observer);
320
+ }
321
+ };
322
+ const SERVICE_TIER_OBSERVER = Symbol("openaiResponsesServiceTierObserver");
323
+ const responsesServiceTierObserver = {
324
+ set(options, observer) {
325
+ Reflect.set(options, SERVICE_TIER_OBSERVER, observer);
326
+ },
327
+ get(options) {
328
+ return Reflect.get(options, SERVICE_TIER_OBSERVER);
329
+ },
330
+ copy(source, target) {
331
+ const observer = source && responsesServiceTierObserver.get(source);
332
+ if (observer) responsesServiceTierObserver.set(target, observer);
333
+ },
334
+ observe(options, requestedTier, responseTier) {
335
+ const observer = options && responsesServiceTierObserver.get(options);
336
+ if (observer && typeof requestedTier === "string" && /^[a-z0-9_-]{1,64}$/i.test(requestedTier) && typeof responseTier === "string" && /^[a-z0-9_-]{1,64}$/i.test(responseTier)) observer({
337
+ requestedTier,
338
+ responseTier
339
+ });
340
+ }
341
+ };
342
+ //#endregion
343
+ export { resolveOpenAIThinkingApi as A, resolveOpenAIReasoningEffortForModel as C, supportsOpenAITemperature as D, supportsOpenAIReasoningEffort as E, MODEL_CATALOG_THINKING_LEVELS as O, resolveOpenAIModelReasoningEfforts as S, resolveOpenAISupportedReasoningEfforts as T, isOpenAIGpt54MiniModel as _, OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE as a, isOpenAIGpt6Model as b, OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE as c, OpenAIResponsesWebSocketSafeRetryError as d, RESPONSE_FAILED_NO_DETAILS_MESSAGE as f, responsesServiceTierObserver as g, responsesPromptObserver as h, OPENAI_RESPONSES_APIS as i, listMappedModelThinkingLevels as k, OpenAIResponsesWebSocketPostDispatchError as l, parseOpenAIResponsesWebSocketServerError as m, DEFAULT_AZURE_OPENAI_API_VERSION as n, OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY as o, isPreviousResponseRejection as p, OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS as r, OPENAI_RESPONSES_REASONING_REPLAY_META_KEY as s, AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS as t, OpenAIResponsesWebSocketPreDispatchError as u, isOpenAIGpt55Model as v, resolveOpenAIReasoningEffortMapping as w, normalizeOpenAIReasoningEffort as x, isOpenAIGpt56Model as y };
@@ -1,7 +1,7 @@
1
- import "./index-D6KsSE74.mjs";
2
- import { O as Model, j as ModelThinkingLevel, n as Api } from "./types-CLLR3eB4.mjs";
3
- import { a as BaseOpenAIStreamOptions, f as OpenAIReasoningEffort } from "./provider-options-Df7ov0K1.mjs";
4
- import "./types-CB-_vNyI.mjs";
1
+ import "./index-a8e_oKnu.mjs";
2
+ import { M as ModelThinkingLevel, k as Model, n as Api } from "./types-DvzmWW8J.mjs";
3
+ import { a as BaseOpenAIStreamOptions, f as OpenAIReasoningEffort } from "./provider-options-D5ABCV_l.mjs";
4
+ import "./types-BuiEBM3u.mjs";
5
5
  import { ResponseCompactionItem, ResponseCreateParamsStreaming, ResponseInputItem } from "openai/resources/responses/responses.js";
6
6
  //#region packages/ai/src/providers/openai-request-reasoning.d.ts
7
7
  type OpenAIRequestReasoningEffort = ModelThinkingLevel | "none";
@@ -52,5 +52,16 @@ declare const responsesPromptObserver: {
52
52
  get(options: object): ResponsesPromptObserver | undefined;
53
53
  copy(source: object | undefined, target: object): void;
54
54
  };
55
+ type ResponsesServiceTierObservation = {
56
+ requestedTier: string;
57
+ responseTier: string;
58
+ };
59
+ type ResponsesServiceTierObserver = (observation: ResponsesServiceTierObservation) => void;
60
+ declare const responsesServiceTierObserver: {
61
+ set(options: object, observer: ResponsesServiceTierObserver): void;
62
+ get(options: object): ResponsesServiceTierObserver | undefined;
63
+ copy(source: object | undefined, target: object): void;
64
+ observe(options: object | undefined, requestedTier: unknown, responseTier: unknown): void;
65
+ };
55
66
  //#endregion
56
- export { ResponsesPromptObservation as a, readOpenAIResponsesCompactionWindow as c, ReplayableResponseCompactionItem as i, OpenAIRequestReasoningEffort as l, OpenAIResponsesOptions as n, responsesPromptObserver as o, OpenAIResponsesReasoningReplayMetadata as r, OpenAIResponsesCompactionOutput as s, OPENAI_RESPONSES_APIS as t };
67
+ export { ResponsesPromptObservation as a, responsesServiceTierObserver as c, OpenAIRequestReasoningEffort as d, ReplayableResponseCompactionItem as i, OpenAIResponsesCompactionOutput as l, OpenAIResponsesOptions as n, ResponsesServiceTierObservation as o, OpenAIResponsesReasoningReplayMetadata as r, responsesPromptObserver as s, OPENAI_RESPONSES_APIS as t, readOpenAIResponsesCompactionWindow as u };
@@ -0,0 +1,32 @@
1
+ import { h as responsesPromptObserver } from "./openai-responses-contracts-BKu8O7l4.mjs";
2
+ import { v as sanitizeTransportPayloadText } from "./transport-stream-shared-CxXXz_Dd.mjs";
3
+ import { C as stripSystemPromptCacheBoundary } from "./simple-options-BkKTXxhp.mjs";
4
+ //#region packages/ai/src/transports/openai-responses-prompt-observer-internal.ts
5
+ function readFinalResponsesPrompt(request) {
6
+ if (typeof request.instructions === "string") return ["instructions", request.instructions];
7
+ const message = (Array.isArray(request.input) ? request.input : []).find((item) => {
8
+ const role = item.role;
9
+ return role === "developer" || role === "system";
10
+ });
11
+ if (!message) return ["missing", ""];
12
+ const content = message.content;
13
+ const observedPrompt = typeof content === "string" ? content : Array.isArray(content) ? content.flatMap((part) => part.type === "input_text" ? [part.text] : []).join("") : "";
14
+ return [message.role === "developer" ? "input.developer" : "input.system", observedPrompt];
15
+ }
16
+ function createResponsesPromptEgressObserver(options, assembledPrompt) {
17
+ const observer = options ? responsesPromptObserver.get(options) : void 0;
18
+ if (!observer) return;
19
+ const expectedPrompt = sanitizeTransportPayloadText(stripSystemPromptCacheBoundary(assembledPrompt ?? ""));
20
+ return (request, metadata) => {
21
+ const [promptSource, observedPrompt] = readFinalResponsesPrompt(request);
22
+ observer({
23
+ ...metadata,
24
+ promptSource,
25
+ expectedChars: expectedPrompt.length,
26
+ observedChars: observedPrompt.length,
27
+ matchesAssembledPrompt: promptSource !== "missing" && observedPrompt === expectedPrompt
28
+ });
29
+ };
30
+ }
31
+ //#endregion
32
+ export { createResponsesPromptEgressObserver as t };