@openclaw/ai 2026.9.2 → 2026.9.4

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 +3 -2
  2. package/dist/anthropic-C4Qu4H0Z.mjs +377 -0
  3. package/dist/{anthropic-payload-policy-d46X2pR0.d.mts → anthropic-payload-policy-BZ8umAbk.d.mts} +16 -6
  4. package/dist/{anthropic-compaction-replay-DB2FGLQc.mjs → anthropic-stream-reducer-CILWF7JD.mjs} +931 -184
  5. package/dist/{api-registry-DWtPjzyn.d.mts → api-registry-ByUwIR0e.d.mts} +2 -2
  6. package/dist/assistant-output-tLt4H-iQ.mjs +16 -0
  7. package/dist/assistant-text-phase-C20rxWwP.mjs +55 -0
  8. package/dist/{azure-openai-responses-C5bZRfAP.mjs → azure-openai-responses-BAlqlKKc.mjs} +5 -5
  9. package/dist/{base64-CEFBpSkN.mjs → base64-D-su8YVo.mjs} +1 -27
  10. package/dist/{diagnostics-DfFyKeX_.mjs → diagnostics-QuErwCIl.mjs} +96 -21
  11. package/dist/diagnostics.d.mts +3 -1
  12. package/dist/diagnostics.mjs +3 -3
  13. package/dist/{event-stream-BhT5T1Ay.d.mts → event-stream-Bt5Y4Pav.d.mts} +11 -3
  14. package/dist/event-stream-C3WGFsum.d.mts +1 -0
  15. package/dist/{event-stream-BgDvQeum.mjs → event-stream-D8PARQfL.mjs} +45 -1
  16. package/dist/event-stream.d.mts +2 -2
  17. package/dist/event-stream.mjs +1 -1
  18. package/dist/{github-copilot-headers-NCJtz9i0.mjs → github-copilot-headers-B37TB3rB.mjs} +3 -10
  19. package/dist/github-copilot-request-facts-BTEBMeOv.mjs +16 -0
  20. package/dist/{google-4qeuE8iX.mjs → google-DPBAOaOW.mjs} +10 -10
  21. package/dist/google-messages-6JkpHrhJ.mjs +448 -0
  22. package/dist/google-shared-BvBeW9aq.mjs +185 -0
  23. package/dist/{google-vertex-O9BcnB6X.mjs → google-vertex-k-TMCAYD.mjs} +7 -6
  24. package/dist/{host-DjzGmdZ2.d.mts → host-4atIX-2V.d.mts} +5 -3
  25. package/dist/{host-CEvLw30U.mjs → host-B8YfDGd4.mjs} +181 -41
  26. package/dist/host-policy-Zcg_cNz8.mjs +37 -0
  27. package/dist/{index-FnHM2FcI.d.mts → index-DdD3qerf.d.mts} +4 -4
  28. package/dist/index.d.mts +7 -7
  29. package/dist/index.mjs +7 -6
  30. package/dist/internal/anthropic.d.mts +7 -7
  31. package/dist/internal/anthropic.mjs +4 -4
  32. package/dist/internal/google-model-family.d.mts +5 -0
  33. package/dist/internal/google-model-family.mjs +15 -0
  34. package/dist/internal/openai-responses-payload-policy.d.mts +3 -3
  35. package/dist/internal/openai-responses-payload-policy.mjs +3 -2
  36. package/dist/internal/openai.d.mts +8 -103
  37. package/dist/internal/openai.mjs +9 -10
  38. package/dist/internal/retry-after.d.mts +2 -4
  39. package/dist/internal/retry-after.mjs +57 -8
  40. package/dist/internal/runtime.d.mts +43 -7
  41. package/dist/internal/runtime.mjs +6 -7
  42. package/dist/internal/shared.d.mts +43 -3
  43. package/dist/internal/shared.mjs +5 -4
  44. package/dist/internal/tool-schema.d.mts +63 -0
  45. package/dist/internal/tool-schema.mjs +3 -0
  46. package/dist/{mistral-Tb6oalqH.mjs → mistral-CxUZ1jUb.mjs} +10 -37
  47. package/dist/model-transport-url-DKocrEsb.d.mts +28 -0
  48. package/dist/{openai-chatgpt-responses-yUXjPNfu.mjs → openai-chatgpt-responses-CgO6kZfo.mjs} +50 -41
  49. package/dist/{openai-completions-compat-CpjYUArk.d.mts → openai-completions-compat-eHgh5UPE.d.mts} +26 -4
  50. package/dist/{openai-completions-stream-BsrBe3Gg.mjs → openai-completions-stream-Da2vvl-S.mjs} +654 -453
  51. package/dist/openai-completions-yJuk7eis.mjs +187 -0
  52. package/dist/openai-prompt-cache-B4eYo2-I.d.mts +16 -0
  53. package/dist/openai-prompt-cache-Bds-n_9Q.mjs +220 -0
  54. package/dist/openai-provider-client-S2gCrM2Z.mjs +24 -0
  55. package/dist/{openai-responses-CCL41ALM.mjs → openai-responses-DaYwH05E.mjs} +14 -29
  56. package/dist/{openai-responses-compaction-window-BMVHFOtq.mjs → openai-responses-compaction-window-CIhBAkkq.mjs} +6 -246
  57. package/dist/{openai-responses-contracts-rF5DDRNS.d.mts → openai-responses-contracts-BjBAqAg_.d.mts} +5 -38
  58. package/dist/openai-responses-contracts-DDOHA62Y.mjs +245 -0
  59. package/dist/{openai-responses-prompt-observer-internal-D0bhBfgL.mjs → openai-responses-prompt-observer-internal-f8J7wpsk.mjs} +3 -3
  60. package/dist/{openai-responses-shared-Bmma_3Qc.mjs → openai-responses-shared-B8RdBPCv.mjs} +47 -118
  61. package/dist/openai-tool-projection-793cE3QX.d.mts +37 -0
  62. package/dist/{openai-tool-schema-_pTAJqKF.mjs → openai-tool-schema-CzjyYXun.mjs} +38 -556
  63. package/dist/openai-tool-schema-ynZBgqW-.d.mts +38 -0
  64. package/dist/openai-transport-params-9aPuV5YY.mjs +675 -0
  65. package/dist/positive-integer-41zhOdcV.mjs +8 -0
  66. package/dist/{provider-error-9TraxGvt.mjs → provider-error-BA-v_tKd.mjs} +70 -11
  67. package/dist/{provider-options-Bcc_p-TU.d.mts → provider-options-Ceqv1OKk.d.mts} +4 -39
  68. package/dist/{provider-replay-context-BuSUaAk5.mjs → provider-replay-context-CJ_YvcEW.mjs} +1 -1
  69. package/dist/{provider-transcript-transform-BaMbI1hr.mjs → provider-transcript-transform-V5YzU9zh.mjs} +1 -1
  70. package/dist/provider-transport-turn-state-D5EXOFL2.mjs +42 -0
  71. package/dist/provider-types-CVjKjsuq.d.mts +29 -0
  72. package/dist/provider-types.d.mts +6 -31
  73. package/dist/providers.d.mts +2 -2
  74. package/dist/providers.mjs +11 -11
  75. package/dist/{reasoning-tag-text-partitioner-DLCNXki6.mjs → reasoning-tag-text-partitioner-BcR5pztD.mjs} +19 -19
  76. package/dist/record-coerce-DwRYMj3t.mjs +32 -0
  77. package/dist/retry-after-CdCURCVg.d.mts +15 -0
  78. package/dist/session-affinity-Bcunsn4I.mjs +23 -0
  79. package/dist/{simple-options-BjHCCh4v.mjs → simple-options-BQbb4yQL.mjs} +24 -5
  80. package/dist/src-DDmEryvj.mjs +2 -0
  81. package/dist/{stream-first-event-timeout-DcNjoFQE.mjs → stream-first-event-timeout-2hfrquuz.mjs} +1 -1
  82. package/dist/string-coerce-fsri9iCu.mjs +34 -0
  83. package/dist/{string-normalization--fwJ4S2q.mjs → string-normalization-CmLIasuf.mjs} +1 -1
  84. package/dist/{tool-schema-json-projection-mJhXDcyz.mjs → tool-schema-json-projection-ClptDdAO.mjs} +2 -38
  85. package/dist/{transport-stream-shared-xnaqxmbP.d.mts → transport-stream-shared-DNvmoWnv.d.mts} +20 -36
  86. package/dist/{transport-stream-shared-CZqMhfIw.mjs → transport-stream-shared-zHll9BxO.mjs} +225 -13
  87. package/dist/transport-utils-zrYjICLZ.mjs +118 -0
  88. package/dist/transports.d.mts +137 -193
  89. package/dist/transports.mjs +204 -1334
  90. package/dist/types-DlfwzH3T.d.mts +1 -0
  91. package/dist/types-LFWwv0cF.mjs +8 -0
  92. package/dist/{types-CJ1-Ht7A.d.mts → types-Ntv5z2g2.d.mts} +74 -57
  93. package/dist/types.d.mts +6 -6
  94. package/dist/types.mjs +6 -5
  95. package/dist/{src-2qBGKg8O.mjs → usage-cost-BNWbbXav.mjs} +0 -1
  96. package/dist/utf16-slice-CvGodqok.mjs +29 -0
  97. package/dist/{validation-AKZBDGQd.d.mts → validation-B0t_G2H6.d.mts} +1 -1
  98. package/dist/{validation-CJZtym2g.mjs → validation-BDzVDnTs.mjs} +9 -1
  99. package/dist/validation.d.mts +1 -1
  100. package/dist/validation.mjs +1 -1
  101. package/package.json +13 -3
  102. package/dist/anthropic-BDdqdVLK.mjs +0 -886
  103. package/dist/event-stream-zctLx0yr.d.mts +0 -1
  104. package/dist/google-shared-CWeG8RIl.mjs +0 -636
  105. package/dist/google-thinking-level-C-V3tecN.mjs +0 -9
  106. package/dist/hash-CHgqbJmD.mjs +0 -16
  107. package/dist/json-parse-BuAJEbdW.mjs +0 -146
  108. package/dist/openai-completions-BIUV3RDT.mjs +0 -403
  109. package/dist/openai-prompt-cache-CGnVB74a.mjs +0 -21
  110. package/dist/openai-prompt-cache-CNoIfHYC.d.mts +0 -16
  111. package/dist/sanitize-unicode-D6xUvZaS.mjs +0 -83
  112. package/dist/transport-utils-7il795_9.mjs +0 -138
  113. package/dist/types-3Lnm-QSJ.d.mts +0 -1
  114. package/dist/types-BDdaOVi2.mjs +0 -6
  115. package/dist/utf16-slice-qz3nsy87.mjs +0 -84
@@ -1,254 +1,14 @@
1
- import "./src-2qBGKg8O.mjs";
2
- import { n as PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE } from "./types-BDdaOVi2.mjs";
3
- import { c as normalizeLowercaseStringOrEmpty, o as isRecord, p as readStringValue, u as normalizeOptionalLowercaseString } from "./utf16-slice-qz3nsy87.mjs";
4
- import { t as canonicalizeBase64 } from "./base64-CEFBpSkN.mjs";
5
- import { n as uniqueStrings, t as normalizeStringEntries } from "./string-normalization--fwJ4S2q.mjs";
6
- import { s as parsePositiveInteger } from "./transport-utils-7il795_9.mjs";
1
+ import { i as normalizeOptionalLowercaseString, n as normalizeLowercaseStringOrEmpty, s as readStringValue } from "./string-coerce-fsri9iCu.mjs";
2
+ import { o as isRecord } from "./record-coerce-DwRYMj3t.mjs";
3
+ import { t as canonicalizeBase64 } from "./base64-D-su8YVo.mjs";
4
+ import { t as parsePositiveInteger } from "./positive-integer-41zhOdcV.mjs";
5
+ import { S as supportsOpenAIReasoningEffort, i as OPENAI_RESPONSES_APIS } from "./openai-responses-contracts-DDOHA62Y.mjs";
7
6
  import { t as createSseByteGuard } from "./streaming-byte-guard-CC-HMn_u.mjs";
8
- //#region packages/ai/src/providers/openai-reasoning-effort.ts
9
- /**
10
- * OpenAI-compatible reasoning-effort normalization. Different GPT families
11
- * expose different accepted effort enums, so callers map requested values here
12
- * before constructing provider payloads.
13
- */
14
- const GPT_5_REASONING_EFFORTS = [
15
- "minimal",
16
- "low",
17
- "medium",
18
- "high"
19
- ];
20
- const GPT_51_REASONING_EFFORTS = [
21
- "none",
22
- "low",
23
- "medium",
24
- "high"
25
- ];
26
- const GPT_52_REASONING_EFFORTS = [
27
- "none",
28
- "low",
29
- "medium",
30
- "high",
31
- "xhigh"
32
- ];
33
- const GPT_56_REASONING_EFFORTS = [
34
- "none",
35
- "low",
36
- "medium",
37
- "high",
38
- "xhigh",
39
- "max"
40
- ];
41
- const GPT_6_ASTRA_REASONING_EFFORTS = [
42
- "low",
43
- "medium",
44
- "high",
45
- "xhigh",
46
- "max"
47
- ];
48
- const GPT_CODEX_REASONING_EFFORTS = [
49
- "low",
50
- "medium",
51
- "high",
52
- "xhigh"
53
- ];
54
- const GPT_PRO_REASONING_EFFORTS = [
55
- "medium",
56
- "high",
57
- "xhigh"
58
- ];
59
- const GPT_5_PRO_REASONING_EFFORTS = ["high"];
60
- const GPT_51_CODEX_MAX_REASONING_EFFORTS = [
61
- "none",
62
- "medium",
63
- "high",
64
- "xhigh"
65
- ];
66
- const GPT_51_CODEX_MINI_REASONING_EFFORTS = ["medium"];
67
- const GENERIC_REASONING_EFFORTS = [
68
- "low",
69
- "medium",
70
- "high"
71
- ];
72
- const CANONICAL_REASONING_EFFORTS = /* @__PURE__ */ new Set([
73
- "none",
74
- "minimal",
75
- "low",
76
- "medium",
77
- "high",
78
- "xhigh",
79
- "max",
80
- "off"
81
- ]);
82
- function normalizeModelId(id) {
83
- return normalizeLowercaseStringOrEmpty(id ?? "").replace(/-\d{4}-\d{2}-\d{2}$/u, "");
84
- }
85
- /** Return whether a model is the GPT-5.4 mini family. */
86
- function isOpenAIGpt54MiniModel(model) {
87
- const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
88
- return /^gpt-5\.4-mini(?:-|$)/u.test(id);
89
- }
90
- /** Return whether a model is the GPT-5.5 family. */
91
- function isOpenAIGpt55Model(model) {
92
- const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
93
- const name = normalizeModelId(typeof model.name === "string" ? model.name : void 0);
94
- return /^gpt-5\.5(?:-|$)/u.test(id) || /^gpt-5\.5(?:\s|\(|-|$)/u.test(name);
95
- }
96
- /** Return whether a model is the GPT-5.6 family. */
97
- function isOpenAIGpt56Model(model) {
98
- const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
99
- const name = normalizeModelId(typeof model.name === "string" ? model.name : void 0);
100
- return /^gpt-5\.6(?:-|$)/u.test(id) || /^gpt-5\.6(?:\s|\(|-|$)/u.test(name);
101
- }
102
- /** Normalize user-facing reasoning effort names to API effort names. */
103
- function normalizeOpenAIReasoningEffort(effort) {
104
- const trimmed = effort.trim();
105
- const folded = trimmed.toLowerCase();
106
- return CANONICAL_REASONING_EFFORTS.has(folded) ? folded : trimmed;
107
- }
108
- function readCompatReasoningEfforts(compat) {
109
- if (!compat || typeof compat !== "object") return;
110
- if (compat.supportsReasoningEffort === false) return [];
111
- const raw = compat.supportedReasoningEfforts;
112
- if (!Array.isArray(raw)) return;
113
- const supported = uniqueStrings(normalizeStringEntries(raw.filter((value) => typeof value === "string")));
114
- return supported.length > 0 ? supported : void 0;
115
- }
116
- function isDisabledReasoningEffort(effort) {
117
- return effort === "none" || effort === "off";
118
- }
119
- /** Resolve the reasoning efforts accepted by a specific OpenAI-compatible model. */
120
- function resolveOpenAISupportedReasoningEfforts(model) {
121
- return resolveOpenAIModelReasoningEfforts(model) ?? GENERIC_REASONING_EFFORTS;
122
- }
123
- /** Read a declared or known model contract, leaving unknown compatible models unspecified. */
124
- function resolveOpenAIModelReasoningEfforts(model) {
125
- const compatEfforts = readCompatReasoningEfforts(model.compat);
126
- if (compatEfforts) return compatEfforts;
127
- const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
128
- if (id === "gpt-6-astra" && model.api !== "azure-openai-responses") return GPT_6_ASTRA_REASONING_EFFORTS;
129
- if (/^gpt-5\.6(?:-|$)/u.test(id)) return GPT_56_REASONING_EFFORTS;
130
- if (id === "gpt-5.1-codex-mini") return GPT_51_CODEX_MINI_REASONING_EFFORTS;
131
- if (id === "gpt-5.1-codex-max") return GPT_51_CODEX_MAX_REASONING_EFFORTS;
132
- if (/^gpt-5(?:\.\d+)?-codex(?:-|$)/u.test(id)) return GPT_CODEX_REASONING_EFFORTS;
133
- if (id === "gpt-5-pro") return GPT_5_PRO_REASONING_EFFORTS;
134
- if (/^gpt-5\.[2-9](?:\.\d+)?-pro(?:-|$)/u.test(id)) return GPT_PRO_REASONING_EFFORTS;
135
- if (/^gpt-5\.[2-9](?:\.\d+)?(?:-|$)/u.test(id)) return GPT_52_REASONING_EFFORTS;
136
- if (/^gpt-5\.1(?:-|$)/u.test(id)) return GPT_51_REASONING_EFFORTS;
137
- if (/^gpt-5(?:-|$)/u.test(id)) return GPT_5_REASONING_EFFORTS;
138
- }
139
- /**
140
- * Return whether a model accepts temperature. GPT-5.6 and GPT-6 Astra
141
- * reject it with a 400; catalog compat can override per model.
142
- */
143
- function supportsOpenAITemperature(model) {
144
- const compat = model.compat;
145
- if (compat && typeof compat === "object") {
146
- const declared = compat.supportsTemperature;
147
- if (typeof declared === "boolean") return declared;
148
- }
149
- const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
150
- return (id !== "gpt-6-astra" || model.api === "azure-openai-responses") && !/^gpt-5\.6(?:-|$)/u.test(id);
151
- }
152
- /** Return whether a model accepts a requested reasoning effort. */
153
- function supportsOpenAIReasoningEffort(model, effort) {
154
- return resolveOpenAISupportedReasoningEfforts(model).includes(normalizeOpenAIReasoningEffort(effort));
155
- }
156
- /** Resolve a requested reasoning effort to the closest value supported by the model. */
157
- function resolveOpenAIReasoningEffortForModel(params) {
158
- const requested = normalizeOpenAIReasoningEffort(params.effort);
159
- const mapped = params.fallbackMap?.[requested] ?? (params.fallbackMap && CANONICAL_REASONING_EFFORTS.has(requested) ? Object.entries(params.fallbackMap).find(([effort]) => normalizeOpenAIReasoningEffort(effort) === requested)?.[1] : void 0);
160
- const normalized = mapped === void 0 ? requested : mapped.trim();
161
- const supported = resolveOpenAISupportedReasoningEfforts(params.model);
162
- if (supported.includes(normalized)) return normalized;
163
- if (requested === "off" && supported.includes("none")) return "none";
164
- if (isDisabledReasoningEffort(requested) || isDisabledReasoningEffort(normalized)) return;
165
- if (requested === "minimal" && supported.includes("low")) return "low";
166
- if ((requested === "minimal" || requested === "low") && supported.includes("medium")) return "medium";
167
- if (requested === "xhigh" && supported.includes("high")) return "high";
168
- if (requested === "max" && supported.includes("xhigh")) return "xhigh";
169
- return supported.find((effort) => !isDisabledReasoningEffort(normalizeOpenAIReasoningEffort(effort)));
170
- }
171
- //#endregion
172
7
  //#region packages/model-catalog-core/src/provider-id.ts
173
8
  function normalizeProviderId(provider) {
174
9
  return normalizeLowercaseStringOrEmpty(provider);
175
10
  }
176
11
  //#endregion
177
- //#region packages/ai/src/transports/openai-responses-contracts.ts
178
- const DEFAULT_AZURE_OPENAI_API_VERSION = "preview";
179
- const OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS = "Follow the user request.";
180
- const AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS = 3e4;
181
- const RESPONSE_FAILED_NO_DETAILS_MESSAGE = "Unknown error (no error details in response)";
182
- const OPENAI_RESPONSES_REASONING_REPLAY_META_KEY = "__openclaw_replay";
183
- const OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY = "openclawReasoningReplay";
184
- const OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE = "openai-responses-compaction";
185
- const OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE = "openai-responses-retained-compaction";
186
- const OPENAI_RESPONSES_APIS = /* @__PURE__ */ new Set([
187
- "openai-responses",
188
- "azure-openai-responses",
189
- "openai-chatgpt-responses",
190
- "openclaw-openai-responses-transport",
191
- "openclaw-openai-chatgpt-responses-transport",
192
- "openclaw-azure-openai-responses-transport"
193
- ]);
194
- var OpenAIResponsesWebSocketPreDispatchError = class extends Error {
195
- constructor(cause) {
196
- super("OpenAI Responses WebSocket failed before request dispatch", { cause });
197
- this.name = "OpenAIResponsesWebSocketPreDispatchError";
198
- }
199
- };
200
- var OpenAIResponsesWebSocketPostDispatchError = class extends Error {
201
- constructor(cause) {
202
- super("OpenAI Responses WebSocket failed after request dispatch; outcome is unknown", { cause });
203
- this.code = PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE;
204
- this.name = "OpenAIResponsesWebSocketPostDispatchError";
205
- }
206
- };
207
- var OpenAIResponsesWebSocketServerError = class extends Error {
208
- constructor(code, status, param, message, cause) {
209
- super(message, { cause });
210
- this.code = code;
211
- this.status = status;
212
- this.param = param;
213
- this.name = "OpenAIResponsesWebSocketServerError";
214
- }
215
- };
216
- var OpenAIResponsesWebSocketSafeRetryError = class extends OpenAIResponsesWebSocketServerError {};
217
- function readWebSocketServerError(value) {
218
- if (!isRecord(value) || value.type !== "error") return;
219
- const details = isRecord(value.error) ? value.error : value;
220
- if (typeof details.code !== "string" || typeof details.message !== "string") return;
221
- const rawStatus = value.status ?? value.status_code;
222
- return {
223
- code: details.code,
224
- message: details.message,
225
- param: typeof details.param === "string" ? details.param : null,
226
- status: typeof rawStatus === "number" ? rawStatus : void 0
227
- };
228
- }
229
- function parseOpenAIResponsesWebSocketServerError(cause) {
230
- if (!isRecord(cause)) return;
231
- let details = readWebSocketServerError(cause.error) ?? readWebSocketServerError(cause);
232
- if (!details && typeof cause.message === "string") try {
233
- details = readWebSocketServerError(JSON.parse(cause.message));
234
- } catch {}
235
- if (!details) return;
236
- return new (details.code === "previous_response_not_found" || 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);
237
- }
238
- const PROMPT_OBSERVER = Symbol("openaiResponsesPromptObserver");
239
- const responsesPromptObserver = {
240
- set(options, observer) {
241
- Reflect.set(options, PROMPT_OBSERVER, observer);
242
- },
243
- get(options) {
244
- return Reflect.get(options, PROMPT_OBSERVER);
245
- },
246
- copy(source, target) {
247
- const observer = source && responsesPromptObserver.get(source);
248
- if (observer) responsesPromptObserver.set(target, observer);
249
- }
250
- };
251
- //#endregion
252
12
  //#region packages/ai/src/transports/openai-responses-payload-policy.ts
253
13
  /**
254
14
  * OpenAI Responses payload policy.
@@ -694,4 +454,4 @@ function createBoundedOpenAIResponsesCompactionFetch(upstreamFetch) {
694
454
  };
695
455
  }
696
456
  //#endregion
697
- export { supportsOpenAIReasoningEffort as A, isOpenAIGpt54MiniModel as C, resolveOpenAIModelReasoningEfforts as D, normalizeOpenAIReasoningEffort as E, resolveOpenAIReasoningEffortForModel as O, responsesPromptObserver as S, isOpenAIGpt56Model as T, OpenAIResponsesWebSocketPostDispatchError as _, applyOpenAIResponsesPayloadPolicy as a, RESPONSE_FAILED_NO_DETAILS_MESSAGE as b, resolveOpenAIResponsesServerCompactionPlan as c, OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS as d, OPENAI_RESPONSES_APIS as f, OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE as g, OPENAI_RESPONSES_REASONING_REPLAY_META_KEY as h, sanitizeResponsesImagePayload as i, supportsOpenAITemperature as j, resolveOpenAISupportedReasoningEfforts as k, AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS as l, OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY as m, isOpenAIResponsesCompactionOutput as n, resolveOpenAIResponsesCompactEndpointPlan as o, OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE as p, readOpenAIResponsesCompactionWindow as r, resolveOpenAIResponsesPayloadPolicy as s, createBoundedOpenAIResponsesCompactionFetch as t, DEFAULT_AZURE_OPENAI_API_VERSION as u, OpenAIResponsesWebSocketPreDispatchError as v, isOpenAIGpt55Model as w, parseOpenAIResponsesWebSocketServerError as x, OpenAIResponsesWebSocketSafeRetryError as y };
457
+ export { applyOpenAIResponsesPayloadPolicy as a, resolveOpenAIResponsesServerCompactionPlan as c, sanitizeResponsesImagePayload as i, isOpenAIResponsesCompactionOutput as n, resolveOpenAIResponsesCompactEndpointPlan as o, readOpenAIResponsesCompactionWindow as r, resolveOpenAIResponsesPayloadPolicy as s, createBoundedOpenAIResponsesCompactionFetch as t };
@@ -1,7 +1,7 @@
1
- import "./index-FnHM2FcI.mjs";
2
- import { D as Model, n as Api } from "./types-CJ1-Ht7A.mjs";
3
- import { _ as OpenAIReasoningEffort, a as BaseOpenAIStreamOptions, g as OpenAIApiReasoningEffort } from "./provider-options-Bcc_p-TU.mjs";
4
- import { FunctionTool, ResponseCompactionItem, ResponseCreateParamsStreaming, ResponseInput, ResponseInputItem } from "openai/resources/responses/responses.js";
1
+ import "./index-DdD3qerf.mjs";
2
+ import { O as Model, n as Api } from "./types-Ntv5z2g2.mjs";
3
+ import { a as BaseOpenAIStreamOptions, f as OpenAIReasoningEffort } from "./provider-options-Ceqv1OKk.mjs";
4
+ import { ResponseCompactionItem, ResponseCreateParamsStreaming, ResponseInputItem } from "openai/resources/responses/responses.js";
5
5
  //#region packages/ai/src/transports/openai-responses-compaction-window.d.ts
6
6
  type OpenAIResponsesCompactionOutput = Array<ResponseInputItem.Message | ReplayableResponseCompactionItem>;
7
7
  /** Read the saved canonical window only when it still matches its opaque checkpoint. */
@@ -48,38 +48,5 @@ declare const responsesPromptObserver: {
48
48
  get(options: object): ResponsesPromptObserver | undefined;
49
49
  copy(source: object | undefined, target: object): void;
50
50
  };
51
- type OpenAIResponsesRequestParams = {
52
- model: string;
53
- input: ResponseInput;
54
- stream: true;
55
- instructions?: string;
56
- prompt_cache_key?: string;
57
- prompt_cache_retention?: "24h";
58
- prompt_cache_options?: {
59
- ttl: "30m";
60
- };
61
- metadata?: Record<string, string>;
62
- previous_response_id?: string;
63
- store?: boolean;
64
- max_output_tokens?: number;
65
- temperature?: number;
66
- top_p?: number;
67
- text?: ResponseCreateParamsStreaming["text"];
68
- service_tier?: ResponseCreateParamsStreaming["service_tier"];
69
- tools?: Array<FunctionTool & {
70
- async?: boolean;
71
- }>;
72
- multi_agent?: {
73
- enabled?: boolean;
74
- };
75
- tool_choice?: ResponseCreateParamsStreaming["tool_choice"];
76
- reasoning?: {
77
- effort: OpenAIApiReasoningEffort;
78
- } | {
79
- effort: OpenAIApiReasoningEffort;
80
- summary: NonNullable<OpenAIResponsesOptions["reasoningSummary"]>;
81
- };
82
- include?: string[];
83
- };
84
51
  //#endregion
85
- export { ReplayableResponseCompactionItem as a, OpenAIResponsesCompactionOutput as c, OpenAIResponsesRequestParams as i, readOpenAIResponsesCompactionWindow as l, OpenAIResponsesOptions as n, ResponsesPromptObservation as o, OpenAIResponsesReasoningReplayMetadata as r, responsesPromptObserver as s, OPENAI_RESPONSES_APIS as t };
52
+ export { ResponsesPromptObservation as a, readOpenAIResponsesCompactionWindow as c, ReplayableResponseCompactionItem as i, OpenAIResponsesOptions as n, responsesPromptObserver as o, OpenAIResponsesReasoningReplayMetadata as r, OpenAIResponsesCompactionOutput as s, OPENAI_RESPONSES_APIS as t };
@@ -0,0 +1,245 @@
1
+ import { r as PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE } from "./types-LFWwv0cF.mjs";
2
+ import "./src-DDmEryvj.mjs";
3
+ import { n as normalizeLowercaseStringOrEmpty } from "./string-coerce-fsri9iCu.mjs";
4
+ import { o as isRecord } from "./record-coerce-DwRYMj3t.mjs";
5
+ import { n as uniqueStrings, t as normalizeStringEntries } from "./string-normalization-CmLIasuf.mjs";
6
+ //#region packages/ai/src/providers/openai-reasoning-effort.ts
7
+ /**
8
+ * OpenAI-compatible reasoning-effort normalization. Different GPT families
9
+ * expose different accepted effort enums, so callers map requested values here
10
+ * before constructing provider payloads.
11
+ */
12
+ const GPT_5_REASONING_EFFORTS = [
13
+ "minimal",
14
+ "low",
15
+ "medium",
16
+ "high"
17
+ ];
18
+ const GPT_51_REASONING_EFFORTS = [
19
+ "none",
20
+ "low",
21
+ "medium",
22
+ "high"
23
+ ];
24
+ const GPT_52_REASONING_EFFORTS = [
25
+ "none",
26
+ "low",
27
+ "medium",
28
+ "high",
29
+ "xhigh"
30
+ ];
31
+ const GPT_56_REASONING_EFFORTS = [
32
+ "none",
33
+ "low",
34
+ "medium",
35
+ "high",
36
+ "xhigh",
37
+ "max"
38
+ ];
39
+ const GPT_6_ASTRA_REASONING_EFFORTS = [
40
+ "low",
41
+ "medium",
42
+ "high",
43
+ "xhigh",
44
+ "max"
45
+ ];
46
+ const GPT_CODEX_REASONING_EFFORTS = [
47
+ "low",
48
+ "medium",
49
+ "high",
50
+ "xhigh"
51
+ ];
52
+ const GPT_PRO_REASONING_EFFORTS = [
53
+ "medium",
54
+ "high",
55
+ "xhigh"
56
+ ];
57
+ const GPT_5_PRO_REASONING_EFFORTS = ["high"];
58
+ const GPT_51_CODEX_MAX_REASONING_EFFORTS = [
59
+ "none",
60
+ "medium",
61
+ "high",
62
+ "xhigh"
63
+ ];
64
+ const GPT_51_CODEX_MINI_REASONING_EFFORTS = ["medium"];
65
+ const GENERIC_REASONING_EFFORTS = [
66
+ "low",
67
+ "medium",
68
+ "high"
69
+ ];
70
+ const CANONICAL_REASONING_EFFORTS = /* @__PURE__ */ new Set([
71
+ "none",
72
+ "minimal",
73
+ "low",
74
+ "medium",
75
+ "high",
76
+ "xhigh",
77
+ "max",
78
+ "off"
79
+ ]);
80
+ function normalizeModelId(id) {
81
+ return normalizeLowercaseStringOrEmpty(id ?? "").replace(/-\d{4}-\d{2}-\d{2}$/u, "");
82
+ }
83
+ /** Return whether a model is the GPT-5.4 mini family. */
84
+ function isOpenAIGpt54MiniModel(model) {
85
+ const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
86
+ return /^gpt-5\.4-mini(?:-|$)/u.test(id);
87
+ }
88
+ /** Return whether a model is the GPT-5.5 family. */
89
+ function isOpenAIGpt55Model(model) {
90
+ const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
91
+ const name = normalizeModelId(typeof model.name === "string" ? model.name : void 0);
92
+ return /^gpt-5\.5(?:-|$)/u.test(id) || /^gpt-5\.5(?:\s|\(|-|$)/u.test(name);
93
+ }
94
+ /** Return whether a model is the GPT-5.6 family. */
95
+ function isOpenAIGpt56Model(model) {
96
+ const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
97
+ const name = normalizeModelId(typeof model.name === "string" ? model.name : void 0);
98
+ return /^gpt-5\.6(?:-|$)/u.test(id) || /^gpt-5\.6(?:\s|\(|-|$)/u.test(name);
99
+ }
100
+ /** Normalize user-facing reasoning effort names to API effort names. */
101
+ function normalizeOpenAIReasoningEffort(effort) {
102
+ const trimmed = effort.trim();
103
+ const folded = trimmed.toLowerCase();
104
+ return CANONICAL_REASONING_EFFORTS.has(folded) ? folded : trimmed;
105
+ }
106
+ function readCompatReasoningEfforts(compat) {
107
+ if (!compat || typeof compat !== "object") return;
108
+ if (compat.supportsReasoningEffort === false) return [];
109
+ const raw = compat.supportedReasoningEfforts;
110
+ if (!Array.isArray(raw)) return;
111
+ const supported = uniqueStrings(normalizeStringEntries(raw.filter((value) => typeof value === "string")));
112
+ return supported.length > 0 ? supported : void 0;
113
+ }
114
+ function isDisabledReasoningEffort(effort) {
115
+ return effort === "none" || effort === "off";
116
+ }
117
+ /** Resolve the reasoning efforts accepted by a specific OpenAI-compatible model. */
118
+ function resolveOpenAISupportedReasoningEfforts(model) {
119
+ return resolveOpenAIModelReasoningEfforts(model) ?? GENERIC_REASONING_EFFORTS;
120
+ }
121
+ /** Read a declared or known model contract, leaving unknown compatible models unspecified. */
122
+ function resolveOpenAIModelReasoningEfforts(model) {
123
+ const compatEfforts = readCompatReasoningEfforts(model.compat);
124
+ if (compatEfforts) return compatEfforts;
125
+ const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
126
+ if (id === "gpt-6-astra" && model.api !== "azure-openai-responses") return GPT_6_ASTRA_REASONING_EFFORTS;
127
+ if (/^gpt-5\.6(?:-|$)/u.test(id)) return GPT_56_REASONING_EFFORTS;
128
+ if (id === "gpt-5.1-codex-mini") return GPT_51_CODEX_MINI_REASONING_EFFORTS;
129
+ if (id === "gpt-5.1-codex-max") return GPT_51_CODEX_MAX_REASONING_EFFORTS;
130
+ if (/^gpt-5(?:\.\d+)?-codex(?:-|$)/u.test(id)) return GPT_CODEX_REASONING_EFFORTS;
131
+ if (id === "gpt-5-pro") return GPT_5_PRO_REASONING_EFFORTS;
132
+ if (/^gpt-5\.[2-9](?:\.\d+)?-pro(?:-|$)/u.test(id)) return GPT_PRO_REASONING_EFFORTS;
133
+ if (/^gpt-5\.[2-9](?:\.\d+)?(?:-|$)/u.test(id)) return GPT_52_REASONING_EFFORTS;
134
+ if (/^gpt-5\.1(?:-|$)/u.test(id)) return GPT_51_REASONING_EFFORTS;
135
+ if (/^gpt-5(?:-|$)/u.test(id)) return GPT_5_REASONING_EFFORTS;
136
+ }
137
+ /**
138
+ * Return whether a model accepts temperature. GPT-5.6 and GPT-6 Astra
139
+ * reject it with a 400; catalog compat can override per model.
140
+ */
141
+ function supportsOpenAITemperature(model) {
142
+ const compat = model.compat;
143
+ if (compat && typeof compat === "object") {
144
+ const declared = compat.supportsTemperature;
145
+ if (typeof declared === "boolean") return declared;
146
+ }
147
+ const id = normalizeModelId(typeof model.id === "string" ? model.id : void 0);
148
+ return (id !== "gpt-6-astra" || model.api === "azure-openai-responses") && !/^gpt-5\.6(?:-|$)/u.test(id);
149
+ }
150
+ /** Return whether a model accepts a requested reasoning effort. */
151
+ function supportsOpenAIReasoningEffort(model, effort) {
152
+ return resolveOpenAISupportedReasoningEfforts(model).includes(normalizeOpenAIReasoningEffort(effort));
153
+ }
154
+ /** Resolve a requested reasoning effort to the closest value supported by the model. */
155
+ function resolveOpenAIReasoningEffortForModel(params) {
156
+ const requested = normalizeOpenAIReasoningEffort(params.effort);
157
+ const mapped = params.fallbackMap?.[requested] ?? (params.fallbackMap && CANONICAL_REASONING_EFFORTS.has(requested) ? Object.entries(params.fallbackMap).find(([effort]) => normalizeOpenAIReasoningEffort(effort) === requested)?.[1] : void 0);
158
+ const normalized = mapped === void 0 ? requested : mapped.trim();
159
+ const supported = resolveOpenAISupportedReasoningEfforts(params.model);
160
+ if (supported.includes(normalized)) return normalized;
161
+ if (requested === "off" && supported.includes("none")) return "none";
162
+ if (isDisabledReasoningEffort(requested) || isDisabledReasoningEffort(normalized)) return;
163
+ if (requested === "minimal" && supported.includes("low")) return "low";
164
+ if ((requested === "minimal" || requested === "low") && supported.includes("medium")) return "medium";
165
+ if (requested === "xhigh" && supported.includes("high")) return "high";
166
+ if (requested === "max" && supported.includes("xhigh")) return "xhigh";
167
+ return supported.find((effort) => !isDisabledReasoningEffort(normalizeOpenAIReasoningEffort(effort)));
168
+ }
169
+ //#endregion
170
+ //#region packages/ai/src/transports/openai-responses-contracts.ts
171
+ const DEFAULT_AZURE_OPENAI_API_VERSION = "preview";
172
+ const OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS = "Follow the user request.";
173
+ const AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS = 3e4;
174
+ const RESPONSE_FAILED_NO_DETAILS_MESSAGE = "Unknown error (no error details in response)";
175
+ const OPENAI_RESPONSES_REASONING_REPLAY_META_KEY = "__openclaw_replay";
176
+ const OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY = "openclawReasoningReplay";
177
+ const OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE = "openai-responses-compaction";
178
+ const OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE = "openai-responses-retained-compaction";
179
+ const OPENAI_RESPONSES_APIS = /* @__PURE__ */ new Set([
180
+ "openai-responses",
181
+ "azure-openai-responses",
182
+ "openai-chatgpt-responses",
183
+ "openclaw-openai-responses-transport",
184
+ "openclaw-openai-chatgpt-responses-transport",
185
+ "openclaw-azure-openai-responses-transport"
186
+ ]);
187
+ var OpenAIResponsesWebSocketPreDispatchError = class extends Error {
188
+ constructor(cause) {
189
+ super("OpenAI Responses WebSocket failed before request dispatch", { cause });
190
+ this.name = "OpenAIResponsesWebSocketPreDispatchError";
191
+ }
192
+ };
193
+ var OpenAIResponsesWebSocketPostDispatchError = class extends Error {
194
+ constructor(cause) {
195
+ super("OpenAI Responses WebSocket failed after request dispatch; outcome is unknown", { cause });
196
+ this.code = PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE;
197
+ this.name = "OpenAIResponsesWebSocketPostDispatchError";
198
+ }
199
+ };
200
+ var OpenAIResponsesWebSocketServerError = class extends Error {
201
+ constructor(code, status, param, message, cause) {
202
+ super(message, { cause });
203
+ this.code = code;
204
+ this.status = status;
205
+ this.param = param;
206
+ this.name = "OpenAIResponsesWebSocketServerError";
207
+ }
208
+ };
209
+ var OpenAIResponsesWebSocketSafeRetryError = class extends OpenAIResponsesWebSocketServerError {};
210
+ function readWebSocketServerError(value) {
211
+ if (!isRecord(value) || value.type !== "error") return;
212
+ const details = isRecord(value.error) ? value.error : value;
213
+ if (typeof details.code !== "string" || typeof details.message !== "string") return;
214
+ const rawStatus = value.status ?? value.status_code;
215
+ return {
216
+ code: details.code,
217
+ message: details.message,
218
+ param: typeof details.param === "string" ? details.param : null,
219
+ status: typeof rawStatus === "number" ? rawStatus : void 0
220
+ };
221
+ }
222
+ function parseOpenAIResponsesWebSocketServerError(cause) {
223
+ if (!isRecord(cause)) return;
224
+ let details = readWebSocketServerError(cause.error) ?? readWebSocketServerError(cause);
225
+ if (!details && typeof cause.message === "string") try {
226
+ details = readWebSocketServerError(JSON.parse(cause.message));
227
+ } catch {}
228
+ if (!details) return;
229
+ return new (details.code === "previous_response_not_found" || 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);
230
+ }
231
+ const PROMPT_OBSERVER = Symbol("openaiResponsesPromptObserver");
232
+ const responsesPromptObserver = {
233
+ set(options, observer) {
234
+ Reflect.set(options, PROMPT_OBSERVER, observer);
235
+ },
236
+ get(options) {
237
+ return Reflect.get(options, PROMPT_OBSERVER);
238
+ },
239
+ copy(source, target) {
240
+ const observer = source && responsesPromptObserver.get(source);
241
+ if (observer) responsesPromptObserver.set(target, observer);
242
+ }
243
+ };
244
+ //#endregion
245
+ export { supportsOpenAITemperature as C, supportsOpenAIReasoningEffort as S, isOpenAIGpt56Model as _, OPENAI_RESPONSES_COMPACTION_REPLAY_TYPE as a, resolveOpenAIReasoningEffortForModel as b, OPENAI_RESPONSES_RETAINED_COMPACTION_REPLAY_TYPE as c, OpenAIResponsesWebSocketSafeRetryError as d, RESPONSE_FAILED_NO_DETAILS_MESSAGE as f, isOpenAIGpt55Model as g, isOpenAIGpt54MiniModel as h, OPENAI_RESPONSES_APIS as i, OpenAIResponsesWebSocketPostDispatchError as l, responsesPromptObserver as m, DEFAULT_AZURE_OPENAI_API_VERSION as n, OPENAI_RESPONSES_REASONING_REPLAY_BLOCK_META_KEY as o, parseOpenAIResponsesWebSocketServerError 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, normalizeOpenAIReasoningEffort as v, resolveOpenAISupportedReasoningEfforts as x, resolveOpenAIModelReasoningEfforts as y };
@@ -1,6 +1,6 @@
1
- import { d as stripSystemPromptCacheBoundary } from "./simple-options-BjHCCh4v.mjs";
2
- import { g as sanitizeTransportPayloadText } from "./transport-stream-shared-CZqMhfIw.mjs";
3
- import { S as responsesPromptObserver } from "./openai-responses-compaction-window-BMVHFOtq.mjs";
1
+ import { m as stripSystemPromptCacheBoundary } from "./simple-options-BQbb4yQL.mjs";
2
+ import { _ as sanitizeTransportPayloadText } from "./transport-stream-shared-zHll9BxO.mjs";
3
+ import { m as responsesPromptObserver } from "./openai-responses-contracts-DDOHA62Y.mjs";
4
4
  //#region packages/ai/src/transports/openai-responses-prompt-observer-internal.ts
5
5
  function readFinalResponsesPrompt(request) {
6
6
  if (typeof request.instructions === "string") return ["instructions", request.instructions];