Skip to content

Commit a75a6c2

Browse files
authored
🐛 Repair English error message shows up under chinese language when model is not connected
2 parents 68ee8a3 + 861cdf9 commit a75a6c2

File tree

3 files changed

+95
-15
lines changed

3 files changed

+95
-15
lines changed

frontend/app/[locale]/setup/models/components/model/ModelAddDialog.tsx

Lines changed: 81 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,70 @@ interface ModelAddDialogProps {
3939

4040
// Connectivity status type comes from utils
4141

42+
// Helper function to translate error messages from backend
43+
const translateError = (errorMessage: string, t: (key: string, params?: any) => string): string => {
44+
if (!errorMessage) return errorMessage
45+
46+
const errorLower = errorMessage.toLowerCase()
47+
48+
// Extract model name from patterns like "Name 'xxx' is already in use"
49+
// Matches: "Name 'xxx' is already in use" or "Name xxx is already in use"
50+
const nameMatch = errorMessage.match(/Name\s+(?:['"]([^'"]+)['"]|([^\s,]+))\s+is already in use/i)
51+
if (nameMatch) {
52+
const modelName = nameMatch[1] || nameMatch[2]
53+
return t('model.dialog.error.nameAlreadyInUse', { name: modelName })
54+
}
55+
56+
// Model not found pattern
57+
if (errorLower.includes('model not found') || errorLower.includes('not found')) {
58+
const modelNameMatch = errorMessage.match(/(?:Model not found|not found)[:\s]+([^\s,]+)/i)
59+
if (modelNameMatch) {
60+
return t('model.dialog.error.modelNotFound', { name: modelNameMatch[1] })
61+
}
62+
return t('model.dialog.error.modelNotFound', { name: '' })
63+
}
64+
65+
// Unsupported model type
66+
if (errorLower.includes('unsupported model type')) {
67+
const typeMatch = errorMessage.match(/unsupported model type[:\s]+([^\s,]+)/i)
68+
if (typeMatch) {
69+
return t('model.dialog.error.unsupportedModelType', { type: typeMatch[1] })
70+
}
71+
return t('model.dialog.error.unsupportedModelType', { type: 'unknown' })
72+
}
73+
74+
// Connection failed patterns - extract model name and URL from backend error
75+
if (errorLower.includes('failed to connect') || errorLower.includes('connection failed') ||
76+
errorLower.includes('connection error') || errorLower.includes('unable to connect')) {
77+
// Try to extract model name and URL from pattern: "Failed to connect to model 'xxx' at https://..."
78+
// Match URL that may end with period before the next sentence (e.g., "https://api.example.com. Please verify...")
79+
// Match URL pattern: http:// or https:// followed by domain (may contain dots) and optional path
80+
// Example: "Failed to connect to model 'qwen-plus' at https://api.siliconflow.cn. Please verify..."
81+
const connectMatch = errorMessage.match(/Failed to connect to model\s+['"]([^'"]+)['"]\s+at\s+(https?:\/\/[^\s]+?)(?:\.\s|\.$|$)/i)
82+
if (connectMatch) {
83+
// Remove trailing period if present (URL might end with period before next sentence)
84+
let url = connectMatch[2].replace(/\.$/, '')
85+
// Return fully translated message with model name and URL
86+
return t('model.dialog.error.failedToConnect', {
87+
modelName: connectMatch[1],
88+
url: url
89+
})
90+
}
91+
// Fallback: return original error message (will be wrapped by connectivityFailed)
92+
return errorMessage
93+
}
94+
95+
// Invalid configuration
96+
if (errorLower.includes('invalid') && errorLower.includes('config')) {
97+
// Extract the actual error description
98+
const configError = errorMessage.replace(/^.*?invalid[^:]*:?\s*/i, '').trim() || errorMessage
99+
return t('model.dialog.error.invalidConfiguration', { error: configError })
100+
}
101+
102+
// Return original error if no pattern matches
103+
return errorMessage
104+
}
105+
42106
export const ModelAddDialog = ({
43107
isOpen,
44108
onClose,
@@ -66,7 +130,6 @@ export const ModelAddDialog = ({
66130
// For other errors, return generic error key without showing backend details
67131
return { key: 'model.dialog.error.addFailed' }
68132
}
69-
70133
const [form, setForm] = useState({
71134
type: MODEL_TYPES.LLM as ModelType,
72135
name: "",
@@ -231,9 +294,14 @@ export const ModelAddDialog = ({
231294
status: "unavailable",
232295
message: t("model.dialog.connectivity.status.unavailable")
233296
});
234-
// Show detailed error message using message.error (same as add failure)
297+
// Show detailed error message using internationalized component (same as add failure)
235298
if (result.error) {
236-
message.error(result.error)
299+
const translatedError = translateError(result.error, t)
300+
// Ensure translatedError is a valid string, fallback to original error if needed
301+
const errorText = (translatedError && translatedError.length > 0)
302+
? translatedError
303+
: (result.error || 'Unknown error')
304+
message.error(t('model.dialog.error.connectivityFailed', { error: errorText }))
237305
}
238306
}
239307
} catch (error) {
@@ -242,8 +310,11 @@ export const ModelAddDialog = ({
242310
status: "unavailable",
243311
message: t("model.dialog.connectivity.status.unavailable"),
244312
});
245-
// Show error message using message.error (same as add failure)
246-
message.error(errorMessage || t("model.dialog.connectivity.status.unavailable"))
313+
// Show error message using internationalized component (same as add failure)
314+
const translatedError = translateError(errorMessage || t('model.dialog.connectivity.status.unavailable'), t)
315+
// Ensure translatedError is a valid string
316+
const errorText = translatedError ? translatedError : (errorMessage || t("model.dialog.connectivity.status.unavailable"))
317+
message.error(t('model.dialog.error.connectivityFailed', { error: errorText }))
247318
} finally {
248319
setVerifyingConnectivity(false);
249320
}
@@ -280,8 +351,9 @@ export const ModelAddDialog = ({
280351
onSuccess();
281352
}
282353
} catch (error: any) {
283-
const errorInfo = parseModelError(error?.message || "")
284-
message.error(t(errorInfo.key, errorInfo.params))
354+
const errorMessage = error?.message || t("model.dialog.error.addFailedLog");
355+
const translatedError = translateError(errorMessage, t)
356+
message.error(t("model.dialog.error.addFailed", { error: translatedError }));
285357
}
286358

287359
setForm((prev) => ({
@@ -441,8 +513,8 @@ export const ModelAddDialog = ({
441513
onClose();
442514
} catch (error) {
443515
const errorMessage = error instanceof Error ? error.message : String(error)
444-
const errorInfo = parseModelError(errorMessage)
445-
message.error(t(errorInfo.key, errorInfo.params));
516+
const translatedError = translateError(errorMessage, t)
517+
message.error(t("model.dialog.error.addFailed", { error: translatedError }));
446518
log.error(t("model.dialog.error.addFailedLog"), error);
447519
} finally {
448520
setLoading(false);

frontend/public/locales/en/common.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -562,16 +562,20 @@
562562
"model.dialog.status.verifying": "Verifying model connectivity...",
563563
"model.dialog.success.connectivityVerified": "Model connectivity verification successful!",
564564
"model.dialog.error.connectivityRequired": "Please verify model connectivity and ensure connection is successful before adding the model",
565-
"model.dialog.error.addFailed": "Failed to add model",
565+
"model.dialog.error.connectivityFailed": "Model connectivity verification failed: {{error}}",
566+
"model.dialog.error.addFailed": "Failed to add model: {{error}}",
567+
"model.dialog.error.nameAlreadyInUse": "Name '{{name}}' is already in use, please choose another display name",
568+
"model.dialog.error.modelNotFound": "Model not found: {{name}}",
569+
"model.dialog.error.failedToConnect": "Failed to connect to model '{{modelName}}' at {{url}}. Please verify the URL, API key, and network connection.",
570+
"model.dialog.error.unsupportedModelType": "Unsupported model type: {{type}}",
571+
"model.dialog.error.invalidConfiguration": "Invalid configuration: {{error}}",
566572
"model.dialog.error.addFailedLog": "Failed to add model",
567573
"model.dialog.error.noModelsFetched": "Operation failed! Please check your API key and network connectivity",
568574
"model.dialog.message.noModels": "Please fetch models first",
569575
"model.dialog.success.updateSuccess": "Updated successfully",
570576
"model.dialog.editTitle": "Edit Model",
571577
"model.dialog.editSuccess": "Model updated successfully",
572578
"model.dialog.error.editFailed": "Failed to update model",
573-
"model.dialog.error.nameConflict": "Name '{{name}}' is already in use, please choose another display name",
574-
"model.dialog.error.modelNotFound": "Model not found",
575579
"model.dialog.error.serverError": "Server internal error, please try again later",
576580
"model.type.llm": "Large Language Model",
577581
"model.type.embedding": "Embedding Model",

frontend/public/locales/zh/common.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -562,15 +562,19 @@
562562
"model.dialog.warning.incompleteForm": "请先填写完整的模型配置信息",
563563
"model.dialog.status.verifying": "正在验证模型连通性...",
564564
"model.dialog.error.connectivityRequired": "请先验证模型连通性且确保连接成功后再添加模型",
565-
"model.dialog.error.addFailed": "添加模型失败",
565+
"model.dialog.error.connectivityFailed": "模型连通性验证失败:{{error}}",
566+
"model.dialog.error.addFailed": "添加模型失败:{{error}}",
567+
"model.dialog.error.nameAlreadyInUse": "名称 '{{name}}' 已被使用,请选择其他显示名称",
568+
"model.dialog.error.modelNotFound": "模型未找到:{{name}}",
569+
"model.dialog.error.failedToConnect": "无法连接到模型 '{{modelName}}'({{url}})。请检查URL、API密钥和网络连接。",
570+
"model.dialog.error.unsupportedModelType": "不支持的模型类型:{{type}}",
571+
"model.dialog.error.invalidConfiguration": "配置无效:{{error}}",
566572
"model.dialog.error.addFailedLog": "添加模型失败",
567573
"model.dialog.error.noModelsFetched": "操作失败!请检查相关API Key以及网络连通性",
568574
"model.dialog.message.noModels": "请先获取模型",
569575
"model.dialog.editTitle": "编辑模型",
570576
"model.dialog.editSuccess": "模型更新成功",
571577
"model.dialog.error.editFailed": "更新模型失败",
572-
"model.dialog.error.nameConflict": "名称 '{{name}}' 已被使用,请选择其他显示名称",
573-
"model.dialog.error.modelNotFound": "模型未找到",
574578
"model.dialog.error.serverError": "服务器内部错误,请稍后重试",
575579
"model.type.llm": "大语言模型",
576580
"model.type.embedding": "向量模型",

0 commit comments

Comments
 (0)