fix qwq model in openai provider (#1940)

* feat: Add the openAiR1FormatEnabled field to enable this switch in OpenAI compatible mode to support the current QWQ and future additional classes of R1 models.

* feat: Add the openAiR1FormatEnabled field to enable this switch in OpenAI compatible mode to support the current QWQ and future additional classes of R1 models.

* fix: add miss i18n

* fix: add miss i18n

* fix: remove the redundant call

---------

Co-authored-by: xiong <yueminxiong.xym@alibaba-inc.com>
This commit is contained in:
teddyOOXX 2025-03-24 22:14:44 +08:00 committed by GitHub
parent e8d6a552b3
commit cc2420ea1a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 241 additions and 177 deletions

View file

@ -0,0 +1,5 @@
---
"roo-cline": patch
---
Add the openAiR1FormatEnabled field to enable this switch in OpenAI compatible mode to support the current QWQ and future additional classes of R1 models.

View file

@ -63,10 +63,9 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl
const modelInfo = this.getModel().info
const modelUrl = this.options.openAiBaseUrl ?? ""
const modelId = this.options.openAiModelId ?? ""
const deepseekReasoner = modelId.includes("deepseek-reasoner")
const enabledR1Format = this.options.openAiR1FormatEnabled ?? false
const deepseekReasoner = modelId.includes("deepseek-reasoner") || enabledR1Format
const ark = modelUrl.includes(".volces.com")
if (modelId.startsWith("o3-mini")) {
yield* this.handleO3FamilyMessage(modelId, systemPrompt, messages)
return

View file

@ -2142,7 +2142,6 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
await this.configManager.setModeConfig(mode, config.id)
}
}
await this.contextProxy.setApiConfiguration(apiConfiguration)
if (this.getCurrentCline()) {

View file

@ -200,6 +200,7 @@ export type GlobalStateKey =
| "modelMaxThinkingTokens"
| "azureApiVersion"
| "openAiStreamingEnabled"
| "openAiR1FormatEnabled"
| "openRouterModelId"
| "openRouterModelInfo"
| "openRouterBaseUrl"

View file

@ -48,6 +48,7 @@ export interface ApiHandlerOptions {
vertexRegion?: string
openAiBaseUrl?: string
openAiApiKey?: string
openAiR1FormatEnabled?: boolean
openAiModelId?: string
openAiCustomModelInfo?: ModelInfo
openAiUseAzure?: boolean
@ -127,6 +128,7 @@ export const API_CONFIG_KEYS: GlobalStateKey[] = [
"azureApiVersion",
"openRouterUseMiddleOutTransform",
"openAiStreamingEnabled",
"openAiR1FormatEnabled",
// "deepSeekBaseUrl", // not exist on GlobalStateKey
// "includeMaxTokens", // not exist on GlobalStateKey
"unboundModelId",

View file

@ -68,6 +68,7 @@ export const GLOBAL_STATE_KEYS = [
"modelMaxThinkingTokens",
"azureApiVersion",
"openAiStreamingEnabled",
"openAiR1FormatEnabled",
"openRouterModelId",
"openRouterModelInfo",
"openRouterBaseUrl",

View file

@ -55,6 +55,7 @@ import { TemperatureControl } from "./TemperatureControl"
import { validateApiConfiguration, validateModelId, validateBedrockArn } from "@/utils/validate"
import { ApiErrorMessage } from "./ApiErrorMessage"
import { ThinkingBudget } from "./ThinkingBudget"
import { R1FormatSetting } from "./R1FormatSetting"
interface ApiOptionsProps {
uriScheme: string | undefined
@ -104,7 +105,6 @@ const ApiOptions = ({
!!apiConfiguration?.googleGeminiBaseUrl,
)
const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false)
const noTransform = <T,>(value: T) => value
const inputEventTransform = <E,>(event: E) => (event as { target: HTMLInputElement })?.target?.value as any
@ -696,6 +696,10 @@ const ApiOptions = ({
serviceName="OpenAI"
serviceUrl="https://platform.openai.com"
/>
<R1FormatSetting
onChange={handleInputChange("openAiR1FormatEnabled", noTransform)}
openAiR1FormatEnabled={apiConfiguration?.openAiR1FormatEnabled ?? false}
/>
<Checkbox
checked={apiConfiguration?.openAiStreamingEnabled ?? true}
onChange={handleInputChange("openAiStreamingEnabled", noTransform)}>

View file

@ -0,0 +1,25 @@
import { Checkbox } from "vscrui"
import { useAppTranslation } from "@/i18n/TranslationContext"
interface R1FormatSettingProps {
onChange: (value: boolean) => void
openAiR1FormatEnabled?: boolean
}
export const R1FormatSetting = ({ onChange, openAiR1FormatEnabled }: R1FormatSettingProps) => {
const { t } = useAppTranslation()
return (
<div>
<div className="flex items-center gap-2">
<Checkbox checked={openAiR1FormatEnabled} onChange={onChange}>
<span className="font-medium">{t("settings:modelInfo.enableR1Format")}</span>
</Checkbox>
</div>
<p className="text-vscode-descriptionForeground text-sm mt-0">
{t("settings:modelInfo.enableR1FormatTips")}
</p>
</div>
)
}

View file

@ -136,7 +136,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
// Make sure apiConfiguration is initialized and managed by SettingsView.
const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration])
useEffect(() => {
// Update only when currentApiConfigName is changed.
// Expected to be triggered by loadApiConfiguration/upsertApiConfiguration.
@ -168,7 +167,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
}
setChangeDetected(true)
return { ...prevState, apiConfiguration: { ...prevState.apiConfiguration, [field]: value } }
})
},

View file

@ -349,13 +349,15 @@
"outputPrice": "Preu de sortida",
"cacheReadsPrice": "Preu de lectures de caché",
"cacheWritesPrice": "Preu d'escriptures de caché",
"enableStreaming": "Habilitar streaming",
"enableR1Format": "Activar els paràmetres del model R1",
"enableR1FormatTips": "S'ha d'activat quan s'utilitzen models R1 com el QWQ per evitar errors 400",
"useAzure": "Utilitzar Azure",
"azureApiVersion": "Establir versió de l'API d'Azure",
"gemini": {
"freeRequests": "* Gratuït fins a {{count}} sol·licituds per minut. Després d'això, la facturació depèn de la mida del prompt.",
"pricingDetails": "Per a més informació, consulteu els detalls de preus."
},
"enableStreaming": "Habilitar streaming",
"useAzure": "Utilitzar Azure",
"azureApiVersion": "Establir versió de l'API d'Azure"
}
},
"modelPicker": {
"automaticFetch": "L'extensió obté automàticament la llista més recent de models disponibles a <serviceLink>{{serviceName}}</serviceLink>. Si no esteu segur de quin model triar, Roo Code funciona millor amb <defaultModelLink>{{defaultModelId}}</defaultModelLink>. També podeu cercar \"free\" per a opcions gratuïtes actualment disponibles.",

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Cache-Lesepreis",
"cacheWritesPrice": "Cache-Schreibpreis",
"enableStreaming": "Streaming aktivieren",
"enableR1Format": "R1-Modellparameter aktivieren",
"enableR1FormatTips": "Muss aktiviert werden, wenn R1-Modelle wie QWQ verwendet werden, um 400-Fehler zu vermeiden",
"useAzure": "Azure verwenden",
"azureApiVersion": "Azure API-Version festlegen",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Cache reads price",
"cacheWritesPrice": "Cache writes price",
"enableStreaming": "Enable streaming",
"enableR1Format": "Enable R1 model parameters",
"enableR1FormatTips": "Must be enabled when using R1 models such as QWQ to prevent 400 errors",
"useAzure": "Use Azure",
"azureApiVersion": "Set Azure API version",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Precio de lecturas de caché",
"cacheWritesPrice": "Precio de escrituras de caché",
"enableStreaming": "Habilitar streaming",
"enableR1Format": "Habilitar parámetros del modelo R1",
"enableR1FormatTips": "Debe habilitarse al utilizar modelos R1 como QWQ, para evitar el error 400",
"useAzure": "Usar Azure",
"azureApiVersion": "Establecer versión de API de Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Prix des lectures de cache",
"cacheWritesPrice": "Prix des écritures de cache",
"enableStreaming": "Activer le streaming",
"enableR1Format": "Activer les paramètres du modèle R1",
"enableR1FormatTips": "Doit être activé lors de l'utilisation de modèles R1 tels que QWQ, pour éviter l'erreur 400",
"useAzure": "Utiliser Azure",
"azureApiVersion": "Définir la version de l'API Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "कैश रीड्स मूल्य",
"cacheWritesPrice": "कैश राइट्स मूल्य",
"enableStreaming": "स्ट्रीमिंग सक्षम करें",
"enableR1Format": "R1 मॉडल पैरामीटर सक्षम करें",
"enableR1FormatTips": "QWQ जैसी R1 मॉडलों का उपयोग करते समय इसे सक्षम करना आवश्यक है, ताकि 400 त्रुटि से बचा जा सके",
"useAzure": "Azure का उपयोग करें",
"azureApiVersion": "Azure API संस्करण सेट करें",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Prezzo letture cache",
"cacheWritesPrice": "Prezzo scritture cache",
"enableStreaming": "Abilita streaming",
"enableR1Format": "Abilita i parametri del modello R1",
"enableR1FormatTips": "Deve essere abilitato quando si utilizzano modelli R1 come QWQ, per evitare l'errore 400",
"useAzure": "Usa Azure",
"azureApiVersion": "Imposta versione API Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "キャッシュ読み取り価格",
"cacheWritesPrice": "キャッシュ書き込み価格",
"enableStreaming": "ストリーミングを有効化",
"enableR1Format": "R1モデルパラメータを有効にする",
"enableR1FormatTips": "QWQなどのR1モデルを使用する際には、有効にする必要があります。400エラーを防ぐために",
"useAzure": "Azureを使用",
"azureApiVersion": "Azure APIバージョンを設定",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "캐시 읽기 가격",
"cacheWritesPrice": "캐시 쓰기 가격",
"enableStreaming": "스트리밍 활성화",
"enableR1Format": "R1 모델 매개변수 활성화",
"enableR1FormatTips": "QWQ와 같은 R1 모델을 사용할 때 활성화해야 하며, 400 오류를 방지합니다",
"useAzure": "Azure 사용",
"azureApiVersion": "Azure API 버전 설정",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Cena odczytów bufora",
"cacheWritesPrice": "Cena zapisów bufora",
"enableStreaming": "Włącz strumieniowanie",
"enableR1Format": "Włącz parametry modelu R1",
"enableR1FormatTips": "Należy włączyć podczas korzystania z modeli R1, takich jak QWQ, aby uniknąć błędu 400",
"useAzure": "Użyj Azure",
"azureApiVersion": "Ustaw wersję API Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Preço de leituras de cache",
"cacheWritesPrice": "Preço de escritas de cache",
"enableStreaming": "Ativar streaming",
"enableR1Format": "Ativar parâmetros do modelo R1",
"enableR1FormatTips": "Deve ser ativado ao usar modelos R1 como QWQ, para evitar erro 400",
"useAzure": "Usar Azure",
"azureApiVersion": "Definir versão da API Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Önbellek okuma fiyatı",
"cacheWritesPrice": "Önbellek yazma fiyatı",
"enableStreaming": "Akışı etkinleştir",
"enableR1Format": "R1 model parametrelerini etkinleştir",
"enableR1FormatTips": "QWQ gibi R1 modelleri kullanıldığında etkinleştirilmelidir, 400 hatası alınmaması için",
"useAzure": "Azure kullan",
"azureApiVersion": "Azure API sürümünü ayarla",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "Giá đọc bộ nhớ đệm",
"cacheWritesPrice": "Giá ghi bộ nhớ đệm",
"enableStreaming": "Bật streaming",
"enableR1Format": "Kích hoạt tham số mô hình R1",
"enableR1FormatTips": "Cần kích hoạt khi sử dụng các mô hình R1 như QWQ, để tránh lỗi 400",
"useAzure": "Sử dụng Azure",
"azureApiVersion": "Đặt phiên bản API Azure",
"gemini": {

View file

@ -350,6 +350,8 @@
"cacheReadsPrice": "缓存读取价格",
"cacheWritesPrice": "缓存写入价格",
"enableStreaming": "启用流式传输",
"enableR1Format": "启用R1模型传参",
"enableR1FormatTips": "当使用QWQ等类R1模型时需启用防止报400错误",
"useAzure": "使用 Azure 服务",
"azureApiVersion": "设置 Azure API 版本",
"gemini": {

View file

@ -9,22 +9,22 @@
"header": {
"title": "設定",
"saveButtonTooltip": "儲存變更",
"nothingChangedTooltip": "沒有變更",
"doneButtonTooltip": "捨棄未儲存的變更並關閉設定面板"
"nothingChangedTooltip": "無任何變更",
"doneButtonTooltip": "取消未保存的變更並關閉設定面板"
},
"unsavedChangesDialog": {
"title": "未存的變更",
"description": "是否捨棄變更並繼續?",
"title": "未存的變更",
"description": "是否要取消變更並繼續?",
"cancelButton": "取消",
"discardButton": "捨棄變更"
"discardButton": "取消變更"
},
"sections": {
"providers": "提供者",
"autoApprove": "自動准",
"browser": "瀏覽器 / 電腦使用",
"autoApprove": "自動准",
"browser": "瀏覽器/電腦使用",
"checkpoints": "檢查點",
"notifications": "通知",
"contextManagement": "內容管理",
"contextManagement": "上下文管理",
"terminal": "終端機",
"advanced": "進階",
"experimental": "實驗性功能",
@ -32,75 +32,75 @@
"about": "關於 Roo Code"
},
"autoApprove": {
"description": "允許 Roo 自動執行操作而無需核准。僅在您完全信任 AI 並理解相關安全風險的情況下啟用這些設定。",
"description": "允許 Roo 無需批准即執行操作。僅在您完全信任 AI 並了解相關安全風險時啟用這些設定。",
"readOnly": {
"label": "始終核准唯讀操作",
"description": "啟用後Roo 將自動檢視目錄內容並讀取檔案,無需點擊核准按鈕。"
"label": "始終批准只讀操作",
"description": "啟用後Roo 將自動查看目錄內容和讀取文件,無需點擊批准按鈕。"
},
"write": {
"label": "始終准寫入操作",
"description": "自動建立和編輯檔案而無需核准",
"delayLabel": "寫入後延遲以允許診斷測潛在問題"
"label": "始終准寫入操作",
"description": "自動建立和編輯文件而無需批准",
"delayLabel": "寫入後延遲以允許診斷測潛在問題"
},
"browser": {
"label": "始終准瀏覽器操作",
"description": "自動執行瀏覽器操作而無需准",
"note": "注意:僅當模型支援電腦使用時適用"
"label": "始終准瀏覽器操作",
"description": "自動執行瀏覽器操作而無需准",
"note": "注意:僅適用於模型支援電腦使用時"
},
"retry": {
"label": "始終重試失敗的 API 請求",
"description": "當伺服器傳回錯誤回應時自動重試失敗的 API 請求",
"description": "當伺服器返回錯誤響應時自動重試失敗的 API 請求",
"delayLabel": "重試請求前的延遲"
},
"mcp": {
"label": "始終准 MCP 工具",
"description": "在 MCP 伺服器檢視中啟用個別 MCP 工具的自動核准(需要此設定和工具的\"始終允許\"核取方塊"
"label": "始終准 MCP 工具",
"description": "在 MCP 伺服器檢視中啟用單個 MCP 工具的自動批准(需要此設定和工具的「始終允許」核取方框"
},
"modeSwitch": {
"label": "始終准模式切換",
"description": "自動在不同模式之間切換而無需准"
"label": "始終准模式切換",
"description": "自動在不同模式之間切換而無需准"
},
"subtasks": {
"label": "始終核准子任務的建立和完成",
"description": "允許建立和完成子任務而無需准"
"label": "始終批准子任務的建立與完成",
"description": "允許建立和完成子任務而無需准"
},
"execute": {
"label": "始終准允許的執行操作",
"description": "自動執行允許的終端機命令而無需核准",
"allowedCommands": "允許的自動執行命令",
"allowedCommandsDescription": "當\"始終核准執行操作\"啟用時可以自動執行的命令前綴。添加 * 以允許所有命令(謹慎使用)。",
"commandPlaceholder": "輸入命令前綴(例如 'git '",
"label": "始終准允許的執行操作",
"description": "自動執行允許的終端機指令而無需批准",
"allowedCommands": "允許自動執行的指令",
"allowedCommandsDescription": "當「始終批准執行操作」啟用時可自動執行的指令前綴。加入 * 以允許所有指令(謹慎使用)。",
"commandPlaceholder": "輸入指令前綴例如git ",
"addButton": "新增"
}
},
"providers": {
"configProfile": "設定檔",
"configProfile": "配置設定檔",
"description": "儲存不同的 API 設定以快速切換提供者和設定。",
"apiProvider": "API 提供者",
"model": "模型",
"nameEmpty": "名稱不為空",
"nameEmpty": "名稱不為空",
"nameExists": "已存在同名的設定檔",
"deleteProfile": "刪除設定檔",
"invalidArnFormat": "無效的 ARN 格式。請檢查上面的範例。",
"invalidArnFormat": "ARN 格式無效。請檢查上方示例。",
"enterNewName": "輸入新名稱",
"addProfile": "新增設定檔",
"renameProfile": "重新命名設定檔",
"newProfile": "新設定檔",
"newProfile": "新配置設定檔",
"enterProfileName": "輸入設定檔名稱",
"createProfile": "建立設定檔",
"cannotDeleteOnlyProfile": "無法刪除唯一的設定檔",
"vscodeLmDescription": "VS Code 語言模型 API 允許您運行其他 VS Code 擴展提供的模型(包括但不限於 GitHub Copilot。最簡單的方式是從 VS Code Marketplace 安裝 Copilot 和 Copilot Chat 擴展。",
"awsCustomArnUse": "輸入要使用的模型有效 AWS Bedrock ARN。格式範例",
"awsCustomArnDesc": "確保 ARN 中的區域與您上面選擇的 AWS 區域匹配。",
"vscodeLmDescription": "VS Code 語言模型 API 可讓您執行其他擴充功能(如 GitHub Copilot提供的模型。最快捷的方式是從 VS Code 市集安裝 Copilot 和 Copilot Chat 擴充功能。",
"awsCustomArnUse": "輸入要使用的模型有效 AWS Bedrock ARN。格式範例",
"awsCustomArnDesc": "確保 ARN 中的區域與您選擇的 AWS 區域相符。",
"openRouterApiKey": "OpenRouter API 金鑰",
"getOpenRouterApiKey": "取得 OpenRouter API 金鑰",
"apiKeyStorageNotice": "API 金鑰安全儲存在 VSCode 的秘密儲存中",
"apiKeyStorageNotice": "API 金鑰安全儲存於 VSCode 金鑰儲存中",
"glamaApiKey": "Glama API 金鑰",
"getGlamaApiKey": "取得 Glama API 金鑰",
"useCustomBaseUrl": "使用自基礎 URL",
"useCustomBaseUrl": "使用自定義基礎 URL",
"requestyApiKey": "Requesty API 金鑰",
"getRequestyApiKey": "取得 Requesty API 金鑰",
"openRouterTransformsText": "將提示和訊息鏈壓縮到內容大小 (<a>OpenRouter 轉換</a>)",
"openRouterTransformsText": "將提示和訊息鏈壓縮到上下文大小 (<a>OpenRouter 轉換</a>)",
"anthropicApiKey": "Anthropic API 金鑰",
"getAnthropicApiKey": "取得 Anthropic API 金鑰",
"deepSeekApiKey": "DeepSeek API 金鑰",
@ -111,109 +111,109 @@
"openAiBaseUrl": "基礎 URL",
"getOpenAiApiKey": "取得 OpenAI API 金鑰",
"mistralApiKey": "Mistral API 金鑰",
"getMistralApiKey": "取得 Mistral / Codestral API 金鑰",
"codestralBaseUrl": "Codestral 基礎 URL",
"codestralBaseUrlDesc": "設 Codestral 模型的替代 URL。",
"awsCredentials": "AWS 證",
"awsProfile": "AWS 設定",
"awsProfileName": "AWS 設定名稱",
"getMistralApiKey": "取得 Mistral/Codestral API 金鑰",
"codestralBaseUrl": "Codestral 基礎 URL選)",
"codestralBaseUrlDesc": "設 Codestral 模型的替代 URL。",
"awsCredentials": "AWS 證",
"awsProfile": "AWS 個人設定",
"awsProfileName": "AWS 個人設定名稱",
"awsAccessKey": "AWS 存取金鑰",
"awsSecretKey": "AWS 密金鑰",
"awsSessionToken": "AWS 工作階段權杖",
"awsSecretKey": "AWS 密金鑰",
"awsSessionToken": "AWS 會話權杖",
"awsRegion": "AWS 區域",
"awsCrossRegion": "使用跨區域推論",
"vscodeLmModel": "VSCode LM 模型",
"vscodeLmWarning": "注意:這是一個非常實驗性的集成,提供者支援會有所不同。如果您收到有關不支援模型的錯誤,那麼這是提供者方面的問題。",
"vscodeLmModel": "語言模型",
"vscodeLmWarning": "注意:此為實驗性整合,提供者支援可能不同。若遇到模型不支援錯誤,請聯繫提供者。",
"googleCloudSetup": {
"title": "要使用 Google Cloud Vertex AI您需要",
"step1": "1. 建立 Google Cloud 帳戶,啟用 Vertex AI API 並啟用所需 Claude 模型。",
"step1": "1. 建立 Google Cloud 帳戶,啟用 Vertex AI API 並啟用所需 Claude 模型。",
"step2": "2. 安裝 Google Cloud CLI 並設定應用程式預設憑證。",
"step3": "3. 或建立具憑證的服務帳戶。"
"step3": "3. 或建立具憑證的服務帳戶。"
},
"googleCloudCredentials": "Google Cloud 憑證",
"googleCloudKeyFile": "Google Cloud 金鑰檔案路徑",
"googleCloudProjectId": "Google Cloud 專案 ID",
"googleCloudRegion": "Google Cloud 區域",
"lmStudio": {
"baseUrl": "基礎 URL",
"baseUrl": "基礎 URL選)",
"modelId": "模型 ID",
"speculativeDecoding": "啟用推測解碼",
"speculativeDecoding": "啟用預測性解碼",
"draftModelId": "草稿模型 ID",
"draftModelDesc": "推測解碼要正確運作,草稿模型必須來自相同模型系列。",
"draftModelDesc": "草稿模型必須來自相同模型系列才能正確運作。",
"selectDraftModel": "選擇草稿模型",
"noModelsFound": "找不到草稿模型。請確保 LM Studio 已在伺服器模式下執行。",
"description": "LM Studio 允許您在本機電腦上執行模型。關於如何開始使用,請參閱他們的<a>快速入門指南</a>。您還需要啟動 LM Studio 的<b>本機伺服器</b>功能才能與此擴充功能一起使用。<span>注意:</span>Roo Code 使用複雜的提示,並在 Claude 模型上運作最佳。功能較弱的模型可能無法如預期運作。"
"noModelsFound": "未找到草稿模型。請確保 LM Studio 以伺服器模式運行。",
"description": "LM Studio 允許您在本地電腦運行模型。詳細資訊請參閱快速入門指南。您需要啟動 LM Studio 的本地伺服器功能才能與此擴充功能搭配使用。<span>注意:</span> Roo Code 使用複雜提示,與 Claude 模型搭配最佳。功能較弱的模型可能無法正常運作。"
},
"ollama": {
"baseUrl": "基礎 URL",
"baseUrl": "基礎 URL選)",
"modelId": "模型 ID",
"description": "Ollama 允許您在本機電腦上執行模型。關於如何開始使用,請參閱快速入門指南。",
"warning": "注意Roo Code 使用複雜的提示,並在 Claude 模型上運作最佳。功能較弱的模型可能無法如預期運作。"
"description": "Ollama 允許您在本地電腦運行模型。請參閱快速入門指南。",
"warning": "注意Roo Code 使用複雜提示,與 Claude 模型搭配最佳。功能較弱的模型可能無法正常運作。"
},
"unboundApiKey": "Unbound API 金鑰",
"getUnboundApiKey": "取得 Unbound API 金鑰",
"humanRelay": {
"description": "不需要 API 金鑰,但使用者需要協助將資訊複製並貼上到網頁聊天 AI。",
"instructions": "使用期間會彈出對話框,並自動將目前訊息複製到剪貼簿。您需要將這些內容貼上到網頁版 AI如 ChatGPT 或 Claude然後將 AI 的回覆複製回對話框並點擊確認按鈕。"
"description": "無需 API 金鑰,但使用者需協助將資訊複製到網頁聊天 AI。",
"instructions": "使用期間,對話方格會彈出且當前訊息會自動複製到剪貼簿。您需將其貼到 ChatGPT 或 Claude 網頁版,再將 AI 回應複製回對話方塊並點擊確認按鈕。"
},
"openRouter": {
"providerRouting": {
"title": "OpenRouter 提供者路由",
"description": "OpenRouter 將請求路由到適合您模型的最佳可用提供者。預設情況下,請求會在頂級提供者之間進行負載平衡以最大化正常運行時間。但是,您可以為此模型選擇特定的提供者。",
"learnMore": "了解更多關於提供者路由的資訊"
"description": "OpenRouter 會將請求路由到適合模型的最佳提供者。預設會在頂尖提供者之間負載平衡以確保正常運作時間。您可為此模型選擇特定提供者。",
"learnMore": "了解更多關於提供者路由"
}
},
"customModel": {
"capabilities": "設定您的自訂 OpenAI 相容模型的功能和定價。請謹慎指定模型功能,因為它們會影響 Roo Code 的效能。",
"capabilities": "設定自定義 OpenAI 相容模型的功能和定價。指定功能時需謹慎。",
"maxTokens": {
"label": "最大輸出權杖",
"description": "模型在回應中可以生成的最大權杖數。(指定 -1 以允許伺服器設定最大權杖數。"
"label": "最大輸出トークン",
"description": "模型回應可產生的最大トークン數。(指定 -1 使用伺服器設定最大值"
},
"contextWindow": {
"label": "內容視窗大小",
"description": "模型可以處理的總權杖數(輸入 + 輸出)。"
"label": "上下文視窗大小",
"description": "模型可處理的總トークン數(輸入+輸出)"
},
"imageSupport": {
"label": "像支援",
"description": "此模型是否能夠處理和理解圖像?"
"label": "像支援",
"description": "此模型是否能處理和理解影像?"
},
"computerUse": {
"label": "電腦使用",
"description": "此模型是否能夠與瀏覽器互動?(例如 Claude 3.7 Sonnet"
"description": "此模型能否與瀏覽器互動?(例如 Claude 3.7 Sonnet"
},
"promptCache": {
"label": "提示快取",
"description": "此模型是否能快取提示?"
"description": "此模型是否能快取提示?"
},
"pricing": {
"input": {
"label": "輸入價格",
"description": "輸入/提示每百萬權杖的成本。這會影響向模型發送內容和指令的成本。"
"description": "每百萬輸入/提示トークン的費用"
},
"output": {
"label": "輸出價格",
"description": "模型回應每百萬權杖的成本。這會影響生成內容和完成的成本。"
"description": "模型回應每百萬トークン的費用"
},
"cacheReads": {
"label": "快取讀取價格",
"description": "從快取讀取每百萬權杖的成本。這是檢索快取回應時收取的價格。"
"description": "讀取快取時的費用"
},
"cacheWrites": {
"label": "快取寫入價格",
"description": "寫入快取每百萬權杖的成本。這是首次快取提示時收取的價格。"
"description": "首次將提示寫入快取時的費用"
}
},
"resetDefaults": "重設預設值"
"resetDefaults": "重設預設值"
}
},
"browser": {
"enable": {
"label": "啟用瀏覽器工具",
"description": "啟用後Roo 可在使用支援電腦使用的模型時使用瀏覽器與網站互動。"
"description": "啟用後Roo 可在使用支援電腦使用的模型時使用瀏覽器互動。"
},
"viewport": {
"label": "視大小",
"description": "選擇瀏覽器互動的視窗大小。這會影響網站的顯示方式和互動方式。",
"label": "視大小",
"description": "選擇瀏覽器互動的視口大小。",
"options": {
"largeDesktop": "大型桌面 (1280x800)",
"smallDesktop": "小型桌面 (900x600)",
@ -223,123 +223,123 @@
},
"screenshotQuality": {
"label": "截圖品質",
"description": "調整瀏覽器截圖的 WebP 品質。較高的值提供更清晰的截圖,但會增加 token 使用量。"
"description": "調整瀏覽器截圖的 WebP 品質。較高會增加 token 使用量。"
},
"remote": {
"label": "使用遠端瀏覽器連線",
"description": "連線到啟用遠端偵錯的 Chrome 瀏覽器 (--remote-debugging-port=9222)。",
"urlPlaceholder": "自 URL例如 http://localhost:9222",
"description": "連線到啟用遠端除錯的 Chrome 瀏覽器(--remote-debugging-port=9222。",
"urlPlaceholder": "自定義 URL例如 http://localhost:9222",
"testButton": "測試連線",
"testingButton": "測試中...",
"instructions": "輸入 DevTools 協議主機地址或留空以自動探索本地 Chrome 實例。測試連線按鈕將嘗試使用自訂 URL如果提供或者如果欄位為空則自動探索。"
"instructions": "輸入 DevTools 協定主機位址或留空以自動發現本機 Chrome 執行個體。"
}
},
"checkpoints": {
"enable": {
"label": "啟用自動檢查點",
"description": "啟用後Roo 將在任務執行期間自動建立檢查點,使審核變更或返回到早期狀態變得容易。"
"description": "啟用後Roo 將在任務執行期間自動建立檢查點。"
}
},
"notifications": {
"sound": {
"label": "啟用音效",
"description": "啟用後Roo 將為通知和事件播放音效",
"description": "啟用後Roo 將為通知播放音效",
"volumeLabel": "音量"
},
"tts": {
"label": "啟用文字轉語音",
"description": "啟用後Roo 將使用文字轉語音功能朗讀回應",
"description": "啟用後Roo 將使用文字轉語音朗讀回應",
"speedLabel": "速度"
}
},
"contextManagement": {
"description": "控制在 AI 的內容視窗中包含哪些資訊,影響 token 使用和回應品質",
"description": "控制 AI 上下文視窗包含的資訊,影響 token 使用和回應品質",
"openTabs": {
"label": "開啟分頁內容限制",
"description": "在內容中包含的 VSCode 開啟分頁的最大數量。較高的值提供更多內容,但會增加 token 使用量。"
"label": "開啟的分頁上下文限制",
"description": "最多包含的 VSCode 開啟分頁數"
},
"workspaceFiles": {
"label": "工作區檔案內容限制",
"description": "在目前工作目錄詳細資訊中包含的最大檔案數。較高的值提供更多內容,但會增加 token 使用量。"
"label": "工作區檔案上下文限制",
"description": "最多包含的當前工作目錄詳細資訊檔案數"
},
"rooignore": {
"label": "在列表和搜尋中顯示 .rooignore 檔案",
"description": "啟用後,與 .rooignore 中模式匹配的檔案將在列表中顯示鎖定符號。禁用時,這些檔案將從檔案列表和搜尋中完全隱藏。"
"label": "顯示 .rooignore 檔案",
"description": "啟用後,符合 .rooignore 模式之檔案會顯示上鎖符號"
},
"maxReadFile": {
"label": "檔案讀取自動截斷閾值",
"description": "一批中從檔案讀取的預設行數。較低的值會減少內容/資源使用,但可能需要對大型檔案進行更多次讀取。",
"description": "預設讀取檔案的行數",
"lines": "行"
}
},
"terminal": {
"outputLineLimit": {
"label": "終端機輸出限制",
"description": "執行命令時在終端機輸出中包含的最大行數。超過時將從中間刪除行,節省 token。"
"description": "執行指令時包含的最大行數"
},
"shellIntegrationTimeout": {
"label": "終端機 Shell 整合逾時",
"description": "執行命令前等待 Shell 整合初始化的最長時間。對於 Shell 啟動時間較長的使用者,如果在終端機中看到\"Shell Integration Unavailable\"錯誤,可能需要增加此值。"
"label": "終端機 shell 綜合超時",
"description": "shell 綜合初始化的最長等待時間"
}
},
"advanced": {
"rateLimit": {
"label": "速率限制",
"description": "API 請求之間的最小時間。"
"description": "API 請求間的最短時間"
},
"diff": {
"label": "啟用透過差異編輯",
"description": "啟用後Roo 將能夠更快地編輯檔案,並將自動拒絕截斷的完整檔案寫入。與最新的 Claude 3.7 Sonnet 模型搭配最佳。",
"label": "啟用 diff 編輯",
"description": "啟用後可更快編輯文件並自動拒絕不完整的完整文件寫入",
"strategy": {
"label": "Diff 策略",
"label": "diff 策略",
"options": {
"standard": "標準(單塊)",
"multiBlock": "實驗性:多塊 diff",
"standard": "標準(單一區塊)",
"multiBlock": "實驗性:多塊 diff",
"unified": "實驗性:統一 diff"
},
"descriptions": {
"standard": "標準 diff 策略一次對一個程式碼塊應用變更。",
"unified": "統一 diff 策略採用多種方法應用差異並選擇最佳方法。",
"multiBlock": "多塊 diff 策略允許在一個請求中更新檔案中的多個程式碼塊。"
"standard": "每次修改單一程式區塊",
"multiBlock": "單次請求更新多個程式區塊",
"unified": "多種 diff 方法選擇最佳方案"
}
},
"matchPrecision": {
"label": "匹配精度",
"description": "此滑桿控制應用差異時程式碼部分必須匹配的精確度。較低的值允許更靈活的匹配,但會增加錯誤替換的風險。極其謹慎地使用低於 100% 的值。"
"label": "匹配精度",
"description": "此滑桿控制應用 diff 時程式區塊的匹配精確度"
}
}
},
"experimental": {
"warning": "⚠️",
"DIFF_STRATEGY": {
"name": "使用實驗性統一差異策略",
"description": "啟用實驗性統一差異策略。此策略可能減少由模型錯誤引起的重試次數,但可能導致意外行為或不正確的編輯。僅在您了解風險並願意仔細審查所有更改時才啟用。"
"name": "使用實驗性統一 diff 策略",
"description": "此實驗性策略可能減少模型錯誤導致的重試次數,但需謹慎使用"
},
"SEARCH_AND_REPLACE": {
"name": "使用實驗性搜索和替換工具",
"description": "啟用實驗性搜索和替換工具,允許 Roo 在一個請求中替換搜索詞的多個實例。"
"name": "使用實驗性搜尋與取代工具",
"description": "允許 Roo 在單一請求中取代多個搜尋詞實例"
},
"INSERT_BLOCK": {
"name": "使用實驗性插入內容工具",
"description": "啟用實驗性插入內容工具,允許 Roo 在特定行號插入內容,無需創建差異。"
"description": "允許在特定行號插入內容而無需建立 diff"
},
"POWER_STEERING": {
"name": "使用實驗性\"動力轉向\"模式",
"description": "啟用後Roo 將更頻繁地提醒模型關於其當前模式定義的詳細信息。這將導致對角色定義和自定義指令的更強遵守,但每條消息將使用更多 token。"
"name": "使用實驗性「動力轉向」模式",
"description": "此模式會更頻繁地提醒模型其角色定義"
},
"MULTI_SEARCH_AND_REPLACE": {
"name": "使用實驗性多塊差異工具",
"description": "啟用後Roo 將使用多塊差異工具。這將嘗試在一個請求中更新文件中的多個代碼塊。"
"name": "使用實驗性多區塊 diff 工具",
"description": "單次請求更新檔案中的多個程式區塊"
}
},
"temperature": {
"useCustom": "使用自溫度",
"description": "控制模型回應的隨機性",
"rangeDescription": "較高的值使輸出更隨機,較低的值使其更確定性。"
"useCustom": "使用自定義溫度",
"description": "控制模型回應的隨機性",
"rangeDescription": "較高值使輸出更隨機,較低值更確定"
},
"modelInfo": {
"supportsImages": "支援像",
"noImages": "不支援像",
"supportsImages": "支援像",
"noImages": "不支援像",
"supportsComputerUse": "支援電腦使用",
"noComputerUse": "不支援電腦使用",
"supportsPromptCache": "支援提示快取",
@ -349,81 +349,83 @@
"outputPrice": "輸出價格",
"cacheReadsPrice": "快取讀取價格",
"cacheWritesPrice": "快取寫入價格",
"enableStreaming": "啟用串流媒體",
"enableStreaming": "啟用串流",
"enableR1Format": "啟用R1模型參數",
"enableR1FormatTips": "當使用QWQ等類R1模型時需啟用防止400錯誤",
"useAzure": "使用 Azure",
"azureApiVersion": "設定 Azure API 版本",
"gemini": {
"freeRequests": "* 每分鐘免費 {{count}} 個請求。之後,計費取決於提示大小。",
"pricingDetails": "有關更多資訊,請參閱定價詳情。"
"freeRequests": "* 每分鐘免費 {{count}} 次請求。超過後依提示大小計費。",
"pricingDetails": "查看定價細節"
}
},
"modelPicker": {
"automaticFetch": "擴充功能會自動獲取 <serviceLink>{{serviceName}}</serviceLink> 上可用的最新模型列表。如果您不確定選擇哪個模型Roo Code 與 <defaultModelLink>{{defaultModelId}}</defaultModelLink> 配合最佳。您還可以搜尋\"free\"以尋找目前可用的免費選項。",
"automaticFetch": "擴充功能會自動取得 {{serviceName}} 上最新模型列表。若不確定選擇Roo Code 與 {{defaultModelId}} 搭配最佳。",
"label": "模型",
"searchPlaceholder": "搜尋",
"noMatchFound": "未找到相符項目",
"useCustomModel": "使用自訂: {{modelId}}"
"useCustomModel": "使用自定義模型:{{modelId}}"
},
"footer": {
"feedback": "如果您有任何問題或反饋,請隨時在 <githubLink>github.com/RooVetGit/Roo-Code</githubLink> 上提出問題或加入 <redditLink>reddit.com/r/RooCode</redditLink> 或 <discordLink>discord.gg/roocode</discordLink>",
"feedback": "若有問題或建議,請在 <githubLink>GitHub</githubLink> 建立 issue 或加入 <discordLink>Discord</discordLink>",
"version": "Roo Code v{{version}}",
"telemetry": {
"label": "允許匿名錯誤和使用情況報告",
"description": "透過發送匿名使用資料和錯誤報告來幫助改進 Roo Code。絕不會發送程式碼、提示或個人資訊。有關更多詳細資訊請參閱我們的隱私政策。"
"label": "允許匿名錯誤和使用報告",
"description": "匿名資料協助改善 Roo Code絕不傳送程式碼或個人資訊"
},
"reset": {
"description": "重設擴充功能中的所有全域狀態和秘密儲存。",
"description": "重設擴充功能的全局狀態和金鑰儲存",
"button": "重設"
}
},
"thinkingBudget": {
"maxTokens": "最大 tokens",
"maxThinkingTokens": "最大思考 tokens"
"maxTokens": "最大 token",
"maxThinkingTokens": "最大思考 token"
},
"validation": {
"apiKey": "您必須提供有效的 API 金鑰。",
"awsRegion": "您必須選擇一個區域來使用 AWS Bedrock。",
"googleCloud": "您必須提供有效的 Google Cloud 專案 ID 和區域。",
"modelId": "您必須提供有效的模型 ID。",
"modelSelector": "您必須提供有效的模型選擇器。",
"openAi": "您必須提供有效的基礎 URL、API 金鑰和模型 ID。",
"apiKey": "需要有效 API 金鑰",
"awsRegion": "請選擇 AWS 區域",
"googleCloud": "需要有效的 Google Cloud 專案 ID 和區域",
"modelId": "需要有效模型 ID",
"modelSelector": "需要有效模型選擇器",
"openAi": "需要有效的基礎 URL、API 金鑰和模型 ID",
"arn": {
"invalidFormat": "ARN 格式無效。請檢查格式要求。",
"regionMismatch": "警告:您的 ARN 中的區域 ({{arnRegion}}) 與您選擇的區域 ({{region}}) 不符。這可能會導致存取問題。提供者將使用 ARN 中的區域。"
"invalidFormat": "ARN 格式無效",
"regionMismatch": "ARN 區域與選擇的區域不匹配"
},
"modelAvailability": "您提供的模型 ID ({{modelId}}) 無法使用。請選擇其他模型。"
"modelAvailability": "該模型 ID 不可用"
},
"placeholders": {
"apiKey": "輸入 API 金鑰...",
"profileName": "輸入設定檔名稱",
"accessKey": "輸入存取金鑰...",
"secretKey": "請輸入密鑰...",
"sessionToken": "請輸入工作階段權杖...",
"credentialsJson": "輸入憑證 JSON...",
"keyFilePath": "輸入金鑰檔案路徑...",
"projectId": "輸入專案 ID...",
"customArn": "請輸入 ARNarn:aws:bedrock:us-east-1:123456789012:foundation-model/my-model",
"baseUrl": "輸入基礎 URL...",
"apiKey": "輸入 API 金鑰...",
"profileName": "輸入設定檔名稱",
"accessKey": "輸入存取金鑰...",
"secretKey": "輸入機密金鑰...",
"sessionToken": "輸入會話權杖...",
"credentialsJson": "輸入憑證 JSON...",
"keyFilePath": "輸入金鑰檔案路徑...",
"projectId": "輸入專案 ID...",
"customArn": "ARN 範例arn:aws:bedrock:...",
"baseUrl": "輸入基礎 URL...",
"modelId": {
"lmStudio": "meta-llama-3.1-8b-instruct",
"lmStudioDraft": "lmstudio-community/llama-3.2-1b-instruct",
"ollama": "llama3.1"
"lmStudio": "meta-llama-3.1-8b-instruct",
"lmStudioDraft": "lmstudio-community/llama-3.2-1b-instruct",
"ollama": "llama3.1"
},
"numbers": {
"maxTokens": "4096",
"contextWindow": "128000",
"inputPrice": "0.0001",
"outputPrice": "0.0002",
"cacheWritePrice": "0.00005"
"maxTokens": "4096",
"contextWindow": "128000",
"inputPrice": "0.0001",
"outputPrice": "0.0002",
"cacheWritePrice": "0.00005"
}
},
"defaults": {
"ollamaUrl": "預設http://localhost:11434",
"lmStudioUrl": "預設http://localhost:1234",
"geminiUrl": "預設https://generativelanguage.googleapis.com"
"ollamaUrl": "預設http://localhost:11434",
"lmStudioUrl": "預設http://localhost:1234",
"geminiUrl": "預設https://generativelanguage.googleapis.com"
},
"labels": {
"customArn": "自 ARN",
"useCustomArn": "使用自 ARN..."
"customArn": "自定義 ARN",
"useCustomArn": "使用自定義 ARN..."
}
}