@code-yeongyu/senpi-ai 2026.8.18 → 2026.8.19

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 (139) hide show
  1. package/README.md +5 -3
  2. package/dist/api/anthropic-messages.d.ts +7 -1
  3. package/dist/api/anthropic-messages.d.ts.map +1 -1
  4. package/dist/api/anthropic-messages.js +21 -4
  5. package/dist/api/anthropic-messages.js.map +1 -1
  6. package/dist/api/azure-openai-responses.d.ts +2 -0
  7. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  8. package/dist/api/azure-openai-responses.js +7 -1
  9. package/dist/api/azure-openai-responses.js.map +1 -1
  10. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  11. package/dist/api/bedrock-converse-stream.js +39 -2
  12. package/dist/api/bedrock-converse-stream.js.map +1 -1
  13. package/dist/api/cursor-agent/gen/agent_pb.d.ts +22 -1
  14. package/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
  15. package/dist/api/cursor-agent/gen/agent_pb.js +1 -1
  16. package/dist/api/cursor-agent/gen/agent_pb.js.map +1 -1
  17. package/dist/api/cursor-agent/reasoning-params.d.ts +20 -0
  18. package/dist/api/cursor-agent/reasoning-params.d.ts.map +1 -0
  19. package/dist/api/cursor-agent/reasoning-params.js +26 -0
  20. package/dist/api/cursor-agent/reasoning-params.js.map +1 -0
  21. package/dist/api/cursor-agent/types.d.ts +7 -1
  22. package/dist/api/cursor-agent/types.d.ts.map +1 -1
  23. package/dist/api/cursor-agent/types.js.map +1 -1
  24. package/dist/api/cursor-agent.d.ts +5 -3
  25. package/dist/api/cursor-agent.d.ts.map +1 -1
  26. package/dist/api/cursor-agent.js +82 -12
  27. package/dist/api/cursor-agent.js.map +1 -1
  28. package/dist/api/google-generative-ai.d.ts +2 -2
  29. package/dist/api/google-generative-ai.d.ts.map +1 -1
  30. package/dist/api/google-generative-ai.js +14 -11
  31. package/dist/api/google-generative-ai.js.map +1 -1
  32. package/dist/api/google-shared.d.ts +5 -2
  33. package/dist/api/google-shared.d.ts.map +1 -1
  34. package/dist/api/google-shared.js +16 -0
  35. package/dist/api/google-shared.js.map +1 -1
  36. package/dist/api/google-vertex.d.ts +2 -2
  37. package/dist/api/google-vertex.d.ts.map +1 -1
  38. package/dist/api/google-vertex.js +13 -10
  39. package/dist/api/google-vertex.js.map +1 -1
  40. package/dist/api/mistral-conversations.d.ts.map +1 -1
  41. package/dist/api/mistral-conversations.js +4 -1
  42. package/dist/api/mistral-conversations.js.map +1 -1
  43. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  44. package/dist/api/openai-codex-responses.js +4 -1
  45. package/dist/api/openai-codex-responses.js.map +1 -1
  46. package/dist/api/openai-completions.d.ts +1 -1
  47. package/dist/api/openai-completions.d.ts.map +1 -1
  48. package/dist/api/openai-completions.js +45 -29
  49. package/dist/api/openai-completions.js.map +1 -1
  50. package/dist/api/openai-responses.d.ts.map +1 -1
  51. package/dist/api/openai-responses.js +8 -1
  52. package/dist/api/openai-responses.js.map +1 -1
  53. package/dist/api/pi-messages.js +1 -1
  54. package/dist/api/pi-messages.js.map +1 -1
  55. package/dist/api/simple-options.d.ts +4 -0
  56. package/dist/api/simple-options.d.ts.map +1 -1
  57. package/dist/api/simple-options.js +18 -9
  58. package/dist/api/simple-options.js.map +1 -1
  59. package/dist/auth/oauth/device-code.d.ts +1 -0
  60. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  61. package/dist/auth/oauth/device-code.js +1 -1
  62. package/dist/auth/oauth/device-code.js.map +1 -1
  63. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  64. package/dist/auth/oauth/github-copilot.js +22 -9
  65. package/dist/auth/oauth/github-copilot.js.map +1 -1
  66. package/dist/cursor/catalog-grouping.d.ts +25 -0
  67. package/dist/cursor/catalog-grouping.d.ts.map +1 -0
  68. package/dist/cursor/catalog-grouping.js +134 -0
  69. package/dist/cursor/catalog-grouping.js.map +1 -0
  70. package/dist/cursor/cursor-variant-aliases.json +1893 -0
  71. package/dist/cursor/model-capabilities.d.ts +47 -0
  72. package/dist/cursor/model-capabilities.d.ts.map +1 -0
  73. package/dist/cursor/model-capabilities.js +208 -0
  74. package/dist/cursor/model-capabilities.js.map +1 -0
  75. package/dist/cursor/selection-descriptor.d.ts +21 -0
  76. package/dist/cursor/selection-descriptor.d.ts.map +1 -0
  77. package/dist/cursor/selection-descriptor.js +83 -0
  78. package/dist/cursor/selection-descriptor.js.map +1 -0
  79. package/dist/cursor/store-migration.d.ts +8 -0
  80. package/dist/cursor/store-migration.d.ts.map +1 -0
  81. package/dist/cursor/store-migration.js +76 -0
  82. package/dist/cursor/store-migration.js.map +1 -0
  83. package/dist/index.d.ts +5 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +4 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/model.d.ts +13 -0
  88. package/dist/model.d.ts.map +1 -1
  89. package/dist/model.js.map +1 -1
  90. package/dist/models.d.ts +6 -0
  91. package/dist/models.d.ts.map +1 -1
  92. package/dist/models.js +9 -1
  93. package/dist/models.js.map +1 -1
  94. package/dist/providers/cursor.d.ts.map +1 -1
  95. package/dist/providers/cursor.js +40 -11
  96. package/dist/providers/cursor.js.map +1 -1
  97. package/dist/providers/data/.manifest.json +1 -1
  98. package/dist/providers/data/anthropic.json +1 -1
  99. package/dist/providers/data/baseten.json +1 -1
  100. package/dist/providers/data/github-copilot.json +1 -1
  101. package/dist/providers/data/openai-codex.json +1 -1
  102. package/dist/providers/data/openai.json +1 -1
  103. package/dist/providers/data/opencode-go.json +1 -1
  104. package/dist/providers/data/opencode.json +1 -1
  105. package/dist/providers/data/openrouter.json +1 -1
  106. package/dist/providers/data/qwen-token-plan-individual.json +1 -1
  107. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  108. package/dist/providers/data/xai.json +1 -1
  109. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  110. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  111. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  112. package/dist/providers/data/xiaomi.json +1 -1
  113. package/dist/providers/data/zai-coding-cn.json +1 -1
  114. package/dist/providers/data/zai.json +1 -1
  115. package/dist/providers/xai.d.ts +1 -1
  116. package/dist/providers/xai.d.ts.map +1 -1
  117. package/dist/providers/xai.js +1 -5
  118. package/dist/providers/xai.js.map +1 -1
  119. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -1
  120. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +21 -1
  121. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -1
  122. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -1
  123. package/dist/tool-call-middleware/recovery-message-snapshot.js +2 -1
  124. package/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -1
  125. package/dist/types.d.ts +45 -4
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/types.js.map +1 -1
  128. package/dist/utils/overflow.d.ts.map +1 -1
  129. package/dist/utils/overflow.js +15 -0
  130. package/dist/utils/overflow.js.map +1 -1
  131. package/dist/utils/pi-user-agent.d.ts +2 -0
  132. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  133. package/dist/utils/pi-user-agent.js +7 -0
  134. package/dist/utils/pi-user-agent.js.map +1 -1
  135. package/dist/utils/prompt-cache-ttl.d.ts +2 -1
  136. package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  137. package/dist/utils/prompt-cache-ttl.js +2 -0
  138. package/dist/utils/prompt-cache-ttl.js.map +1 -1
  139. package/package.json +2 -3
package/README.md CHANGED
@@ -801,7 +801,7 @@ Many models support thinking/reasoning capabilities where they can show their in
801
801
  const model = models.getModel('anthropic', 'claude-sonnet-4-5')!;
802
802
  // or models.getModel('openai', 'gpt-5-mini');
803
803
  // or models.getModel('google', 'gemini-2.5-flash');
804
- // or models.getModel('xai', 'grok-4.5');
804
+ // or models.getModel('xai', 'grok-4.6');
805
805
 
806
806
  // Check if model supports reasoning
807
807
  if (model.reasoning) {
@@ -1191,8 +1191,10 @@ interface OpenAICompletionsCompat {
1191
1191
  requiresThinkingAsText?: boolean; // Whether thinking blocks must be converted to text (default: false)
1192
1192
  requiresReasoningContentOnAssistantMessages?: boolean; // Whether all replayed assistant messages must include empty reasoning_content when reasoning is enabled (default: auto-detected for DeepSeek)
1193
1193
  thinkingFormat?: 'openai' | 'openrouter' | 'deepseek' | 'together' | 'baseten' | 'zai' | 'qwen' | 'chat-template' | 'qwen-chat-template' | 'string-thinking' | 'ant-ling'; // Format for reasoning param: 'openai' uses reasoning_effort, 'openrouter' uses reasoning: { effort }, 'deepseek' uses thinking: { type } plus reasoning_effort when supported, 'together' uses reasoning: { enabled } plus reasoning_effort when supported, 'baseten' uses configurable chat_template_args plus reasoning_effort when supported, 'zai' uses thinking: { type }, 'qwen' uses enable_thinking, 'chat-template' uses configurable chat_template_kwargs, 'qwen-chat-template' uses chat_template_kwargs.enable_thinking and preserve_thinking, 'string-thinking' uses top-level thinking, 'ant-ling' uses reasoning: { effort } only for mapped efforts (default: openai)
1194
- chatTemplateKwargs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort'; omitWhenOff?: boolean }>; // chat_template_kwargs values; use $var for pi-controlled thinking values
1195
- chatTemplateArgs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort'; omitWhenOff?: boolean }>; // chat_template_args values for thinkingFormat: 'baseten'; use $var for pi-controlled thinking values
1194
+ chatTemplateKwargs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort' | 'thinking.budget'; omitWhenOff?: boolean }>; // chat_template_kwargs values; use $var for pi-controlled thinking values
1195
+ chatTemplateArgs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort' | 'thinking.budget'; omitWhenOff?: boolean }>; // chat_template_args values for thinkingFormat: 'baseten'; use $var for pi-controlled thinking values
1196
+ thinkingTokenBudgetField?: 'thinking_token_budget' | 'thinking_budget' | 'thinking_budget_tokens'; // Top-level field that caps reasoning tokens from thinkingBudgets (vLLM / Qwen / llama.cpp). Off by default.
1197
+ supportsThinkingTokenBudget?: boolean; // Alias for thinkingTokenBudgetField: 'thinking_token_budget' (vLLM). Prefer thinkingTokenBudgetField. Default: false.
1196
1198
  cacheControlFormat?: 'anthropic'; // Anthropic-style cache_control on system prompt, last tool, and last user/assistant text content
1197
1199
  openRouterRouting?: OpenRouterRouting; // OpenRouter routing preferences (default: {})
1198
1200
  vercelGatewayRouting?: VercelGatewayRouting; // Vercel AI Gateway routing preferences (default: {})
@@ -1,6 +1,6 @@
1
1
  import Anthropic from "@anthropic-ai/sdk";
2
2
  import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/messages.js";
3
- import type { Context, Model, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
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";
6
6
  export type AnthropicThinkingDisplay = "summarized" | "omitted";
@@ -52,6 +52,12 @@ export interface AnthropicOptions extends StreamOptions {
52
52
  * Default: true.
53
53
  */
54
54
  interleavedThinking?: boolean;
55
+ /**
56
+ * Anthropic refusal fallback. When set, the request includes the server-side
57
+ * fallback beta and Anthropic retries eligible refusals on the configured
58
+ * fallback target before returning a final response.
59
+ */
60
+ refusalFallbacks?: AnthropicRefusalFallback;
55
61
  /**
56
62
  * Anthropic tool choice behavior. String values map to Anthropic's built-in
57
63
  * choices; `{ type: "tool", name }` forces a specific tool.
@@ -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;AAEjD,OAAO,KAAK,EAKX,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAmCrB,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;AAoEhE,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;;;;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;AA+1BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA2ZzE,CAAC;AA0FF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAyClF,CAAC;AAyIF,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,EAGX,+BAA+B,EAK/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAmCrB,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;AAyEhE,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;;;;OAIG;IACH,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;AA+1BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA6ZzE,CAAC;AA0FF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAkDlF,CAAC;AA6IF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
@@ -175,6 +175,7 @@ const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
175
175
  "opus-4-8",
176
176
  "opus-4.8",
177
177
  ];
178
+ const SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
178
179
  // A provider can reject its own empty signatures. Learn that capability for one
179
180
  // conversation without changing the shared model definition used by other sessions.
180
181
  const unsignedThinkingTextReplayFallbacks = new Set();
@@ -941,7 +942,7 @@ export const stream = (model, context, options) => {
941
942
  }
942
943
  const cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env, "short");
943
944
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
944
- const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
945
+ const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), options?.refusalFallbacks !== undefined, optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
945
946
  client = created.client;
946
947
  isOAuth = created.isOAuthToken;
947
948
  }
@@ -1005,6 +1006,7 @@ export const stream = (model, context, options) => {
1005
1006
  for await (const event of iterateAnthropicEvents(response, requestSignal)) {
1006
1007
  if (event.type === "message_start") {
1007
1008
  output.responseId = event.message.id;
1009
+ output.model = event.message.model;
1008
1010
  // Capture initial token usage from message_start event
1009
1011
  // This ensures we have input token counts even if the stream is aborted early
1010
1012
  output.usage.input = event.message.usage.input_tokens || 0;
@@ -1357,9 +1359,16 @@ function mapThinkingLevelToEffort(model, level) {
1357
1359
  export const streamSimple = (model, context, options) => {
1358
1360
  const apiKey = options?.apiKey;
1359
1361
  assertRequestAuth(model.provider, apiKey, providerHeadersToRecord(options?.headers));
1360
- const base = buildBaseOptions(model, context, options, options?.apiKey);
1362
+ const base = {
1363
+ ...buildBaseOptions(model, context, options, options?.apiKey),
1364
+ toolChoice: options?.toolChoice,
1365
+ };
1361
1366
  if (!options?.reasoning) {
1362
- return stream(model, context, { ...base, thinkingEnabled: false });
1367
+ return stream(model, context, {
1368
+ ...base,
1369
+ refusalFallbacks: options?.refusalFallbacks,
1370
+ thinkingEnabled: false,
1371
+ });
1363
1372
  }
1364
1373
  // For models with adaptive thinking: use an effort level.
1365
1374
  // For older models: use budget-based thinking.
@@ -1367,6 +1376,7 @@ export const streamSimple = (model, context, options) => {
1367
1376
  const effort = mapThinkingLevelToEffort(model, options.reasoning);
1368
1377
  return stream(model, context, {
1369
1378
  ...base,
1379
+ refusalFallbacks: options?.refusalFallbacks,
1370
1380
  thinkingEnabled: true,
1371
1381
  effort,
1372
1382
  });
@@ -1377,6 +1387,7 @@ export const streamSimple = (model, context, options) => {
1377
1387
  const maxTokens = clampMaxTokensToContext(model, context, adjusted.maxTokens);
1378
1388
  return stream(model, context, {
1379
1389
  ...base,
1390
+ refusalFallbacks: options?.refusalFallbacks,
1380
1391
  maxTokens,
1381
1392
  thinkingEnabled: true,
1382
1393
  thinkingBudgetTokens: Math.min(adjusted.thinkingBudget, Math.max(0, maxTokens - 1024)),
@@ -1385,7 +1396,7 @@ export const streamSimple = (model, context, options) => {
1385
1396
  function isOAuthToken(apiKey) {
1386
1397
  return apiKey.includes("sk-ant-oat");
1387
1398
  }
1388
- function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStreamingBeta, optionsHeaders, fetch, dynamicHeaders, sessionId, env) {
1399
+ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStreamingBeta, useServerSideFallbackBeta, optionsHeaders, fetch, dynamicHeaders, sessionId, env) {
1389
1400
  // Adaptive thinking models have interleaved thinking built in, so skip the beta header.
1390
1401
  const needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model);
1391
1402
  const betaFeatures = [];
@@ -1395,6 +1406,9 @@ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStre
1395
1406
  if (needsInterleavedBeta) {
1396
1407
  betaFeatures.push(INTERLEAVED_THINKING_BETA);
1397
1408
  }
1409
+ if (useServerSideFallbackBeta) {
1410
+ betaFeatures.push(SERVER_SIDE_FALLBACK_BETA);
1411
+ }
1398
1412
  if (model.provider === "cloudflare-ai-gateway") {
1399
1413
  const client = new Anthropic({
1400
1414
  apiKey: null,
@@ -1599,6 +1613,9 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
1599
1613
  }
1600
1614
  }
1601
1615
  applyExtraBodyToAnthropicParams(params, options?.extraBody);
1616
+ if (options?.refusalFallbacks !== undefined) {
1617
+ params.fallbacks = options.refusalFallbacks;
1618
+ }
1602
1619
  return params;
1603
1620
  }
1604
1621
  function applyExtraBodyToAnthropicParams(params, extraBody) {