Compare commits

...

3 Commits

Author SHA1 Message Date
0xtoshii 40da2d6d0c replay 2025-06-09 22:56:53 -07:00
Saoud Rizwan c42f6aed2d Remove ‘-beta’ from grok model id (#4124)
* Remove ‘-beta’ from grok model id

* Create purple-islands-move.md
2025-06-09 18:31:01 -07:00
github-actions[bot] e8fb3c7199 v3.17.12 Release Notes
* changeset version bump

* Updating CHANGELOG.md format

* Update CHANGELOG.md for version 3.17.12

* changelog language

* changelog language

* attribution

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Cline Evaluation <cline@example.com>
2025-06-09 16:31:39 -07:00
25 changed files with 84 additions and 79 deletions
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Migrated updateSettings to protos, removed didUpdateSettings, altered Plan/Act toggling in settings menu
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Fixed issue where telemetry warning popup was created for every new Cline window
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": minor
---
Prioritize active files in file context menu
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
toggleWorkflow protobus migration
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Added promise to task init to prevent race condition with checkpoints
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Spring cleaning
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Add free grok model
+5
View File
@@ -0,0 +1,5 @@
---
"claude-dev": patch
---
Remove -beta from grok model id
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": patch
---
Fix bug where replace_in_file would not be able to handle for out-of-order SEARCH/REPLACE blocks
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": minor
---
Context menu is default to File option on start up
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": minor
---
Migrate fetchLatestServersFromHub to protobus
-5
View File
@@ -1,5 +0,0 @@
---
"claude-dev": minor
---
the response of the mcps is displayed with a collapsible which allows to focus on the model responses.
+9
View File
@@ -1,5 +1,14 @@
# Changelog
## [3.17.12]
- **Free Grok Model Available!** Access Grok 3 completely free through the Cline provider
- Add collapsible MCP response panels to keep conversations focused on the main AI responses while still allowing access to detailed MCP output (Thanks @valinha!)
- Prioritize active files (open tabs) at the top of the file context menu when using @ mentions (Thanks @abeatrix!)
- Fix context menu to properly default to "File" option instead of incorrectly selecting "Git Commits"
- Fix diff editing to handle out-of-order SEARCH/REPLACE blocks, improving reliability with models that don't follow strict ordering
- Fix telemetry warning popup appearing repeatedly for users who have telemetry disabled
## [3.17.11]
- Add support for Gemini 2.5 Pro Preview 06-05 model to Vertex AI and Google Gemini providers
+5
View File
@@ -13,6 +13,7 @@ interface RunDiffEvalOptions {
verbose: boolean
testPath: string
outputPath: string
replay: boolean
}
export async function runDiffEvalHandler(options: RunDiffEvalOptions) {
@@ -50,6 +51,10 @@ export async function runDiffEvalHandler(options: RunDiffEvalOptions) {
args.push("--parallel")
}
if (options.replay) {
args.push("--replay")
}
if (options.verbose) {
args.push("--verbose")
}
+1
View File
@@ -91,6 +91,7 @@ program
.option("--diff-edit-function <name>", "The diff editing function to use", "constructNewFileContentV2")
.option("--thinking-budget <tokens>", "Set the thinking tokens budget", "0")
.option("--parallel", "Run tests in parallel", false)
.option("--replay", "Run evaluation from a pre-recorded LLM output, skipping the API call", false)
.option("-v, --verbose", "Enable verbose logging", false)
.action(async (options) => {
try {
+19 -10
View File
@@ -114,10 +114,10 @@ export async function runSingleEvaluation(input: TestInput): Promise<TestResult>
parsingFunction,
diffEditFunction,
thinkingBudgetTokens,
originalDiffEditToolCallMessage,
} = input
const requiredParams = {
apiKey,
systemPrompt,
messages,
modelId,
@@ -163,17 +163,26 @@ export async function runSingleEvaluation(input: TestInput): Promise<TestResult>
},
}
const openRouterHandler = new OpenRouterHandler(options)
// Get the output of streaming output of this llm call
let streamResult: StreamResult
try {
streamResult = await processStream(openRouterHandler, systemPrompt, messages)
} catch (error: any) {
return {
success: false,
error: "llm_stream_error",
errorString: error.message || error.toString(),
if (originalDiffEditToolCallMessage !== undefined) {
// Replay mode: mock the stream result
streamResult = {
assistantMessage: originalDiffEditToolCallMessage,
reasoningMessage: "",
usage: { inputTokens: 0, outputTokens: 0, cacheWriteTokens: 0, cacheReadTokens: 0, totalCost: 0 },
}
} else {
// Live mode: existing API call logic
try {
const openRouterHandler = new OpenRouterHandler(options)
streamResult = await processStream(openRouterHandler, systemPrompt, messages)
} catch (error: any) {
return {
success: false,
error: "llm_stream_error",
errorString: error.message || error.toString(),
}
}
}
+22 -6
View File
@@ -22,12 +22,14 @@ const systemPromptGeneratorLookup: Record<string, ConstructSystemPromptFn> = {
type TestResultSet = { [test_id: string]: (TestResult & { test_id?: string })[] }
class NodeTestRunner {
private apiKey: string
private apiKey: string | undefined
constructor() {
this.apiKey = process.env.OPENROUTER_API_KEY!
if (!this.apiKey) {
throw new Error("OPENROUTER_API_KEY environment variable not set")
constructor(isReplay: boolean) {
if (!isReplay) {
this.apiKey = process.env.OPENROUTER_API_KEY
if (!this.apiKey) {
throw new Error("OPENROUTER_API_KEY environment variable not set for a non-replay run.")
}
}
}
@@ -125,6 +127,14 @@ class NodeTestRunner {
* Run a single test example
*/
async runSingleTest(testCase: ProcessedTestCase, testConfig: TestConfig): Promise<TestResult> {
if (testConfig.replay && !testCase.original_diff_edit_tool_call_message) {
return {
success: false,
error: "missing_original_diff_edit_tool_call_message",
errorString: `Test case ${testCase.test_id} is missing 'original_diff_edit_tool_call_message' for replay.`,
}
}
const customSystemPrompt = this.constructSystemPrompt(testCase.system_prompt_details, testConfig.system_prompt_name)
// messages don't include system prompt and are everything up to the first replace_in_file tool call which results in a diff edit error
@@ -138,6 +148,7 @@ class NodeTestRunner {
parsingFunction: testConfig.parsing_function,
diffEditFunction: testConfig.diff_edit_function,
thinkingBudgetTokens: testConfig.thinking_tokens_budget,
originalDiffEditToolCallMessage: testConfig.replay ? testCase.original_diff_edit_tool_call_message : undefined,
}
return await runSingleEvaluation(input)
@@ -320,6 +331,7 @@ async function main() {
.option("--diff-edit-function <name>", "The diff editing function to use", "constructNewFileContentV2")
.option("--thinking-budget <tokens>", "Set the thinking tokens budget", "0")
.option("--parallel", "Run tests in parallel", false)
.option("--replay", "Run evaluation from a pre-recorded LLM output, skipping the API call", false)
.option("-v, --verbose", "Enable verbose logging", false)
program.parse(process.argv)
@@ -336,12 +348,13 @@ async function main() {
parsing_function: options.parsingFunction,
diff_edit_function: options.diffEditFunction,
thinking_tokens_budget: parseInt(options.thinkingBudget, 10),
replay: options.replay,
}
try {
const startTime = Date.now()
const runner = new NodeTestRunner()
const runner = new NodeTestRunner(testConfig.replay)
const testCases = runner.loadTestCases(testPath)
const processedTestCases: ProcessedTestCase[] = testCases.map((tc) => ({
@@ -351,6 +364,9 @@ async function main() {
log(isVerbose, `-Loaded ${testCases.length} test cases.`)
log(isVerbose, `-Executing ${testConfig.number_of_runs} run(s) per test case.`)
if (testConfig.replay) {
log(isVerbose, `-Running in REPLAY mode. No API calls will be made.`)
}
log(isVerbose, "Starting tests...\n")
const results = options.parallel
+5 -1
View File
@@ -13,6 +13,7 @@ export interface ProcessedTestCase {
file_contents: string
file_path: string
system_prompt_details: SystemPromptDetails
original_diff_edit_tool_call_message: string
}
export interface TestCase {
@@ -21,6 +22,7 @@ export interface TestCase {
file_contents: string
file_path: string
system_prompt_details: SystemPromptDetails
original_diff_edit_tool_call_message: string
}
export interface TestConfig {
@@ -30,6 +32,7 @@ export interface TestConfig {
parsing_function: string
diff_edit_function: string
thinking_tokens_budget: number
replay: boolean
}
export interface SystemPromptDetails {
@@ -72,7 +75,7 @@ export interface ExtractedToolCall {
}
export interface TestInput {
apiKey: string
apiKey?: string
systemPrompt: string
messages: Anthropic.Messages.MessageParam[]
modelId: string
@@ -81,4 +84,5 @@ export interface TestInput {
parsingFunction: string
diffEditFunction: string
thinkingBudgetTokens: number
originalDiffEditToolCallMessage?: string
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "claude-dev",
"version": "3.17.11",
"version": "3.17.12",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "claude-dev",
"version": "3.17.11",
"version": "3.17.12",
"license": "Apache-2.0",
"dependencies": {
"@anthropic-ai/bedrock-sdk": "^0.12.4",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "claude-dev",
"displayName": "Cline",
"description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.",
"version": "3.17.11",
"version": "3.17.12",
"icon": "assets/icons/icon.png",
"engines": {
"vscode": "^1.84.0"
+4 -1
View File
@@ -134,7 +134,10 @@ export class ClineHandler implements ApiHandler {
}
getModel(): { id: string; info: ModelInfo } {
const modelId = this.options.openRouterModelId
let modelId = this.options.openRouterModelId
if (modelId === "x-ai/grok-3") {
modelId = "x-ai/grok-3-beta"
}
const modelInfo = this.options.openRouterModelInfo
if (modelId && modelInfo) {
return { id: modelId, info: modelInfo }
+4 -1
View File
@@ -139,7 +139,10 @@ export class OpenRouterHandler implements ApiHandler {
}
getModel(): { id: string; info: ModelInfo } {
const modelId = this.options.openRouterModelId
let modelId = this.options.openRouterModelId
if (modelId === "x-ai/grok-3") {
modelId = "x-ai/grok-3-beta"
}
const modelInfo = this.options.openRouterModelInfo
if (modelId && modelInfo) {
return { id: modelId, info: modelInfo }
@@ -117,6 +117,11 @@ export async function refreshOpenRouterModels(
break
}
// add new model id
if (rawModel.id === "x-ai/grok-3-beta") {
models["x-ai/grok-3"] = modelInfo
}
models[rawModel.id] = modelInfo
}
} else {
@@ -2577,7 +2577,7 @@ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration):
// TODO: remove this once we have a better way to handle free models on Cline
// Free grok 3 promotion
selectedModelInfo:
openRouterModelId === "x-ai/grok-3-beta"
openRouterModelId === "x-ai/grok-3"
? { ...openRouterModelInfo, inputPrice: 0, outputPrice: 0 }
: openRouterModelInfo,
}
@@ -52,7 +52,7 @@ const featuredModels = [
label: "Trending",
},
{
id: "x-ai/grok-3-beta",
id: "x-ai/grok-3",
description: "Latest flagship model from xAI, free for now!",
label: "Free",
},