More resiliency

This commit is contained in:
arafatkatze
2025-07-12 07:45:22 -07:00
parent bbf0826875
commit 71c5fd9bf6
5 changed files with 48 additions and 6 deletions
+2 -2
View File
@@ -10,6 +10,7 @@ import { withRetry } from "../retry"
import { AuthService } from "@/services/auth/AuthService"
import OpenAI from "openai"
import { version as extensionVersion } from "../../../package.json"
import { shouldSkipReasoningForModel } from "@utils/model-utils"
interface ClineHandlerOptions {
taskId?: string
@@ -128,8 +129,7 @@ export class ClineHandler implements ApiHandler {
// Reasoning tokens are returned separately from the content
// Skip reasoning content for Grok 4 models since it only displays "thinking" without providing useful information
const shouldSkipGrok4 = this.options.openRouterModelId && this.options.openRouterModelId.includes("grok-4")
if ("reasoning" in delta && delta.reasoning && !shouldSkipGrok4) {
if ("reasoning" in delta && delta.reasoning && !shouldSkipReasoningForModel(this.options.openRouterModelId)) {
yield {
type: "reasoning",
// @ts-ignore-next-line
+3 -3
View File
@@ -8,6 +8,7 @@ import { withRetry } from "../retry"
import { createOpenRouterStream } from "../transform/openrouter-stream"
import { ApiStream, ApiStreamUsageChunk } from "../transform/stream"
import { OpenRouterErrorResponse } from "./types"
import { shouldSkipReasoningForModel } from "@utils/model-utils"
interface OpenRouterHandlerOptions {
openRouterApiKey?: string
@@ -111,10 +112,9 @@ export class OpenRouterHandler implements ApiHandler {
}
}
// Skip reasoning content for Grok 4 models since it only displays "thinking" without providing useful information
const shouldSkipGrok4 = this.options.openRouterModelId && this.options.openRouterModelId.includes("grok-4")
// Reasoning tokens are returned separately from the content
if ("reasoning" in delta && delta.reasoning && !shouldSkipGrok4) {
// Skip reasoning content for Grok 4 models since it only displays "thinking" without providing useful information
if ("reasoning" in delta && delta.reasoning && !shouldSkipReasoningForModel(this.options.openRouterModelId)) {
yield {
type: "reasoning",
// @ts-ignore-next-line
+2 -1
View File
@@ -6,6 +6,7 @@ import { convertToOpenAiMessages } from "@api/transform/openai-format"
import { ApiStream } from "@api/transform/stream"
import { ChatCompletionReasoningEffort } from "openai/resources/chat/completions"
import { withRetry } from "../retry"
import { shouldSkipReasoningForModel } from "@utils/model-utils"
interface XAIHandlerOptions {
xaiApiKey?: string
@@ -71,7 +72,7 @@ export class XAIHandler implements ApiHandler {
if (delta && "reasoning_content" in delta && delta.reasoning_content) {
// Skip reasoning content for Grok 4 models since it only displays "thinking" without providing useful information
if (!modelId.includes("grok-4")) {
if (!shouldSkipReasoningForModel(modelId)) {
yield {
type: "reasoning",
// @ts-ignore-next-line
+30
View File
@@ -0,0 +1,30 @@
import { describe, it } from "mocha"
import "should"
import { shouldSkipReasoningForModel } from "../model-utils"
describe("shouldSkipReasoningForModel", () => {
it("should return true for grok-4 models", () => {
shouldSkipReasoningForModel("grok-4").should.equal(true)
shouldSkipReasoningForModel("x-ai/grok-4").should.equal(true)
shouldSkipReasoningForModel("openrouter/grok-4-turbo").should.equal(true)
shouldSkipReasoningForModel("some-provider/grok-4-mini").should.equal(true)
})
it("should return false for non-grok-4 models", () => {
shouldSkipReasoningForModel("grok-3").should.equal(false)
shouldSkipReasoningForModel("grok-2").should.equal(false)
shouldSkipReasoningForModel("claude-3-sonnet").should.equal(false)
shouldSkipReasoningForModel("gpt-4").should.equal(false)
shouldSkipReasoningForModel("gemini-pro").should.equal(false)
})
it("should return false for undefined or empty model IDs", () => {
shouldSkipReasoningForModel(undefined).should.equal(false)
shouldSkipReasoningForModel("").should.equal(false)
})
it("should be case sensitive", () => {
shouldSkipReasoningForModel("GROK-4").should.equal(false)
shouldSkipReasoningForModel("Grok-4").should.equal(false)
})
})
+11
View File
@@ -13,3 +13,14 @@ export function isGemini2dot5ModelFamily(api: ApiHandler): boolean {
const modelId = model.id
return modelId.includes("gemini-2.5")
}
/**
* Determines if reasoning content should be skipped for a given model
* Currently skips reasoning for Grok-4 models since they only display "thinking" without useful information
*/
export function shouldSkipReasoningForModel(modelId?: string): boolean {
if (!modelId) {
return false
}
return modelId.includes("grok-4")
}