@code-yeongyu/senpi-ai 2026.9.3 → 2026.9.4-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 (84) hide show
  1. package/dist/api/anthropic-messages.d.ts +1 -1
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +130 -15
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/context-room.d.ts +20 -0
  6. package/dist/api/context-room.d.ts.map +1 -0
  7. package/dist/api/context-room.js +40 -0
  8. package/dist/api/context-room.js.map +1 -0
  9. package/dist/api/cursor-agent.js +4 -4
  10. package/dist/api/cursor-agent.js.map +1 -1
  11. package/dist/api/mistral-conversations.js +1 -1
  12. package/dist/api/mistral-conversations.js.map +1 -1
  13. package/dist/api/openai-completions.d.ts.map +1 -1
  14. package/dist/api/openai-completions.js +16 -1
  15. package/dist/api/openai-completions.js.map +1 -1
  16. package/dist/api/openai-responses.d.ts.map +1 -1
  17. package/dist/api/openai-responses.js +2 -1
  18. package/dist/api/openai-responses.js.map +1 -1
  19. package/dist/api/pi-messages.d.ts +2 -0
  20. package/dist/api/pi-messages.d.ts.map +1 -1
  21. package/dist/api/pi-messages.js +6 -0
  22. package/dist/api/pi-messages.js.map +1 -1
  23. package/dist/api/simple-options.d.ts +1 -3
  24. package/dist/api/simple-options.d.ts.map +1 -1
  25. package/dist/api/simple-options.js +2 -16
  26. package/dist/api/simple-options.js.map +1 -1
  27. package/dist/api/warm-prompt-cache.js +1 -1
  28. package/dist/api/warm-prompt-cache.js.map +1 -1
  29. package/dist/auth/pool/slots.d.ts +16 -3
  30. package/dist/auth/pool/slots.d.ts.map +1 -1
  31. package/dist/auth/pool/slots.js +40 -6
  32. package/dist/auth/pool/slots.js.map +1 -1
  33. package/dist/compat/extension-oauth-types.d.ts +8 -0
  34. package/dist/compat/extension-oauth-types.d.ts.map +1 -1
  35. package/dist/compat/extension-oauth-types.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/models.d.ts.map +1 -1
  41. package/dist/models.js +3 -2
  42. package/dist/models.js.map +1 -1
  43. package/dist/openai-responses-compat.d.ts +2 -0
  44. package/dist/openai-responses-compat.d.ts.map +1 -1
  45. package/dist/openai-responses-compat.js.map +1 -1
  46. package/dist/providers/data/.manifest.json +1 -1
  47. package/dist/providers/data/anthropic.json +1 -1
  48. package/dist/providers/data/azure-openai-responses.json +1 -1
  49. package/dist/providers/data/baseten.json +1 -1
  50. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  51. package/dist/providers/data/fireworks.json +1 -1
  52. package/dist/providers/data/github-copilot.json +1 -1
  53. package/dist/providers/data/huggingface.json +1 -1
  54. package/dist/providers/data/nvidia.json +1 -1
  55. package/dist/providers/data/openai-codex.json +1 -1
  56. package/dist/providers/data/openai.json +1 -1
  57. package/dist/providers/data/opencode-go.json +1 -1
  58. package/dist/providers/data/openrouter.json +1 -1
  59. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  60. package/dist/providers/openrouter.d.ts +1 -1
  61. package/dist/providers/openrouter.d.ts.map +1 -1
  62. package/dist/providers/openrouter.js +8 -1
  63. package/dist/providers/openrouter.js.map +1 -1
  64. package/dist/types.d.ts +14 -1
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/types.js.map +1 -1
  67. package/dist/utils/drop-failed-assistant-turns.d.ts +23 -0
  68. package/dist/utils/drop-failed-assistant-turns.d.ts.map +1 -0
  69. package/dist/utils/drop-failed-assistant-turns.js +58 -0
  70. package/dist/utils/drop-failed-assistant-turns.js.map +1 -0
  71. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  72. package/dist/utils/node-http-proxy.js +53 -12
  73. package/dist/utils/node-http-proxy.js.map +1 -1
  74. package/dist/utils/overflow.d.ts.map +1 -1
  75. package/dist/utils/overflow.js +2 -0
  76. package/dist/utils/overflow.js.map +1 -1
  77. package/dist/utils/prompt-cache-ttl.d.ts +4 -2
  78. package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  79. package/dist/utils/prompt-cache-ttl.js +3 -0
  80. package/dist/utils/prompt-cache-ttl.js.map +1 -1
  81. package/dist/utils/retry.d.ts.map +1 -1
  82. package/dist/utils/retry.js +3 -0
  83. package/dist/utils/retry.js.map +1 -1
  84. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import Anthropic from "@anthropic-ai/sdk";
2
- import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/messages.js";
2
+ import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/beta/messages/messages.js";
3
3
  import type { AnthropicRefusalFallback, Context, Model, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
4
4
  export { getAnthropicCompat } from "../utils/prompt-cache-ttl.ts";
5
5
  export type AnthropicEffort = "low" | "medium" | "high" | "xhigh" | "max";
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAGX,+BAA+B,EAK/B,MAAM,yCAAyC,CAAC;AAGjD,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAqCrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6JlE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AAuFhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAo4BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAqbzE,CAAC;AA0FF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA+ClF,CAAC;AA6IF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
1
+ {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAMX,+BAA+B,EAK/B,MAAM,uDAAuD,CAAC;AAG/D,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAqCrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6JlE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AA+FhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAo4BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA2czE,CAAC;AAyFF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA+ClF,CAAC;AA6IF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
@@ -179,6 +179,11 @@ const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
179
179
  "opus-4.8",
180
180
  ];
181
181
  const SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
182
+ function shouldUseServerSideFallbackBeta(model) {
183
+ return (model.compat?.allowedFallbackModels?.length ?? 0) > 0;
184
+ }
185
+ const MID_CONVERSATION_OUTPUT_CONFIG_BETA = "mid-conversation-output-config-2026-07-01";
186
+ const THINKING_BINDING_CONTROLS_BETA = "thinking-binding-controls-2026-08-01";
182
187
  // A provider can reject its own empty signatures. Learn that capability for one
183
188
  // conversation without changing the shared model definition used by other sessions.
184
189
  const unsignedThinkingTextReplayFallbacks = new Set();
@@ -953,12 +958,14 @@ async function* iterateAnthropicEvents(response, signal) {
953
958
  export const stream = (model, context, options) => {
954
959
  const stream = new AssistantMessageEventStream();
955
960
  (async () => {
961
+ const providerThinkingLevel = model.compat?.supportsMidConvoEffort ? (options?.effort ?? "high") : undefined;
956
962
  const output = {
957
963
  role: "assistant",
958
964
  content: [],
959
965
  api: model.api,
960
966
  provider: model.provider,
961
967
  model: model.id,
968
+ ...(providerThinkingLevel === undefined ? {} : { providerThinkingLevel }),
962
969
  usage: {
963
970
  input: 0,
964
971
  output: 0,
@@ -978,6 +985,7 @@ export const stream = (model, context, options) => {
978
985
  let client;
979
986
  let isOAuth;
980
987
  let usageModel = model;
988
+ let inputTransformations;
981
989
  if (options?.client) {
982
990
  client = options.client;
983
991
  isOAuth = false;
@@ -1022,13 +1030,15 @@ export const stream = (model, context, options) => {
1022
1030
  ...(payloadRequestMetadata.headers ? { headers: payloadRequestMetadata.headers } : {}),
1023
1031
  };
1024
1032
  try {
1025
- const response = await client.messages.create({ ...params, stream: true }, requestOptions).asResponse();
1033
+ const response = await client.beta.messages
1034
+ .create({ ...params, stream: true }, requestOptions)
1035
+ .asResponse();
1026
1036
  return { params, response };
1027
1037
  }
1028
1038
  catch (error) {
1029
1039
  if (isForcedToolChoiceUnsupportedError(error, isForcedAnthropicToolChoice(params.tool_choice))) {
1030
1040
  params = omitToolChoiceParam(params);
1031
- const response = await client.messages
1041
+ const response = await client.beta.messages
1032
1042
  .create({ ...params, stream: true }, requestOptions)
1033
1043
  .asResponse();
1034
1044
  return { params, response };
@@ -1060,6 +1070,9 @@ export const stream = (model, context, options) => {
1060
1070
  for await (const event of iterateAnthropicEvents(response, requestSignal)) {
1061
1071
  if (event.type === "message_start") {
1062
1072
  output.responseId = event.message.id;
1073
+ const transformations = event.message.input_transformations;
1074
+ if (Array.isArray(transformations))
1075
+ inputTransformations = transformations;
1063
1076
  output.model = event.message.model;
1064
1077
  const fallback = output.model === model.id
1065
1078
  ? undefined
@@ -1089,6 +1102,9 @@ export const stream = (model, context, options) => {
1089
1102
  }
1090
1103
  }
1091
1104
  else if (event.type === "content_block_start") {
1105
+ if (event.content_block.type === "fallback" && output.content.length > 0) {
1106
+ throw new Error("Anthropic performed an unsupported mid-output model fallback");
1107
+ }
1092
1108
  const receipt = options?.abortServerSideFallback === true
1093
1109
  ? parseServerFallbackReceipt(event.content_block)
1094
1110
  : undefined;
@@ -1251,6 +1267,9 @@ export const stream = (model, context, options) => {
1251
1267
  }
1252
1268
  }
1253
1269
  else if (event.type === "message_delta") {
1270
+ const transformations = event.input_transformations;
1271
+ if (Array.isArray(transformations))
1272
+ inputTransformations = transformations;
1254
1273
  if (event.delta.stop_reason) {
1255
1274
  output.rawStopReason = event.delta.stop_reason;
1256
1275
  const stopReasonResult = mapStopReason(event.delta.stop_reason, event.delta.stop_details);
@@ -1277,11 +1296,8 @@ export const stream = (model, context, options) => {
1277
1296
  if (event.usage.cache_creation_input_tokens != null) {
1278
1297
  output.usage.cacheWrite = event.usage.cache_creation_input_tokens;
1279
1298
  }
1280
- // Anthropic reports reasoning tokens in `output_tokens_details.thinking_tokens` on the
1281
- // final message_delta usage (a subset of output_tokens). SDK 0.91.1 omits the field from
1282
- // its Usage type, so read it through a narrow cast. Verified against the live API.
1283
- const thinkingTokens = event.usage
1284
- .output_tokens_details?.thinking_tokens;
1299
+ // Anthropic reports reasoning tokens as a subset of output tokens.
1300
+ const thinkingTokens = event.usage.output_tokens_details?.thinking_tokens;
1285
1301
  if (thinkingTokens != null) {
1286
1302
  output.usage.reasoning = thinkingTokens;
1287
1303
  }
@@ -1304,6 +1320,19 @@ export const stream = (model, context, options) => {
1304
1320
  if (output.stopReason === "aborted" || output.stopReason === "error") {
1305
1321
  throw new Error(output.errorMessage || "An unknown error occurred");
1306
1322
  }
1323
+ if (inputTransformations && inputTransformations.length > 0) {
1324
+ appendAssistantMessageDiagnostic(output, {
1325
+ type: "anthropic_input_transformations",
1326
+ timestamp: Date.now(),
1327
+ details: {
1328
+ transformations: inputTransformations.map((transformation) => ({
1329
+ type: transformation.type ?? undefined,
1330
+ path: transformation.path ?? undefined,
1331
+ reason: transformation.reason ?? undefined,
1332
+ })),
1333
+ },
1334
+ });
1335
+ }
1307
1336
  combinedAbort.cleanup();
1308
1337
  stream.push({ type: "done", reason: output.stopReason, message: output });
1309
1338
  stream.end();
@@ -1380,8 +1409,6 @@ function supportsNativeXhighEffort(model) {
1380
1409
  function cannotDisableThinking(model, compat) {
1381
1410
  if (!compat.supportsDisabledThinking)
1382
1411
  return true;
1383
- if (model.thinkingLevelMap?.off === null)
1384
- return true;
1385
1412
  return matchesModelMarker(model, DISABLED_THINKING_REJECTING_MODEL_MARKERS);
1386
1413
  }
1387
1414
  function disableThinkingForRequest(params, model, compat) {
@@ -1560,6 +1587,42 @@ export function buildAnthropicWarmPromptCacheParams(model, context, options) {
1560
1587
  max_tokens: 0,
1561
1588
  });
1562
1589
  }
1590
+ function getBetaFeatures(model, context, isOAuthToken, options) {
1591
+ let configuredFeatures;
1592
+ for (const headers of [model.headers, options?.headers]) {
1593
+ for (const [name, value] of Object.entries(headers ?? {})) {
1594
+ if (name.toLowerCase() === "anthropic-beta")
1595
+ configuredFeatures = value;
1596
+ }
1597
+ }
1598
+ if (configuredFeatures === null)
1599
+ return [];
1600
+ if (configuredFeatures !== undefined) {
1601
+ return [
1602
+ ...new Set(configuredFeatures
1603
+ .split(",")
1604
+ .map((feature) => feature.trim())
1605
+ .filter(Boolean)),
1606
+ ];
1607
+ }
1608
+ const features = [];
1609
+ if (isOAuthToken)
1610
+ features.push("claude-code-20250219", "oauth-2025-04-20");
1611
+ if (shouldUseFineGrainedToolStreamingBeta(model, context))
1612
+ features.push(FINE_GRAINED_TOOL_STREAMING_BETA);
1613
+ if (model.reasoning &&
1614
+ options?.thinkingEnabled === true &&
1615
+ (options.interleavedThinking ?? true) &&
1616
+ !supportsAdaptiveThinking(model)) {
1617
+ features.push(INTERLEAVED_THINKING_BETA);
1618
+ }
1619
+ if (shouldUseServerSideFallbackBeta(model))
1620
+ features.push(SERVER_SIDE_FALLBACK_BETA);
1621
+ if (model.compat?.supportsMidConvoEffort === true) {
1622
+ features.push(MID_CONVERSATION_OUTPUT_CONFIG_BETA, THINKING_BINDING_CONTROLS_BETA);
1623
+ }
1624
+ return [...new Set(features)];
1625
+ }
1563
1626
  function buildParams(model, context, isOAuthToken, options, unsignedThinkingReplay = getAnthropicCompat(model).unsignedThinkingReplay) {
1564
1627
  const compat = getAnthropicCompat(model);
1565
1628
  const { cacheControl } = getCacheControl(model, options?.cacheRetention ?? model.cacheRetention, options?.env);
@@ -1581,11 +1644,28 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
1581
1644
  deferredTools = [];
1582
1645
  }
1583
1646
  const deferredToolNames = new Set(deferredTools.map((tool) => normalizeToolName(tool.name)));
1647
+ const activeEffort = options?.effort ?? "high";
1648
+ const betaFeatures = getBetaFeatures(model, context, isOAuthToken, options);
1649
+ const convertedMessages = convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay, deferredToolNames, normalizeToolName, model.compat?.supportsMidConvoEffort === true ? model.provider : undefined);
1650
+ const messages = model.compat?.supportsMidConvoEffort === true
1651
+ ? insertThinkingLevelMessages(convertedMessages, activeEffort)
1652
+ : convertedMessages.messages;
1653
+ // Effort markers are appended after history; re-run the fork's final-user cache checkpoint
1654
+ // against the actual last user/tool-result message so the marker cannot displace cache_control.
1655
+ if (model.compat?.supportsMidConvoEffort === true && cacheControl) {
1656
+ for (let index = messages.length - 1; index >= 0; index--) {
1657
+ if (messages[index].role === "user") {
1658
+ markUserMessageCacheCheckpoint(messages[index], cacheControl);
1659
+ break;
1660
+ }
1661
+ }
1662
+ }
1584
1663
  const params = {
1585
1664
  model: model.id,
1586
- messages: convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay, deferredToolNames, normalizeToolName),
1665
+ messages,
1587
1666
  max_tokens: options?.maxTokens ?? model.maxTokens,
1588
1667
  stream: true,
1668
+ ...(betaFeatures.length > 0 ? { betas: betaFeatures } : {}),
1589
1669
  };
1590
1670
  // For OAuth tokens, we MUST include Claude Code identity
1591
1671
  if (isOAuthToken) {
@@ -1629,8 +1709,18 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
1629
1709
  ...convertTools(deferredTools, isOAuthToken, compat.supportsEagerToolInputStreaming, compat.supportsStrictTools, undefined, true),
1630
1710
  ];
1631
1711
  }
1632
- // Configure thinking mode: adaptive, budget-based, or explicitly disabled.
1633
- if (model.reasoning) {
1712
+ // Managed effort models always use adaptive thinking so prefix mismatches can
1713
+ // be dropped instead of surfacing as persistent 400 responses. Thinking-off is
1714
+ // handled before this managed branch because these models accept `disabled`.
1715
+ if (model.compat?.supportsMidConvoEffort === true && options?.thinkingEnabled !== false) {
1716
+ params.thinking = {
1717
+ type: "adaptive",
1718
+ display: options?.thinkingDisplay ?? "summarized",
1719
+ block_binding: { prefix_mismatch_behavior: "drop_block" },
1720
+ };
1721
+ params.output_config = { effort: "high" };
1722
+ }
1723
+ else if (model.reasoning) {
1634
1724
  if (options?.thinkingEnabled) {
1635
1725
  // Default to "summarized" so Opus 4.7 and Mythos Preview behave like
1636
1726
  // older Claude 4 models (whose API default is also "summarized").
@@ -1684,7 +1774,9 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
1684
1774
  }
1685
1775
  applyExtraBodyToAnthropicParams(params, options?.extraBody);
1686
1776
  if (options?.refusalFallbacks !== undefined) {
1687
- params.fallbacks = options.refusalFallbacks;
1777
+ // AnthropicRefusalFallback models a readonly list; the SDK's BetaFallbacksParam
1778
+ // is mutable, so copy rather than widen the fork's public type.
1779
+ params.fallbacks = options.refusalFallbacks === "default" ? "default" : [...options.refusalFallbacks];
1688
1780
  }
1689
1781
  return params;
1690
1782
  }
@@ -1746,8 +1838,9 @@ function convertToolResult(msg, isOAuthToken, deferredToolNames, loadedToolNames
1746
1838
  : convertedContent,
1747
1839
  };
1748
1840
  }
1749
- function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay = "text", deferredToolNames = new Set(), normalizeToolName = (name) => name) {
1841
+ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay = "text", deferredToolNames = new Set(), normalizeToolName = (name) => name, managedProvider) {
1750
1842
  const params = [];
1843
+ const assistantLevels = new Map();
1751
1844
  const loadedToolNames = new Set();
1752
1845
  // Tool calls from a declined pre-fallback attempt are dropped from their
1753
1846
  // assistant turn below; drop their tool_results in lockstep so none dangle.
@@ -1896,10 +1989,17 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
1896
1989
  }
1897
1990
  if (blocks.length === 0)
1898
1991
  continue;
1992
+ const messageIndex = params.length;
1899
1993
  params.push({
1900
1994
  role: "assistant",
1901
1995
  content: blocks,
1902
1996
  });
1997
+ if (managedProvider !== undefined &&
1998
+ msg.api === "anthropic-messages" &&
1999
+ msg.provider === managedProvider &&
2000
+ isAnthropicEffort(msg.providerThinkingLevel)) {
2001
+ assistantLevels.set(messageIndex, msg.providerThinkingLevel);
2002
+ }
1903
2003
  }
1904
2004
  else if (msg.role === "toolResult") {
1905
2005
  // Collect all consecutive toolResult messages, needed for z.ai Anthropic endpoint.
@@ -1933,7 +2033,22 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
1933
2033
  }
1934
2034
  }
1935
2035
  }
1936
- return params;
2036
+ return { messages: params, assistantLevels };
2037
+ }
2038
+ function isAnthropicEffort(value) {
2039
+ return value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max";
2040
+ }
2041
+ function insertThinkingLevelMessages(converted, activeEffort) {
2042
+ const messages = [];
2043
+ for (let index = 0; index < converted.messages.length; index++) {
2044
+ const historicalEffort = converted.assistantLevels.get(index);
2045
+ if (historicalEffort !== undefined) {
2046
+ messages.push({ role: "system", content: [], output_config: { effort: historicalEffort } });
2047
+ }
2048
+ messages.push(converted.messages[index]);
2049
+ }
2050
+ messages.push({ role: "system", content: [], output_config: { effort: activeEffort } });
2051
+ return messages;
1937
2052
  }
1938
2053
  function shouldUseFineGrainedToolStreamingBeta(model, context) {
1939
2054
  return !!context.tools?.length && !getAnthropicCompat(model).supportsEagerToolInputStreaming;