@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.
- package/README.md +4 -1
- package/dist/{anthropic-CTXJlfnS.mjs → anthropic-CZv6XFER.mjs} +52 -147
- package/dist/{anthropic-payload-policy-NIPVYXPq.d.mts → anthropic-payload-policy-BhCcgNdm.d.mts} +7 -4
- package/dist/{anthropic-stream-reducer-DrsBCsFY.mjs → anthropic-stream-reducer-BQ1tjd7x.mjs} +369 -233
- package/dist/{api-registry-D-nbmSqr.d.mts → api-registry-DpU0Rj-I.d.mts} +4 -4
- package/dist/{provider-transcript-transform-DjA5Fk2P.mjs → assistant-output-OLm-Oln0.mjs} +17 -17
- package/dist/{assistant-text-phase-C20rxWwP.mjs → assistant-text-phase-Bl1aDCB7.mjs} +2 -8
- package/dist/{azure-openai-responses-BBxv4QVI.mjs → azure-openai-responses-DH7bd3QT.mjs} +12 -17
- package/dist/{azure-openai-responses-client-compat-C7K7QfUE.mjs → azure-openai-responses-client-compat-D0dvJMbZ.mjs} +3 -10
- package/dist/{base64-C1PsYcRQ.mjs → base64-C8CdcsjU.mjs} +3 -45
- package/dist/cloudflare-5qSGvIUH.mjs +39 -0
- package/dist/{diagnostics-CJaB6g8J.mjs → diagnostics-Caj-4RBA.mjs} +19 -37
- package/dist/diagnostics.d.mts +4 -4
- package/dist/diagnostics.mjs +2 -2
- package/dist/{event-stream-vd9UnCAU.mjs → event-stream-C5AbCAaZ.mjs} +29 -1
- package/dist/event-stream-DqDQWqiy.d.mts +1 -0
- package/dist/{event-stream-DOPFYVqs.d.mts → event-stream-DrRM_90c.d.mts} +1 -1
- package/dist/event-stream.d.mts +2 -2
- package/dist/event-stream.mjs +1 -1
- package/dist/{github-copilot-request-facts-BTEBMeOv.mjs → github-copilot-request-facts-DEE6gcB9.mjs} +3 -1
- package/dist/{google-B3HEK0Ag.mjs → google-1WLOtb8w.mjs} +12 -9
- package/dist/{google-interactions-vMlEfPAA.mjs → google-interactions-wrnE6MLw.mjs} +39 -49
- package/dist/{google-messages-Dz2dAnGo.mjs → google-messages-BwPPycw6.mjs} +11 -17
- package/dist/{google-shared-B58i3c8H.mjs → google-shared-Eql1OMPU.mjs} +5 -6
- package/dist/{google-vertex-DYFXzEbh.mjs → google-vertex-0LrlRoO3.mjs} +11 -11
- package/dist/{host-rxlNaBwm.d.mts → host-BinBeGcQ.d.mts} +12 -4
- package/dist/{host-DwBmNMCC.mjs → host-DCW52iHe.mjs} +57 -9
- package/dist/{host-policy-wK-ay_RK.mjs → host-policy-B3jc4Rpn.mjs} +9 -2
- package/dist/{index-D6KsSE74.d.mts → index-a8e_oKnu.d.mts} +7 -5
- package/dist/index.d.mts +23 -7
- package/dist/index.mjs +7 -7
- package/dist/internal/anthropic.d.mts +6 -6
- package/dist/internal/anthropic.mjs +5 -5
- package/dist/internal/google-model-family.mjs +1 -1
- package/dist/internal/openai-completions-compat.d.mts +1 -1
- package/dist/internal/openai-completions-compat.mjs +1 -1
- package/dist/internal/openai-responses-payload-policy.d.mts +1 -1
- package/dist/internal/openai-responses-payload-policy.mjs +2 -2
- package/dist/internal/openai.d.mts +14 -10
- package/dist/internal/openai.mjs +12 -12
- package/dist/internal/runtime.d.mts +18 -9
- package/dist/internal/runtime.mjs +9 -9
- package/dist/internal/shared.d.mts +6 -4
- package/dist/internal/shared.mjs +6 -6
- package/dist/internal/tool-schema.mjs +1 -1
- package/dist/json-schema-Bp07Qui3.mjs +22 -0
- package/dist/{llm-request-activity-BjtkplhG.mjs → llm-request-activity-D8f_oxHj.mjs} +1 -2
- package/dist/{mistral-7wDWcjfF.mjs → mistral-DSt4vQAO.mjs} +18 -29
- package/dist/number-coercion-V8-BhME4.mjs +47 -0
- package/dist/{openai-chatgpt-responses-Bc7NZrQR.mjs → openai-chatgpt-responses-BC2x0Oqx.mjs} +215 -164
- package/dist/openai-completions-DNyHnXKg.mjs +25 -0
- package/dist/{openai-completions-compat-qJjmqQ71.d.mts → openai-completions-compat-BYdYpXhU.d.mts} +3 -3
- package/dist/{openai-completions-compat-BJf57ZxN.mjs → openai-completions-compat-BdmlhD4u.mjs} +30 -23
- package/dist/{openai-completions-stream-dju_5F3P.mjs → openai-completions-transport-DWM2mQDB.mjs} +389 -76
- package/dist/{openai-prompt-cache-CouErLh7.d.mts → openai-prompt-cache-45-AH_xv.d.mts} +2 -2
- package/dist/{openai-prompt-cache-BTMs80_O.mjs → openai-prompt-cache-I8YQTzf8.mjs} +1 -1
- package/dist/{openai-responses-compaction-replay-DiYn-gFM.d.mts → openai-responses-compaction-replay-BClApUIf.d.mts} +4 -4
- package/dist/{openai-responses-compaction-window-CYGCjAQz.mjs → openai-responses-compaction-window-m878aVpU.mjs} +25 -83
- package/dist/{openai-reasoning-effort-C_0p3psG.mjs → openai-responses-contracts-BKu8O7l4.mjs} +103 -4
- package/dist/{openai-responses-contracts-D1iZ0njF.d.mts → openai-responses-contracts-Br5IIw_h.d.mts} +16 -5
- package/dist/openai-responses-prompt-observer-internal-CCg7B6l4.mjs +32 -0
- package/dist/{openai-responses-shared-CIEHiKx7.mjs → openai-responses-shared-C7oVyjED.mjs} +297 -312
- package/dist/{openai-responses-terminal-usage-BE7lf7nW.d.mts → openai-responses-terminal-usage-DgImcyJu.d.mts} +2 -2
- package/dist/{openai-responses-DbPe3-Py.mjs → openai-responses-uZ5oWSp7.mjs} +12 -21
- package/dist/{openai-tool-schema-vsl-cE-n.mjs → openai-tool-schema-DYNePiF8.mjs} +66 -36
- package/dist/{openai-transport-params-DyFJ4cgR.mjs → openai-transport-params-JFsnIyto.mjs} +25 -30
- package/dist/openai-web-search-tools-Cfu0uLyN.mjs +14 -0
- package/dist/{positive-integer-CjN5OJbH.mjs → positive-integer-CwLi8LUL.mjs} +1 -1
- package/dist/{provider-error-CwT_j2v0.mjs → provider-error-DQBE1bUQ.mjs} +17 -28
- package/dist/{provider-options-Df7ov0K1.d.mts → provider-options-D5ABCV_l.d.mts} +2 -2
- package/dist/{provider-replay-context-Bs5aWE1d.mjs → provider-replay-context-C7Bmi84a.mjs} +6 -2
- package/dist/{provider-transport-turn-state-Dw7OtYUs.mjs → provider-transport-turn-state-_M2kLdUE.mjs} +25 -3
- package/dist/{provider-types-d4XnoZMd.d.mts → provider-types-F8Mqc9Ma.d.mts} +3 -3
- package/dist/provider-types.d.mts +6 -6
- package/dist/providers.d.mts +2 -2
- package/dist/providers.mjs +14 -26
- package/dist/{reasoning-tag-text-partitioner-B6FIIBt6.mjs → reasoning-tag-text-partitioner-Ju9VpUGl.mjs} +23 -37
- package/dist/required-api-key-D4kn3252.mjs +9 -0
- package/dist/sanitize-unicode-CjDG6jJx.d.mts +5 -0
- package/dist/{session-affinity-Bcunsn4I.mjs → session-affinity-DA4WHv1h.mjs} +2 -6
- package/dist/session-resources-D1wgDQ8C.mjs +40 -0
- package/dist/{simple-options-BkDPMuxw.mjs → simple-options-BkKTXxhp.mjs} +7 -11
- package/dist/{src-H4aXcFuX.mjs → src-B0NIt2UK.mjs} +7 -4
- package/dist/stream-DSdzKsDK.mjs +275 -0
- package/dist/{stream-first-event-timeout-B9o0S4SZ.mjs → stream-first-event-timeout-D9ZmL_s9.mjs} +3 -3
- package/dist/{string-coerce-fsri9iCu.mjs → string-coerce-CtgOVOSv.mjs} +5 -1
- package/dist/{string-normalization-J9ZiLfGO.mjs → string-normalization-PN10hf6d.mjs} +1 -1
- package/dist/{transport-utils-CqXzku3R.mjs → text-signature-MLwfi6fq.mjs} +18 -18
- package/dist/{transport-stream-shared-yYhXa4kX.d.mts → transport-stream-shared-BcAKh2XH.d.mts} +6 -19
- package/dist/{transport-stream-shared-BU5pwY6W.mjs → transport-stream-shared-CxXXz_Dd.mjs} +171 -56
- package/dist/transports.d.mts +22 -23
- package/dist/transports.mjs +251 -495
- package/dist/types-BuiEBM3u.d.mts +1 -0
- package/dist/types-CQc6JNG4.mjs +69 -0
- package/dist/{types-CLLR3eB4.d.mts → types-DvzmWW8J.d.mts} +58 -6
- package/dist/types.d.mts +6 -6
- package/dist/types.mjs +5 -5
- package/dist/usage-CJH5D6Ea.mjs +19 -0
- package/dist/{validation-Cat2wQsc.d.mts → validation-B3lQt_VE.d.mts} +1 -1
- package/dist/{validation-BFZc40Ig.mjs → validation-DbqlIfDn.mjs} +15 -30
- package/dist/validation.d.mts +1 -1
- package/dist/validation.mjs +1 -1
- package/package.json +4 -4
- package/dist/cache-retention-0x979a5V.mjs +0 -12
- package/dist/event-stream-CMQfX_yr.d.mts +0 -1
- package/dist/github-copilot-headers-B37TB3rB.mjs +0 -30
- package/dist/openai-completions-CHnwIV-W.mjs +0 -188
- package/dist/openai-provider-client-G8Otsq2Q.mjs +0 -24
- package/dist/openai-responses-contracts-CLxnqS9p.mjs +0 -81
- package/dist/openai-responses-prompt-observer-internal-BX3QTNSv.mjs +0 -198
- package/dist/sanitize-unicode-BZiVbGwK.d.mts +0 -24
- package/dist/session-resources-CkR4WWy1.mjs +0 -21
- package/dist/stream-DDsCBgd-.mjs +0 -68
- package/dist/types-CB-_vNyI.d.mts +0 -1
- package/dist/types-LFWwv0cF.mjs +0 -8
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { o as isRecord } from "./record-coerce-CNDovvft.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as canonicalizeBase64 } from "./base64-
|
|
5
|
-
import { t as parsePositiveInteger } from "./positive-integer-
|
|
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
|
-
|
|
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")
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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 (!
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
if (
|
|
261
|
-
|
|
262
|
-
|
|
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
|
|
265
|
-
base64:
|
|
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
|
-
} :
|
|
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);
|
package/dist/{openai-reasoning-effort-C_0p3psG.mjs → openai-responses-contracts-BKu8O7l4.mjs}
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { i as
|
|
2
|
-
import {
|
|
3
|
-
import { n as
|
|
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
|
-
|
|
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 };
|
package/dist/{openai-responses-contracts-D1iZ0njF.d.mts → openai-responses-contracts-Br5IIw_h.d.mts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "./index-
|
|
2
|
-
import {
|
|
3
|
-
import { a as BaseOpenAIStreamOptions, f as OpenAIReasoningEffort } from "./provider-options-
|
|
4
|
-
import "./types-
|
|
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,
|
|
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 };
|