@code-yeongyu/senpi-ai 2026.9.28 → 2026.9.29-2

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 (138) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +76 -24
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  5. package/dist/api/bedrock-converse-stream.js +10 -3
  6. package/dist/api/bedrock-converse-stream.js.map +1 -1
  7. package/dist/api/github-copilot-endpoint.d.ts +19 -0
  8. package/dist/api/github-copilot-endpoint.d.ts.map +1 -0
  9. package/dist/api/github-copilot-endpoint.js +48 -0
  10. package/dist/api/github-copilot-endpoint.js.map +1 -0
  11. package/dist/api/github-copilot-errors.d.ts +9 -0
  12. package/dist/api/github-copilot-errors.d.ts.map +1 -0
  13. package/dist/api/github-copilot-errors.js +78 -0
  14. package/dist/api/github-copilot-errors.js.map +1 -0
  15. package/dist/api/github-copilot-headers.d.ts +1 -0
  16. package/dist/api/github-copilot-headers.d.ts.map +1 -1
  17. package/dist/api/github-copilot-headers.js +3 -0
  18. package/dist/api/github-copilot-headers.js.map +1 -1
  19. package/dist/api/openai-completions.d.ts.map +1 -1
  20. package/dist/api/openai-completions.js +31 -20
  21. package/dist/api/openai-completions.js.map +1 -1
  22. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  23. package/dist/api/openai-responses-shared.js +4 -1
  24. package/dist/api/openai-responses-shared.js.map +1 -1
  25. package/dist/api/openai-responses.d.ts.map +1 -1
  26. package/dist/api/openai-responses.js +48 -9
  27. package/dist/api/openai-responses.js.map +1 -1
  28. package/dist/auth/helpers.d.ts +1 -0
  29. package/dist/auth/helpers.d.ts.map +1 -1
  30. package/dist/auth/helpers.js +1 -0
  31. package/dist/auth/helpers.js.map +1 -1
  32. package/dist/auth/oauth/github-copilot-model-catalog.d.ts +7 -0
  33. package/dist/auth/oauth/github-copilot-model-catalog.d.ts.map +1 -0
  34. package/dist/auth/oauth/github-copilot-model-catalog.js +46 -0
  35. package/dist/auth/oauth/github-copilot-model-catalog.js.map +1 -0
  36. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  37. package/dist/auth/oauth/github-copilot.js +24 -77
  38. package/dist/auth/oauth/github-copilot.js.map +1 -1
  39. package/dist/auth/pool/slots.d.ts.map +1 -1
  40. package/dist/auth/pool/slots.js +21 -3
  41. package/dist/auth/pool/slots.js.map +1 -1
  42. package/dist/auth/resolve.d.ts +6 -0
  43. package/dist/auth/resolve.d.ts.map +1 -1
  44. package/dist/auth/resolve.js +6 -5
  45. package/dist/auth/resolve.js.map +1 -1
  46. package/dist/auth/types.d.ts +14 -0
  47. package/dist/auth/types.d.ts.map +1 -1
  48. package/dist/auth/types.js.map +1 -1
  49. package/dist/cursor/context-limit-store.d.ts.map +1 -1
  50. package/dist/cursor/context-limit-store.js +23 -18
  51. package/dist/cursor/context-limit-store.js.map +1 -1
  52. package/dist/models.d.ts.map +1 -1
  53. package/dist/models.js +3 -2
  54. package/dist/models.js.map +1 -1
  55. package/dist/openai-responses-compat.d.ts +6 -0
  56. package/dist/openai-responses-compat.d.ts.map +1 -1
  57. package/dist/openai-responses-compat.js.map +1 -1
  58. package/dist/providers/amazon-bedrock.js +13 -13
  59. package/dist/providers/amazon-bedrock.js.map +1 -1
  60. package/dist/providers/data/.manifest.json +1 -1
  61. package/dist/providers/data/amazon-bedrock.json +1 -1
  62. package/dist/providers/data/anthropic.json +1 -1
  63. package/dist/providers/data/azure-openai-responses.json +1 -1
  64. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  65. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  66. package/dist/providers/data/github-copilot.json +1 -1
  67. package/dist/providers/data/mistral.json +1 -1
  68. package/dist/providers/data/openai.json +1 -1
  69. package/dist/providers/data/opencode-go.json +1 -1
  70. package/dist/providers/data/opencode.json +1 -1
  71. package/dist/providers/data/opengateway.json +1 -1
  72. package/dist/providers/data/openrouter.json +1 -1
  73. package/dist/providers/data/together.json +1 -1
  74. package/dist/providers/data/venice.json +1 -1
  75. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  76. package/dist/providers/devin.models.d.ts +5 -3
  77. package/dist/providers/devin.models.d.ts.map +1 -1
  78. package/dist/providers/devin.models.js +6 -5
  79. package/dist/providers/devin.models.js.map +1 -1
  80. package/dist/providers/github-copilot-limits.d.ts +11 -0
  81. package/dist/providers/github-copilot-limits.d.ts.map +1 -0
  82. package/dist/providers/github-copilot-limits.js +65 -0
  83. package/dist/providers/github-copilot-limits.js.map +1 -0
  84. package/dist/providers/github-copilot.d.ts.map +1 -1
  85. package/dist/providers/github-copilot.js +24 -3
  86. package/dist/providers/github-copilot.js.map +1 -1
  87. package/dist/providers/google-vertex.d.ts.map +1 -1
  88. package/dist/providers/google-vertex.js +3 -5
  89. package/dist/providers/google-vertex.js.map +1 -1
  90. package/dist/session-resources.d.ts.map +1 -1
  91. package/dist/session-resources.js +2 -1
  92. package/dist/session-resources.js.map +1 -1
  93. package/dist/types.d.ts +6 -0
  94. package/dist/types.d.ts.map +1 -1
  95. package/dist/types.js.map +1 -1
  96. package/dist/utils/block-symbols.d.ts +4 -0
  97. package/dist/utils/block-symbols.d.ts.map +1 -1
  98. package/dist/utils/block-symbols.js +10 -6
  99. package/dist/utils/block-symbols.js.map +1 -1
  100. package/dist/utils/claude-code-version-cache.d.ts +12 -0
  101. package/dist/utils/claude-code-version-cache.d.ts.map +1 -0
  102. package/dist/utils/claude-code-version-cache.js +60 -0
  103. package/dist/utils/claude-code-version-cache.js.map +1 -0
  104. package/dist/utils/claude-code-version.d.ts +78 -0
  105. package/dist/utils/claude-code-version.d.ts.map +1 -0
  106. package/dist/utils/claude-code-version.js +203 -0
  107. package/dist/utils/claude-code-version.js.map +1 -0
  108. package/dist/utils/cursor-context-limit.d.ts.map +1 -1
  109. package/dist/utils/cursor-context-limit.js +51 -45
  110. package/dist/utils/cursor-context-limit.js.map +1 -1
  111. package/dist/utils/github-copilot-tool-limit.d.ts +10 -0
  112. package/dist/utils/github-copilot-tool-limit.d.ts.map +1 -0
  113. package/dist/utils/github-copilot-tool-limit.js +75 -0
  114. package/dist/utils/github-copilot-tool-limit.js.map +1 -0
  115. package/dist/utils/overflow.d.ts.map +1 -1
  116. package/dist/utils/overflow.js +3 -1
  117. package/dist/utils/overflow.js.map +1 -1
  118. package/dist/utils/process-singleton.d.ts +10 -0
  119. package/dist/utils/process-singleton.d.ts.map +1 -0
  120. package/dist/utils/process-singleton.js +18 -0
  121. package/dist/utils/process-singleton.js.map +1 -0
  122. package/dist/utils/prompt-cache-ttl.d.ts +3 -1
  123. package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  124. package/dist/utils/prompt-cache-ttl.js +4 -2
  125. package/dist/utils/prompt-cache-ttl.js.map +1 -1
  126. package/dist/utils/retry.d.ts +3 -0
  127. package/dist/utils/retry.d.ts.map +1 -1
  128. package/dist/utils/retry.js +15 -3
  129. package/dist/utils/retry.js.map +1 -1
  130. package/dist/utils/tool-choice-fallback.d.ts +29 -0
  131. package/dist/utils/tool-choice-fallback.d.ts.map +1 -1
  132. package/dist/utils/tool-choice-fallback.js +50 -2
  133. package/dist/utils/tool-choice-fallback.js.map +1 -1
  134. package/dist/utils/tool-schema-compat.d.ts +2 -0
  135. package/dist/utils/tool-schema-compat.d.ts.map +1 -1
  136. package/dist/utils/tool-schema-compat.js +28 -9
  137. package/dist/utils/tool-schema-compat.js.map +1 -1
  138. package/package.json +2 -2
@@ -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,EAMX,+BAA+B,EAK/B,MAAM,uDAAuD,CAAC;AAI/D,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAGb,IAAI,EAIJ,MAAM,aAAa,CAAC;AA4CrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA0ElE,eAAO,MAAM,gBAAgB,SAAU,MAAM,WAC2B,CAAC;AACzE,eAAO,MAAM,kBAAkB,SAAU,MAAM,UAAU,IAAI,EAAE,WAS9D,CAAC;AA4EF,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;AAmvBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA0dzE,CAAC;AAyFF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA+ClF,CAAC;AAmJF,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;AAI/D,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAGb,IAAI,EAIJ,MAAM,aAAa,CAAC;AAwDrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6ElE,eAAO,MAAM,gBAAgB,SAAU,MAAM,WAC2B,CAAC;AACzE,eAAO,MAAM,kBAAkB,SAAU,MAAM,UAAU,IAAI,EAAE,WAS9D,CAAC;AA4EF,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AAsGhE,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;AAmvBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA0gBzE,CAAC;AAyFF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA+ClF,CAAC;AAoJF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
@@ -4,9 +4,11 @@ import { readProviderDiagnostic } from "../provider-diagnostic.js";
4
4
  import { registerSessionResourceCleanup } from "../session-resources.js";
5
5
  import { isVideoMimeType } from "../types.js";
6
6
  import { combineAbortSignals } from "../utils/abort-signals.js";
7
+ import { claudeCodeVersionTooOldHint, getClaudeCodeVersion, isClaudeCodeVersionTooOldError, recoverClaudeCodeVersion, } from "../utils/claude-code-version.js";
7
8
  import { splitDeferredTools } from "../utils/deferred-tools.js";
8
9
  import { appendAssistantMessageDiagnostic } from "../utils/diagnostics.js";
9
10
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
11
+ import { formatGitHubCopilotToolLimitError, limitGitHubCopilotTools, recordGitHubCopilotToolLimit, } from "../utils/github-copilot-tool-limit.js";
10
12
  import { headersToRecord, providerHeadersToRecord } from "../utils/headers.js";
11
13
  import { parseJsonWithRepair, parseStreamingJson } from "../utils/json-parse.js";
12
14
  import { getPiUserAgent } from "../utils/pi-user-agent.js";
@@ -20,12 +22,13 @@ import { normalizeAnthropicRetryFailure } from "../utils/retry-profile/failure.j
20
22
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
21
23
  import { applyServerFallbackAbort, applyServerFallbackContinuation, parseServerFallbackReceipt, parseStickyFallbackReceipt, } from "../utils/server-fallback-receipt.js";
22
24
  import { normalizeToolCallId } from "../utils/tool-call-id.js";
23
- import { isForcedToolChoiceUnsupportedError, omitToolChoiceParam } from "../utils/tool-choice-fallback.js";
25
+ import { sendWithForcedToolChoiceFallback } from "../utils/tool-choice-fallback.js";
24
26
  import { resolveRootObjectSchema } from "../utils/tool-schema-compat.js";
25
27
  import { sanitizeAnthropicToolPairs } from "./anthropic-tool-pairs.js";
26
28
  import { demoteUnavailableToolReferences } from "./anthropic-tool-references.js";
27
29
  import { resolveCloudflareBaseUrl } from "./cloudflare.js";
28
30
  import { getJsonSchemaToolParameters, resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
31
+ import { withGitHubCopilotFailureNote } from "./github-copilot-errors.js";
29
32
  import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
30
33
  import { ANTHROPIC_RESERVED_BODY_KEYS, adjustMaxTokensForThinking, buildBaseOptions, clampMaxTokensToContext, } from "./simple-options.js";
31
34
  import { transformMessages } from "./transform-messages.js";
@@ -61,8 +64,11 @@ function getCacheControl(model, cacheRetention, env) {
61
64
  cacheControl: { type: "ephemeral", ...(ttl && { ttl }) },
62
65
  };
63
66
  }
64
- // Stealth mode: Mimic Claude Code's tool naming exactly
65
- const claudeCodeVersion = "2.1.280";
67
+ // Stealth mode: Mimic Claude Code's identity and tool naming exactly.
68
+ // The bundled Claude Code version and the floor of the advertised `claude-cli/<version>`
69
+ // (see utils/claude-code-version.ts). Keep this exact declaration: a downstream installer
70
+ // (oh-my-openagent) rewrites it byte-for-byte in the installed dist and bundle.
71
+ const claudeCodeVersion = "2.1.284";
66
72
  // Claude Code 2.x tool names (canonical casing)
67
73
  // Source: https://cchistory.mariozechner.at/data/prompts-2.1.11.md
68
74
  // To update: https://github.com/badlogic/cchistory
@@ -176,7 +182,14 @@ const NATIVE_XHIGH_EFFORT_MODEL_MARKERS = [
176
182
  * this as `compat.supportsDisabledThinking: false`, but `models.json` entries and third-party
177
183
  * gateway rows carry no generated compat, so the family fact has to live here as well.
178
184
  */
179
- const DISABLED_THINKING_REJECTING_MODEL_MARKERS = ["fable-5", "mythos-5", "opus-5-5", "opus-5.5"];
185
+ const DISABLED_THINKING_REJECTING_MODEL_MARKERS = [
186
+ "fable-5",
187
+ "mythos-5",
188
+ "opus-5-5",
189
+ "opus-5.5",
190
+ "sonnet-5-5",
191
+ "sonnet-5.5",
192
+ ];
180
193
  const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
181
194
  "opus-4-6",
182
195
  "opus-4.6",
@@ -845,12 +858,13 @@ export const stream = (model, context, options) => {
845
858
  const requestSignal = combinedAbort.signal;
846
859
  try {
847
860
  let client;
848
- let isOAuth;
861
+ let isOAuth = false;
862
+ let advertisedClaudeCodeVersion;
849
863
  let usageModel = model;
850
864
  let inputTransformations;
865
+ let openClient;
851
866
  if (options?.client) {
852
867
  client = options.client;
853
- isOAuth = false;
854
868
  }
855
869
  else {
856
870
  const apiKey = options?.apiKey;
@@ -866,10 +880,36 @@ export const stream = (model, context, options) => {
866
880
  }
867
881
  const cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env, "short");
868
882
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
869
- const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), options?.refusalFallbacks !== undefined, optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
870
- client = created.client;
871
- isOAuth = created.isOAuthToken;
883
+ openClient = () => {
884
+ const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), options?.refusalFallbacks !== undefined, optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
885
+ client = created.client;
886
+ isOAuth = created.isOAuthToken;
887
+ advertisedClaudeCodeVersion = created.claudeCodeVersion;
888
+ };
889
+ openClient();
872
890
  }
891
+ // One retry per request: a `claude_code_version_too_old` 400 names the version Anthropic
892
+ // wants, so the fingerprint is raised and the same request goes out again with it.
893
+ let claudeCodeVersionRetried = false;
894
+ const retryWithNewerClaudeCode = async (error) => {
895
+ if (claudeCodeVersionRetried ||
896
+ openClient === undefined ||
897
+ advertisedClaudeCodeVersion === undefined ||
898
+ !isClaudeCodeVersionTooOldError(error)) {
899
+ return false;
900
+ }
901
+ const next = await recoverClaudeCodeVersion(error, claudeCodeVersion, advertisedClaudeCodeVersion, options?.env);
902
+ if (next === undefined)
903
+ return false;
904
+ claudeCodeVersionRetried = true;
905
+ openClient();
906
+ return true;
907
+ };
908
+ const noteTooOldClaudeCode = (error) => {
909
+ if (advertisedClaudeCodeVersion !== undefined && isClaudeCodeVersionTooOldError(error)) {
910
+ error.message = `${error.message}\n${claudeCodeVersionTooOldHint(advertisedClaudeCodeVersion)}`;
911
+ }
912
+ };
873
913
  const fallbackKey = unsignedThinkingFallbackKey(model, options?.sessionId);
874
914
  let unsignedThinkingReplay = fallbackKey && unsignedThinkingTextReplayFallbacks.has(fallbackKey)
875
915
  ? "text"
@@ -885,6 +925,11 @@ export const stream = (model, context, options) => {
885
925
  params = sanitizeAnthropicToolPairs(demoteUnavailableToolReferences(params));
886
926
  const payloadRequestMetadata = extractPayloadRequestMetadata(params);
887
927
  params = payloadRequestMetadata.params;
928
+ const limitedTools = limitGitHubCopilotTools(model.provider, params.tools, params.tool_choice);
929
+ if (limitedTools.omittedCount > 0) {
930
+ params = { ...params, tools: limitedTools.tools };
931
+ recordGitHubCopilotToolLimit(output, limitedTools.omittedCount);
932
+ }
888
933
  const requestOptions = {
889
934
  ...(requestSignal ? { signal: requestSignal } : {}),
890
935
  ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
@@ -892,18 +937,14 @@ export const stream = (model, context, options) => {
892
937
  ...(payloadRequestMetadata.headers ? { headers: payloadRequestMetadata.headers } : {}),
893
938
  };
894
939
  const send = (body) => awaitProviderTransport(() => client.beta.messages.create({ ...body, stream: true }, requestOptions).asResponse(), anthropicProviderDiagnosticFromError);
895
- try {
896
- const response = await send(params);
897
- return { params, response };
898
- }
899
- catch (error) {
900
- if (isForcedToolChoiceUnsupportedError(error, isForcedAnthropicToolChoice(params.tool_choice))) {
901
- params = omitToolChoiceParam(params);
902
- const response = await send(params);
903
- return { params, response };
904
- }
905
- throw error;
906
- }
940
+ const sent = await sendWithForcedToolChoiceFallback({
941
+ target: model,
942
+ params,
943
+ acceptsForcedToolChoice: getAnthropicCompat(model).supportsForcedToolChoice,
944
+ isForced: isForcedAnthropicToolChoice,
945
+ send,
946
+ });
947
+ return { params: sent.params, response: sent.result };
907
948
  };
908
949
  let requestOutcome;
909
950
  try {
@@ -918,6 +959,16 @@ export const stream = (model, context, options) => {
918
959
  unsignedThinkingTextReplayFallbacks.add(fallbackKey);
919
960
  return createRequest();
920
961
  }
962
+ if (await retryWithNewerClaudeCode(error)) {
963
+ try {
964
+ return await createRequest();
965
+ }
966
+ catch (retryError) {
967
+ noteTooOldClaudeCode(retryError);
968
+ throw retryError;
969
+ }
970
+ }
971
+ noteTooOldClaudeCode(error);
921
972
  throw error;
922
973
  }
923
974
  }, {
@@ -1257,7 +1308,7 @@ export const stream = (model, context, options) => {
1257
1308
  const providerDiagnostic = output.stopReason === "error" ? readProviderDiagnostic(error) : undefined;
1258
1309
  if (providerDiagnostic !== undefined)
1259
1310
  output.providerDiagnostic = providerDiagnostic;
1260
- output.errorMessage = errorMessage;
1311
+ output.errorMessage = withGitHubCopilotFailureNote(formatGitHubCopilotToolLimitError(output, errorMessage), model.provider, error);
1261
1312
  stream.push({ type: "error", reason: output.stopReason, error: output });
1262
1313
  stream.end();
1263
1314
  }
@@ -1418,6 +1469,7 @@ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStre
1418
1469
  }
1419
1470
  // OAuth: Bearer auth, Claude Code identity headers
1420
1471
  if (apiKey && isOAuthToken(apiKey)) {
1472
+ const advertisedClaudeCodeVersion = getClaudeCodeVersion(claudeCodeVersion, env);
1421
1473
  const client = new Anthropic({
1422
1474
  apiKey: null,
1423
1475
  authToken: apiKey,
@@ -1428,11 +1480,11 @@ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStre
1428
1480
  accept: "application/json",
1429
1481
  "anthropic-dangerous-direct-browser-access": "true",
1430
1482
  "anthropic-beta": ["claude-code-20250219", "oauth-2025-04-20", ...betaFeatures].join(","),
1431
- "user-agent": `claude-cli/${claudeCodeVersion}`,
1483
+ "user-agent": `claude-cli/${advertisedClaudeCodeVersion}`,
1432
1484
  "x-app": "cli",
1433
1485
  }, model.headers, optionsHeaders)),
1434
1486
  });
1435
- return { client, isOAuthToken: true };
1487
+ return { client, isOAuthToken: true, claudeCodeVersion: advertisedClaudeCodeVersion };
1436
1488
  }
1437
1489
  // API key auth
1438
1490
  const affinityCompat = getAnthropicCompat(model);