【AI小打小闹】cliproxyapi踩坑实录

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

测试时用的是nvidia 免费api,国内访问延迟较高
https://build.nvidia.com/

由于这个延迟高,为了解决这个因延迟导致每次测试api联通性超时的问题,进行了如下工作:
1、cliproxyapi服务端项目

cliproxyapi 地址 :https://github.com/router-for-me/CLIProxyAPI
cp ./config.example.yaml ./config.yaml

 

// 修改以下几个配置
allow-remote: true

secret-key: "1111"

api-keys:
  - "xxxxxxxxxx"
  - "your-api-key-2"
  - "your-api-key-3"

- Go 版本 :必须使用 Go 1.26 或更高版本
- 配置文件 :首次运行前必须创建 config.yaml

go version
如果版本低于1.26,升级一下:brew update go
go version
go mod download
go run ./cmd/server
### 修改 1:增强 APICall 错误日志和错误提示

**文件:** `internal/api/handlers/management/api_tools.go`  
**行数:** 第 194-227 行  
**修改类型:** 功能增强

#### 修改前

```go
resp, errDo := httpClient.Do(req)
if errDo != nil {
    log.WithError(errDo).Debug("management APICall request failed")
    c.JSON(http.StatusBadGateway, gin.H{"error": "request failed"})
    return
}
```

#### 修改后

```go
resp, errDo := httpClient.Do(req)
if errDo != nil {
    // 记录详细日志
    log.WithFields(log.Fields{
        "error":  errDo.Error(),
        "url":    urlStr,
        "method": method,
        "auth":   authIndex,
    }).Error("management APICall request failed")

    // 分类错误信息
    var userMessage string
    errMsg := errDo.Error()
    switch {
    case strings.Contains(errMsg, "timeout"):
        userMessage = "请求超时:连接上游服务器超时(600秒),请检查网络或稍后重试"
    case strings.Contains(errMsg, "connection refused"):
        userMessage = "连接被拒绝:上游服务器拒绝连接,请检查 URL 和网络"
    case strings.Contains(errMsg, "no such host"):
        userMessage = "DNS 解析失败:无法解析域名,请检查 URL"
    case strings.Contains(errMsg, "network is unreachable"):
        userMessage = "网络不可达:请检查网络连接和代理设置"
    case strings.Contains(errMsg, "proxy"):
        userMessage = "代理错误:代理服务器连接失败"
    default:
        userMessage = fmt.Sprintf("请求失败:%s", errMsg)
    }

    c.JSON(http.StatusBadGateway, gin.H{
        "error":  userMessage,
        "detail": errMsg,
    })
    return
}
```

#### 改动说明

| 改动项 | 说明 |
|--------|------|
| **日志级别提升** | 从 `Debug` 提升到 `Error`,确保错误信息默认输出到控制台 |
| **结构化日志** | 添加 `error`、`url`、`method`、`auth` 字段,方便排查问题 |
| **错误分类** | 根据错误类型返回不同的中文友好提示 |
| **前端错误信息** | 返回 `error`(用户友好提示)和 `detail`(详细技术信息)两个字段 |

#### 错误分类对照表

| 错误类型 | 前端显示 |
|---------|---------|
| 超时 | "请求超时:连接上游服务器超时(600秒),请检查网络或稍后重试" |
| 连接被拒 | "连接被拒绝:上游服务器拒绝连接,请检查 URL 和网络" |
| DNS 失败 | "DNS 解析失败:无法解析域名,请检查 URL" |
| 网络不可达 | "网络不可达:请检查网络连接和代理设置" |
| 代理错误 | "代理错误:代理服务器连接失败" |
| 其他错误 | "请求失败:[具体错误信息]" |

---

### 修改 2:增加 APICall 超时时间

**文件:** `internal/api/handlers/management/api_tools.go`  
**行数:** 第 23 行  
**修改类型:** 配置调整

#### 修改前

```go
const defaultAPICallTimeout = 60 * time.Second
```

#### 修改后

```go
const defaultAPICallTimeout = 600 * time.Second
```

#### 改动说明

| 改动项 | 说明 |
|--------|------|
| **超时时间** | 从 60 秒增加到 600 秒(10 分钟) |
| **影响范围** | 所有通过管理面板 `APICall` 接口发起的请求 |
| **适用场景** | NVIDIA 等响应较慢的国际 API 测试连接 |

---

2、cliproxyapi前端项目
cliproxyapi 前端地址: https://github.com/router-for-me/Cli-Proxy-API-Management-Center

## 1. 依赖包修复

### 问题描述
项目启动时 Vite 报错,提示以下依赖包未安装但代码中有引用:
- `react-router`
- `@codemirror/search`
- `@codemirror/view`
- `@codemirror/state`

### 变更内容

```bash
pnpm add @codemirror/search @codemirror/view @codemirror/state react-router
```

### 涉及文件
- `package.json` - 添加了以下依赖:
  - `@codemirror/search` ^6.7.0
  - `@codemirror/state` ^6.6.0
  - `@codemirror/view` ^6.41.1
  - `react-router` ^7.14.2

### 变更原因
这些依赖包是项目中以下文件所必需的:
- `react-router`: `src/hooks/useUnsavedChangesGuard.ts`
- `@codemirror/search`: `src/components/config/ConfigSourceEditor.tsx`
- `@codemirror/view`: `src/components/config/ConfigSourceEditor.tsx`
- `@codemirror/state`: `src/components/config/DiffModal.tsx`

---

## 2. 测试模型请求超时时间调整

### 变更描述
将 AI 提供商测试功能的请求超时时间从 30 秒延长至 10 分钟(600 秒)。

### 涉及文件

#### 2.1 AiProvidersOpenAIEditPage.tsx

**文件路径**: `src/pages/AiProvidersOpenAIEditPage.tsx`

**变更内容**:
```typescript
// 修改前
const OPENAI_TEST_TIMEOUT_MS = 30_000;

// 修改后
const OPENAI_TEST_TIMEOUT_MS = 600_000;
```

**影响范围**:
- OpenAI 提供商的单个密钥测试
- OpenAI 提供商的"一键测试全部密钥"功能

**超时提示语**: 超时提示会自动计算显示为"测试请求超时(600秒)",无需额外修改语言文件。

---

#### 2.2 AiProvidersClaudeEditPage.tsx

**文件路径**: `src/pages/AiProvidersClaudeEditPage.tsx`

**变更内容**:
```typescript
// 修改前
const CLAUDE_TEST_TIMEOUT_MS = 30_000;

// 修改后
const CLAUDE_TEST_TIMEOUT_MS = 600_000;
```

**影响范围**:
- Claude 提供商的连通性测试

**超时提示语**: 超时提示会自动计算显示为"测试请求超时(600秒)",无需额外修改语言文件。

---

## 变更统计

| 类型 | 数量 | 说明 |
|------|------|------|
| 依赖添加 | 4 个 | 修复缺失的运行时依赖 |
| 常量修改 | 2 处 | 测试超时时间调整 |

---
npm install pnpm -g
pnpm i
pnpm dev

为了让两个项目可以联调,需要增加一下配置

// vite.config.ts
export default defineConfig({
  // ......
  server: {
    proxy: {
      '/v0/management': {
        target: 'http://localhost:8317',
        changeOrigin: true,
      },
    },
  }
});


由于执行pnpm dev之后

所以访问的前端地址为:http://localhost:5173/#/

3、测试联通后,如何给claudecode中使用
3.1如果不借助ccswitch,直接给claudecode使用的话
需要在~/.claude/settings.json按如下配置

配置env
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "这里填写你后台复制的API密钥",
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317",
    "ANTHROPIC_MODEL": "z-ai/glm4.7",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "z-ai/glm4.7"
  }
}

3.2 如果搭配ccswitch,给claudecode使用的话

必须注意 关掉路由

 这个必须关掉,即不能是这种打开绿色的状态
模型选自定义的就行

注意这里一定要选择Anthropic Messages(原生)
为什么呢?
因为原理如下

当cliproxyapi 直接 和 claudecode交互
正向请求流:

Claude Code 原始请求 (Anthropic 格式) ➡️ cliproxyapi 本地代理 (拦截 & 改写 Key/Body/模型名) ➡️ 转换成目标 API 格式请求 (如 OpenAI 格式) ➡️ 目标大模型服务器

反向响应流:

目标大模型服务器 ➡️ 返回目标格式响应 (如 OpenAI 格式) ➡️ cliproxyapi 本地代理 (解析 & 逆向翻译) ➡️ 转换成 Anthropic 格式响应 ➡️ Claude Code 正常渲染输出

加入ccswitch后的流程应该是如下样子

正向请求流:

Claude Code 原始请求 (Anthropic 格式) ➡️ ccswitch (拦截路由 & 切换目标模型/配置) ➡️ cliproxyapi 本地代理 (接收 & 改写 Key/Body) ➡️ 转换成目标 API 格式请求 (如 OpenAI 格式) ➡️ 目标大模型服务器

反向响应流:

目标大模型服务器 ➡️ 返回目标格式响应 (如 OpenAI 格式) ➡️ cliproxyapi 本地代理 (解析 & 逆向翻译) ➡️ 转换成 Anthropic 格式响应 ➡️ ccswitch (透传响应) ➡️ Claude Code 正常渲染输出
 

简单理解各层职责:

  • ccswitch:决定“找谁说话”(负责在 Claude、GPT-4、DeepSeek 等不同配置间无缝切换)

  • cliproxyapi:决定“怎么说对方能听懂”(负责协议翻译和密钥替换,把 Claude 的话翻译给其他模型听)

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值