Răsfoiți Sursa

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 <[email protected]>
teddyOOXX 9 luni în urmă
părinte
comite
cc2420ea1a

+ 5 - 0
.changeset/nine-ways-worry.md

@@ -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.

+ 2 - 3
src/api/providers/openai.ts

@@ -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

+ 0 - 1
src/core/webview/ClineProvider.ts

@@ -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()) {

+ 1 - 0
src/exports/roo-code.d.ts

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

+ 2 - 0
src/shared/api.ts

@@ -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",

+ 1 - 0
src/shared/globalState.ts

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

+ 5 - 1
webview-ui/src/components/settings/ApiOptions.tsx

@@ -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)}>

+ 25 - 0
webview-ui/src/components/settings/R1FormatSetting.tsx

@@ -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>
+	)
+}

+ 0 - 2
webview-ui/src/components/settings/SettingsView.tsx

@@ -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 } }
 			})
 		},

+ 6 - 4
webview-ui/src/i18n/locales/ca/settings.json

@@ -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.",

+ 2 - 0
webview-ui/src/i18n/locales/de/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/en/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/es/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/fr/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/hi/settings.json

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

+ 2 - 0
webview-ui/src/i18n/locales/it/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/ja/settings.json

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

+ 2 - 0
webview-ui/src/i18n/locales/ko/settings.json

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

+ 2 - 0
webview-ui/src/i18n/locales/pl/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/pt-BR/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/tr/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/vi/settings.json

@@ -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": {

+ 2 - 0
webview-ui/src/i18n/locales/zh-CN/settings.json

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

+ 168 - 166
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -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": "請輸入 ARN(例:arn: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..."
 	}
 }