Skip to content

Commit f5ce56c

Browse files
fix(claude-code): disable native tools and temperature support (#9643)
1 parent b31e755 commit f5ce56c

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

packages/types/src/providers/claude-code.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ export const claudeCodeModels = {
4747
supportsReasoningEffort: false,
4848
supportsReasoningBudget: false,
4949
requiredReasoningBudget: false,
50+
// Claude Code manages its own tools and temperature via the CLI
51+
supportsNativeTools: false,
52+
supportsTemperature: false,
5053
},
5154
"claude-sonnet-4-5-20250929[1m]": {
5255
...anthropicModels["claude-sonnet-4-5"],
@@ -56,6 +59,9 @@ export const claudeCodeModels = {
5659
supportsReasoningEffort: false,
5760
supportsReasoningBudget: false,
5861
requiredReasoningBudget: false,
62+
// Claude Code manages its own tools and temperature via the CLI
63+
supportsNativeTools: false,
64+
supportsTemperature: false,
5965
},
6066
"claude-sonnet-4-20250514": {
6167
...anthropicModels["claude-sonnet-4-20250514"],
@@ -64,6 +70,9 @@ export const claudeCodeModels = {
6470
supportsReasoningEffort: false,
6571
supportsReasoningBudget: false,
6672
requiredReasoningBudget: false,
73+
// Claude Code manages its own tools and temperature via the CLI
74+
supportsNativeTools: false,
75+
supportsTemperature: false,
6776
},
6877
"claude-opus-4-5-20251101": {
6978
...anthropicModels["claude-opus-4-5-20251101"],
@@ -72,6 +81,9 @@ export const claudeCodeModels = {
7281
supportsReasoningEffort: false,
7382
supportsReasoningBudget: false,
7483
requiredReasoningBudget: false,
84+
// Claude Code manages its own tools and temperature via the CLI
85+
supportsNativeTools: false,
86+
supportsTemperature: false,
7587
},
7688
"claude-opus-4-1-20250805": {
7789
...anthropicModels["claude-opus-4-1-20250805"],
@@ -80,6 +92,9 @@ export const claudeCodeModels = {
8092
supportsReasoningEffort: false,
8193
supportsReasoningBudget: false,
8294
requiredReasoningBudget: false,
95+
// Claude Code manages its own tools and temperature via the CLI
96+
supportsNativeTools: false,
97+
supportsTemperature: false,
8398
},
8499
"claude-opus-4-20250514": {
85100
...anthropicModels["claude-opus-4-20250514"],
@@ -88,6 +103,9 @@ export const claudeCodeModels = {
88103
supportsReasoningEffort: false,
89104
supportsReasoningBudget: false,
90105
requiredReasoningBudget: false,
106+
// Claude Code manages its own tools and temperature via the CLI
107+
supportsNativeTools: false,
108+
supportsTemperature: false,
91109
},
92110
"claude-3-7-sonnet-20250219": {
93111
...anthropicModels["claude-3-7-sonnet-20250219"],
@@ -96,6 +114,9 @@ export const claudeCodeModels = {
96114
supportsReasoningEffort: false,
97115
supportsReasoningBudget: false,
98116
requiredReasoningBudget: false,
117+
// Claude Code manages its own tools and temperature via the CLI
118+
supportsNativeTools: false,
119+
supportsTemperature: false,
99120
},
100121
"claude-3-5-sonnet-20241022": {
101122
...anthropicModels["claude-3-5-sonnet-20241022"],
@@ -104,6 +125,9 @@ export const claudeCodeModels = {
104125
supportsReasoningEffort: false,
105126
supportsReasoningBudget: false,
106127
requiredReasoningBudget: false,
128+
// Claude Code manages its own tools and temperature via the CLI
129+
supportsNativeTools: false,
130+
supportsTemperature: false,
107131
},
108132
"claude-3-5-haiku-20241022": {
109133
...anthropicModels["claude-3-5-haiku-20241022"],
@@ -112,6 +136,9 @@ export const claudeCodeModels = {
112136
supportsReasoningEffort: false,
113137
supportsReasoningBudget: false,
114138
requiredReasoningBudget: false,
139+
// Claude Code manages its own tools and temperature via the CLI
140+
supportsNativeTools: false,
141+
supportsTemperature: false,
115142
},
116143
"claude-haiku-4-5-20251001": {
117144
...anthropicModels["claude-haiku-4-5-20251001"],
@@ -120,5 +147,8 @@ export const claudeCodeModels = {
120147
supportsReasoningEffort: false,
121148
supportsReasoningBudget: false,
122149
requiredReasoningBudget: false,
150+
// Claude Code manages its own tools and temperature via the CLI
151+
supportsNativeTools: false,
152+
supportsTemperature: false,
123153
},
124154
} as const satisfies Record<string, ModelInfo>

src/api/providers/claude-code.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,26 @@ import {
66
type ModelInfo,
77
getClaudeCodeModelId,
88
} from "@roo-code/types"
9-
import { type ApiHandler } from ".."
9+
import { type ApiHandler, ApiHandlerCreateMessageMetadata } from ".."
1010
import { ApiStreamUsageChunk, type ApiStream } from "../transform/stream"
1111
import { runClaudeCode } from "../../integrations/claude-code/run"
1212
import { filterMessagesForClaudeCode } from "../../integrations/claude-code/message-filter"
13-
import { BaseProvider } from "./base-provider"
1413
import { t } from "../../i18n"
1514
import { ApiHandlerOptions } from "../../shared/api"
15+
import { countTokens } from "../../utils/countTokens"
1616

17-
export class ClaudeCodeHandler extends BaseProvider implements ApiHandler {
17+
export class ClaudeCodeHandler implements ApiHandler {
1818
private options: ApiHandlerOptions
1919

2020
constructor(options: ApiHandlerOptions) {
21-
super()
2221
this.options = options
2322
}
2423

25-
override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream {
24+
async *createMessage(
25+
systemPrompt: string,
26+
messages: Anthropic.Messages.MessageParam[],
27+
_metadata?: ApiHandlerCreateMessageMetadata,
28+
): ApiStream {
2629
// Filter out image blocks since Claude Code doesn't support them
2730
const filteredMessages = filterMessagesForClaudeCode(messages)
2831

@@ -42,7 +45,7 @@ export class ClaudeCodeHandler extends BaseProvider implements ApiHandler {
4245

4346
// Usage is included with assistant messages,
4447
// but cost is included in the result chunk
45-
let usage: ApiStreamUsageChunk = {
48+
const usage: ApiStreamUsageChunk = {
4649
type: "usage",
4750
inputTokens: 0,
4851
outputTokens: 0,
@@ -121,6 +124,7 @@ export class ClaudeCodeHandler extends BaseProvider implements ApiHandler {
121124
}
122125
}
123126

127+
// Accumulate usage across streaming chunks
124128
usage.inputTokens += message.usage.input_tokens
125129
usage.outputTokens += message.usage.output_tokens
126130
usage.cacheReadTokens = (usage.cacheReadTokens || 0) + (message.usage.cache_read_input_tokens || 0)
@@ -138,7 +142,7 @@ export class ClaudeCodeHandler extends BaseProvider implements ApiHandler {
138142
}
139143
}
140144

141-
getModel() {
145+
getModel(): { id: string; info: ModelInfo } {
142146
const modelId = this.options.apiModelId
143147
if (modelId && modelId in claudeCodeModels) {
144148
const id = modelId as ClaudeCodeModelId
@@ -165,6 +169,13 @@ export class ClaudeCodeHandler extends BaseProvider implements ApiHandler {
165169
}
166170
}
167171

172+
async countTokens(content: Anthropic.Messages.ContentBlockParam[]): Promise<number> {
173+
if (content.length === 0) {
174+
return 0
175+
}
176+
return countTokens(content, { useWorker: true })
177+
}
178+
168179
private attemptParse(str: string) {
169180
try {
170181
return JSON.parse(str)

0 commit comments

Comments
 (0)