update .
This commit is contained in:
parent
2f34794a3c
commit
d16207e3c5
@ -239,6 +239,31 @@ export default {
|
|||||||
searchOrEnterModelName: 'Search or enter model name...',
|
searchOrEnterModelName: 'Search or enter model name...',
|
||||||
enterCustomModelName: 'Enter custom model name',
|
enterCustomModelName: 'Enter custom model name',
|
||||||
custom: 'Custom: ',
|
custom: 'Custom: ',
|
||||||
|
testConnection: {
|
||||||
|
testApiConnection: 'Test API Connection',
|
||||||
|
testingConnection: 'Testing connection...',
|
||||||
|
connectionSuccess: 'Connection test successful',
|
||||||
|
connectionFailed: 'Connection test failed',
|
||||||
|
notSupported: 'Testing {provider} API connection is not supported',
|
||||||
|
invalidApiKey: 'Invalid or missing API key',
|
||||||
|
invalidBaseUrl: 'Invalid base URL configuration',
|
||||||
|
requestTimeout: 'Request timeout, please check network connection',
|
||||||
|
networkError: 'Network connection failed',
|
||||||
|
unauthorizedError: 'API key authorization failed',
|
||||||
|
forbiddenError: 'Access denied, please check API key permissions',
|
||||||
|
rateLimitError: 'Rate limit exceeded, please try again later',
|
||||||
|
serverError: 'Internal server error',
|
||||||
|
noDefaultModel: 'No default model available for {provider}',
|
||||||
|
invalidResponse: 'Invalid response format',
|
||||||
|
// UI text
|
||||||
|
showApiKey: 'Show API Key',
|
||||||
|
hideApiKey: 'Hide API Key',
|
||||||
|
testConnectionTooltip: 'Test API connection',
|
||||||
|
testing: 'Testing',
|
||||||
|
success: 'Success',
|
||||||
|
failed: 'Failed',
|
||||||
|
test: 'Test',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// Model Parameters Section
|
// Model Parameters Section
|
||||||
|
|||||||
@ -240,6 +240,31 @@ export default {
|
|||||||
searchOrEnterModelName: '搜索或输入模型名称...',
|
searchOrEnterModelName: '搜索或输入模型名称...',
|
||||||
enterCustomModelName: '输入自定义模型名称',
|
enterCustomModelName: '输入自定义模型名称',
|
||||||
custom: '自定义: ',
|
custom: '自定义: ',
|
||||||
|
testConnection: {
|
||||||
|
testApiConnection: '测试 API 连接',
|
||||||
|
testingConnection: '正在测试连接...',
|
||||||
|
connectionSuccess: '连接测试成功',
|
||||||
|
connectionFailed: '连接测试失败',
|
||||||
|
notSupported: '不支持测试 {provider} 的 API 连接',
|
||||||
|
invalidApiKey: 'API Key 无效或缺失',
|
||||||
|
invalidBaseUrl: '基础 URL 设置错误',
|
||||||
|
requestTimeout: '请求超时,请检查网络连接',
|
||||||
|
networkError: '网络连接失败',
|
||||||
|
unauthorizedError: 'API Key 授权失败',
|
||||||
|
forbiddenError: '访问被拒绝,请检查 API Key 权限',
|
||||||
|
rateLimitError: '请求频率过高,请稍后重试',
|
||||||
|
serverError: '服务器内部错误',
|
||||||
|
noDefaultModel: '{provider} 没有可用的默认模型',
|
||||||
|
invalidResponse: '响应格式无效',
|
||||||
|
// UI 文本
|
||||||
|
showApiKey: '显示 API Key',
|
||||||
|
hideApiKey: '隐藏 API Key',
|
||||||
|
testConnectionTooltip: '测试 API 连接',
|
||||||
|
testing: '测试中',
|
||||||
|
success: '成功',
|
||||||
|
failed: '失败',
|
||||||
|
test: '测试',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// 模型参数部分
|
// 模型参数部分
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
import { t } from '../../lang/helpers';
|
||||||
|
|
||||||
export type DropdownComponentProps = {
|
export type DropdownComponentProps = {
|
||||||
name: string;
|
name: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
@ -310,7 +312,7 @@ export const ApiKeyComponent: React.FC<ApiKeyComponentProps> = ({
|
|||||||
type="button"
|
type="button"
|
||||||
className="infio-api-key-toggle"
|
className="infio-api-key-toggle"
|
||||||
onClick={toggleVisibility}
|
onClick={toggleVisibility}
|
||||||
title={isVisible ? "隐藏API Key" : "显示API Key"}
|
title={isVisible ? t("settings.ModelProvider.testConnection.hideApiKey") : t("settings.ModelProvider.testConnection.showApiKey")}
|
||||||
>
|
>
|
||||||
{isVisible ? (
|
{isVisible ? (
|
||||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
||||||
@ -332,19 +334,19 @@ export const ApiKeyComponent: React.FC<ApiKeyComponentProps> = ({
|
|||||||
className={`infio-api-key-test ${isTestingConnection ? 'testing' : ''} ${testResult ? testResult : ''}`}
|
className={`infio-api-key-test ${isTestingConnection ? 'testing' : ''} ${testResult ? testResult : ''}`}
|
||||||
onClick={handleTest}
|
onClick={handleTest}
|
||||||
disabled={isTestingConnection || !localValue.trim()}
|
disabled={isTestingConnection || !localValue.trim()}
|
||||||
title="测试API连通性"
|
title={t("settings.ModelProvider.testConnection.testConnectionTooltip")}
|
||||||
>
|
>
|
||||||
{isTestingConnection ? (
|
{isTestingConnection ? (
|
||||||
<>
|
<>
|
||||||
<div className="loading-spinner"></div>
|
<div className="loading-spinner"></div>
|
||||||
<span>测试中</span>
|
<span>{t("settings.ModelProvider.testConnection.testing")}</span>
|
||||||
</>
|
</>
|
||||||
) : testResult === 'success' ? (
|
) : testResult === 'success' ? (
|
||||||
<>
|
<>
|
||||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
||||||
<polyline points="20,6 9,17 4,12"></polyline>
|
<polyline points="20,6 9,17 4,12"></polyline>
|
||||||
</svg>
|
</svg>
|
||||||
<span>成功</span>
|
<span>{t("settings.ModelProvider.testConnection.success")}</span>
|
||||||
</>
|
</>
|
||||||
) : testResult === 'error' ? (
|
) : testResult === 'error' ? (
|
||||||
<>
|
<>
|
||||||
@ -353,7 +355,7 @@ export const ApiKeyComponent: React.FC<ApiKeyComponentProps> = ({
|
|||||||
<line x1="15" y1="9" x2="9" y2="15"></line>
|
<line x1="15" y1="9" x2="9" y2="15"></line>
|
||||||
<line x1="9" y1="9" x2="15" y2="15"></line>
|
<line x1="9" y1="9" x2="15" y2="15"></line>
|
||||||
</svg>
|
</svg>
|
||||||
<span>失败</span>
|
<span>{t("settings.ModelProvider.testConnection.failed")}</span>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
@ -362,7 +364,7 @@ export const ApiKeyComponent: React.FC<ApiKeyComponentProps> = ({
|
|||||||
<path d="M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5z"></path>
|
<path d="M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5z"></path>
|
||||||
<path d="M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5z"></path>
|
<path d="M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
<span>测试</span>
|
<span>{t("settings.ModelProvider.testConnection.test")}</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -181,7 +181,7 @@ const CustomProviderSettings: React.FC<CustomProviderSettingsProps> = ({ plugin,
|
|||||||
|
|
||||||
// 对于Ollama和OpenAICompatible,不支持测试API连接
|
// 对于Ollama和OpenAICompatible,不支持测试API连接
|
||||||
if (provider === ApiProvider.Ollama || provider === ApiProvider.OpenAICompatible) {
|
if (provider === ApiProvider.Ollama || provider === ApiProvider.OpenAICompatible) {
|
||||||
throw new Error(`不支持测试 ${provider} 的API连接`);
|
throw new Error(t("settings.ModelProvider.testConnection.notSupported", { provider }));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建LLM管理器实例
|
// 创建LLM管理器实例
|
||||||
@ -193,7 +193,7 @@ const CustomProviderSettings: React.FC<CustomProviderSettingsProps> = ({ plugin,
|
|||||||
|
|
||||||
// 对于没有默认模型的提供商,使用通用的测试模型
|
// 对于没有默认模型的提供商,使用通用的测试模型
|
||||||
if (!testModelId) {
|
if (!testModelId) {
|
||||||
throw new Error(`No default chat model available for ${provider}`);
|
throw new Error(t("settings.ModelProvider.testConnection.noDefaultModel", { provider }));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构造测试模型对象
|
// 构造测试模型对象
|
||||||
@ -235,7 +235,7 @@ const CustomProviderSettings: React.FC<CustomProviderSettingsProps> = ({ plugin,
|
|||||||
// ApiKeyComponent expects no return value on success, just no thrown error
|
// ApiKeyComponent expects no return value on success, just no thrown error
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
throw new Error('Invalid response format');
|
throw new Error(t("settings.ModelProvider.testConnection.invalidResponse"));
|
||||||
}
|
}
|
||||||
} catch (apiError) {
|
} catch (apiError) {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
@ -246,26 +246,33 @@ const CustomProviderSettings: React.FC<CustomProviderSettingsProps> = ({ plugin,
|
|||||||
console.error(`❌ ${provider} connection test failed:`, error);
|
console.error(`❌ ${provider} connection test failed:`, error);
|
||||||
|
|
||||||
// 根据错误类型提供更具体的错误信息
|
// 根据错误类型提供更具体的错误信息
|
||||||
let errorMessage = '连接测试失败';
|
let errorMessage = t("settings.ModelProvider.testConnection.connectionFailed");
|
||||||
|
|
||||||
if (error.message?.includes('API key')) {
|
if (error.message?.includes('API key')) {
|
||||||
errorMessage = 'API Key 无效或缺失';
|
errorMessage = t("settings.ModelProvider.testConnection.invalidApiKey");
|
||||||
} else if (error.message?.includes('base URL') || error.message?.includes('baseURL')) {
|
} else if (error.message?.includes('base URL') || error.message?.includes('baseURL')) {
|
||||||
errorMessage = '基础URL设置错误';
|
errorMessage = t("settings.ModelProvider.testConnection.invalidBaseUrl");
|
||||||
} else if (error.message?.includes('timeout') || error.name === 'AbortError') {
|
} else if (error.message?.includes('timeout') || error.name === 'AbortError') {
|
||||||
errorMessage = '请求超时,请检查网络连接';
|
errorMessage = t("settings.ModelProvider.testConnection.requestTimeout");
|
||||||
} else if (error.message?.includes('fetch')) {
|
} else if (error.message?.includes('fetch')) {
|
||||||
errorMessage = '网络连接失败';
|
errorMessage = t("settings.ModelProvider.testConnection.networkError");
|
||||||
} else if (error.message?.includes('401')) {
|
} else if (error.message?.includes('401')) {
|
||||||
errorMessage = 'API Key 授权失败';
|
errorMessage = t("settings.ModelProvider.testConnection.unauthorizedError");
|
||||||
} else if (error.message?.includes('403')) {
|
} else if (error.message?.includes('403')) {
|
||||||
errorMessage = '访问被拒绝,请检查API Key权限';
|
errorMessage = t("settings.ModelProvider.testConnection.forbiddenError");
|
||||||
} else if (error.message?.includes('429')) {
|
} else if (error.message?.includes('429')) {
|
||||||
errorMessage = '请求频率过高,请稍后重试';
|
errorMessage = t("settings.ModelProvider.testConnection.rateLimitError");
|
||||||
} else if (error.message?.includes('500')) {
|
} else if (error.message?.includes('500')) {
|
||||||
errorMessage = '服务器内部错误';
|
errorMessage = t("settings.ModelProvider.testConnection.serverError");
|
||||||
} else if (error.message) {
|
} else if (error.message) {
|
||||||
|
// 如果错误消息本身已经是翻译过的(比如不支持的提供商),直接使用
|
||||||
|
if (error.message.includes(t("settings.ModelProvider.testConnection.notSupported", { provider: '' }).slice(0, 10))) {
|
||||||
errorMessage = error.message;
|
errorMessage = error.message;
|
||||||
|
} else if (error.message.includes(t("settings.ModelProvider.testConnection.noDefaultModel", { provider: '' }).slice(0, 10))) {
|
||||||
|
errorMessage = error.message;
|
||||||
|
} else {
|
||||||
|
errorMessage = error.message;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
alert(errorMessage);
|
alert(errorMessage);
|
||||||
// 必须抛出错误,这样ApiKeyComponent才能正确显示失败状态
|
// 必须抛出错误,这样ApiKeyComponent才能正确显示失败状态
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user