@openclaw/ai 2026.7.2-beta.3 → 2026.7.2-beta.5

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 (60) hide show
  1. package/README.md +6 -5
  2. package/dist/{anthropic-D7SyZQ5v.mjs → anthropic-CQVj3le6.mjs} +174 -33
  3. package/dist/{index-BoTnz8cv.d.mts → anthropic-SrGtwsJu.d.mts} +27 -1
  4. package/dist/{api-registry-DXBIXISf.d.mts → api-registry-DlMgPR39.d.mts} +1 -2
  5. package/dist/{azure-openai-responses-BkZgyZ3I.mjs → azure-openai-responses-DIYgsqFM.mjs} +7 -11
  6. package/dist/{env-api-keys-DnhYpc27.mjs → env-api-keys-DrgeBuva.mjs} +1 -1
  7. package/dist/error-coercion-DgxlWC0n.mjs +15 -0
  8. package/dist/{event-stream-BPemFrFW.d.mts → event-stream-YjaPW20U.d.mts} +1 -1
  9. package/dist/event-stream.d.mts +1 -1
  10. package/dist/{tool-schema-json-projection-BwNu3nDi.mjs → github-copilot-headers-BCoBNmL7.mjs} +48 -1
  11. package/dist/{google-C_biGbV7.mjs → google-f-A8xrae.mjs} +4 -4
  12. package/dist/{google-shared-BK-NoHl8.mjs → google-shared-J6qvYINH.mjs} +5 -4
  13. package/dist/{google-vertex-CvdzF1U7.mjs → google-vertex-D3yMVXIY.mjs} +3 -3
  14. package/dist/host-B9GUmcra.d.mts +173 -0
  15. package/dist/host-XYGZcgO8.mjs +98 -0
  16. package/dist/index-BVVgDSdq.d.mts +1 -0
  17. package/dist/index.d.mts +7 -50
  18. package/dist/index.mjs +3 -3
  19. package/dist/internal/anthropic.d.mts +15 -11
  20. package/dist/internal/anthropic.mjs +4 -4
  21. package/dist/internal/openai.d.mts +3 -280
  22. package/dist/internal/openai.mjs +5 -7
  23. package/dist/internal/runtime.d.mts +13 -34
  24. package/dist/internal/runtime.mjs +19 -11
  25. package/dist/internal/shared.d.mts +13 -8
  26. package/dist/internal/shared.mjs +2 -2
  27. package/dist/{mistral-BdrQmDWp.mjs → mistral-CKV-TOQj.mjs} +7 -6
  28. package/dist/number-coercion-DvG7SNMg.mjs +129 -0
  29. package/dist/openai-BPor_3WI.d.mts +358 -0
  30. package/dist/{openai-responses-shared-CwnGU0KW.mjs → openai-D3PD6PE-.mjs} +1890 -705
  31. package/dist/{openai-chatgpt-responses-DP63Qt01.mjs → openai-chatgpt-responses-CedIj0hk.mjs} +54 -58
  32. package/dist/{openai-completions-zLDfebnN.mjs → openai-completions-CiSutyu0.mjs} +459 -104
  33. package/dist/openai-prompt-cache-2uo_1OR1.d.mts +7 -0
  34. package/dist/openai-prompt-cache-mZTCdRPo.mjs +12 -0
  35. package/dist/prompt-cache-stability-Cwcjv_fx.d.mts +13 -0
  36. package/dist/{provider-error-LMfTEkfO.mjs → provider-error-apVOZI6G.mjs} +9 -2
  37. package/dist/providers.d.mts +3 -2
  38. package/dist/providers.mjs +10 -9
  39. package/dist/{transform-messages-eb6lxDLB.mjs → shared-CdjNZd35.mjs} +273 -161
  40. package/dist/{src-CXno1H5g.mjs → src-QkygScBs.mjs} +23 -4
  41. package/dist/stream-first-event-timeout-C3OgBjIk.mjs +12294 -0
  42. package/dist/stream-first-event-timeout-DvDeSucC.d.mts +29 -0
  43. package/dist/transport-stream-shared-BbMELSI4.mjs +297 -0
  44. package/dist/transports.d.mts +593 -0
  45. package/dist/transports.mjs +4069 -0
  46. package/dist/{types-CYORveZ7.d.mts → types-bzp5k29J.d.mts} +8 -0
  47. package/dist/types.d.mts +5 -5
  48. package/dist/types.mjs +2 -2
  49. package/dist/{validation-BX8euiDv.d.mts → validation-B-j7cOYp.d.mts} +1 -1
  50. package/dist/validation.d.mts +1 -1
  51. package/package.json +36 -11
  52. package/dist/azure-openai-responses-client-compat-C7K7QfUE.mjs +0 -62
  53. package/dist/github-copilot-headers-BsH5cqGj.mjs +0 -48
  54. package/dist/host-4t713IeR.mjs +0 -37
  55. package/dist/model-utils-1GiZ2_rr.mjs +0 -64
  56. package/dist/openai-responses-ClspWt4I.mjs +0 -136
  57. package/dist/openai-tool-projection-WHf2nuOI.mjs +0 -200
  58. package/dist/reasoning-tag-text-partitioner-BlVe67g6.mjs +0 -400
  59. package/dist/stream-first-event-timeout-RjWszj8c.mjs +0 -106
  60. package/npm-shrinkwrap.json +0 -645
@@ -45,6 +45,11 @@ interface ProviderResponse {
45
45
  interface StreamOptions {
46
46
  temperature?: number;
47
47
  maxTokens?: number;
48
+ /**
49
+ * Optional JSON Schema for the generated response. Providers that support
50
+ * constrained decoding map it to their native request shape; others ignore it.
51
+ */
52
+ responseFormat?: Record<string, unknown>;
48
53
  /**
49
54
  * Stop sequences forwarded to providers that support them. Providers map this
50
55
  * to their native request field, such as OpenAI `stop` or Anthropic
@@ -258,6 +263,7 @@ interface AssistantMessage {
258
263
  model: string;
259
264
  responseModel?: string;
260
265
  responseId?: string;
266
+ turnId?: string;
261
267
  diagnostics?: AssistantMessageDiagnostic[];
262
268
  usage: Usage;
263
269
  stopReason: StopReason;
@@ -426,6 +432,8 @@ interface OpenAICompletionsCompat {
426
432
  zaiToolStream?: boolean;
427
433
  /** Whether the provider supports the `strict` field in tool definitions. Default: true. */
428
434
  supportsStrictMode?: boolean;
435
+ /** Whether the provider supports JSON Schema through `response_format`. Default: false for unknown compatible endpoints. */
436
+ supportsJsonSchemaResponseFormat?: boolean;
429
437
  /** Cache control convention for prompt caching. "anthropic" applies Anthropic-style `cache_control` markers to the system prompt, last tool definition, and last user/assistant text content. */
430
438
  cacheControlFormat?: "anthropic";
431
439
  /** Whether to send known session-affinity headers (`session_id`, `x-client-request-id`, `x-session-affinity`) from `options.sessionId` when caching is enabled. Default: false. */
package/dist/types.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { a as resolveClaudeFable5ModelIdentity, c as resolveClaudeNativeThinkingLevelMap, d as supportsClaudeNativeMaxEffort, f as supportsClaudeNativeXhighEffort, i as requiresClaudeMandatoryAdaptiveThinking, l as resolveClaudeSonnet5ModelIdentity, n as CLAUDE_SONNET_5_THINKING_PROFILE, o as resolveClaudeModelIdentity, r as requiresClaudeDefaultSampling, s as resolveClaudeMythos5ModelIdentity, t as CLAUDE_FABLE_5_THINKING_PROFILE, u as supportsClaudeAdaptiveThinking } from "./index-BoTnz8cv.mjs";
1
+ import { a as requiresClaudeMandatoryAdaptiveThinking, c as resolveClaudeMythos5ModelIdentity, d as resolveClaudeSonnet5ModelIdentity, f as supportsClaude1MContext, g as supportsClaudeNativeXhighEffort, h as supportsClaudeNativeMaxEffort, i as requiresClaudeDefaultSampling, l as resolveClaudeNativeThinkingLevelMap, m as supportsClaudeFastMode, n as CLAUDE_OPUS_5_THINKING_PROFILE, o as resolveClaudeFable5ModelIdentity, p as supportsClaudeAdaptiveThinking, r as CLAUDE_SONNET_5_THINKING_PROFILE, s as resolveClaudeModelIdentity, t as CLAUDE_FABLE_5_THINKING_PROFILE, u as resolveClaudeOpus5ModelIdentity } from "./anthropic-SrGtwsJu.mjs";
2
2
  import { a as extractDiagnosticError, i as createAssistantMessageDiagnostic, n as DiagnosticErrorInfo, o as formatThrownValue, r as appendAssistantMessageDiagnostic, t as AssistantMessageDiagnostic } from "./diagnostics-BaTA9eVl.mjs";
3
- import { $ as VercelGatewayRouting, A as OpenRouterRouting, B as TextContent, C as KnownImagesProvider, D as ModelThinkingLevel, E as Model, F as SimpleStreamOptions, G as ThinkingLevelMap, H as ThinkingBudgets, I as StopReason, J as ToolResultMessage, K as Tool, L as StreamFn, M as ProviderImagesOptions, N as ProviderResponse, O as OpenAICompletionsCompat, P as ProviderStreamOptions, Q as ValidateToolArgumentsFn, R as StreamFunction, S as KnownImagesApi, T as Message, U as ThinkingContent, V as TextSignatureV1, W as ThinkingLevel, X as Usage, Y as Transport, Z as UserMessage, _ as ImagesOptions, a as AssistantMessageEvent, b as ImagesStopReason, c as CacheRetention, d as ImageContent, f as ImagesApi, g as ImagesModel, h as ImagesInputContent, i as AssistantMessage, j as Provider, k as OpenAIResponsesCompat, l as CompleteSimpleFn, m as ImagesFunction, n as Api, o as AssistantMessageEventStreamContract, p as ImagesContext, q as ToolCall, r as AssistantImages, s as AssistantMessageEventStreamLike, t as AnthropicMessagesCompat, u as Context, v as ImagesOutputContent, w as MaybePromise, x as KnownApi, y as ImagesProvider, z as StreamOptions } from "./types-CYORveZ7.mjs";
4
- import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-BPemFrFW.mjs";
5
- import { n as validateToolCall, t as validateToolArguments } from "./validation-BX8euiDv.mjs";
6
- export { AnthropicMessagesCompat, Api, AssistantImages, AssistantMessage, AssistantMessageDiagnostic, AssistantMessageEvent, AssistantMessageEventStream, AssistantMessageEventStreamContract, AssistantMessageEventStreamLike, CLAUDE_FABLE_5_THINKING_PROFILE, CLAUDE_SONNET_5_THINKING_PROFILE, CacheRetention, CompleteSimpleFn, Context, DiagnosticErrorInfo, EventStream, ImageContent, ImagesApi, ImagesContext, ImagesFunction, ImagesInputContent, ImagesModel, ImagesOptions, ImagesOutputContent, ImagesProvider, ImagesStopReason, KnownApi, KnownImagesApi, KnownImagesProvider, MaybePromise, Message, Model, ModelThinkingLevel, OpenAICompletionsCompat, OpenAIResponsesCompat, OpenRouterRouting, Provider, ProviderImagesOptions, ProviderResponse, ProviderStreamOptions, SimpleStreamOptions, StopReason, StreamFn, StreamFunction, StreamOptions, TextContent, TextSignatureV1, ThinkingBudgets, ThinkingContent, ThinkingLevel, ThinkingLevelMap, Tool, ToolCall, ToolResultMessage, Transport, Usage, UserMessage, ValidateToolArgumentsFn, VercelGatewayRouting, appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, createAssistantMessageEventStream, extractDiagnosticError, formatThrownValue, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, validateToolArguments, validateToolCall };
3
+ import { $ as VercelGatewayRouting, A as OpenRouterRouting, B as TextContent, C as KnownImagesProvider, D as ModelThinkingLevel, E as Model, F as SimpleStreamOptions, G as ThinkingLevelMap, H as ThinkingBudgets, I as StopReason, J as ToolResultMessage, K as Tool, L as StreamFn, M as ProviderImagesOptions, N as ProviderResponse, O as OpenAICompletionsCompat, P as ProviderStreamOptions, Q as ValidateToolArgumentsFn, R as StreamFunction, S as KnownImagesApi, T as Message, U as ThinkingContent, V as TextSignatureV1, W as ThinkingLevel, X as Usage, Y as Transport, Z as UserMessage, _ as ImagesOptions, a as AssistantMessageEvent, b as ImagesStopReason, c as CacheRetention, d as ImageContent, f as ImagesApi, g as ImagesModel, h as ImagesInputContent, i as AssistantMessage, j as Provider, k as OpenAIResponsesCompat, l as CompleteSimpleFn, m as ImagesFunction, n as Api, o as AssistantMessageEventStreamContract, p as ImagesContext, q as ToolCall, r as AssistantImages, s as AssistantMessageEventStreamLike, t as AnthropicMessagesCompat, u as Context, v as ImagesOutputContent, w as MaybePromise, x as KnownApi, y as ImagesProvider, z as StreamOptions } from "./types-bzp5k29J.mjs";
4
+ import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-YjaPW20U.mjs";
5
+ import { n as validateToolCall, t as validateToolArguments } from "./validation-B-j7cOYp.mjs";
6
+ export { AnthropicMessagesCompat, Api, AssistantImages, AssistantMessage, AssistantMessageDiagnostic, AssistantMessageEvent, AssistantMessageEventStream, AssistantMessageEventStreamContract, AssistantMessageEventStreamLike, CLAUDE_FABLE_5_THINKING_PROFILE, CLAUDE_OPUS_5_THINKING_PROFILE, CLAUDE_SONNET_5_THINKING_PROFILE, CacheRetention, CompleteSimpleFn, Context, DiagnosticErrorInfo, EventStream, ImageContent, ImagesApi, ImagesContext, ImagesFunction, ImagesInputContent, ImagesModel, ImagesOptions, ImagesOutputContent, ImagesProvider, ImagesStopReason, KnownApi, KnownImagesApi, KnownImagesProvider, MaybePromise, Message, Model, ModelThinkingLevel, OpenAICompletionsCompat, OpenAIResponsesCompat, OpenRouterRouting, Provider, ProviderImagesOptions, ProviderResponse, ProviderStreamOptions, SimpleStreamOptions, StopReason, StreamFn, StreamFunction, StreamOptions, TextContent, TextSignatureV1, ThinkingBudgets, ThinkingContent, ThinkingLevel, ThinkingLevelMap, Tool, ToolCall, ToolResultMessage, Transport, Usage, UserMessage, ValidateToolArgumentsFn, VercelGatewayRouting, appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, createAssistantMessageEventStream, extractDiagnosticError, formatThrownValue, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeOpus5ModelIdentity, resolveClaudeSonnet5ModelIdentity, supportsClaude1MContext, supportsClaudeAdaptiveThinking, supportsClaudeFastMode, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, validateToolArguments, validateToolCall };
package/dist/types.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { a as resolveClaudeFable5ModelIdentity, c as resolveClaudeNativeThinkingLevelMap, d as supportsClaudeNativeMaxEffort, f as supportsClaudeNativeXhighEffort, i as requiresClaudeMandatoryAdaptiveThinking, l as resolveClaudeSonnet5ModelIdentity, n as CLAUDE_SONNET_5_THINKING_PROFILE, o as resolveClaudeModelIdentity, r as requiresClaudeDefaultSampling, s as resolveClaudeMythos5ModelIdentity, t as CLAUDE_FABLE_5_THINKING_PROFILE, u as supportsClaudeAdaptiveThinking } from "./src-CXno1H5g.mjs";
1
+ import { a as requiresClaudeMandatoryAdaptiveThinking, c as resolveClaudeMythos5ModelIdentity, d as resolveClaudeSonnet5ModelIdentity, f as supportsClaude1MContext, g as supportsClaudeNativeXhighEffort, h as supportsClaudeNativeMaxEffort, i as requiresClaudeDefaultSampling, l as resolveClaudeNativeThinkingLevelMap, m as supportsClaudeFastMode, n as CLAUDE_OPUS_5_THINKING_PROFILE, o as resolveClaudeFable5ModelIdentity, p as supportsClaudeAdaptiveThinking, r as CLAUDE_SONNET_5_THINKING_PROFILE, s as resolveClaudeModelIdentity, t as CLAUDE_FABLE_5_THINKING_PROFILE, u as resolveClaudeOpus5ModelIdentity } from "./src-QkygScBs.mjs";
2
2
  import { i as formatThrownValue, n as createAssistantMessageDiagnostic, r as extractDiagnosticError, t as appendAssistantMessageDiagnostic } from "./diagnostics-COpOtRwq.mjs";
3
3
  import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
4
4
  import { n as validateToolCall, t as validateToolArguments } from "./validation-DAa_yFOM.mjs";
5
- export { AssistantMessageEventStream, CLAUDE_FABLE_5_THINKING_PROFILE, CLAUDE_SONNET_5_THINKING_PROFILE, EventStream, appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, createAssistantMessageEventStream, extractDiagnosticError, formatThrownValue, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, validateToolArguments, validateToolCall };
5
+ export { AssistantMessageEventStream, CLAUDE_FABLE_5_THINKING_PROFILE, CLAUDE_OPUS_5_THINKING_PROFILE, CLAUDE_SONNET_5_THINKING_PROFILE, EventStream, appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, createAssistantMessageEventStream, extractDiagnosticError, formatThrownValue, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeOpus5ModelIdentity, resolveClaudeSonnet5ModelIdentity, supportsClaude1MContext, supportsClaudeAdaptiveThinking, supportsClaudeFastMode, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, validateToolArguments, validateToolCall };
@@ -1,4 +1,4 @@
1
- import { K as Tool, q as ToolCall } from "./types-CYORveZ7.mjs";
1
+ import { K as Tool, q as ToolCall } from "./types-bzp5k29J.mjs";
2
2
 
3
3
  //#region packages/llm-core/src/validation.d.ts
4
4
  /** Finds the target tool and validates/coerces a model-emitted tool call. */
@@ -1,2 +1,2 @@
1
- import { n as validateToolCall, t as validateToolArguments } from "./validation-BX8euiDv.mjs";
1
+ import { n as validateToolCall, t as validateToolArguments } from "./validation-B-j7cOYp.mjs";
2
2
  export { validateToolArguments, validateToolCall };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/ai",
3
- "version": "2026.7.2-beta.3",
3
+ "version": "2026.7.2-beta.5",
4
4
  "description": "Reusable model provider adapters and streaming runtime from OpenClaw",
5
5
  "keywords": [
6
6
  "ai",
@@ -16,6 +16,7 @@
16
16
  "url": "https://github.com/openclaw/openclaw/issues"
17
17
  },
18
18
  "license": "MIT",
19
+ "author": "OpenClaw Foundation (https://openclaw.org)",
19
20
  "repository": {
20
21
  "type": "git",
21
22
  "url": "git+https://github.com/openclaw/openclaw.git",
@@ -23,7 +24,6 @@
23
24
  },
24
25
  "files": [
25
26
  "dist",
26
- "npm-shrinkwrap.json",
27
27
  "LICENSE",
28
28
  "README.md"
29
29
  ],
@@ -41,6 +41,11 @@
41
41
  "import": "./dist/providers.mjs",
42
42
  "default": "./dist/providers.mjs"
43
43
  },
44
+ "./transports": {
45
+ "types": "./dist/transports.d.mts",
46
+ "import": "./dist/transports.mjs",
47
+ "default": "./dist/transports.mjs"
48
+ },
44
49
  "./diagnostics": {
45
50
  "types": "./dist/diagnostics.d.mts",
46
51
  "import": "./dist/diagnostics.mjs",
@@ -61,19 +66,39 @@
61
66
  "import": "./dist/validation.mjs",
62
67
  "default": "./dist/validation.mjs"
63
68
  },
64
- "./internal/*": {
65
- "types": "./dist/internal/*.d.mts",
66
- "import": "./dist/internal/*.mjs",
67
- "default": "./dist/internal/*.mjs"
69
+ "./internal/anthropic": {
70
+ "types": "./dist/internal/anthropic.d.mts",
71
+ "import": "./dist/internal/anthropic.mjs",
72
+ "default": "./dist/internal/anthropic.mjs"
73
+ },
74
+ "./internal/openai": {
75
+ "types": "./dist/internal/openai.d.mts",
76
+ "import": "./dist/internal/openai.mjs",
77
+ "default": "./dist/internal/openai.mjs"
78
+ },
79
+ "./internal/retry-after": {
80
+ "types": "./dist/internal/retry-after.d.mts",
81
+ "import": "./dist/internal/retry-after.mjs",
82
+ "default": "./dist/internal/retry-after.mjs"
83
+ },
84
+ "./internal/runtime": {
85
+ "types": "./dist/internal/runtime.d.mts",
86
+ "import": "./dist/internal/runtime.mjs",
87
+ "default": "./dist/internal/runtime.mjs"
88
+ },
89
+ "./internal/shared": {
90
+ "types": "./dist/internal/shared.d.mts",
91
+ "import": "./dist/internal/shared.mjs",
92
+ "default": "./dist/internal/shared.mjs"
68
93
  }
69
94
  },
70
95
  "dependencies": {
71
- "@anthropic-ai/sdk": "0.109.1",
72
- "@google/genai": "2.10.0",
73
- "@mistralai/mistralai": "2.4.0",
74
- "openai": "6.45.0",
96
+ "@anthropic-ai/sdk": "0.112.3",
97
+ "@google/genai": "2.12.0",
98
+ "@mistralai/mistralai": "2.5.0",
99
+ "openai": "6.48.0",
75
100
  "partial-json": "0.1.7",
76
- "typebox": "1.3.3"
101
+ "typebox": "1.3.6"
77
102
  },
78
103
  "engines": {
79
104
  "node": ">=22.19.0"
@@ -1,62 +0,0 @@
1
- //#region packages/ai/src/providers/azure-deployment-map.ts
2
- /** Parses AZURE_OPENAI_DEPLOYMENT_MAP-style model=deployment entries. */
3
- function parseAzureDeploymentNameMap(value) {
4
- const map = /* @__PURE__ */ new Map();
5
- if (!value) return map;
6
- for (const entry of value.split(",")) {
7
- const trimmed = entry.trim();
8
- if (!trimmed) continue;
9
- const separator = trimmed.indexOf("=");
10
- if (separator <= 0) continue;
11
- const modelId = trimmed.slice(0, separator).trim();
12
- const deploymentName = trimmed.slice(separator + 1).trim();
13
- if (!modelId || !deploymentName) continue;
14
- map.set(modelId, deploymentName);
15
- }
16
- return map;
17
- }
18
- let cachedDeploymentLookup;
19
- function getDeploymentLookup(source) {
20
- const cached = cachedDeploymentLookup;
21
- if (cached && cached.source === source) return cached;
22
- const exact = parseAzureDeploymentNameMap(source);
23
- const folded = /* @__PURE__ */ new Map();
24
- for (const [modelId, deploymentName] of exact) folded.set(modelId.toLowerCase(), deploymentName);
25
- cachedDeploymentLookup = {
26
- source,
27
- exact,
28
- folded
29
- };
30
- return cachedDeploymentLookup;
31
- }
32
- /**
33
- * Resolves the Azure deployment name for a model id, falling back to the model id.
34
- *
35
- * An exact-case match always wins, so configs that intentionally distinguish keys by
36
- * case keep their exact mappings; a case-insensitive match is only used as a fallback
37
- * (e.g. `GPT-4o` against a `gpt-4o=...` map) to avoid 404s from casing differences.
38
- */
39
- function resolveAzureDeploymentNameFromMap(params) {
40
- const { exact, folded } = getDeploymentLookup(params.deploymentMap);
41
- return exact.get(params.modelId) ?? folded.get(params.modelId.toLowerCase()) ?? params.modelId;
42
- }
43
- //#endregion
44
- //#region packages/ai/src/providers/azure-openai-responses-client-compat.ts
45
- function isTraditionalAzureOpenAIHost(hostname) {
46
- return hostname.endsWith(".openai.azure.com") || hostname.endsWith(".cognitiveservices.azure.com");
47
- }
48
- function isOpenAICompatibleAzureResponsesBaseUrl(baseUrl) {
49
- let url;
50
- try {
51
- url = new URL(baseUrl);
52
- } catch {
53
- return false;
54
- }
55
- if (isTraditionalAzureOpenAIHost(url.hostname)) return false;
56
- const hostname = url.hostname.toLowerCase();
57
- if (!(hostname.endsWith(".services.ai.azure.com") || hostname.endsWith(".api.cognitive.microsoft.com"))) return false;
58
- const normalizedPath = url.pathname.replace(/\/+$/, "");
59
- return normalizedPath === "/openai/v1" || normalizedPath.endsWith("/openai/v1");
60
- }
61
- //#endregion
62
- export { resolveAzureDeploymentNameFromMap as i, isTraditionalAzureOpenAIHost as n, parseAzureDeploymentNameMap as r, isOpenAICompatibleAzureResponsesBaseUrl as t };
@@ -1,48 +0,0 @@
1
- //#region packages/ai/src/providers/cache-retention.ts
2
- /**
3
- * Resolve cache retention preference.
4
- * Defaults to "short" and uses OPENCLAW_CACHE_RETENTION for backward compatibility.
5
- */
6
- function resolveCacheRetention(cacheRetention) {
7
- if (cacheRetention) return cacheRetention;
8
- if (typeof process !== "undefined" && process.env.OPENCLAW_CACHE_RETENTION === "long") return "long";
9
- return "short";
10
- }
11
- //#endregion
12
- //#region packages/ai/src/providers/cloudflare.ts
13
- function isCloudflareProvider(provider) {
14
- return provider === "cloudflare-workers-ai" || provider === "cloudflare-ai-gateway";
15
- }
16
- /** Substitute `{VAR}` placeholders in a Cloudflare baseUrl from process.env. */
17
- function resolveCloudflareBaseUrl(model) {
18
- const url = model.baseUrl;
19
- if (!url.includes("{")) return url;
20
- return url.replace(/\{([A-Z_][A-Z0-9_]*)\}/g, (_match, name) => {
21
- const value = process.env[name];
22
- if (!value) throw new Error(`${name} is required for provider ${model.provider} but is not set.`);
23
- return value;
24
- });
25
- }
26
- //#endregion
27
- //#region packages/ai/src/providers/github-copilot-headers.ts
28
- function inferCopilotInitiator(messages) {
29
- const last = messages[messages.length - 1];
30
- return last && last.role !== "user" ? "agent" : "user";
31
- }
32
- function hasCopilotVisionInput(messages) {
33
- return messages.some((msg) => {
34
- if (msg.role === "user" && Array.isArray(msg.content)) return msg.content.some((c) => c.type === "image");
35
- if (msg.role === "toolResult" && Array.isArray(msg.content)) return msg.content.some((c) => c.type === "image");
36
- return false;
37
- });
38
- }
39
- function buildCopilotDynamicHeaders(params) {
40
- const headers = {
41
- "X-Initiator": inferCopilotInitiator(params.messages),
42
- "Openai-Intent": "conversation-edits"
43
- };
44
- if (params.hasImages) headers["Copilot-Vision-Request"] = "true";
45
- return headers;
46
- }
47
- //#endregion
48
- export { resolveCacheRetention as a, resolveCloudflareBaseUrl as i, hasCopilotVisionInput as n, isCloudflareProvider as r, buildCopilotDynamicHeaders as t };
@@ -1,37 +0,0 @@
1
- //#region packages/ai/src/host.ts
2
- const inertAiTransportHost = {
3
- buildModelFetch: () => void 0,
4
- resolveSecretSentinel: (value) => value,
5
- redactSecrets: (value) => value,
6
- redactToolPayloadText: (text) => text,
7
- resolveOpenAIStrictToolSetting: (_model, options) => options?.supportsStrictMode ? false : void 0,
8
- logDebug: () => {}
9
- };
10
- let activeAiTransportHost = inertAiTransportHost;
11
- /** Installs host implementations for the transport policy ports. */
12
- function configureAiTransportHost(host) {
13
- activeAiTransportHost = {
14
- ...inertAiTransportHost,
15
- ...host
16
- };
17
- }
18
- /** Returns the active transport host (inert defaults unless configured). */
19
- function getAiTransportHost() {
20
- return activeAiTransportHost;
21
- }
22
- /** Resolves sentinel substrings in custom headers at a no-fetch adapter boundary. */
23
- function resolveAiTransportHeaderSentinels(headers) {
24
- if (!headers) return;
25
- const host = getAiTransportHost();
26
- let resolvedHeaders;
27
- for (const [name, value] of Object.entries(headers)) {
28
- const resolved = host.resolveSecretSentinel(value);
29
- if (resolved !== value) {
30
- resolvedHeaders ??= { ...headers };
31
- resolvedHeaders[name] = resolved;
32
- }
33
- }
34
- return resolvedHeaders ?? headers;
35
- }
36
- //#endregion
37
- export { getAiTransportHost as n, resolveAiTransportHeaderSentinels as r, configureAiTransportHost as t };
@@ -1,64 +0,0 @@
1
- import { c as resolveClaudeNativeThinkingLevelMap, i as requiresClaudeMandatoryAdaptiveThinking } from "./src-CXno1H5g.mjs";
2
- //#region packages/ai/src/model-utils.ts
3
- /** Calculates and stores model cost fields from token usage and per-million pricing. */
4
- function calculateCost(model, usage) {
5
- const cacheWrite1h = Math.min(usage.cacheWrite, Math.max(0, usage.cacheWrite1h ?? 0));
6
- const cacheWrite5m = usage.cacheWrite - cacheWrite1h;
7
- usage.cost.input = model.cost.input / 1e6 * usage.input;
8
- usage.cost.output = model.cost.output / 1e6 * usage.output;
9
- usage.cost.cacheRead = model.cost.cacheRead / 1e6 * usage.cacheRead;
10
- usage.cost.cacheWrite = (model.cost.cacheWrite * cacheWrite5m + model.cost.input * 2 * cacheWrite1h) / 1e6;
11
- usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
12
- return usage.cost;
13
- }
14
- /** Replaces the catalog estimate when the provider reports an authoritative billed total. */
15
- function applyProviderReportedUsageCost(usage, reportedCost) {
16
- if (typeof reportedCost !== "number" || !Number.isFinite(reportedCost) || reportedCost < 0) return;
17
- usage.cost.total = reportedCost;
18
- usage.cost.totalOrigin = "provider-billed";
19
- }
20
- const EXTENDED_THINKING_LEVELS = [
21
- "off",
22
- "minimal",
23
- "low",
24
- "medium",
25
- "high",
26
- "xhigh",
27
- "max"
28
- ];
29
- function resolveThinkingLevelMap(model) {
30
- return model.api === "anthropic-messages" ? resolveClaudeNativeThinkingLevelMap(model) ?? model.thinkingLevelMap : model.thinkingLevelMap;
31
- }
32
- /** Returns thinking levels exposed by a reasoning-capable model. */
33
- function getSupportedThinkingLevels(model) {
34
- const mandatoryAdaptiveContract = model.api === "anthropic-messages" && requiresClaudeMandatoryAdaptiveThinking(model);
35
- if (!model.reasoning && !mandatoryAdaptiveContract) return ["off"];
36
- const thinkingLevelMap = resolveThinkingLevelMap(model);
37
- return EXTENDED_THINKING_LEVELS.filter((level) => {
38
- const mapped = thinkingLevelMap?.[level];
39
- if (mapped === null) return false;
40
- if (level === "xhigh" || level === "max") return mapped !== void 0;
41
- return true;
42
- });
43
- }
44
- /** Clamps a requested thinking level to the closest supported level for a model. */
45
- function clampThinkingLevel(model, level) {
46
- const availableLevels = getSupportedThinkingLevels(model);
47
- if (availableLevels.includes(level)) return level;
48
- const requestedIndex = EXTENDED_THINKING_LEVELS.indexOf(level);
49
- if (requestedIndex === -1) return availableLevels[0] ?? "off";
50
- const thinkingLevelMap = resolveThinkingLevelMap(model);
51
- if ((level === "xhigh" || level === "max") && thinkingLevelMap?.[level] === null) {
52
- for (const candidate of EXTENDED_THINKING_LEVELS.slice(0, requestedIndex).toReversed()) if (availableLevels.includes(candidate)) return candidate;
53
- }
54
- for (const candidate of EXTENDED_THINKING_LEVELS.slice(requestedIndex)) if (availableLevels.includes(candidate)) return candidate;
55
- for (const candidate of EXTENDED_THINKING_LEVELS.slice(0, requestedIndex).toReversed()) if (availableLevels.includes(candidate)) return candidate;
56
- return availableLevels[0] ?? "off";
57
- }
58
- /** Compares model identity by provider and id. */
59
- function modelsAreEqual(a, b) {
60
- if (!a || !b) return false;
61
- return a.id === b.id && a.provider === b.provider;
62
- }
63
- //#endregion
64
- export { modelsAreEqual as a, getSupportedThinkingLevels as i, calculateCost as n, clampThinkingLevel as r, applyProviderReportedUsageCost as t };
@@ -1,136 +0,0 @@
1
- import { n as getEnvApiKey, r as __exportAll } from "./env-api-keys-DnhYpc27.mjs";
2
- import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
3
- import { n as getAiTransportHost } from "./host-4t713IeR.mjs";
4
- import { l as buildBaseOptions } from "./transform-messages-eb6lxDLB.mjs";
5
- import { a as resolveCacheRetention, i as resolveCloudflareBaseUrl, n as hasCopilotVisionInput, r as isCloudflareProvider, t as buildCopilotDynamicHeaders } from "./github-copilot-headers-BsH5cqGj.mjs";
6
- import { M as supportsOpenAITemperature, a as resolveResponsesReasoningEffort, n as convertResponsesMessages, o as runResponsesStreamLifecycle, r as createResponsesAssistantOutput, t as applyCommonResponsesParams } from "./openai-responses-shared-CwnGU0KW.mjs";
7
- import { a as clampOpenAIPromptCacheKey } from "./openai-tool-projection-WHf2nuOI.mjs";
8
- import OpenAI from "openai";
9
- //#region packages/ai/src/providers/openai-responses.ts
10
- var openai_responses_exports = /* @__PURE__ */ __exportAll({
11
- streamOpenAIResponses: () => streamOpenAIResponses,
12
- streamSimpleOpenAIResponses: () => streamSimpleOpenAIResponses
13
- });
14
- const OPENAI_TOOL_CALL_PROVIDERS = /* @__PURE__ */ new Set(["openai", "opencode"]);
15
- function getCompat(model) {
16
- return {
17
- sendSessionIdHeader: model.compat?.sendSessionIdHeader ?? true,
18
- supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? true
19
- };
20
- }
21
- function getPromptCacheRetention(compat, cacheRetention) {
22
- return cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : void 0;
23
- }
24
- function formatOpenAIResponsesError(error) {
25
- if (error instanceof Error) {
26
- const status = error.status;
27
- const statusCode = typeof status === "number" ? status : void 0;
28
- if (statusCode !== void 0) return `OpenAI API error (${statusCode}): ${error.message}`;
29
- return error.message;
30
- }
31
- try {
32
- return JSON.stringify(error);
33
- } catch {
34
- return String(error);
35
- }
36
- }
37
- /**
38
- * Generate function for OpenAI Responses API
39
- */
40
- const streamOpenAIResponses = (model, context, options) => {
41
- const stream = new AssistantMessageEventStream();
42
- runResponsesStreamLifecycle({
43
- stream,
44
- model,
45
- output: createResponsesAssistantOutput(model),
46
- options,
47
- createClient: () => {
48
- const apiKey = options?.apiKey || getEnvApiKey(model.provider) || "";
49
- const cacheSessionId = resolveCacheRetention(options?.cacheRetention) === "none" ? void 0 : options?.sessionId;
50
- return createClient(model, context, apiKey, options?.headers, cacheSessionId);
51
- },
52
- buildParams: () => buildParams(model, context, options),
53
- processStreamOptions: {
54
- serviceTier: options?.serviceTier,
55
- applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model)
56
- },
57
- formatError: formatOpenAIResponsesError
58
- });
59
- return stream;
60
- };
61
- const streamSimpleOpenAIResponses = (model, context, options) => {
62
- const apiKey = options?.apiKey || getEnvApiKey(model.provider);
63
- if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
64
- const base = buildBaseOptions(model, options, apiKey);
65
- return streamOpenAIResponses(model, context, {
66
- ...base,
67
- reasoningEffort: resolveResponsesReasoningEffort(model, options?.reasoning),
68
- replayResponsesItemIds: options?.replayResponsesItemIds
69
- });
70
- };
71
- function createClient(model, context, apiKey, optionsHeaders, sessionId) {
72
- if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
73
- const compat = getCompat(model);
74
- const headers = { ...model.headers };
75
- if (model.provider === "github-copilot") {
76
- const hasImages = hasCopilotVisionInput(context.messages);
77
- const copilotHeaders = buildCopilotDynamicHeaders({
78
- messages: context.messages,
79
- hasImages
80
- });
81
- Object.assign(headers, copilotHeaders);
82
- }
83
- if (sessionId) {
84
- if (compat.sendSessionIdHeader) headers.session_id = sessionId;
85
- headers["x-client-request-id"] = sessionId;
86
- }
87
- if (optionsHeaders) Object.assign(headers, optionsHeaders);
88
- const defaultHeaders = model.provider === "cloudflare-ai-gateway" ? {
89
- ...headers,
90
- Authorization: headers.Authorization ?? null,
91
- "cf-aig-authorization": `Bearer ${apiKey}`
92
- } : headers;
93
- return new OpenAI({
94
- apiKey,
95
- baseURL: isCloudflareProvider(model.provider) ? resolveCloudflareBaseUrl(model) : model.baseUrl,
96
- dangerouslyAllowBrowser: true,
97
- defaultHeaders,
98
- fetch: getAiTransportHost().buildModelFetch(model)
99
- });
100
- }
101
- function buildParams(model, context, options) {
102
- const messages = convertResponsesMessages(model, context, OPENAI_TOOL_CALL_PROVIDERS, { replayResponsesItemIds: options?.replayResponsesItemIds ?? false });
103
- const cacheRetention = resolveCacheRetention(options?.cacheRetention);
104
- const compat = getCompat(model);
105
- const params = {
106
- model: model.id,
107
- input: messages,
108
- stream: true,
109
- prompt_cache_key: cacheRetention === "none" ? void 0 : clampOpenAIPromptCacheKey(options?.promptCacheKey ?? options?.sessionId),
110
- prompt_cache_retention: getPromptCacheRetention(compat, cacheRetention),
111
- store: false
112
- };
113
- if (options?.maxTokens) params.max_output_tokens = options?.maxTokens;
114
- if (options?.temperature !== void 0 && supportsOpenAITemperature(model)) params.temperature = options?.temperature;
115
- if (options?.serviceTier !== void 0) params.service_tier = options.serviceTier;
116
- applyCommonResponsesParams(params, model, context, options, { setDefaultReasoningOff: model.provider !== "github-copilot" });
117
- return params;
118
- }
119
- function getServiceTierCostMultiplier(model, serviceTier) {
120
- switch (serviceTier) {
121
- case "flex": return .5;
122
- case "priority": return model.id === "gpt-5.5" ? 2.5 : 2;
123
- default: return 1;
124
- }
125
- }
126
- function applyServiceTierPricing(usage, serviceTier, model) {
127
- const multiplier = getServiceTierCostMultiplier(model, serviceTier);
128
- if (multiplier === 1) return;
129
- usage.cost.input *= multiplier;
130
- usage.cost.output *= multiplier;
131
- usage.cost.cacheRead *= multiplier;
132
- usage.cost.cacheWrite *= multiplier;
133
- usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
134
- }
135
- //#endregion
136
- export { streamOpenAIResponses as n, streamSimpleOpenAIResponses as r, openai_responses_exports as t };