重构状态检测功能:清理复杂逻辑,保留UI结构

## 主要变更
- 移除所有Claude命令调用和进程管理逻辑
- 简化检测函数,暂时返回"功能开发中"状态
- 添加单独检查状态按钮和相关UI交互
- 保留完整的供应商管理功能(添加、编辑、删除、切换)

## 技术优化
- 删除复杂的超时机制、进程监听、错误处理
- 移除axios依赖和HTTP请求相关代码
- 清理竞态条件和队列管理逻辑
- 保持清晰的UI状态管理

## UI改进
- 添加橙色主题的单独检查按钮
- 增强检查状态的视觉反馈(🔄 进度指示器)
- 保留所有状态显示逻辑等待功能重新实现
This commit is contained in:
farion1231
2025-08-05 20:10:51 +08:00
parent 687882d5c0
commit c74069ba57
4 changed files with 90 additions and 150 deletions

View File

@@ -1,123 +1,17 @@
import axios from 'axios'
import fs from 'fs/promises'
import path from 'path'
import os from 'os'
import { Provider, ProviderStatus } from '../shared/types'
export async function checkProviderStatus(provider: Provider): Promise<ProviderStatus> {
const startTime = Date.now()
try {
// 方法1: 先检查 Anthropic 官方状态 (适用于 Anthropic API)
if (provider.apiUrl.includes('anthropic.com')) {
try {
const statusResponse = await axios.get('https://status.anthropic.com/api/v2/summary.json', {
timeout: 3000
})
if (statusResponse.data.status?.indicator !== 'none') {
return {
isOnline: false,
responseTime: -1,
lastChecked: new Date(),
error: 'Anthropic 服务当前不可用'
}
}
} catch {
// 状态检查失败,继续尝试直接 API 调用
}
}
// 方法2: 轻量级 API 测试请求 - 使用最新的 API 格式
const testPayload = {
model: provider.model || 'claude-sonnet-4-20250514',
max_tokens: 1,
messages: [
{
role: 'user',
content: 'test'
}
]
}
const response = await axios.post(
`${provider.apiUrl}/v1/messages`,
testPayload,
{
headers: {
'x-api-key': provider.apiKey,
'anthropic-version': '2023-06-01',
'content-type': 'application/json'
},
timeout: 20000, // 增加超时时间到20秒
validateStatus: (status) => {
// 200-299 为成功400-499 通常表示 API 可用但请求有问题(如 key 无效)
return status < 500
}
}
)
const responseTime = Date.now() - startTime
// 检查响应状态
if (response.status >= 200 && response.status < 300) {
return {
isOnline: true,
responseTime,
lastChecked: new Date()
}
} else if (response.status >= 400 && response.status < 500) {
// 客户端错误API 可用但可能是 key 无效或其他认证问题
return {
isOnline: true, // API 本身是可用的
responseTime,
lastChecked: new Date(),
error: `API 可用但认证失败 (${response.status}): ${response.data?.error?.message || '请检查 API Key'}`
}
} else {
return {
isOnline: false,
responseTime,
lastChecked: new Date(),
error: `服务器错误 (${response.status})`
}
}
} catch (error) {
const responseTime = Date.now() - startTime
if (axios.isAxiosError(error)) {
if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') {
return {
isOnline: false,
responseTime,
lastChecked: new Date(),
error: '请求超时 - 服务可能不可用'
}
} else if (error.response) {
// 服务器响应了错误状态码
return {
isOnline: false,
responseTime,
lastChecked: new Date(),
error: `HTTP ${error.response.status}: ${error.response.data?.error?.message || error.message}`
}
} else if (error.request) {
// 请求发出但没有收到响应
return {
isOnline: false,
responseTime,
lastChecked: new Date(),
error: '网络连接失败 - 无法访问服务'
}
}
}
return {
isOnline: false,
responseTime,
lastChecked: new Date(),
error: error instanceof Error ? error.message : '未知错误'
}
export async function checkProviderStatus(
provider: Provider
): Promise<ProviderStatus> {
// 暂时返回未检查状态
return {
isOnline: false,
responseTime: -1,
lastChecked: new Date(),
error: '功能开发中'
}
}
@@ -125,17 +19,17 @@ export function getClaudeCodeConfig() {
// Claude Code 配置文件路径
const configDir = path.join(os.homedir(), '.claude')
const configPath = path.join(configDir, 'settings.json')
return { path: configPath, dir: configDir }
}
export async function switchProvider(provider: Provider): Promise<boolean> {
try {
const { path: configPath, dir: configDir } = getClaudeCodeConfig()
// 确保目录存在
await fs.mkdir(configDir, { recursive: true })
// 读取现有配置
let config: any = {}
try {
@@ -144,18 +38,19 @@ export async function switchProvider(provider: Provider): Promise<boolean> {
} catch {
// 文件不存在或解析失败,使用空配置
}
// 更新配置
config.api = {
...config.api,
baseURL: provider.apiUrl,
apiKey: provider.apiKey,
model: provider.model
// 确保 env 对象存在
if (!config.env) {
config.env = {}
}
// 更新环境变量配置
config.env.ANTHROPIC_AUTH_TOKEN = provider.apiKey
config.env.ANTHROPIC_BASE_URL = provider.apiUrl
// 写回配置文件
await fs.writeFile(configPath, JSON.stringify(config, null, 2))
return true
} catch (error) {
console.error('切换供应商失败:', error)