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

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 (34) hide show
  1. package/dist/{anthropic-BIRSg5x9.mjs → anthropic-D7SyZQ5v.mjs} +54 -35
  2. package/dist/{api-registry-Byvoz8Ha.d.mts → api-registry-DXBIXISf.d.mts} +1 -1
  3. package/dist/{azure-openai-responses-CHi7Wo4A.mjs → azure-openai-responses-BkZgyZ3I.mjs} +5 -4
  4. package/dist/{event-stream-uQspnL8S.d.mts → event-stream-BPemFrFW.d.mts} +1 -1
  5. package/dist/event-stream.d.mts +1 -1
  6. package/dist/{google-BmsqsNwR.mjs → google-C_biGbV7.mjs} +2 -2
  7. package/dist/{google-shared-Dx2aba47.mjs → google-shared-BK-NoHl8.mjs} +4 -3
  8. package/dist/{google-vertex-HZ_0rTwS.mjs → google-vertex-CvdzF1U7.mjs} +2 -2
  9. package/dist/index.d.mts +4 -4
  10. package/dist/internal/anthropic.d.mts +8 -2
  11. package/dist/internal/anthropic.mjs +3 -3
  12. package/dist/internal/openai.d.mts +2 -1
  13. package/dist/internal/openai.mjs +4 -4
  14. package/dist/internal/runtime.d.mts +2 -2
  15. package/dist/internal/runtime.mjs +3 -2
  16. package/dist/internal/shared.d.mts +4 -2
  17. package/dist/internal/shared.mjs +2 -2
  18. package/dist/{mistral-DxMPt9q9.mjs → mistral-BdrQmDWp.mjs} +23 -7
  19. package/dist/{model-utils-Q1LSRIdo.mjs → model-utils-1GiZ2_rr.mjs} +3 -1
  20. package/dist/{openai-chatgpt-responses-BuH2NvsR.mjs → openai-chatgpt-responses-DP63Qt01.mjs} +11 -9
  21. package/dist/{openai-completions-DPR_O2RW.mjs → openai-completions-zLDfebnN.mjs} +39 -15
  22. package/dist/{openai-responses-Cov-Vdc2.mjs → openai-responses-ClspWt4I.mjs} +3 -3
  23. package/dist/{openai-responses-shared-Befb4D6R.mjs → openai-responses-shared-CwnGU0KW.mjs} +323 -223
  24. package/dist/{openai-tool-projection-CFqm42J2.mjs → openai-tool-projection-WHf2nuOI.mjs} +1 -1
  25. package/dist/provider-error-LMfTEkfO.mjs +40 -0
  26. package/dist/providers.d.mts +1 -1
  27. package/dist/providers.mjs +8 -8
  28. package/dist/{transform-messages-BmS70CP5.mjs → transform-messages-eb6lxDLB.mjs} +8 -2
  29. package/dist/{types-Cx2zJtyz.d.mts → types-CYORveZ7.d.mts} +6 -0
  30. package/dist/types.d.mts +3 -3
  31. package/dist/{validation-Cej7htKc.d.mts → validation-BX8euiDv.d.mts} +1 -1
  32. package/dist/validation.d.mts +1 -1
  33. package/npm-shrinkwrap.json +2 -2
  34. package/package.json +1 -1
@@ -2,12 +2,12 @@ import { n as getEnvApiKey, r as __exportAll } from "./env-api-keys-DnhYpc27.mjs
2
2
  import { c as resolveClaudeNativeThinkingLevelMap, d as supportsClaudeNativeMaxEffort, f as supportsClaudeNativeXhighEffort, l as resolveClaudeSonnet5ModelIdentity, u as supportsClaudeAdaptiveThinking } from "./src-CXno1H5g.mjs";
3
3
  import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
4
4
  import { n as getAiTransportHost, r as resolveAiTransportHeaderSentinels } from "./host-4t713IeR.mjs";
5
- import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-Q1LSRIdo.mjs";
5
+ import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-1GiZ2_rr.mjs";
6
6
  import { r as createDeferredEventBuffer, t as notifyLlmRequestActivity } from "./llm-request-activity-CehVkZP-.mjs";
7
7
  import { t as headersToRecord } from "./headers-B_e4-1J0.mjs";
8
8
  import { n as parseStreamingJson, t as parseJsonWithRepair } from "./json-parse-BvXNt1-7.mjs";
9
9
  import { t as sanitizeSurrogates } from "./sanitize-unicode-DT5o51ur.mjs";
10
- import { C as stripSystemPromptCacheBoundary, S as splitSystemPromptCacheBoundary, _ as usesClaudeFable5MessagesContract, c as adjustMaxTokensForThinking, d as isRecord, f as applyClaudeRequestContract, h as requiresClaudeAdaptiveThinking, i as extractToolResultText, l as buildBaseOptions, m as prepareClaudeSonnet5RequestContext, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, r as extractToolResultBlockText, t as transformMessages, v as usesClaudeStreamingRefusalContract } from "./transform-messages-BmS70CP5.mjs";
10
+ import { C as splitSystemPromptCacheBoundary, c as adjustMaxTokensForThinking, f as isRecord, g as requiresClaudeAdaptiveThinking, h as prepareClaudeSonnet5RequestContext, i as extractToolResultText, l as buildBaseOptions, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, p as applyClaudeRequestContract, r as extractToolResultBlockText, t as transformMessages, u as clampMaxTokensToModel, v as usesClaudeFable5MessagesContract, w as stripSystemPromptCacheBoundary, y as usesClaudeStreamingRefusalContract } from "./transform-messages-eb6lxDLB.mjs";
11
11
  import { t as projectRuntimeToolInputSchema } from "./tool-schema-json-projection-BwNu3nDi.mjs";
12
12
  import { a as resolveCacheRetention, i as resolveCloudflareBaseUrl, n as hasCopilotVisionInput, t as buildCopilotDynamicHeaders } from "./github-copilot-headers-BsH5cqGj.mjs";
13
13
  import Anthropic from "@anthropic-ai/sdk";
@@ -295,6 +295,16 @@ function resolveOriginalAnthropicToolName(name, projection) {
295
295
  function readAnthropicUsageTokenCount(value) {
296
296
  return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
297
297
  }
298
+ function readAnthropicCacheWriteUsage(usage) {
299
+ if (!usage.cache_creation || typeof usage.cache_creation !== "object") return {};
300
+ const cacheCreation = usage.cache_creation;
301
+ const cacheWrite5m = readAnthropicUsageTokenCount(cacheCreation.ephemeral_5m_input_tokens);
302
+ const cacheWrite1h = readAnthropicUsageTokenCount(cacheCreation.ephemeral_1h_input_tokens);
303
+ return {
304
+ ...cacheWrite5m !== void 0 ? { cacheWrite5m } : {},
305
+ ...cacheWrite1h !== void 0 ? { cacheWrite1h } : {}
306
+ };
307
+ }
298
308
  function readAnthropicPromptUsageSnapshot(usage) {
299
309
  const input = readAnthropicUsageTokenCount(usage.input_tokens);
300
310
  const cacheRead = usage.cache_read_input_tokens == null ? 0 : readAnthropicUsageTokenCount(usage.cache_read_input_tokens);
@@ -417,7 +427,8 @@ function getAnthropicCompat(model) {
417
427
  supportsEagerToolInputStreaming: model.compat?.supportsEagerToolInputStreaming ?? !isFireworks,
418
428
  supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? !isFireworks,
419
429
  sendSessionAffinityHeaders: model.compat?.sendSessionAffinityHeaders ?? (isFireworks || isCloudflareAiGatewayAnthropic),
420
- supportsCacheControlOnTools: model.compat?.supportsCacheControlOnTools ?? !isFireworks
430
+ supportsCacheControlOnTools: model.compat?.supportsCacheControlOnTools ?? !isFireworks,
431
+ allowEmptySignature: model.compat?.allowEmptySignature ?? false
421
432
  };
422
433
  }
423
434
  function mergeHeaders(...headerSources) {
@@ -516,7 +527,7 @@ const streamAnthropic = (model, context, options) => {
516
527
  const sdkRequestOptions = {
517
528
  ...requestOptions?.signal ? { signal: requestOptions.signal } : {},
518
529
  ...requestOptions?.timeoutMs !== void 0 ? { timeout: requestOptions.timeoutMs } : {},
519
- ...requestOptions?.maxRetries !== void 0 ? { maxRetries: requestOptions.maxRetries } : {}
530
+ maxRetries: requestOptions?.maxRetries ?? 0
520
531
  };
521
532
  const response = await client.messages.create({
522
533
  ...params,
@@ -542,6 +553,8 @@ const streamAnthropic = (model, context, options) => {
542
553
  if (cacheReadTokens !== void 0) output.usage.cacheRead = cacheReadTokens;
543
554
  const cacheWriteTokens = event.message.usage.cache_creation_input_tokens == null ? 0 : readAnthropicUsageTokenCount(event.message.usage.cache_creation_input_tokens);
544
555
  if (cacheWriteTokens !== void 0) output.usage.cacheWrite = cacheWriteTokens;
556
+ const cacheWriteUsage = readAnthropicCacheWriteUsage(event.message.usage);
557
+ if (cacheWriteUsage.cacheWrite1h !== void 0) output.usage.cacheWrite1h = cacheWriteUsage.cacheWrite1h;
545
558
  output.usage.totalTokens = output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
546
559
  if (messageStartPromptUsage && outputTokens !== void 0) output.usage.contextUsage = {
547
560
  state: "available",
@@ -730,30 +743,34 @@ const streamAnthropic = (model, context, options) => {
730
743
  } else if (event.type === "message_delta") {
731
744
  if (event.delta.stop_reason) if (event.delta.stop_reason === "refusal") applyAnthropicRefusal(output, event.delta.stop_details, model.provider);
732
745
  else output.stopReason = mapStopReason(event.delta.stop_reason);
733
- const inputTokens = readAnthropicUsageTokenCount(event.usage.input_tokens);
734
- if (inputTokens !== void 0) output.usage.input = inputTokens;
735
- const outputTokens = readAnthropicUsageTokenCount(event.usage.output_tokens);
736
- if (outputTokens !== void 0) output.usage.output = outputTokens;
737
- const cacheReadTokens = readAnthropicUsageTokenCount(event.usage.cache_read_input_tokens);
738
- if (cacheReadTokens !== void 0) output.usage.cacheRead = cacheReadTokens;
739
- const cacheWriteTokens = readAnthropicUsageTokenCount(event.usage.cache_creation_input_tokens);
740
- if (cacheWriteTokens !== void 0) output.usage.cacheWrite = cacheWriteTokens;
741
- output.usage.totalTokens = output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
742
- const iterationUsage = readLastAnthropicIterationUsage(event.usage);
743
- if (iterationUsage.state === "valid") output.usage.contextUsage = {
744
- state: "available",
745
- promptTokens: iterationUsage.usage.contextPromptTokens,
746
- totalTokens: iterationUsage.usage.totalTokens
747
- };
748
- else if (iterationUsage.state === "invalid") output.usage.contextUsage = { state: "unavailable" };
749
- else if (outputTokens !== void 0 && (messageStartPromptUsage !== void 0 || inputTokens !== void 0 && cacheReadTokens !== void 0 && cacheWriteTokens !== void 0)) {
750
- const promptTokens = output.usage.input + output.usage.cacheRead + output.usage.cacheWrite;
751
- output.usage.contextUsage = {
746
+ if (event.usage) {
747
+ const inputTokens = readAnthropicUsageTokenCount(event.usage.input_tokens);
748
+ if (inputTokens !== void 0) output.usage.input = inputTokens;
749
+ const outputTokens = readAnthropicUsageTokenCount(event.usage.output_tokens);
750
+ if (outputTokens !== void 0) output.usage.output = outputTokens;
751
+ const cacheReadTokens = readAnthropicUsageTokenCount(event.usage.cache_read_input_tokens);
752
+ if (cacheReadTokens !== void 0) output.usage.cacheRead = cacheReadTokens;
753
+ const cacheWriteTokens = readAnthropicUsageTokenCount(event.usage.cache_creation_input_tokens);
754
+ if (cacheWriteTokens !== void 0) output.usage.cacheWrite = cacheWriteTokens;
755
+ const cacheWriteUsage = readAnthropicCacheWriteUsage(event.usage);
756
+ if (cacheWriteUsage.cacheWrite1h !== void 0) output.usage.cacheWrite1h = cacheWriteUsage.cacheWrite1h;
757
+ output.usage.totalTokens = output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
758
+ const iterationUsage = readLastAnthropicIterationUsage(event.usage);
759
+ if (iterationUsage.state === "valid") output.usage.contextUsage = {
752
760
  state: "available",
753
- promptTokens,
754
- totalTokens: promptTokens + output.usage.output
761
+ promptTokens: iterationUsage.usage.contextPromptTokens,
762
+ totalTokens: iterationUsage.usage.totalTokens
755
763
  };
756
- } else output.usage.contextUsage = { state: "unavailable" };
764
+ else if (iterationUsage.state === "invalid") output.usage.contextUsage = { state: "unavailable" };
765
+ else if (outputTokens !== void 0 && (messageStartPromptUsage !== void 0 || inputTokens !== void 0 && cacheReadTokens !== void 0 && cacheWriteTokens !== void 0)) {
766
+ const promptTokens = output.usage.input + output.usage.cacheRead + output.usage.cacheWrite;
767
+ output.usage.contextUsage = {
768
+ state: "available",
769
+ promptTokens,
770
+ totalTokens: promptTokens + output.usage.output
771
+ };
772
+ } else output.usage.contextUsage = { state: "unavailable" };
773
+ }
757
774
  calculateCost(costModel, output.usage);
758
775
  }
759
776
  if (requestOptions?.signal?.aborted) throw new Error("Request was aborted");
@@ -842,6 +859,7 @@ const streamSimpleAnthropic = (model, context, options) => {
842
859
  if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
843
860
  const base = {
844
861
  ...buildBaseOptions(model, options, apiKey),
862
+ maxTokens: clampMaxTokensToModel(model, options?.maxTokens ?? model.maxTokens),
845
863
  toolChoice: options?.toolChoice
846
864
  };
847
865
  const mandatoryAdaptiveThinking = requiresClaudeAdaptiveThinking(model);
@@ -869,10 +887,11 @@ const streamSimpleAnthropic = (model, context, options) => {
869
887
  });
870
888
  }
871
889
  const adjusted = adjustMaxTokensForThinking(base.maxTokens, model.maxTokens, reasoning, options?.thinkingBudgets);
872
- const thinkingEnabled = adjusted.thinkingBudget >= 1024;
890
+ const thinkingEnabled = adjusted.thinkingBudget >= ANTHROPIC_MIN_THINKING_BUDGET_TOKENS;
891
+ const maxTokens = thinkingEnabled ? adjusted.maxTokens : clampMaxTokensToModel(model, options?.maxTokens ?? model.maxTokens);
873
892
  return streamAnthropic(model, context, {
874
893
  ...base,
875
- maxTokens: adjusted.maxTokens,
894
+ maxTokens,
876
895
  thinkingEnabled,
877
896
  thinkingBudgetTokens: thinkingEnabled ? adjusted.thinkingBudget : void 0
878
897
  });
@@ -1003,8 +1022,8 @@ function buildParams(model, context, isOAuthTokenResult, options, serverSideFall
1003
1022
  const replayThinkingEnabled = mandatoryAdaptiveThinking || options?.thinkingEnabled === true;
1004
1023
  const { cacheControl } = getCacheControl(model, options?.cacheRetention);
1005
1024
  const system = buildAnthropicSystemBlocks(context.systemPrompt, isOAuthTokenResult, cacheControl);
1006
- const compat = context.tools ? getAnthropicCompat(model) : void 0;
1007
- const convertedTools = context.tools && compat ? convertTools(context.tools, isOAuthTokenResult, compat.supportsEagerToolInputStreaming, compat.supportsCacheControlOnTools ? cacheControl : void 0) : void 0;
1025
+ const compat = getAnthropicCompat(model);
1026
+ const convertedTools = context.tools ? convertTools(context.tools, isOAuthTokenResult, compat.supportsEagerToolInputStreaming, compat.supportsCacheControlOnTools ? cacheControl : void 0) : void 0;
1008
1027
  const tools = convertedTools?.tools;
1009
1028
  const toolProjection = convertedTools?.projection;
1010
1029
  const systemCacheControlCount = countNativeCacheControlMarkers(system);
@@ -1012,7 +1031,7 @@ function buildParams(model, context, isOAuthTokenResult, options, serverSideFall
1012
1031
  const messageCacheControlLimit = Math.max(0, ANTHROPIC_CACHE_CONTROL_LIMIT - systemCacheControlCount - toolCacheControlCount);
1013
1032
  const params = {
1014
1033
  model: model.id,
1015
- messages: convertMessages(context.messages, model, isOAuthTokenResult, cacheControl, messageCacheControlLimit, replayThinkingEnabled),
1034
+ messages: convertMessages(context.messages, model, isOAuthTokenResult, cacheControl, messageCacheControlLimit, replayThinkingEnabled, compat.allowEmptySignature),
1016
1035
  max_tokens: options?.maxTokens ?? model.maxTokens,
1017
1036
  stream: true
1018
1037
  };
@@ -1055,7 +1074,7 @@ function buildParams(model, context, isOAuthTokenResult, options, serverSideFall
1055
1074
  function normalizeToolCallId(id) {
1056
1075
  return id.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 64);
1057
1076
  }
1058
- function convertMessages(messages, model, isOAuthTokenValue, cacheControl, messageCacheControlLimit = 4, replayThinkingEnabled = true) {
1077
+ function convertMessages(messages, model, isOAuthTokenValue, cacheControl, messageCacheControlLimit = 4, replayThinkingEnabled = true, allowEmptySignature = false) {
1059
1078
  const params = [];
1060
1079
  const cacheBreakpointOptOutParamIndexes = /* @__PURE__ */ new Set();
1061
1080
  const transformedMessages = transformMessages(messages, model, normalizeToolCallId);
@@ -1123,7 +1142,7 @@ function convertMessages(messages, model, isOAuthTokenValue, cacheControl, messa
1123
1142
  const thinkingSignature = block.thinkingSignature?.trim();
1124
1143
  const hasNativeThinkingSignature = Boolean(thinkingSignature) && thinkingSignature !== "reasoning_content";
1125
1144
  if (block.thinking.trim().length === 0 && !hasNativeThinkingSignature) continue;
1126
- if (!thinkingSignature) blocks.push({
1145
+ if (!thinkingSignature && !allowEmptySignature) blocks.push({
1127
1146
  type: "text",
1128
1147
  text: sanitizeSurrogates(block.thinking)
1129
1148
  });
@@ -1132,7 +1151,7 @@ function convertMessages(messages, model, isOAuthTokenValue, cacheControl, messa
1132
1151
  blocks.push({
1133
1152
  type: "thinking",
1134
1153
  thinking: block.thinking,
1135
- signature: thinkingSignature
1154
+ signature: thinkingSignature ?? ""
1136
1155
  });
1137
1156
  }
1138
1157
  } else if (block.type === "toolCall") blocks.push({
@@ -1302,4 +1321,4 @@ function mapStopReason(reason) {
1302
1321
  }
1303
1322
  }
1304
1323
  //#endregion
1305
- export { readAnthropicFallbackBoundary as _, readAnthropicUsageTokenCount as a, usesFoundryBearerAuth as b, reconcileAnthropicToolChoice as c, findActiveAnthropicToolTurnAssistantIndex as d, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA as f, buildAnthropicServerSideFallbacks as g, applyAnthropicFallbackBoundary as h, readAnthropicPromptUsageSnapshot as i, resolveOriginalAnthropicToolName as l, CLAUDE_FABLE_5_FALLBACK_MODEL_COST as m, streamAnthropic as n, readLastAnthropicIterationUsage as o, CLAUDE_FABLE_5_FALLBACK_MODEL as p, streamSimpleAnthropic as r, projectAnthropicTools as s, anthropic_exports as t, ANTHROPIC_OMITTED_REASONING_TEXT as u, applyAnthropicRefusal as v, omitFoundryBearerCredentialHeaders as y };
1324
+ export { buildAnthropicServerSideFallbacks as _, readAnthropicPromptUsageSnapshot as a, omitFoundryBearerCredentialHeaders as b, projectAnthropicTools as c, ANTHROPIC_OMITTED_REASONING_TEXT as d, findActiveAnthropicToolTurnAssistantIndex as f, applyAnthropicFallbackBoundary as g, CLAUDE_FABLE_5_FALLBACK_MODEL_COST as h, readAnthropicCacheWriteUsage as i, reconcileAnthropicToolChoice as l, CLAUDE_FABLE_5_FALLBACK_MODEL as m, streamAnthropic as n, readAnthropicUsageTokenCount as o, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA as p, streamSimpleAnthropic as r, readLastAnthropicIterationUsage as s, anthropic_exports as t, resolveOriginalAnthropicToolName as u, readAnthropicFallbackBoundary as v, usesFoundryBearerAuth as x, applyAnthropicRefusal as y };
@@ -1,4 +1,4 @@
1
- import { E as Model, F as SimpleStreamOptions, R as StreamFunction, n as Api, o as AssistantMessageEventStreamContract, u as Context, z as StreamOptions } from "./types-Cx2zJtyz.mjs";
1
+ import { E as Model, F as SimpleStreamOptions, R as StreamFunction, n as Api, o as AssistantMessageEventStreamContract, u as Context, z as StreamOptions } from "./types-CYORveZ7.mjs";
2
2
 
3
3
  //#region packages/ai/src/api-registry.d.ts
4
4
  /** Runtime stream adapter signature stored in the API provider registry. */
@@ -1,10 +1,10 @@
1
1
  import { n as getEnvApiKey } from "./env-api-keys-DnhYpc27.mjs";
2
2
  import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
3
3
  import { n as getAiTransportHost } from "./host-4t713IeR.mjs";
4
- import { l as buildBaseOptions } from "./transform-messages-BmS70CP5.mjs";
5
- import { a as resolveResponsesReasoningEffort, n as convertResponsesMessages, o as runResponsesStreamLifecycle, r as createResponsesAssistantOutput, t as applyCommonResponsesParams } from "./openai-responses-shared-Befb4D6R.mjs";
4
+ import { l as buildBaseOptions } from "./transform-messages-eb6lxDLB.mjs";
5
+ import { a as resolveResponsesReasoningEffort, n as convertResponsesMessages, o as runResponsesStreamLifecycle, r as createResponsesAssistantOutput, t as applyCommonResponsesParams } from "./openai-responses-shared-CwnGU0KW.mjs";
6
6
  import { i as resolveAzureDeploymentNameFromMap, t as isOpenAICompatibleAzureResponsesBaseUrl } from "./azure-openai-responses-client-compat-C7K7QfUE.mjs";
7
- import { a as clampOpenAIPromptCacheKey } from "./openai-tool-projection-CFqm42J2.mjs";
7
+ import { a as clampOpenAIPromptCacheKey } from "./openai-tool-projection-WHf2nuOI.mjs";
8
8
  import OpenAI, { AzureOpenAI } from "openai";
9
9
  //#region packages/ai/src/providers/azure-openai-responses.ts
10
10
  const DEFAULT_AZURE_API_VERSION = "v1";
@@ -127,7 +127,8 @@ function buildParams(model, context, options, deploymentName) {
127
127
  model: deploymentName,
128
128
  input: convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS),
129
129
  stream: true,
130
- prompt_cache_key: options?.cacheRetention === "none" ? void 0 : clampOpenAIPromptCacheKey(options?.promptCacheKey ?? options?.sessionId)
130
+ prompt_cache_key: options?.cacheRetention === "none" ? void 0 : clampOpenAIPromptCacheKey(options?.promptCacheKey ?? options?.sessionId),
131
+ store: false
131
132
  };
132
133
  applyCommonResponsesParams(params, model, context, options);
133
134
  return params;
@@ -1,4 +1,4 @@
1
- import { a as AssistantMessageEvent, i as AssistantMessage, o as AssistantMessageEventStreamContract } from "./types-Cx2zJtyz.mjs";
1
+ import { a as AssistantMessageEvent, i as AssistantMessage, o as AssistantMessageEventStreamContract } from "./types-CYORveZ7.mjs";
2
2
 
3
3
  //#region packages/llm-core/src/utils/event-stream.d.ts
4
4
  /** Generic async-iterable event stream with a separately awaited final result. */
@@ -1,2 +1,2 @@
1
- import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-uQspnL8S.mjs";
1
+ import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-BPemFrFW.mjs";
2
2
  export { AssistantMessageEventStream, EventStream, createAssistantMessageEventStream };
@@ -1,8 +1,8 @@
1
1
  import { n as getEnvApiKey } from "./env-api-keys-DnhYpc27.mjs";
2
2
  import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
3
3
  import { n as getAiTransportHost, r as resolveAiTransportHeaderSentinels } from "./host-4t713IeR.mjs";
4
- import { l as buildBaseOptions } from "./transform-messages-BmS70CP5.mjs";
5
- import { a as runGoogleGenerateContentLifecycle, i as getDisabledGoogleThinkingConfig, n as buildGoogleSimpleThinking, r as createGoogleAssistantOutput, t as buildGoogleGenerateContentParams } from "./google-shared-Dx2aba47.mjs";
4
+ import { l as buildBaseOptions } from "./transform-messages-eb6lxDLB.mjs";
5
+ import { a as runGoogleGenerateContentLifecycle, i as getDisabledGoogleThinkingConfig, n as buildGoogleSimpleThinking, r as createGoogleAssistantOutput, t as buildGoogleGenerateContentParams } from "./google-shared-BK-NoHl8.mjs";
6
6
  import { GoogleGenAI } from "@google/genai";
7
7
  //#region packages/ai/src/providers/google.ts
8
8
  let toolCallCounter = 0;
@@ -1,6 +1,7 @@
1
- import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-Q1LSRIdo.mjs";
1
+ import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-1GiZ2_rr.mjs";
2
2
  import { t as sanitizeSurrogates } from "./sanitize-unicode-DT5o51ur.mjs";
3
- import { C as stripSystemPromptCacheBoundary, i as extractToolResultText, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, t as transformMessages } from "./transform-messages-BmS70CP5.mjs";
3
+ import { i as extractToolResultText, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, t as transformMessages, w as stripSystemPromptCacheBoundary } from "./transform-messages-eb6lxDLB.mjs";
4
+ import { t as formatProviderError } from "./provider-error-LMfTEkfO.mjs";
4
5
  import { FinishReason, FunctionCallingConfigMode, ThinkingLevel } from "@google/genai";
5
6
  //#region packages/ai/src/providers/google-shared.ts
6
7
  /**
@@ -273,7 +274,7 @@ async function runGoogleGenerateContentLifecycle(params) {
273
274
  } catch (error) {
274
275
  for (const block of output.content) if ("index" in block) delete block.index;
275
276
  output.stopReason = options?.signal?.aborted ? "aborted" : "error";
276
- output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
277
+ output.errorMessage = formatProviderError(error);
277
278
  stream.push({
278
279
  type: "error",
279
280
  reason: output.stopReason,
@@ -1,7 +1,7 @@
1
1
  import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
2
2
  import { n as getAiTransportHost, r as resolveAiTransportHeaderSentinels } from "./host-4t713IeR.mjs";
3
- import { l as buildBaseOptions } from "./transform-messages-BmS70CP5.mjs";
4
- import { a as runGoogleGenerateContentLifecycle, n as buildGoogleSimpleThinking, r as createGoogleAssistantOutput, t as buildGoogleGenerateContentParams } from "./google-shared-Dx2aba47.mjs";
3
+ import { l as buildBaseOptions } from "./transform-messages-eb6lxDLB.mjs";
4
+ import { a as runGoogleGenerateContentLifecycle, n as buildGoogleSimpleThinking, r as createGoogleAssistantOutput, t as buildGoogleGenerateContentParams } from "./google-shared-BK-NoHl8.mjs";
5
5
  import { GoogleGenAI, ResourceScope } from "@google/genai";
6
6
  //#region packages/ai/src/providers/google-vertex.ts
7
7
  const API_VERSION = "v1";
package/dist/index.d.mts CHANGED
@@ -1,9 +1,9 @@
1
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";
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-Cx2zJtyz.mjs";
4
- import { n as EventStream, r as createAssistantMessageEventStream, t as AssistantMessageEventStream } from "./event-stream-uQspnL8S.mjs";
5
- import { n as validateToolCall, t as validateToolArguments } from "./validation-Cej7htKc.mjs";
6
- import { a as RegisteredApiProvider, i as ApiStreamSimpleFunction, n as ApiRegistry, o as createApiRegistry, r as ApiStreamFunction, t as ApiProvider } from "./api-registry-Byvoz8Ha.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
+ import { a as RegisteredApiProvider, i as ApiStreamSimpleFunction, n as ApiRegistry, o as createApiRegistry, r as ApiStreamFunction, t as ApiProvider } from "./api-registry-DXBIXISf.mjs";
7
7
 
8
8
  //#region packages/ai/src/host.d.ts
9
9
  /** Strict-tool policy inputs for OpenAI-compatible routes. */
@@ -1,6 +1,6 @@
1
1
  import { a as resolveClaudeFable5ModelIdentity, c as resolveClaudeNativeThinkingLevelMap, d as supportsClaudeNativeMaxEffort, f as supportsClaudeNativeXhighEffort, i as requiresClaudeMandatoryAdaptiveThinking, l as resolveClaudeSonnet5ModelIdentity, o as resolveClaudeModelIdentity, r as requiresClaudeDefaultSampling, s as resolveClaudeMythos5ModelIdentity, u as supportsClaudeAdaptiveThinking } from "../index-BoTnz8cv.mjs";
2
2
  import { t as AssistantMessageDiagnostic } from "../diagnostics-BaTA9eVl.mjs";
3
- import { E as Model, F as SimpleStreamOptions, R as StreamFunction, u as Context, z as StreamOptions } from "../types-Cx2zJtyz.mjs";
3
+ import { E as Model, F as SimpleStreamOptions, R as StreamFunction, u as Context, z as StreamOptions } from "../types-CYORveZ7.mjs";
4
4
  import Anthropic from "@anthropic-ai/sdk";
5
5
 
6
6
  //#region packages/ai/src/providers/anthropic.d.ts
@@ -208,8 +208,13 @@ type AnthropicUsagePayload = {
208
208
  output_tokens?: unknown;
209
209
  cache_read_input_tokens?: unknown;
210
210
  cache_creation_input_tokens?: unknown;
211
+ cache_creation?: unknown;
211
212
  iterations?: unknown;
212
213
  };
214
+ type AnthropicCacheWriteUsage = {
215
+ cacheWrite5m?: number;
216
+ cacheWrite1h?: number;
217
+ };
213
218
  type AnthropicPromptUsageSnapshot = {
214
219
  input: number;
215
220
  cacheRead: number;
@@ -228,7 +233,8 @@ type AnthropicIterationUsageResult = {
228
233
  usage: AnthropicIterationUsageSnapshot;
229
234
  };
230
235
  declare function readAnthropicUsageTokenCount(value: unknown): number | undefined;
236
+ declare function readAnthropicCacheWriteUsage(usage: AnthropicUsagePayload): AnthropicCacheWriteUsage;
231
237
  declare function readAnthropicPromptUsageSnapshot(usage: AnthropicUsagePayload): AnthropicPromptUsageSnapshot | undefined;
232
238
  declare function readLastAnthropicIterationUsage(usage: AnthropicUsagePayload): AnthropicIterationUsageResult;
233
239
  //#endregion
234
- export { ANTHROPIC_OMITTED_REASONING_TEXT, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, AnthropicEffort, AnthropicFallbackBoundary, AnthropicIterationUsageResult, AnthropicIterationUsageSnapshot, AnthropicOptions, AnthropicProjectedToolChoice, AnthropicPromptUsageSnapshot, AnthropicThinkingDisplay, AnthropicToolProjection, CLAUDE_FABLE_5_FALLBACK_MODEL, CLAUDE_FABLE_5_FALLBACK_MODEL_COST, applyAnthropicFallbackBoundary, applyAnthropicRefusal, applyClaudeRequestContract, buildAnthropicServerSideFallbacks, defaultsClaudeAdaptiveThinking, findActiveAnthropicToolTurnAssistantIndex, omitFoundryBearerCredentialHeaders, prepareClaudeSonnet5RequestContext, projectAnthropicTools, readAnthropicFallbackBoundary, readAnthropicPromptUsageSnapshot, readAnthropicUsageTokenCount, readLastAnthropicIterationUsage, reconcileAnthropicToolChoice, requiresClaudeAdaptiveThinking, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, resolveModelBoundThinkingReplayMode, resolveOriginalAnthropicToolName, streamAnthropic, streamSimpleAnthropic, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, usesClaudeFable5MessagesContract, usesClaudeStreamingRefusalContract, usesFoundryBearerAuth };
240
+ export { ANTHROPIC_OMITTED_REASONING_TEXT, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, AnthropicCacheWriteUsage, AnthropicEffort, AnthropicFallbackBoundary, AnthropicIterationUsageResult, AnthropicIterationUsageSnapshot, AnthropicOptions, AnthropicProjectedToolChoice, AnthropicPromptUsageSnapshot, AnthropicThinkingDisplay, AnthropicToolProjection, CLAUDE_FABLE_5_FALLBACK_MODEL, CLAUDE_FABLE_5_FALLBACK_MODEL_COST, applyAnthropicFallbackBoundary, applyAnthropicRefusal, applyClaudeRequestContract, buildAnthropicServerSideFallbacks, defaultsClaudeAdaptiveThinking, findActiveAnthropicToolTurnAssistantIndex, omitFoundryBearerCredentialHeaders, prepareClaudeSonnet5RequestContext, projectAnthropicTools, readAnthropicCacheWriteUsage, readAnthropicFallbackBoundary, readAnthropicPromptUsageSnapshot, readAnthropicUsageTokenCount, readLastAnthropicIterationUsage, reconcileAnthropicToolChoice, requiresClaudeAdaptiveThinking, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, resolveModelBoundThinkingReplayMode, resolveOriginalAnthropicToolName, streamAnthropic, streamSimpleAnthropic, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, usesClaudeFable5MessagesContract, usesClaudeStreamingRefusalContract, usesFoundryBearerAuth };
@@ -1,4 +1,4 @@
1
1
  import { a as resolveClaudeFable5ModelIdentity, c as resolveClaudeNativeThinkingLevelMap, d as supportsClaudeNativeMaxEffort, f as supportsClaudeNativeXhighEffort, i as requiresClaudeMandatoryAdaptiveThinking, l as resolveClaudeSonnet5ModelIdentity, o as resolveClaudeModelIdentity, r as requiresClaudeDefaultSampling, s as resolveClaudeMythos5ModelIdentity, u as supportsClaudeAdaptiveThinking } from "../src-CXno1H5g.mjs";
2
- import { _ as usesClaudeFable5MessagesContract, f as applyClaudeRequestContract, g as resolveModelBoundThinkingReplayMode, h as requiresClaudeAdaptiveThinking, m as prepareClaudeSonnet5RequestContext, p as defaultsClaudeAdaptiveThinking, v as usesClaudeStreamingRefusalContract } from "../transform-messages-BmS70CP5.mjs";
3
- import { _ as readAnthropicFallbackBoundary, a as readAnthropicUsageTokenCount, b as usesFoundryBearerAuth, c as reconcileAnthropicToolChoice, d as findActiveAnthropicToolTurnAssistantIndex, f as ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, g as buildAnthropicServerSideFallbacks, h as applyAnthropicFallbackBoundary, i as readAnthropicPromptUsageSnapshot, l as resolveOriginalAnthropicToolName, m as CLAUDE_FABLE_5_FALLBACK_MODEL_COST, n as streamAnthropic, o as readLastAnthropicIterationUsage, p as CLAUDE_FABLE_5_FALLBACK_MODEL, r as streamSimpleAnthropic, s as projectAnthropicTools, u as ANTHROPIC_OMITTED_REASONING_TEXT, v as applyAnthropicRefusal, y as omitFoundryBearerCredentialHeaders } from "../anthropic-BIRSg5x9.mjs";
4
- export { ANTHROPIC_OMITTED_REASONING_TEXT, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, CLAUDE_FABLE_5_FALLBACK_MODEL, CLAUDE_FABLE_5_FALLBACK_MODEL_COST, applyAnthropicFallbackBoundary, applyAnthropicRefusal, applyClaudeRequestContract, buildAnthropicServerSideFallbacks, defaultsClaudeAdaptiveThinking, findActiveAnthropicToolTurnAssistantIndex, omitFoundryBearerCredentialHeaders, prepareClaudeSonnet5RequestContext, projectAnthropicTools, readAnthropicFallbackBoundary, readAnthropicPromptUsageSnapshot, readAnthropicUsageTokenCount, readLastAnthropicIterationUsage, reconcileAnthropicToolChoice, requiresClaudeAdaptiveThinking, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, resolveModelBoundThinkingReplayMode, resolveOriginalAnthropicToolName, streamAnthropic, streamSimpleAnthropic, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, usesClaudeFable5MessagesContract, usesClaudeStreamingRefusalContract, usesFoundryBearerAuth };
2
+ import { _ as resolveModelBoundThinkingReplayMode, g as requiresClaudeAdaptiveThinking, h as prepareClaudeSonnet5RequestContext, m as defaultsClaudeAdaptiveThinking, p as applyClaudeRequestContract, v as usesClaudeFable5MessagesContract, y as usesClaudeStreamingRefusalContract } from "../transform-messages-eb6lxDLB.mjs";
3
+ import { _ as buildAnthropicServerSideFallbacks, a as readAnthropicPromptUsageSnapshot, b as omitFoundryBearerCredentialHeaders, c as projectAnthropicTools, d as ANTHROPIC_OMITTED_REASONING_TEXT, f as findActiveAnthropicToolTurnAssistantIndex, g as applyAnthropicFallbackBoundary, h as CLAUDE_FABLE_5_FALLBACK_MODEL_COST, i as readAnthropicCacheWriteUsage, l as reconcileAnthropicToolChoice, m as CLAUDE_FABLE_5_FALLBACK_MODEL, n as streamAnthropic, o as readAnthropicUsageTokenCount, p as ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, r as streamSimpleAnthropic, s as readLastAnthropicIterationUsage, u as resolveOriginalAnthropicToolName, v as readAnthropicFallbackBoundary, x as usesFoundryBearerAuth, y as applyAnthropicRefusal } from "../anthropic-D7SyZQ5v.mjs";
4
+ export { ANTHROPIC_OMITTED_REASONING_TEXT, ANTHROPIC_SERVER_SIDE_FALLBACK_BETA, CLAUDE_FABLE_5_FALLBACK_MODEL, CLAUDE_FABLE_5_FALLBACK_MODEL_COST, applyAnthropicFallbackBoundary, applyAnthropicRefusal, applyClaudeRequestContract, buildAnthropicServerSideFallbacks, defaultsClaudeAdaptiveThinking, findActiveAnthropicToolTurnAssistantIndex, omitFoundryBearerCredentialHeaders, prepareClaudeSonnet5RequestContext, projectAnthropicTools, readAnthropicCacheWriteUsage, readAnthropicFallbackBoundary, readAnthropicPromptUsageSnapshot, readAnthropicUsageTokenCount, readLastAnthropicIterationUsage, reconcileAnthropicToolChoice, requiresClaudeAdaptiveThinking, requiresClaudeDefaultSampling, requiresClaudeMandatoryAdaptiveThinking, resolveClaudeFable5ModelIdentity, resolveClaudeModelIdentity, resolveClaudeMythos5ModelIdentity, resolveClaudeNativeThinkingLevelMap, resolveClaudeSonnet5ModelIdentity, resolveModelBoundThinkingReplayMode, resolveOriginalAnthropicToolName, streamAnthropic, streamSimpleAnthropic, supportsClaudeAdaptiveThinking, supportsClaudeNativeMaxEffort, supportsClaudeNativeXhighEffort, usesClaudeFable5MessagesContract, usesClaudeStreamingRefusalContract, usesFoundryBearerAuth };
@@ -1,4 +1,4 @@
1
- import { E as Model, F as SimpleStreamOptions, I as StopReason, O as OpenAICompletionsCompat, R as StreamFunction, u as Context, z as StreamOptions } from "../types-Cx2zJtyz.mjs";
1
+ import { E as Model, F as SimpleStreamOptions, I as StopReason, O as OpenAICompletionsCompat, R as StreamFunction, u as Context, z as StreamOptions } from "../types-CYORveZ7.mjs";
2
2
  import OpenAI from "openai";
3
3
  import { TSchema } from "typebox";
4
4
  import { ChatCompletionMessageParam } from "openai/resources/chat/completions.js";
@@ -99,6 +99,7 @@ interface OpenAICompletionsOptions extends StreamOptions {
99
99
  }
100
100
  type ResolvedOpenAICompletionsCompat = Omit<Required<OpenAICompletionsCompat>, "cacheControlFormat"> & {
101
101
  cacheControlFormat?: OpenAICompletionsCompat["cacheControlFormat"];
102
+ sessionAffinityFormat: "openai" | "openrouter";
102
103
  };
103
104
  declare const streamOpenAICompletions: StreamFunction<"openai-completions", OpenAICompletionsOptions>;
104
105
  declare const streamSimpleOpenAICompletions: StreamFunction<"openai-completions", SimpleStreamOptions>;
@@ -1,7 +1,7 @@
1
1
  import { t as projectRuntimeToolInputSchema } from "../tool-schema-json-projection-BwNu3nDi.mjs";
2
- import { A as resolveOpenAISupportedReasoningEfforts, C as isResponsesTextDeltaEventType, D as isOpenAIGpt56Model, E as isOpenAIGpt55Model, F as resolveUnsupportedToolSchemaKeywords, I as shouldOmitEmptyArrayItems, L as stripUnsupportedSchemaKeywords, M as supportsOpenAITemperature, N as extractToolSchemaModelCompat, O as normalizeOpenAIReasoningEffort, P as normalizeToolParameterSchema, R as GEMINI_UNSUPPORTED_SCHEMA_KEYWORDS, S as isResponsesTextContentPartType, T as isOpenAIGpt54MiniModel, _ as AZURE_RESPONSES_TEXT_DELTA_EVENT_TYPE, b as isAzureResponsesTextDeltaEvent, c as clearOpenAIToolSchemaCacheForTest, d as normalizeOpenAIStrictToolParameters, f as normalizeStrictOpenAIJsonSchema, g as AZURE_RESPONSES_TEXT_CONTENT_PART_TYPE, h as readResponsesToolCallItemIdentity, j as supportsOpenAIReasoningEffort, k as resolveOpenAIReasoningEffortForModel, l as findOpenAIStrictToolProjectionDiagnostics, m as createResponsesToolCallTracker, p as resolveOpenAIProjectedToolsStrictToolFlag, u as isStrictOpenAIJsonSchemaCompatible, v as OPENAI_RESPONSES_OUTPUT_TEXT_CONTENT_PART_TYPE, w as resolveResponsesMessageSnapshotCollapse, x as isAzureResponsesTextDeltaEventType, y as OPENAI_RESPONSES_OUTPUT_TEXT_DELTA_EVENT_TYPE, z as cleanSchemaForGemini } from "../openai-responses-shared-Befb4D6R.mjs";
2
+ import { A as resolveOpenAISupportedReasoningEfforts, C as isResponsesTextDeltaEventType, D as isOpenAIGpt56Model, E as isOpenAIGpt55Model, F as resolveUnsupportedToolSchemaKeywords, I as shouldOmitEmptyArrayItems, L as stripUnsupportedSchemaKeywords, M as supportsOpenAITemperature, N as extractToolSchemaModelCompat, O as normalizeOpenAIReasoningEffort, P as normalizeToolParameterSchema, R as GEMINI_UNSUPPORTED_SCHEMA_KEYWORDS, S as isResponsesTextContentPartType, T as isOpenAIGpt54MiniModel, _ as AZURE_RESPONSES_TEXT_DELTA_EVENT_TYPE, b as isAzureResponsesTextDeltaEvent, c as clearOpenAIToolSchemaCacheForTest, d as normalizeOpenAIStrictToolParameters, f as normalizeStrictOpenAIJsonSchema, g as AZURE_RESPONSES_TEXT_CONTENT_PART_TYPE, h as readResponsesToolCallItemIdentity, j as supportsOpenAIReasoningEffort, k as resolveOpenAIReasoningEffortForModel, l as findOpenAIStrictToolProjectionDiagnostics, m as createResponsesToolCallTracker, p as resolveOpenAIProjectedToolsStrictToolFlag, u as isStrictOpenAIJsonSchemaCompatible, v as OPENAI_RESPONSES_OUTPUT_TEXT_CONTENT_PART_TYPE, w as resolveResponsesMessageSnapshotCollapse, x as isAzureResponsesTextDeltaEventType, y as OPENAI_RESPONSES_OUTPUT_TEXT_DELTA_EVENT_TYPE, z as cleanSchemaForGemini } from "../openai-responses-shared-CwnGU0KW.mjs";
3
3
  import { i as resolveAzureDeploymentNameFromMap, n as isTraditionalAzureOpenAIHost, r as parseAzureDeploymentNameMap, t as isOpenAICompatibleAzureResponsesBaseUrl } from "../azure-openai-responses-client-compat-C7K7QfUE.mjs";
4
- import { a as clampOpenAIPromptCacheKey, i as OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH, n as reconcileOpenAICompletionsToolChoice, r as reconcileOpenAIResponsesToolChoice, t as projectOpenAITools } from "../openai-tool-projection-CFqm42J2.mjs";
5
- import { a as mapOpenAIStopReason, i as streamSimpleOpenAICompletions, r as streamOpenAICompletions, t as convertMessages } from "../openai-completions-DPR_O2RW.mjs";
6
- import { n as streamOpenAIResponses, r as streamSimpleOpenAIResponses } from "../openai-responses-Cov-Vdc2.mjs";
4
+ import { a as clampOpenAIPromptCacheKey, i as OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH, n as reconcileOpenAICompletionsToolChoice, r as reconcileOpenAIResponsesToolChoice, t as projectOpenAITools } from "../openai-tool-projection-WHf2nuOI.mjs";
5
+ import { a as mapOpenAIStopReason, i as streamSimpleOpenAICompletions, r as streamOpenAICompletions, t as convertMessages } from "../openai-completions-zLDfebnN.mjs";
6
+ import { n as streamOpenAIResponses, r as streamSimpleOpenAIResponses } from "../openai-responses-ClspWt4I.mjs";
7
7
  export { AZURE_RESPONSES_TEXT_CONTENT_PART_TYPE, AZURE_RESPONSES_TEXT_DELTA_EVENT_TYPE, GEMINI_UNSUPPORTED_SCHEMA_KEYWORDS, OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH, OPENAI_RESPONSES_OUTPUT_TEXT_CONTENT_PART_TYPE, OPENAI_RESPONSES_OUTPUT_TEXT_DELTA_EVENT_TYPE, clampOpenAIPromptCacheKey, cleanSchemaForGemini, clearOpenAIToolSchemaCacheForTest, convertMessages, createResponsesToolCallTracker, extractToolSchemaModelCompat, findOpenAIStrictToolProjectionDiagnostics, isAzureResponsesTextDeltaEvent, isAzureResponsesTextDeltaEventType, isOpenAICompatibleAzureResponsesBaseUrl, isOpenAIGpt54MiniModel, isOpenAIGpt55Model, isOpenAIGpt56Model, isResponsesTextContentPartType, isResponsesTextDeltaEventType, isStrictOpenAIJsonSchemaCompatible, isTraditionalAzureOpenAIHost, mapOpenAIStopReason, normalizeOpenAIReasoningEffort, normalizeOpenAIStrictToolParameters, normalizeStrictOpenAIJsonSchema, normalizeToolParameterSchema, parseAzureDeploymentNameMap, projectOpenAITools, projectRuntimeToolInputSchema, readResponsesToolCallItemIdentity, reconcileOpenAICompletionsToolChoice, reconcileOpenAIResponsesToolChoice, resolveAzureDeploymentNameFromMap, resolveOpenAIProjectedToolsStrictToolFlag, resolveOpenAIReasoningEffortForModel, resolveOpenAISupportedReasoningEfforts, resolveResponsesMessageSnapshotCollapse, resolveUnsupportedToolSchemaKeywords, shouldOmitEmptyArrayItems, streamOpenAICompletions, streamOpenAIResponses, streamSimpleOpenAICompletions, streamSimpleOpenAIResponses, stripUnsupportedSchemaKeywords, supportsOpenAIReasoningEffort, supportsOpenAITemperature };
@@ -1,5 +1,5 @@
1
- import { D as ModelThinkingLevel, E as Model, F as SimpleStreamOptions, P as ProviderStreamOptions, X as Usage, i as AssistantMessage, n as Api, o as AssistantMessageEventStreamContract, u as Context, z as StreamOptions } from "../types-Cx2zJtyz.mjs";
2
- import { a as RegisteredApiProvider, t as ApiProvider } from "../api-registry-Byvoz8Ha.mjs";
1
+ import { D as ModelThinkingLevel, E as Model, F as SimpleStreamOptions, P as ProviderStreamOptions, X as Usage, i as AssistantMessage, n as Api, o as AssistantMessageEventStreamContract, u as Context, z as StreamOptions } from "../types-CYORveZ7.mjs";
2
+ import { a as RegisteredApiProvider, t as ApiProvider } from "../api-registry-DXBIXISf.mjs";
3
3
  import { t as sanitizeSurrogates } from "../sanitize-unicode-BZiVbGwK.mjs";
4
4
 
5
5
  //#region packages/ai/src/internal/default-runtime.d.ts
@@ -1,6 +1,6 @@
1
1
  import { n as getEnvApiKey, t as findEnvKeys } from "../env-api-keys-DnhYpc27.mjs";
2
2
  import { n as createApiRegistry, t as createLlmRuntime } from "../stream-CREqxHgU.mjs";
3
- import { a as modelsAreEqual, i as getSupportedThinkingLevels, n as calculateCost, r as clampThinkingLevel, t as applyProviderReportedUsageCost } from "../model-utils-Q1LSRIdo.mjs";
3
+ import { a as modelsAreEqual, i as getSupportedThinkingLevels, n as calculateCost, r as clampThinkingLevel, t as applyProviderReportedUsageCost } from "../model-utils-1GiZ2_rr.mjs";
4
4
  import { n as onLlmRequestActivity, r as createDeferredEventBuffer, t as notifyLlmRequestActivity } from "../llm-request-activity-CehVkZP-.mjs";
5
5
  import { t as headersToRecord } from "../headers-B_e4-1J0.mjs";
6
6
  import { n as parseStreamingJson, r as repairJson, t as parseJsonWithRepair } from "../json-parse-BvXNt1-7.mjs";
@@ -70,11 +70,12 @@ const OVERFLOW_PATTERNS = [
70
70
  /request_too_large/i,
71
71
  /input is too long for requested model/i,
72
72
  /exceeds the context window/i,
73
- /exceeds (?:the )?(?:model'?s )?maximum context length of [\d,]+ tokens?/i,
73
+ /exceeds (?:the )?(?:model'?s )?maximum context length(?: of [\d,]+ tokens?|\s*\([\d,]+\))/i,
74
74
  /input token count.*exceeds the maximum/i,
75
75
  /maximum prompt length is \d+/i,
76
76
  /reduce the length of the messages/i,
77
77
  /maximum context length is \d+ tokens/i,
78
+ /exceeds (?:the )?maximum allowed input length of [\d,]+ tokens?/i,
78
79
  /input \(\d+ tokens\) is longer than the model'?s context length \(\d+ tokens\)/i,
79
80
  /exceeds the limit of \d+/i,
80
81
  /exceeds the available context size/i,
@@ -1,4 +1,4 @@
1
- import { E as Model, F as SimpleStreamOptions, H as ThinkingBudgets, T as Message, W as ThinkingLevel, i as AssistantMessage, n as Api, z as StreamOptions } from "../types-Cx2zJtyz.mjs";
1
+ import { E as Model, F as SimpleStreamOptions, H as ThinkingBudgets, T as Message, W as ThinkingLevel, i as AssistantMessage, n as Api, z as StreamOptions } from "../types-CYORveZ7.mjs";
2
2
  import { t as sanitizeSurrogates } from "../sanitize-unicode-BZiVbGwK.mjs";
3
3
 
4
4
  //#region packages/ai/src/providers/simple-options.d.ts
@@ -7,6 +7,8 @@ type FirstEventStreamOptions = {
7
7
  onFirstEventTimeout?: (reason: Error) => void;
8
8
  };
9
9
  declare function buildBaseOptions(model: Model, options?: SimpleStreamOptions, apiKey?: string): StreamOptions & FirstEventStreamOptions;
10
+ declare function clampMaxTokensToModel(model: Model, requestedMaxTokens: number): number;
11
+ declare function clampMaxTokensToModel(model: Model, requestedMaxTokens: number | undefined): number | undefined;
10
12
  declare function clampReasoning(effort: ThinkingLevel): Exclude<ThinkingLevel, "xhigh">;
11
13
  declare function clampReasoning(effort: ThinkingLevel | undefined): Exclude<ThinkingLevel, "xhigh"> | undefined;
12
14
  declare function adjustMaxTokensForThinking(baseMaxTokens: number | undefined, modelMaxTokens: number, reasoningLevel: ThinkingLevel, customBudgets?: ThinkingBudgets): {
@@ -55,4 +57,4 @@ declare function prependSystemPromptAdditionAfterCacheBoundary(params: {
55
57
  systemPromptAddition?: string;
56
58
  }): string;
57
59
  //#endregion
58
- export { SYSTEM_PROMPT_CACHE_BOUNDARY, adjustMaxTokensForThinking, buildBaseOptions, clampReasoning, describeToolResultMediaPlaceholder, ensureSystemPromptCacheBoundary, extractToolResultBlockText, extractToolResultText, hasMediaPayload, isImageWithMediaPayload, normalizePromptCapabilityIds, normalizeStructuredPromptSection, prependSystemPromptAdditionAfterCacheBoundary, sanitizeSurrogates, splitSystemPromptCacheBoundary, stripSystemPromptCacheBoundary, transformMessages };
60
+ export { SYSTEM_PROMPT_CACHE_BOUNDARY, adjustMaxTokensForThinking, buildBaseOptions, clampMaxTokensToModel, clampReasoning, describeToolResultMediaPlaceholder, ensureSystemPromptCacheBoundary, extractToolResultBlockText, extractToolResultText, hasMediaPayload, isImageWithMediaPayload, normalizePromptCapabilityIds, normalizeStructuredPromptSection, prependSystemPromptAdditionAfterCacheBoundary, sanitizeSurrogates, splitSystemPromptCacheBoundary, stripSystemPromptCacheBoundary, transformMessages };
@@ -1,3 +1,3 @@
1
1
  import { t as sanitizeSurrogates } from "../sanitize-unicode-DT5o51ur.mjs";
2
- import { C as stripSystemPromptCacheBoundary, S as splitSystemPromptCacheBoundary, T as normalizeStructuredPromptSection, a as hasMediaPayload, b as ensureSystemPromptCacheBoundary, c as adjustMaxTokensForThinking, i as extractToolResultText, l as buildBaseOptions, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, r as extractToolResultBlockText, t as transformMessages, u as clampReasoning, w as normalizePromptCapabilityIds, x as prependSystemPromptAdditionAfterCacheBoundary, y as SYSTEM_PROMPT_CACHE_BOUNDARY } from "../transform-messages-BmS70CP5.mjs";
3
- export { SYSTEM_PROMPT_CACHE_BOUNDARY, adjustMaxTokensForThinking, buildBaseOptions, clampReasoning, describeToolResultMediaPlaceholder, ensureSystemPromptCacheBoundary, extractToolResultBlockText, extractToolResultText, hasMediaPayload, isImageWithMediaPayload, normalizePromptCapabilityIds, normalizeStructuredPromptSection, prependSystemPromptAdditionAfterCacheBoundary, sanitizeSurrogates, splitSystemPromptCacheBoundary, stripSystemPromptCacheBoundary, transformMessages };
2
+ import { C as splitSystemPromptCacheBoundary, E as normalizeStructuredPromptSection, S as prependSystemPromptAdditionAfterCacheBoundary, T as normalizePromptCapabilityIds, a as hasMediaPayload, b as SYSTEM_PROMPT_CACHE_BOUNDARY, c as adjustMaxTokensForThinking, d as clampReasoning, i as extractToolResultText, l as buildBaseOptions, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, r as extractToolResultBlockText, t as transformMessages, u as clampMaxTokensToModel, w as stripSystemPromptCacheBoundary, x as ensureSystemPromptCacheBoundary } from "../transform-messages-eb6lxDLB.mjs";
3
+ export { SYSTEM_PROMPT_CACHE_BOUNDARY, adjustMaxTokensForThinking, buildBaseOptions, clampMaxTokensToModel, clampReasoning, describeToolResultMediaPlaceholder, ensureSystemPromptCacheBoundary, extractToolResultBlockText, extractToolResultText, hasMediaPayload, isImageWithMediaPayload, normalizePromptCapabilityIds, normalizeStructuredPromptSection, prependSystemPromptAdditionAfterCacheBoundary, sanitizeSurrogates, splitSystemPromptCacheBoundary, stripSystemPromptCacheBoundary, transformMessages };
@@ -1,10 +1,10 @@
1
1
  import { n as getEnvApiKey } from "./env-api-keys-DnhYpc27.mjs";
2
2
  import { t as AssistantMessageEventStream } from "./event-stream-D8n2uFee.mjs";
3
3
  import { n as getAiTransportHost } from "./host-4t713IeR.mjs";
4
- import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-Q1LSRIdo.mjs";
4
+ import { n as calculateCost, r as clampThinkingLevel } from "./model-utils-1GiZ2_rr.mjs";
5
5
  import { n as parseStreamingJson } from "./json-parse-BvXNt1-7.mjs";
6
6
  import { t as sanitizeSurrogates } from "./sanitize-unicode-DT5o51ur.mjs";
7
- import { C as stripSystemPromptCacheBoundary, i as extractToolResultText, l as buildBaseOptions, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, s as truncateUtf16Safe, t as transformMessages } from "./transform-messages-BmS70CP5.mjs";
7
+ import { i as extractToolResultText, l as buildBaseOptions, n as describeToolResultMediaPlaceholder, o as isImageWithMediaPayload, s as truncateUtf16Safe, t as transformMessages, u as clampMaxTokensToModel, w as stripSystemPromptCacheBoundary } from "./transform-messages-eb6lxDLB.mjs";
8
8
  import { t as shortHash } from "./hash-CHgqbJmD.mjs";
9
9
  import { t as createSseByteGuard } from "./streaming-byte-guard-BrbkbwUu.mjs";
10
10
  import { randomUUID } from "node:crypto";
@@ -75,7 +75,7 @@ const streamMistral = (model, context, options) => {
75
75
  ...model.headers,
76
76
  ...options?.headers
77
77
  };
78
- if (options?.sessionId) headers["x-affinity"] ||= options.sessionId;
78
+ if (resolveMistralPromptCacheKey(options) && options?.sessionId) headers["x-affinity"] ||= options.sessionId;
79
79
  const mistralStream = await mistral.chat.stream(payload, {
80
80
  headers,
81
81
  signal: options?.signal
@@ -113,7 +113,10 @@ const streamMistral = (model, context, options) => {
113
113
  const streamSimpleMistral = (model, context, options) => {
114
114
  const apiKey = options?.apiKey || getEnvApiKey(model.provider);
115
115
  if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
116
- const base = buildBaseOptions(model, options, apiKey);
116
+ const base = {
117
+ ...buildBaseOptions(model, options, apiKey),
118
+ maxTokens: clampMaxTokensToModel(model, options?.maxTokens)
119
+ };
117
120
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : void 0;
118
121
  const reasoning = clampedReasoning === "off" ? void 0 : clampedReasoning;
119
122
  const shouldUseReasoning = model.reasoning && reasoning !== void 0;
@@ -218,12 +221,23 @@ function buildChatPayload(model, context, messages, options) {
218
221
  }
219
222
  if (options?.promptMode) payload.promptMode = options.promptMode;
220
223
  if (options?.reasoningEffort) payload.reasoningEffort = options.reasoningEffort;
224
+ const promptCacheKey = resolveMistralPromptCacheKey(options);
225
+ if (promptCacheKey) payload.promptCacheKey = promptCacheKey;
221
226
  if (context.systemPrompt) payload.messages.unshift({
222
227
  role: "system",
223
228
  content: sanitizeSurrogates(stripSystemPromptCacheBoundary(context.systemPrompt))
224
229
  });
225
230
  return payload;
226
231
  }
232
+ function resolveMistralPromptCacheKey(options) {
233
+ if (options?.cacheRetention === "none") return;
234
+ return options?.promptCacheKey?.trim() || options?.sessionId?.trim() || void 0;
235
+ }
236
+ function readMistralCachedPromptTokens(usage, promptTokens) {
237
+ const record = usage;
238
+ const rawCachedTokens = record.promptTokensDetails?.cachedTokens ?? record.prompt_tokens_details?.cached_tokens ?? record.cachedTokens ?? record.cached_tokens;
239
+ return Math.min(promptTokens, Math.max(0, typeof rawCachedTokens === "number" && Number.isFinite(rawCachedTokens) ? rawCachedTokens : 0));
240
+ }
227
241
  async function consumeChatStream(model, output, stream, mistralStream) {
228
242
  let currentBlock = null;
229
243
  const blocks = output.content;
@@ -309,11 +323,13 @@ async function consumeChatStream(model, output, stream, mistralStream) {
309
323
  const chunk = event.data;
310
324
  output.responseId ||= chunk.id;
311
325
  if (chunk.usage) {
312
- output.usage.input = chunk.usage.promptTokens || 0;
326
+ const promptTokens = chunk.usage.promptTokens || 0;
327
+ const cachedPromptTokens = readMistralCachedPromptTokens(chunk.usage, promptTokens);
328
+ output.usage.input = Math.max(0, promptTokens - cachedPromptTokens);
313
329
  output.usage.output = chunk.usage.completionTokens || 0;
314
- output.usage.cacheRead = 0;
330
+ output.usage.cacheRead = cachedPromptTokens;
315
331
  output.usage.cacheWrite = 0;
316
- output.usage.totalTokens = chunk.usage.totalTokens || output.usage.input + output.usage.output;
332
+ output.usage.totalTokens = chunk.usage.totalTokens || output.usage.input + output.usage.output + output.usage.cacheRead;
317
333
  calculateCost(model, output.usage);
318
334
  }
319
335
  const choice = chunk.choices[0];
@@ -2,10 +2,12 @@ import { c as resolveClaudeNativeThinkingLevelMap, i as requiresClaudeMandatoryA
2
2
  //#region packages/ai/src/model-utils.ts
3
3
  /** Calculates and stores model cost fields from token usage and per-million pricing. */
4
4
  function calculateCost(model, usage) {
5
+ const cacheWrite1h = Math.min(usage.cacheWrite, Math.max(0, usage.cacheWrite1h ?? 0));
6
+ const cacheWrite5m = usage.cacheWrite - cacheWrite1h;
5
7
  usage.cost.input = model.cost.input / 1e6 * usage.input;
6
8
  usage.cost.output = model.cost.output / 1e6 * usage.output;
7
9
  usage.cost.cacheRead = model.cost.cacheRead / 1e6 * usage.cacheRead;
8
- usage.cost.cacheWrite = model.cost.cacheWrite / 1e6 * usage.cacheWrite;
10
+ usage.cost.cacheWrite = (model.cost.cacheWrite * cacheWrite5m + model.cost.input * 2 * cacheWrite1h) / 1e6;
9
11
  usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
10
12
  return usage.cost;
11
13
  }