authorgravatar for 126423069+Marve10s@users.noreply.github.comIbrahim Elkamali <126423069+Marve10s@users.noreply.github.com> 2026-05-28 21:43:48+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-05-28 18:43:48+00:00
log83f0cc9e31b8c38cc3ecd3c394f882ce9ee3714f
tree4ceae078780f5f2c244aa83af5399bb3c31bc851
parente6330ead82319d2be53beb5de3aaf4eda0d91a70
signature Signed by PGP key B5690EEEBB952194

Add Claude Opus 4.8 support (#2849)


6 files changed, 149 insertions(+), 49 deletions(-)

apps/server/package.json+1-1
...@@ -23,7 +23,7 @@...@@ -23,7 +23,7 @@
23 "test": "vitest run"23 "test": "vitest run"
24 },24 },
25 "dependencies": {25 "dependencies": {
26 "@anthropic-ai/claude-agent-sdk": "^0.2.111",26 "@anthropic-ai/claude-agent-sdk": "^0.3.154",
27 "@effect/platform-bun": "catalog:",27 "@effect/platform-bun": "catalog:",
28 "@effect/platform-node": "catalog:",28 "@effect/platform-node": "catalog:",
29 "@effect/platform-node-shared": "catalog:",29 "@effect/platform-node-shared": "catalog:",
apps/server/src/provider/Layers/ClaudeAdapter.ts+11-5
...@@ -70,6 +70,7 @@ import { ServerConfig } from "../../config.ts";...@@ -70,6 +70,7 @@ import { ServerConfig } from "../../config.ts";
70import { makeClaudeEnvironment } from "../Drivers/ClaudeHome.ts";70import { makeClaudeEnvironment } from "../Drivers/ClaudeHome.ts";
71import {71import {
72 getClaudeModelCapabilities,72 getClaudeModelCapabilities,
73 isClaudeUltracodeEffort,
73 normalizeClaudeCliEffort,74 normalizeClaudeCliEffort,
74 resolveClaudeApiModelId,75 resolveClaudeApiModelId,
75 resolveClaudeEffort,76 resolveClaudeEffort,
...@@ -255,8 +256,11 @@ function normalizeClaudeStreamMessages(...@@ -255,8 +256,11 @@ function normalizeClaudeStreamMessages(
255 return squashed.length > 0 ? [squashed] : [];256 return squashed.length > 0 ? [squashed] : [];
256}257}
257258
258function getEffectiveClaudeAgentEffort(effort: string | null | undefined): ClaudeSdkEffort | null {259function getEffectiveClaudeAgentEffort(
259 const normalized = normalizeClaudeCliEffort(effort);260 effort: string | null | undefined,
261 model: string | null | undefined,
262): ClaudeSdkEffort | null {
263 const normalized = normalizeClaudeCliEffort(effort, model);
260 return normalized ? (normalized as ClaudeSdkEffort) : null;264 return normalized ? (normalized as ClaudeSdkEffort) : null;
261}265}
262266
...@@ -2908,7 +2912,8 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (...@@ -2908,7 +2912,8 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
2908 const thinking = thinkingSupported2912 const thinking = thinkingSupported
2909 ? getModelSelectionBooleanOptionValue(modelSelection, "thinking")2913 ? getModelSelectionBooleanOptionValue(modelSelection, "thinking")
2910 : undefined;2914 : undefined;
2911 const effectiveEffort = getEffectiveClaudeAgentEffort(effort);2915 const ultracode = isClaudeUltracodeEffort(effort);
2916 const effectiveEffort = getEffectiveClaudeAgentEffort(effort, modelSelection?.model);
2912 const runtimeModeToPermission: Record<string, PermissionMode> = {2917 const runtimeModeToPermission: Record<string, PermissionMode> = {
2913 "auto-accept-edits": "acceptEdits",2918 "auto-accept-edits": "acceptEdits",
2914 "full-access": "bypassPermissions",2919 "full-access": "bypassPermissions",
...@@ -2917,6 +2922,7 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (...@@ -2917,6 +2922,7 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
2917 const settings = {2922 const settings = {
2918 ...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}),2923 ...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}),
2919 ...(fastMode ? { fastMode: true } : {}),2924 ...(fastMode ? { fastMode: true } : {}),
2925 ...(ultracode ? { ultracode: true } : {}),
2920 };2926 };
2921 const queryOptions: ClaudeQueryOptions = {2927 const queryOptions: ClaudeQueryOptions = {
2922 ...(input.cwd ? { cwd: input.cwd } : {}),2928 ...(input.cwd ? { cwd: input.cwd } : {}),
...@@ -2924,8 +2930,8 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (...@@ -2924,8 +2930,8 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
2924 pathToClaudeCodeExecutable: claudeBinaryPath,2930 pathToClaudeCodeExecutable: claudeBinaryPath,
2925 systemPrompt: { type: "preset", preset: "claude_code" },2931 systemPrompt: { type: "preset", preset: "claude_code" },
2926 settingSources: [...CLAUDE_SETTING_SOURCES],2932 settingSources: [...CLAUDE_SETTING_SOURCES],
2927 // The SDK type lags the CLI here: Opus 4.7 accepts `xhigh` even though2933 // `ultracode` is a Claude Code setting, not an API effort level. It is
2928 // the published `Options["effort"]` union currently stops at `max`.2934 // normalized to `xhigh` above and paired with `settings.ultracode`.
2929 ...(effectiveEffort2935 ...(effectiveEffort
2930 ? {2936 ? {
2931 effort: effectiveEffort as unknown as NonNullable<ClaudeQueryOptions["effort"]>,2937 effort: effectiveEffort as unknown as NonNullable<ClaudeQueryOptions["effort"]>,
apps/server/src/provider/Layers/ClaudeProvider.ts+111-40
...@@ -48,25 +48,83 @@ const CLAUDE_PRESENTATION = {...@@ -48,25 +48,83 @@ const CLAUDE_PRESENTATION = {
48 displayName: "Claude",48 displayName: "Claude",
49 showInteractionModeToggle: true,49 showInteractionModeToggle: true,
50} as const;50} as const;
51const MINIMUM_CLAUDE_OPUS_4_8_VERSION = "2.1.154";
51const MINIMUM_CLAUDE_OPUS_4_7_VERSION = "2.1.111";52const MINIMUM_CLAUDE_OPUS_4_7_VERSION = "2.1.111";
53
54const CLAUDE_EFFORT_OPTIONS = {
55 opus48: [
56 { value: "low", label: "Low" },
57 { value: "medium", label: "Medium" },
58 { value: "high", label: "High", isDefault: true },
59 { value: "xhigh", label: "Extra High" },
60 { value: "max", label: "Max" },
61 { value: "ultracode", label: "Ultracode" },
62 { value: "ultrathink", label: "Ultrathink" },
63 ],
64 opus47: [
65 { value: "low", label: "Low" },
66 { value: "medium", label: "Medium" },
67 { value: "high", label: "High" },
68 { value: "xhigh", label: "Extra High", isDefault: true },
69 { value: "max", label: "Max" },
70 { value: "ultrathink", label: "Ultrathink" },
71 ],
72 opus46: [
73 { value: "low", label: "Low" },
74 { value: "medium", label: "Medium" },
75 { value: "high", label: "High", isDefault: true },
76 { value: "max", label: "Max" },
77 { value: "ultrathink", label: "Ultrathink" },
78 ],
79 sonnet46: [
80 { value: "low", label: "Low" },
81 { value: "medium", label: "Medium" },
82 { value: "high", label: "High", isDefault: true },
83 { value: "max", label: "Max" },
84 { value: "ultrathink", label: "Ultrathink" },
85 ],
86 opus45: [
87 { value: "low", label: "Low" },
88 { value: "medium", label: "Medium" },
89 { value: "high", label: "High", isDefault: true },
90 { value: "max", label: "Max" },
91 ],
92} as const;
93
52const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [94const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
53 {95 {
54 slug: "claude-opus-4-7",96 slug: "claude-opus-4-8",
55 name: "Claude Opus 4.7",97 name: "Claude Opus 4.8",
56 isCustom: false,98 isCustom: false,
57 capabilities: createModelCapabilities({99 capabilities: createModelCapabilities({
58 optionDescriptors: [100 optionDescriptors: [
59 buildSelectOptionDescriptor({101 buildSelectOptionDescriptor({
60 id: "effort",102 id: "effort",
61 label: "Reasoning",103 label: "Reasoning",
104 options: CLAUDE_EFFORT_OPTIONS.opus48,
105 promptInjectedValues: ["ultrathink"],
106 }),
107 buildSelectOptionDescriptor({
108 id: "contextWindow",
109 label: "Context Window",
62 options: [110 options: [
63 { value: "low", label: "Low" },111 { value: "200k", label: "200k", isDefault: true },
64 { value: "medium", label: "Medium" },112 { value: "1m", label: "1M" },
65 { value: "high", label: "High" },
66 { value: "xhigh", label: "Extra High", isDefault: true },
67 { value: "max", label: "Max" },
68 { value: "ultrathink", label: "Ultrathink" },
69 ],113 ],
114 }),
115 ],
116 }),
117 },
118 {
119 slug: "claude-opus-4-7",
120 name: "Claude Opus 4.7",
121 isCustom: false,
122 capabilities: createModelCapabilities({
123 optionDescriptors: [
124 buildSelectOptionDescriptor({
125 id: "effort",
126 label: "Reasoning",
127 options: CLAUDE_EFFORT_OPTIONS.opus47,
70 promptInjectedValues: ["ultrathink"],128 promptInjectedValues: ["ultrathink"],
71 }),129 }),
72 buildSelectOptionDescriptor({130 buildSelectOptionDescriptor({
...@@ -89,13 +147,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [...@@ -89,13 +147,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
89 buildSelectOptionDescriptor({147 buildSelectOptionDescriptor({
90 id: "effort",148 id: "effort",
91 label: "Reasoning",149 label: "Reasoning",
92 options: [150 options: CLAUDE_EFFORT_OPTIONS.opus46,
93 { value: "low", label: "Low" },
94 { value: "medium", label: "Medium" },
95 { value: "high", label: "High", isDefault: true },
96 { value: "max", label: "Max" },
97 { value: "ultrathink", label: "Ultrathink" },
98 ],
99 promptInjectedValues: ["ultrathink"],151 promptInjectedValues: ["ultrathink"],
100 }),152 }),
101 buildBooleanOptionDescriptor({153 buildBooleanOptionDescriptor({
...@@ -122,12 +174,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [...@@ -122,12 +174,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
122 buildSelectOptionDescriptor({174 buildSelectOptionDescriptor({
123 id: "effort",175 id: "effort",
124 label: "Reasoning",176 label: "Reasoning",
125 options: [177 options: CLAUDE_EFFORT_OPTIONS.opus45,
126 { value: "low", label: "Low" },
127 { value: "medium", label: "Medium" },
128 { value: "high", label: "High", isDefault: true },
129 { value: "max", label: "Max" },
130 ],
131 }),178 }),
132 buildBooleanOptionDescriptor({179 buildBooleanOptionDescriptor({
133 id: "fastMode",180 id: "fastMode",
...@@ -145,12 +192,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [...@@ -145,12 +192,7 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
145 buildSelectOptionDescriptor({192 buildSelectOptionDescriptor({
146 id: "effort",193 id: "effort",
147 label: "Reasoning",194 label: "Reasoning",
148 options: [195 options: CLAUDE_EFFORT_OPTIONS.sonnet46,
149 { value: "low", label: "Low" },
150 { value: "medium", label: "Medium" },
151 { value: "high", label: "High", isDefault: true },
152 { value: "ultrathink", label: "Ultrathink" },
153 ],
154 promptInjectedValues: ["ultrathink"],196 promptInjectedValues: ["ultrathink"],
155 }),197 }),
156 buildSelectOptionDescriptor({198 buildSelectOptionDescriptor({
...@@ -179,6 +221,10 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [...@@ -179,6 +221,10 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
179 },221 },
180];222];
181223
224function supportsClaudeOpus48(version: string | null | undefined): boolean {
225 return version ? compareSemverVersions(version, MINIMUM_CLAUDE_OPUS_4_8_VERSION) >= 0 : false;
226}
227
182function supportsClaudeOpus47(version: string | null | undefined): boolean {228function supportsClaudeOpus47(version: string | null | undefined): boolean {
183 return version ? compareSemverVersions(version, MINIMUM_CLAUDE_OPUS_4_7_VERSION) >= 0 : false;229 return version ? compareSemverVersions(version, MINIMUM_CLAUDE_OPUS_4_7_VERSION) >= 0 : false;
184}230}
...@@ -186,10 +232,20 @@ function supportsClaudeOpus47(version: string | null | undefined): boolean {...@@ -186,10 +232,20 @@ function supportsClaudeOpus47(version: string | null | undefined): boolean {
186function getBuiltInClaudeModelsForVersion(232function getBuiltInClaudeModelsForVersion(
187 version: string | null | undefined,233 version: string | null | undefined,
188): ReadonlyArray<ServerProviderModel> {234): ReadonlyArray<ServerProviderModel> {
189 if (supportsClaudeOpus47(version)) {235 return BUILT_IN_MODELS.filter((model) => {
190 return BUILT_IN_MODELS;236 if (model.slug === "claude-opus-4-8") {
191 }237 return supportsClaudeOpus48(version);
192 return BUILT_IN_MODELS.filter((model) => model.slug !== "claude-opus-4-7");238 }
239 if (model.slug === "claude-opus-4-7") {
240 return supportsClaudeOpus47(version);
241 }
242 return true;
243 });
244}
245
246function formatClaudeOpus48UpgradeMessage(version: string | null): string {
247 const versionLabel = version ? `v${version}` : "the installed version";
248 return `Claude Code ${versionLabel} is too old for Claude Opus 4.8. Upgrade to v${MINIMUM_CLAUDE_OPUS_4_8_VERSION} or newer to access it.`;
193}249}
194250
195function formatClaudeOpus47UpgradeMessage(version: string | null): string {251function formatClaudeOpus47UpgradeMessage(version: string | null): string {
...@@ -223,21 +279,34 @@ export function resolveClaudeEffort(...@@ -223,21 +279,34 @@ export function resolveClaudeEffort(
223 * CLI's `--effort` flag.279 * CLI's `--effort` flag.
224 *280 *
225 * Mirrors the mapping used when invoking the Claude Agent SDK281 * Mirrors the mapping used when invoking the Claude Agent SDK
226 * ({@link getEffectiveClaudeAgentEffort} in ClaudeAdapter): the Opus 4.7282 * ({@link getEffectiveClaudeAgentEffort} in ClaudeAdapter): `ultracode` is a
227 * capability `"xhigh"` is rewritten to the accepted CLI value `"max"`, and283 * Claude Code setting that pairs with `xhigh`, `ultrathink` is filtered out
228 * `"ultrathink"` is filtered out because it is a prompt-prefix mode rather284 * because it is a prompt-prefix mode, and older model compatibility mappings
229 * than a CLI-effort value. Returns `undefined` when no flag should be passed.285 * are preserved for current Claude Code behavior.
230 */286 */
231export function normalizeClaudeCliEffort(effort: string | null | undefined): string | undefined {287export function normalizeClaudeCliEffort(
288 effort: string | null | undefined,
289 model: string | null | undefined,
290): string | undefined {
232 if (!effort || effort === "ultrathink") {291 if (!effort || effort === "ultrathink") {
233 return undefined;292 return undefined;
234 }293 }
235 if (effort === "xhigh") {294 if (effort === "ultracode") {
295 return "xhigh";
296 }
297 if (effort === "xhigh" && model !== "claude-opus-4-8") {
236 return "max";298 return "max";
237 }299 }
300 if (effort === "max" && model === "claude-sonnet-4-6") {
301 return "high";
302 }
238 return effort;303 return effort;
239}304}
240305
306export function isClaudeUltracodeEffort(effort: string | null | undefined): boolean {
307 return effort === "ultracode";
308}
309
241export function resolveClaudeApiModelId(modelSelection: ModelSelection): string {310export function resolveClaudeApiModelId(modelSelection: ModelSelection): string {
242 switch (getModelSelectionStringOptionValue(modelSelection, "contextWindow")) {311 switch (getModelSelectionStringOptionValue(modelSelection, "contextWindow")) {
243 case "1m":312 case "1m":
...@@ -617,9 +686,11 @@ export const checkClaudeProviderStatus = Effect.fn("checkClaudeProviderStatus")(...@@ -617,9 +686,11 @@ export const checkClaudeProviderStatus = Effect.fn("checkClaudeProviderStatus")(
617 claudeSettings.customModels,686 claudeSettings.customModels,
618 DEFAULT_CLAUDE_MODEL_CAPABILITIES,687 DEFAULT_CLAUDE_MODEL_CAPABILITIES,
619 );688 );
620 const opus47UpgradeMessage = supportsClaudeOpus47(parsedVersion)689 const versionUpgradeMessage = supportsClaudeOpus48(parsedVersion)
621 ? undefined690 ? undefined
622 : formatClaudeOpus47UpgradeMessage(parsedVersion);691 : supportsClaudeOpus47(parsedVersion)
692 ? formatClaudeOpus48UpgradeMessage(parsedVersion)
693 : formatClaudeOpus47UpgradeMessage(parsedVersion);
623694
624 const capabilities = resolveCapabilities695 const capabilities = resolveCapabilities
625 ? yield* resolveCapabilities(claudeSettings).pipe(Effect.orElseSucceed(() => undefined))696 ? yield* resolveCapabilities(claudeSettings).pipe(Effect.orElseSucceed(() => undefined))
...@@ -663,7 +734,7 @@ export const checkClaudeProviderStatus = Effect.fn("checkClaudeProviderStatus")(...@@ -663,7 +734,7 @@ export const checkClaudeProviderStatus = Effect.fn("checkClaudeProviderStatus")(
663 ...(capabilities.email ? { email: capabilities.email } : {}),734 ...(capabilities.email ? { email: capabilities.email } : {}),
664 ...(authMetadata ? authMetadata : {}),735 ...(authMetadata ? authMetadata : {}),
665 },736 },
666 ...(opus47UpgradeMessage ? { message: opus47UpgradeMessage } : {}),737 ...(versionUpgradeMessage ? { message: versionUpgradeMessage } : {}),
667 },738 },
668 });739 });
669});740});
apps/server/src/textGeneration/ClaudeTextGeneration.ts+4-1
...@@ -37,6 +37,7 @@ import {...@@ -37,6 +37,7 @@ import {
37} from "@t3tools/shared/model";37} from "@t3tools/shared/model";
38import {38import {
39 getClaudeModelCapabilities,39 getClaudeModelCapabilities,
40 isClaudeUltracodeEffort,
40 normalizeClaudeCliEffort,41 normalizeClaudeCliEffort,
41 resolveClaudeApiModelId,42 resolveClaudeApiModelId,
42 resolveClaudeEffort,43 resolveClaudeEffort,
...@@ -132,7 +133,8 @@ export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(fu...@@ -132,7 +133,8 @@ export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(fu
132 const findDescriptor = (id: string) => descriptors.find((descriptor) => descriptor.id === id);133 const findDescriptor = (id: string) => descriptors.find((descriptor) => descriptor.id === id);
133 const rawEffortSelection = getModelSelectionStringOptionValue(modelSelection, "effort");134 const rawEffortSelection = getModelSelectionStringOptionValue(modelSelection, "effort");
134 const resolvedEffort = resolveClaudeEffort(caps, rawEffortSelection);135 const resolvedEffort = resolveClaudeEffort(caps, rawEffortSelection);
135 const cliEffort = normalizeClaudeCliEffort(resolvedEffort);136 const cliEffort = normalizeClaudeCliEffort(resolvedEffort, modelSelection.model);
137 const ultracode = isClaudeUltracodeEffort(resolvedEffort);
136 const thinkingDescriptor = findDescriptor("thinking");138 const thinkingDescriptor = findDescriptor("thinking");
137 const fastModeDescriptor = findDescriptor("fastMode");139 const fastModeDescriptor = findDescriptor("fastMode");
138 const thinking =140 const thinking =
...@@ -142,6 +144,7 @@ export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(fu...@@ -142,6 +144,7 @@ export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(fu
142 const settings = {144 const settings = {
143 ...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}),145 ...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}),
144 ...(fastMode ? { fastMode: true } : {}),146 ...(fastMode ? { fastMode: true } : {}),
147 ...(ultracode ? { ultracode: true } : {}),
145 };148 };
146 const settingsJson =149 const settingsJson =
147 Object.keys(settings).length > 0150 Object.keys(settings).length > 0
bun.lock+19-1
...@@ -55,7 +55,7 @@...@@ -55,7 +55,7 @@
55 "t3": "./dist/bin.mjs",55 "t3": "./dist/bin.mjs",
56 },56 },
57 "dependencies": {57 "dependencies": {
58 "@anthropic-ai/claude-agent-sdk": "^0.2.111",58 "@anthropic-ai/claude-agent-sdk": "^0.3.154",
59 "@effect/platform-bun": "catalog:",59 "@effect/platform-bun": "catalog:",
60 "@effect/platform-node": "catalog:",60 "@effect/platform-node": "catalog:",
61 "@effect/platform-node-shared": "catalog:",61 "@effect/platform-node-shared": "catalog:",
...@@ -304,6 +304,22 @@...@@ -304,6 +304,22 @@
304 "packages": {304 "packages": {
305 "@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.2.111", "", { "dependencies": { "@anthropic-ai/sdk": "^0.81.0", "@modelcontextprotocol/sdk": "^1.29.0" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "^0.34.2", "@img/sharp-darwin-x64": "^0.34.2", "@img/sharp-linux-arm": "^0.34.2", "@img/sharp-linux-arm64": "^0.34.2", "@img/sharp-linux-x64": "^0.34.2", "@img/sharp-linuxmusl-arm64": "^0.34.2", "@img/sharp-linuxmusl-x64": "^0.34.2", "@img/sharp-win32-arm64": "^0.34.2", "@img/sharp-win32-x64": "^0.34.2" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-DwXyJpVL8JXB8L2toSw1by7uIt1p8hPGi0P+hqr5tL+Ae7DcK9O3tUd6XcGown3LZ49zNCUAIpqX3wDmOhqp0Q=="],305 "@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.2.111", "", { "dependencies": { "@anthropic-ai/sdk": "^0.81.0", "@modelcontextprotocol/sdk": "^1.29.0" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "^0.34.2", "@img/sharp-darwin-x64": "^0.34.2", "@img/sharp-linux-arm": "^0.34.2", "@img/sharp-linux-arm64": "^0.34.2", "@img/sharp-linux-x64": "^0.34.2", "@img/sharp-linuxmusl-arm64": "^0.34.2", "@img/sharp-linuxmusl-x64": "^0.34.2", "@img/sharp-win32-arm64": "^0.34.2", "@img/sharp-win32-x64": "^0.34.2" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-DwXyJpVL8JXB8L2toSw1by7uIt1p8hPGi0P+hqr5tL+Ae7DcK9O3tUd6XcGown3LZ49zNCUAIpqX3wDmOhqp0Q=="],
306306
307 "@anthropic-ai/claude-agent-sdk-darwin-arm64": ["@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.154", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oFW3LD5lYrKAU+AKu27Z8hrzqkrh362qQrwi/i3DxGcud9BXUycsXYjShpDj3D3JZu169UzZuSPhx1Wajmbiwg=="],
308
309 "@anthropic-ai/claude-agent-sdk-darwin-x64": ["@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.154", "", { "os": "darwin", "cpu": "x64" }, "sha512-5BgWEueP+cqoctWjZYhCbyltuaV/N2DmKDXD3/69cKaVmJp8XL9OCzlq/HEirA/+Ssjskx6hDUBaOcpuZ3iwQA=="],
310
311 "@anthropic-ai/claude-agent-sdk-linux-arm64": ["@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.154", "", { "os": "linux", "cpu": "arm64" }, "sha512-rRkW4SBL3W7zQvKscCIfIGlmoeuTbMV6dXFbPdmpRGvmYZIs79RpzO6xrGBnnhmm+B7znQ9oHAnffi/2FBgJbA=="],
312
313 "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": ["@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.154", "", { "os": "linux", "cpu": "arm64" }, "sha512-o2bCQN4Xn3UqCLErC5m4T7u0yYArJYmgFCUFnA6K96DdW2RERvx+gTKXxWuHEBkDO+eMoHLHLxk0u2jGES00Ng=="],
314
315 "@anthropic-ai/claude-agent-sdk-linux-x64": ["@anthropic-ai/claude-agent-sdk-linux-x64@0.3.154", "", { "os": "linux", "cpu": "x64" }, "sha512-GpiFF8Ez6PbM3m0gqtCo/FKM346qyRdP7VhbmJzdnbNKTiiUZ66vDQyEUPZPCG24ZkrG4m96KpRIUwY08rHiNg=="],
316
317 "@anthropic-ai/claude-agent-sdk-linux-x64-musl": ["@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.154", "", { "os": "linux", "cpu": "x64" }, "sha512-zA7S8Lm6O4QBsUpbhiOht8BgiXHOBBFUIo8ZLK6r5wAatK3Q44syWVxICeyCnR6wqfnkf3cugCw27ycS6vVgaA=="],
318
319 "@anthropic-ai/claude-agent-sdk-win32-arm64": ["@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.154", "", { "os": "win32", "cpu": "arm64" }, "sha512-cDW1YFbU/PJFlrGXhlAGcbkXt80sEO6WtnH8nN8YHXLn5NWduy2q7o/qC6i8XozgvRGf6t/eMoH7IasGIEDhDw=="],
320
321 "@anthropic-ai/claude-agent-sdk-win32-x64": ["@anthropic-ai/claude-agent-sdk-win32-x64@0.3.154", "", { "os": "win32", "cpu": "x64" }, "sha512-tSKaIIpL72OPg3WfzZTCIl8OJgcbq4qieu8/fDWjsdeQuari9gQMIuEflFphk9HqNsxpSmDqKi8Sm5mW2V566Q=="],
322
307 "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.81.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw=="],323 "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.81.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw=="],
308324
309 "@astrojs/check": ["@astrojs/check@0.9.8", "", { "dependencies": { "@astrojs/language-server": "^2.16.5", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-LDng8446QLS5ToKjRHd3bgUdirvemVVExV7nRyJfW2wV36xuv7vDxwy5NWN9zqeSEDgg0Tv84sP+T3yEq+Zlkw=="],325 "@astrojs/check": ["@astrojs/check@0.9.8", "", { "dependencies": { "@astrojs/language-server": "^2.16.5", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-LDng8446QLS5ToKjRHd3bgUdirvemVVExV7nRyJfW2wV36xuv7vDxwy5NWN9zqeSEDgg0Tv84sP+T3yEq+Zlkw=="],
...@@ -2230,6 +2246,8 @@...@@ -2230,6 +2246,8 @@
22302246
2231 "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="],2247 "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="],
22322248
2249 "t3/@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.3.154", "", { "optionalDependencies": { "@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.154", "@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.154", "@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.154", "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.154", "@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.154", "@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.154", "@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.154", "@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.154" }, "peerDependencies": { "@anthropic-ai/sdk": ">=0.93.0", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" } }, "sha512-iEn25urI2QrMPFIhId3h7v/7EG5gsmF7ooe+6EvsAosePeLmpVVerp5nXtHnlmBkMinLecurcPA+OddKw76jYw=="],
2250
2233 "tsx/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],2251 "tsx/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
22342252
2235 "unrun/rolldown": ["rolldown@1.0.0-rc.9", "", { "dependencies": { "@oxc-project/types": "=0.115.0", "@rolldown/pluginutils": "1.0.0-rc.9" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-x64": "1.0.0-rc.9", "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q=="],2253 "unrun/rolldown": ["rolldown@1.0.0-rc.9", "", { "dependencies": { "@oxc-project/types": "=0.115.0", "@rolldown/pluginutils": "1.0.0-rc.9" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-x64": "1.0.0-rc.9", "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q=="],
packages/contracts/src/model.ts+3-1
...@@ -164,7 +164,9 @@ export const MODEL_SLUG_ALIASES_BY_PROVIDER: Partial<...@@ -164,7 +164,9 @@ export const MODEL_SLUG_ALIASES_BY_PROVIDER: Partial<
164 "gpt-5.3-spark": "gpt-5.3-codex-spark",164 "gpt-5.3-spark": "gpt-5.3-codex-spark",
165 },165 },
166 [CLAUDE_DRIVER_KIND]: {166 [CLAUDE_DRIVER_KIND]: {
167 opus: "claude-opus-4-7",167 opus: "claude-opus-4-8",
168 "opus-4.8": "claude-opus-4-8",
169 "claude-opus-4.8": "claude-opus-4-8",
168 "opus-4.7": "claude-opus-4-7",170 "opus-4.7": "claude-opus-4-7",
169 "claude-opus-4.7": "claude-opus-4-7",171 "claude-opus-4.7": "claude-opus-4-7",
170 "opus-4.6": "claude-opus-4-6",172 "opus-4.6": "claude-opus-4-6",