| author | |
| committer | |
| log | 83f0cc9e31b8c38cc3ecd3c394f882ce9ee3714f |
| tree | 4ceae078780f5f2c244aa83af5399bb3c31bc851 |
| parent | e6330ead82319d2be53beb5de3aaf4eda0d91a70 |
| signature | Signed by PGP key B5690EEEBB952194 |
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"; |
| 70 | import { makeClaudeEnvironment } from "../Drivers/ClaudeHome.ts"; | 70 | import { makeClaudeEnvironment } from "../Drivers/ClaudeHome.ts"; |
| 71 | import { | 71 | import { |
| 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 | } |
| 257 | 258 | ||
| 258 | function getEffectiveClaudeAgentEffort(effort: string | null | undefined): ClaudeSdkEffort | null { | 259 | function 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 | } |
| 262 | 266 | ||
| ... | @@ -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 = thinkingSupported | 2912 | 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 though | 2933 | // `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 | ...(effectiveEffort | 2935 | ...(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; |
| 51 | const MINIMUM_CLAUDE_OPUS_4_8_VERSION = "2.1.154"; | ||
| 51 | const MINIMUM_CLAUDE_OPUS_4_7_VERSION = "2.1.111"; | 52 | const MINIMUM_CLAUDE_OPUS_4_7_VERSION = "2.1.111"; |
| 53 | |||
| 54 | const 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 | |||
| 52 | const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [ | 94 | const 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 | ]; |
| 181 | 223 | ||
| 224 | function supportsClaudeOpus48(version: string | null | undefined): boolean { | ||
| 225 | return version ? compareSemverVersions(version, MINIMUM_CLAUDE_OPUS_4_8_VERSION) >= 0 : false; | ||
| 226 | } | ||
| 227 | |||
| 182 | function supportsClaudeOpus47(version: string | null | undefined): boolean { | 228 | function 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 { |
| 186 | function getBuiltInClaudeModelsForVersion( | 232 | function 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 | |||
| 246 | function 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 | } |
| 194 | 250 | ||
| 195 | function formatClaudeOpus47UpgradeMessage(version: string | null): string { | 251 | function 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 SDK | 281 | * Mirrors the mapping used when invoking the Claude Agent SDK |
| 226 | * ({@link getEffectiveClaudeAgentEffort} in ClaudeAdapter): the Opus 4.7 | 282 | * ({@link getEffectiveClaudeAgentEffort} in ClaudeAdapter): `ultracode` is a |
| 227 | * capability `"xhigh"` is rewritten to the accepted CLI value `"max"`, and | 283 | * Claude Code setting that pairs with `xhigh`, `ultrathink` is filtered out |
| 228 | * `"ultrathink"` is filtered out because it is a prompt-prefix mode rather | 284 | * 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 | */ |
| 231 | export function normalizeClaudeCliEffort(effort: string | null | undefined): string | undefined { | 287 | export 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 | } |
| 240 | 305 | ||
| 306 | export function isClaudeUltracodeEffort(effort: string | null | undefined): boolean { | ||
| 307 | return effort === "ultracode"; | ||
| 308 | } | ||
| 309 | |||
| 241 | export function resolveClaudeApiModelId(modelSelection: ModelSelection): string { | 310 | export 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 | ? undefined | 690 | ? undefined |
| 622 | : formatClaudeOpus47UpgradeMessage(parsedVersion); | 691 | : supportsClaudeOpus47(parsedVersion) |
| 692 | ? formatClaudeOpus48UpgradeMessage(parsedVersion) | ||
| 693 | : formatClaudeOpus47UpgradeMessage(parsedVersion); | ||
| 623 | 694 | ||
| 624 | const capabilities = resolveCapabilities | 695 | 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"; |
| 38 | import { | 38 | import { |
| 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 > 0 | 150 | 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=="], |
| 306 | 306 | ||
| 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=="], |
| 308 | 324 | ||
| 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 @@ |
| 2230 | 2246 | ||
| 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=="], |
| 2232 | 2248 | ||
| 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=="], |
| 2234 | 2252 | ||
| 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", |