mirror of
https://github.com/cline/cline.git
synced 2026-09-04 11:44:01 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 40da2d6d0c | |||
| c42f6aed2d | |||
| e8fb3c7199 |
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Migrated updateSettings to protos, removed didUpdateSettings, altered Plan/Act toggling in settings menu
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Fixed issue where telemetry warning popup was created for every new Cline window
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": minor
|
||||
---
|
||||
|
||||
Prioritize active files in file context menu
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
toggleWorkflow protobus migration
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Added promise to task init to prevent race condition with checkpoints
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Spring cleaning
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Add free grok model
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"claude-dev": patch
|
||||
---
|
||||
|
||||
Remove ‘-beta’ from grok model id
|
||||
@@ -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
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": minor
|
||||
---
|
||||
|
||||
Context menu is default to File option on start up
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"claude-dev": minor
|
||||
---
|
||||
|
||||
Migrate fetchLatestServersFromHub to protobus
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Generated
+2
-2
@@ -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
@@ -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"
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user