作者:尘一不染 

更新日期:2026年5月

适用人群:需要接入国际大模型API的国内开发者、正在准备AI相关实习/项目的同学

前言

作为一名踏入AI开发领域的大二学生,我深知国内开发者在使用Claude、GPT、Codex等国际大模型时面临的困境:官方API直连困难、网络不稳定、支付门槛高……这些问题在我找实习做Agent开发时简直成了噩梦。

经过两个月的踩坑和研究,我终于整理出了一套完整的解决方案。本文将从原理实践,手把手教你在国内优雅地接入各种大模型API。

声明:本文所有方案均为技术层面探讨,使用时请遵守各平台的服务条款。

目录

  1. API中转站原理与使用
  2. API-Key管理与GAC
  3. Claude国内使用方案
  4. CC-Switch深度解析
  5. Codex国内访问
  6. 多模型切换架构
  7. 实战代码示例
  8. 踩坑记录与最佳实践

1. API中转站原理与使用

1.1 什么是API中转站?

原理图解:

plaintext

┌─────────────────────────────────────────────────────────────────┐
│                        直接调用官方API                           │
│  ┌──────────┐      ╳ GFW ╳        ┌─────────────────────────┐   │
│  │ 你的代码  │ ──── ╳      ╳ ──── │   api.anthropic.com     │   │
│  └──────────┘      ╳      ╳       │   api.openai.com        │   │
│                    ╳      ╳       │   api.cohere.com        │   │
│              国内开发者 ──┴────────┘                          │   │
│                   超时/连接失败                                 │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                        通过API中转站                             │
│  ┌──────────┐              ┌──────────────┐       ┌──────────┐ │
│  │ 你的代码  │ ── 稳定连接 ──▶│   国内中转站    │──────▶│  官方API  │ │
│  └──────────┘              │  (香港/海外节点) │       └──────────┘ │
│                             │               │                   │
│                             │  - 协议转换    │                   │
│                             │  - 负载均衡    │                   │
│                             │  - 费用结算    │                   │
│                             └──────────────┘                   │
└─────────────────────────────────────────────────────────────────┘

技术定义:API中转站是一个智能代理层,它在用户和各种AI模型提供商之间架起桥梁,提供统一的标准接口。

1.2 为什么需要API中转站?

表格

痛点 解决方案
官方API直连超时、不稳定 中转站部署优化节点,延迟<200ms
多模型需要管理多个Key 统一入口,单Key调用所有模型
官方支付需要信用卡 支持支付宝/微信/人民币充值
模型切换需要改代码 统一接口,改个参数就行
官方限流严格 多渠道冗余,智能路由

1.3 主流中转站对比

根据2026年5月的综合评测,主流平台对比如下:

表格

平台 模型覆盖 OpenAI兼容 Anthropic原生 国内模型 协议完整度
OpenRouter 300+ 部分
非线智能api 480+
147API 200+ 部分
硅基流动 100+
tuziapi 750+

我的推荐

  • 个人开发者/学习:OpenRouter(免费额度多,生态成熟)
  • 生产环境/Claude深度用户:非线智能api(协议完整,版本更新快)
  • 团队统一管理:147API(企业功能完善)

1.4 OpenRouter详解

OpenRouter是海外生态最成熟的模型聚合平台,特别适合开发者快速上手。

核心特性

markdown

✅ 300+ 模型覆盖:GPT-5、Claude 4.7、Gemini 2.5、Llama 4等
✅ 统一OpenAI兼容接口:改个base_url就能用
✅ 智能路由:自动选择最优模型/最低价格
✅ 免费额度:每日50次请求,多个免费模型
✅ Zero Completion Insurance:调用失败不扣费
注册与配置

bash

# 1. 访问 https://openrouter.ai 注册账号
# 2. 支持 Google/GitHub 快速登录
# 3. 在 API Keys 页面创建新密钥(sk-or-开头)

# 重要:首次使用需要配置隐私设置
# Settings > Privacy > 启用免费模型数据政策
Python调用示例

python

# 安装依赖
pip install openai

# 标准调用方式
from openai import OpenAI

client = OpenAI(
    api_key="sk-or-v1-xxxxxxxxxxxxxxxx",  # 你的OpenRouter密钥
    base_url="https://openrouter.ai/api/v1"  # 统一入口
)

# 调用GPT-4o
response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "用Python实现快速排序"}]
)
print(response.choices[0].message.content)

# 切换到Claude,只需改model参数
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4-20250514",  # 注意格式:provider/model-name
    messages=[{"role": "user", "content": "解释什么是闭包"}]
)

# 智能路由 - 让平台自动选最优模型
response = client.chat.completions.create(
    model="openrouter/auto",  # 自动路由
    messages=[{"role": "user", "content": "帮我写一个Web服务器"}]
)

路由优化技巧

python

# OpenRouter支持多种路由快捷方式
# :nitro - 最快吞吐量的提供商
# :floor - 最低价格的提供商  
# :online - 启用网络搜索

# 示例:使用最低价GPT-4o
response = client.chat.completions.create(
    model="openai/gpt-4o:floor",
    messages=[...]
)

# 示例:启用搜索增强
response = client.chat.completions.create(
    model="openai/gpt-4o:online",
    messages=[{"role": "user", "content": "今天有什么科技新闻?"}]
)

1.5 国内中转站:非线智能api

国内平台最大的优势是协议完整度高人民币结算

python

from openai import OpenAI

client = OpenAI(
    api_key="sk-xxxxxxxxxxxxxxxx",  # 国内平台密钥
    base_url="https://api.nonelinear.com/v1"  # 平台endpoint
)

# 调用Claude(OpenAI兼容格式)
response = client.chat.completions.create(
    model="claude-opus-4.7",
    messages=[{"role": "user", "content": "什么是RAG?"}]
)

# 如果平台支持Anthropic原生协议,也可以用官方SDK
from anthropic import Anthropic

anthropic_client = Anthropic(
    api_key="sk-xxxxxxxxxxxxxxxx",
    base_url="https://api.nonelinear.com/anthropic/v1"  # 原生协议endpoint
)

response = anthropic_client.messages.create(
    model="claude-opus-4.7",
    max_tokens=1024,
    messages=[{"role": "user", "content": "用Python写一个装饰器"}]
)

2. API-Key管理与GAC

2.1 什么是API-Key?

API-Key是调用大模型服务的"通行证",类似于密码的作用。每个平台生成的Key格式不同

markdown

OpenAI: sk-proj-xxxxxxxxxxxxxxxx
Anthropic: sk-ant-api03-xxxxxxxxxxxxxxxx
OpenRouter: sk-or-v1-xxxxxxxxxxxxxxxx
国内平台: sk-xxxxxxxxxxxxxxxx

2.2 安全存储最佳实践

❌ 错误做法(血泪教训)

python

# 绝对禁止:把Key直接写在代码里
client = OpenAI(api_key="sk-xxxxxxxxxxxxxxxx")  # 会泄露!

# 如果上传到GitHub,几分钟内就会被盗刷

✅ 正确做法一:环境变量

bash

# Linux/macOS 终端
export ANTHROPIC_API_KEY="sk-ant-xxx"
export OPENAI_API_KEY="sk-proj-xxx"

# Windows PowerShell
$env:ANTHROPIC_API_KEY = "sk-ant-xxx"

# 写入 ~/.bashrc 或 ~/.zshrc 永久生效
echo 'export ANTHROPIC_API_KEY="sk-ant-xxx"' >> ~/.bashrc

python

# Python代码中读取
import os

api_key = os.environ.get("ANTHROPIC_API_KEY")
if not api_key:
    raise ValueError("请设置 ANTHROPIC_API_KEY 环境变量")

client = Anthropic(api_key=api_key)

✅ 正确做法二:python-dotenv

bash

# 安装
pip install python-dotenv

# 项目根目录创建 .env 文件
# 注意:.env 一定要加入 .gitignore!

env

# .env 文件内容
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-proj-xxx
OPENROUTER_API_KEY=sk-or-v1-xxx

python

# Python代码
from dotenv import load_dotenv
import os

# 加载 .env 文件
load_dotenv()

# 读取配置
api_key = os.getenv("ANTHROPIC_API_KEY")

git

# .gitignore 文件
.env
.env.local
.env.*.local

✅ 正确做法三:GAC(Git Auto Commit)

GAC是一个智能的Git提交助手,可以安全管理API密钥并自动生成提交信息。

bash

# 安装
uv tool install gac

# 初始化配置
gac init

# 基本使用
git add .
gac  # 自动生成提交信息

# 常用命令
gac -y          # 自动确认
gac -a -y -p    # 暂存所有 + 自动确认 + 推送
gac -v          # 详细格式
gac -o          # 单行格式

env

# GAC配置文件 ~/.gac.env
GAC_MODEL=anthropic:claude-sonnet-4-20250514
OPENAI_API_KEY=sk-proj-xxx
ANTHROPIC_API_KEY=sk-ant-xxx

GAC的安全特性

bash

# 自动扫描敏感信息
gac --secret-scan    # 提交前检查API密钥
gac --skip-secret-scan  # 禁用自动扫描(谨慎使用)

# SSL配置(企业代理环境)
GAC_NO_VERIFY_SSL=true  # 跳过SSL验证

2.3 团队API-Key管理策略

markdown

## 团队Key管理最佳实践

1. **不要共享Key**
   - 每人注册自己的账号
   - 各自充值各自的额度
   
2. **使用统一网关**
   - 搭建One-API或LiteLLM统一入口
   - 管理员分配虚拟Key给团队成员
   - 设置额度限制和用量监控

3. **环境隔离**
   - 开发环境 / 测试环境 / 生产环境 分离
   - 不同环境使用不同的Key

3. Claude国内使用方案

3.1 Claude官方API访问

Claude官方API支持多种接入方式:

python

# 方式一:官方Python SDK(推荐)
pip install anthropic

from anthropic import Anthropic

client = Anthropic(
    api_key=os.environ.get("ANTHROPIC_API_KEY"),
    timeout=60.0  # 建议设置,防止长请求超时
)

# 基础调用
message = client.messages.create(
    model="claude-sonnet-4-20250514",  # 最新Sonnet
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "解释什么是异步编程"}
    ]
)
print(message.content[0].text)

# 带系统提示
message = client.messages.create(
    model="claude-opus-4-20250514",  # Opus更强
    max_tokens=2048,
    system="你是一个Python专家,用简洁清晰的语言解释概念",
    messages=[
        {"role": "user", "content": "什么是装饰器?"}
    ]
)

# 流式输出
with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "讲个笑话"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)  # 必须flush=True!

python

# 方式二:原生HTTP请求
import requests
import os

API_URL = "https://api.anthropic.com/v1/messages"
API_KEY = os.environ.get("ANTHROPIC_API_KEY")

headers = {
    "x-api-key": API_KEY,
    "anthropic-version": "2023-06-01",  # 必填
    "Content-Type": "application/json"
}

data = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "什么是FastAPI?"}
    ]
}

response = requests.post(API_URL, headers=headers, json=data, timeout=60)
result = response.json()
print(result["content"][0]["text"])

3.2 Claude模型选择指南

表格

模型 模型ID 特点 适用场景
Claude Opus 4.7 claude-opus-4-7 最强推理能力 复杂分析、代码审查
Claude Sonnet 4.6 claude-sonnet-4-6 均衡之选(推荐) 日常开发、文档处理
Claude Haiku 4.5 claude-haiku-4-5-20251001 速度快、成本低 快速问答、批量处理

价格参考(以ClaudeAPI.com为例,2026年5月):

markdown

| 模型 | 输入价格 | 输出价格 | 推荐场景 |
|------|----------|----------|----------|
| Opus 4.7 | $4.00/1M | $20.00/1M | 复杂推理 |
| Sonnet 4.6 | $2.40/1M | $12.00/1M | 日常开发 |
| Haiku 4.5 | $0.80/1M | $4.00/1M | 快速任务 |

3.3 错误处理与429限流

python

import time
from anthropic import Anthropic, RateLimitError, APIStatusError

client = Anthropic()

def call_with_retry(prompt, max_retries=5):
    """带指数退避的重试机制"""
    for i in range(max_retries):
        try:
            return client.messages.create(
                model="claude-sonnet-4-6",
                max_tokens=1024,
                messages=[{"role": "user", "content": prompt}]
            )
        except RateLimitError:
            # 429限流:指数退避等待
            wait = 2 ** i
            print(f"触发限流,等待 {wait}s 后重试...")
            time.sleep(wait)
        except APIStatusError as e:
            # 5xx错误:服务端问题,等待后重试
            if e.status_code >= 500:
                print(f"服务端错误 {e.status_code},等待 5s 重试...")
                time.sleep(5)
                continue
            raise
    raise RuntimeError("重试次数用尽")

# 使用
result = call_with_retry("解释什么是RESTful API")

3.4 常见坑点

python

# 坑1:context too long - 不是只有输入超限
# 输出max_tokens + 输入tokens > 上下文窗口也会报错
# Claude Opus 4.7 上下文窗口200K,注意计算!

# 坑2:messages必须user开头
# ❌ 错误
messages = [{"role": "assistant", "content": "你好"}]  # 报错!

# ✅ 正确:system单独传
response = client.messages.create(
    model="claude-sonnet-4-6",
    system="你是一个有帮助的助手",  # system单独传
    messages=[
        {"role": "user", "content": "你好"}
    ]
)

# 坑3:tool_use后消息顺序
# 用工具调用时,assistant返回tool_use块后
# 下一条user消息必须包含对应tool_use_id的tool_result

4. CC-Switch深度解析

4.1 什么是CC-Switch?

CC-Switch 是专为 Claude Code 打造的多配置管理工具,让你在不同API配置间一键切换。

plaintext

核心功能:
├── 多Provider管理 - 同时配置官方Key、中转Key、多个渠道
├── 一键切换 - 一条命令切换所有配置
├── Web界面 - 可视化配置管理
├── 智能路由 - 自动选择可用渠道
└── Skills管理 - 一键安装GitHub热门Skills

4.2 安装配置

bash

# npm全局安装(推荐)
npm install -g @hobeeliu/cc-switch
cc-switch --version

# 或下载安装包
# GitHub: https://github.com/farion1231/cc-switch/releases
# 支持 Windows(mac)/macOS(dmg)/Linux(deb/rpm/AppImage)

4.3 ClaudeAPI.com国内直连配置

ClaudeAPI.com是国内直连Claude的优质方案,支持支付宝/微信充值。

bash

# Step 1: 获取API Key
# 访问 https://claudeapi.com 注册
# 控制台 > API Keys > 创建新密钥

# Step 2: 初始化配置
cc-switch init

# Step 3: 添加Provider(Web界面)
cc-switch web
# 自动打开浏览器,界面操作更直观

Web界面配置步骤:

plaintext

1. 点击右上角 "+" 添加供应商
2. 选择 "ClaudeAPI.com" 预设模板
3. 填写配置:
   - 供应商名称:ClaudeAPI (可自定义)
   - API Key: sk-ant-xxx (从后台复制)
   - 请求地址: https://hk.claudeapi.com  ⚠️ 不要以斜杠结尾
4. 模型映射:
   - 主模型: claude-sonnet-4-6
   - Opus模型: claude-opus-4-7
   - Sonnet模型: claude-sonnet-4-6
   - Haiku模型: claude-haiku-4-5-20251001
5. 勾选 "写入通用配置"
6. 保存并激活

4.4 命令行操作

bash

# 查看所有配置
cc-switch list

# 切换配置
cc-switch use claudeapi    # 切换到ClaudeAPI
cc-switch use official      # 切换到官方
cc-switch use deepseek      # 切换到DeepSeek

# 测试连通性
cc-switch test

# 编辑配置
cc-switch edit default --field env.ANTHROPIC_AUTH_TOKEN
# 输入新Key,自动保存并验证

# 导出/备份配置
cc-switch export > backup.json

# 导入配置
cc-switch import backup.json

4.5 配合Claude Code使用

bash

# 安装Claude Code
npm install -g @anthropic-ai/claude-code

# 切换配置并启动Claude Code
cc-switch use claudeapi && claude

# 或直接运行(使用默认配置)
claude

# 验证Claude Code版本
claude --version
# 输出: 2.1.89 (Claude Code)

5. Codex国内访问

5.1 Codex是什么?

Codex是OpenAI推出的AI编程工具,有多种形态:

plaintext

Codex产品矩阵:
├── Claude Code (Anthropic) - CLI工具,编程助手
├── GitHub Copilot (Microsoft) - IDE插件
├── Cursor - AI代码编辑器
└── Codex CLI (@openai/codex) - OpenAI官方CLI

5.2 Codex CLI安装与配置

bash

# 安装Node.js 22+
# 检查版本
node --version

# 安装Codex CLI
npm install -g @openai/codex
codex --version

5.3 国内中转配置

由于网络限制,需要配置第三方API。

toml

# ~/.codex/config.toml

# 方式一:直接修改base_url
openai_base_url = "https://你的中转地址/v1"
model = "gpt-5.4-codex"  # 或其他代码模型

# 方式二:自定义Provider(推荐)
model = "openai/gpt-4o"
model_provider = "myproxy"

[model_providers.myproxy]
name = "国内中转"
base_url = "https://api.中转站.com/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"  # 必须设为responses!
requires_openai_auth = false

json

// ~/.codex/auth.json
{
    "OPENAI_API_KEY": "sk-你的中转站密钥"
}

bash

# 设置环境变量(推荐)
export OPENAI_API_KEY="sk-你的中转站密钥"

5.4 常用配置示例

toml

# 完整配置示例
# ~/.codex/config.toml

# 默认使用GPT-5.4进行代码任务
model = "openai/gpt-5.4-codex"
model_provider = "proxy"

# 推理投入设置
model_reasoning_effort = "high"

[model_providers.proxy]
name = "非线智能api"
base_url = "https://api.nonelinear.com/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
requires_openai_auth = false

# 重试配置
request_max_retries = 4
stream_max_retries = 5
stream_idle_timeout_ms = 300000

6. 多模型切换架构

6.1 为什么要统一管理?

plaintext

痛点:
├── 每个模型SDK不同,代码耦合
├── 换模型要改代码,测试成本高
├── 无法灵活切换,成本难控
└── 单点故障,服务不稳定

解决方案:LiteLLM / One-API

6.2 LiteLLM:生产级网关

LiteLLM是一个开源的统一AI网关,支持100+模型。

bash

# 安装
pip install 'litellm[proxy]'

# 或Docker部署
docker run \
    -v $(pwd)/litellm_config.yaml:/app/config.yaml \
    -e OPENAI_API_KEY=your-key \
    -e ANTHROPIC_API_KEY=your-key \
    -p 4000:4000 \
    ghcr.io/berriai/litellm:main

yaml

# litellm_config.yaml
model_list:
  # OpenAI配置
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
  
  # Claude配置(通过OpenRouter)
  - model_name: claude-sonnet
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/ANTHROPIC_API_KEY
  
  # DeepSeek(国内模型,直接访问)
  - model_name: deepseek-chat
    litellm_params:
      model: deepseek/deepseek-chat-v3-0324
      api_key: os.environ/DEEPSEEK_API_KEY
      api_base: https://api.deepseek.com

litellm_settings:
  drop_params: true
  set_verbose: true

python

# 统一调用 - 不管底层是什么模型
from litellm import completion

# 调用GPT-4o
response = completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}]
)

# 切换到Claude,只需改model
response = completion(
    model="claude-sonnet",
    messages=[{"role": "user", "content": "Hello!"}]
)

# 切换到DeepSeek
response = completion(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "Hello!"}]
)

6.3 One-API:轻量级中转

One-API适合快速搭建私有API网关。

bash

# Docker一行部署
docker run --name one-api -d \
    --restart always \
    -p 3000:3000 \
    -e TZ=Asia/Shanghai \
    -v /data/one-api:/data \
    justsong/one-api

# 访问 http://你的服务器IP:3000
# 初始账号: root
# 初始密码: 123456
# ⚠️ 登录后立即修改密码!

配置渠道:

plaintext

1. 登录后台 > 渠道 > 添加渠道
2. 选择类型(OpenAI/Anthropic/DeepSeek等)
3. 填入官方API Key
4. 选择支持的模型
5. 设置权重(负载均衡)

python

# 调用示例
from openai import OpenAI

client = OpenAI(
    api_key="sk-你生成的令牌",  # One-API生成的令牌
    base_url="http://服务器IP:3000/v1"  # 改成你的服务器地址
)

# 现在可以调用所有配置的模型
response = client.chat.completions.create(
    model="gpt-4o",  # OpenAI
    messages=[{"role": "user", "content": "你好"}]
)

response = client.chat.completions.create(
    model="claude-3-5-sonnet-20241022",  # Anthropic
    messages=[{"role": "user", "content": "你好"}]
)

response = client.chat.completions.create(
    model="deepseek-chat",  # DeepSeek
    messages=[{"role": "user", "content": "你好"}]
)

6.4 多模型切换架构设计

python

# 多模型统一客户端
from abc import ABC, abstractmethod
from enum import Enum
from typing import Optional
import os

class ModelProvider(Enum):
    OPENAI = "openai"
    ANTHROPIC = "anthropic"
    DEEPSEEK = "deepseek"
    LOCAL = "local"

class UnifiedLLMClient(ABC):
    """统一大模型客户端基类"""
    
    @abstractmethod
    def complete(self, prompt: str, **kwargs):
        pass
    
    @abstractmethod
    def chat(self, messages: list, **kwargs):
        pass

class OpenAICompatibleClient(UnifiedLLMClient):
    """OpenAI兼容接口客户端"""
    
    def __init__(self, base_url: str, api_key: str, model: str):
        from openai import OpenAI
        self.client = OpenAI(base_url=base_url, api_key=api_key)
        self.model = model
    
    def complete(self, prompt: str, **kwargs):
        return self.chat([{"role": "user", "content": prompt}], **kwargs)
    
    def chat(self, messages: list, **kwargs):
        return self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            **kwargs
        )

class ClaudeClient(UnifiedLLMClient):
    """Claude原生接口客户端"""
    
    def __init__(self, api_key: str, model: str = "claude-sonnet-4-6"):
        from anthropic import Anthropic
        self.client = Anthropic(api_key=api_key)
        self.model = model
    
    def complete(self, prompt: str, **kwargs):
        return self.chat([{"role": "user", "content": prompt}], **kwargs)
    
    def chat(self, messages: list, **kwargs):
        # 转换消息格式
        system = kwargs.pop("system", None)
        return self.client.messages.create(
            model=self.model,
            system=system,
            messages=messages,
            **kwargs
        )

class MultiModelRouter:
    """多模型路由器"""
    
    def __init__(self):
        self.clients = {}
        self._init_clients()
    
    def _init_clients(self):
        """初始化所有客户端"""
        # OpenAI (通过OpenRouter)
        self.clients["gpt-4o"] = OpenAICompatibleClient(
            base_url=os.environ.get("OPENROUTER_URL", "https://openrouter.ai/api/v1"),
            api_key=os.environ.get("OPENROUTER_API_KEY"),
            model="openai/gpt-4o"
        )
        
        # Claude (通过ClaudeAPI)
        self.clients["claude"] = ClaudeClient(
            api_key=os.environ.get("ANTHROPIC_API_KEY"),
            model="claude-sonnet-4-6"
        )
        
        # DeepSeek (直连)
        self.clients["deepseek"] = OpenAICompatibleClient(
            base_url="https://api.deepseek.com/v1",
            api_key=os.environ.get("DEEPSEEK_API_KEY"),
            model="deepseek-chat"
        )
    
    def complete(self, prompt: str, provider: str = "claude", **kwargs):
        """统一完成接口"""
        client = self.clients.get(provider)
        if not client:
            raise ValueError(f"Unknown provider: {provider}")
        return client.complete(prompt, **kwargs)
    
    def chat(self, messages: list, provider: str = "claude", **kwargs):
        """统一对话接口"""
        client = self.clients.get(provider)
        if not client:
            raise ValueError(f"Unknown provider: {provider}")
        return client.chat(messages, **kwargs)
    
    def switch_model(self, provider: str, model: str):
        """切换模型"""
        if provider in self.clients:
            self.clients[provider].model = model

# 使用示例
router = MultiModelRouter()

# 调用Claude
response = router.chat(
    messages=[{"role": "user", "content": "解释什么是装饰器"}],
    provider="claude"
)

# 切换到GPT-4o
response = router.chat(
    messages=[{"role": "user", "content": "解释什么是装饰器"}],
    provider="gpt-4o"
)

# 切换到DeepSeek
response = router.chat(
    messages=[{"role": "user", "content": "解释什么是装饰器"}],
    provider="deepseek"
)

7. 实战代码示例

7.1 Agent开发:带工具调用的Claude

python

import os
from anthropic import Anthropic, HumanStopEvent
from typing import List, Dict, Any

client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))

# 定义工具
tools = [
    {
        "name": "get_weather",
        "description": "获取指定城市的天气",
        "input_schema": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称"}
            },
            "required": ["city"]
        }
    },
    {
        "name": "calculator",
        "description": "执行数学计算",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {"type": "string", "description": "数学表达式"}
            },
            "required": ["expression"]
        }
    }
]

# 工具实现
def execute_tool(name: str, arguments: dict) -> str:
    if name == "get_weather":
        city = arguments["city"]
        # 实际项目中这里调用天气API
        return f"{city}今天晴天,25°C"
    elif name == "calculator":
        expression = arguments["expression"]
        # 安全评估后执行
        result = eval(expression)
        return str(result)
    return "未知工具"

# 带工具调用的对话
def chat_with_tools(messages: List[Dict], max_turns: int = 5):
    for turn in range(max_turns):
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=messages,
            tools=tools
        )
        
        # 收集响应
        messages.append({"role": "assistant", "content": response.content})
        
        # 检查是否需要工具调用
        tool_uses = [block for block in response.content if block.type == "tool_use"]
        
        if not tool_uses:
            # 没有工具调用,返回结果
            return response.content[0].text
        
        # 执行工具
        for tool_use in tool_uses:
            tool_name = tool_use.name
            tool_args = tool_use.input
            
            result = execute_tool(tool_name, tool_args)
            
            # 添加工具结果
            messages.append({
                "role": "user",
                "content": [{
                    "type": "tool_result",
                    "tool_use_id": tool_use.id,
                    "content": result
                }]
            })
    
    return "达到最大对话轮次"

# 使用
messages = [{"role": "user", "content": "北京天气怎么样?帮我算一下 123 * 456"}]
result = chat_with_tools(messages)
print(result)

7.2 RAG系统:多模型检索增强

python

from openai import OpenAI
from typing import List, Tuple
import os

class RAGSystem:
    """简化版RAG系统"""
    
    def __init__(self, llm_client: OpenAI, embedder: OpenAI):
        self.llm = llm_client
        self.embedder = embedder
        # 模拟向量数据库
        self.documents = []
        self.embeddings = []
    
    def add_documents(self, docs: List[str]):
        """添加文档"""
        self.documents.extend(docs)
        
        # 生成embeddings
        response = self.embedder.embeddings.create(
            model="text-embedding-3-small",
            input=docs
        )
        self.embeddings.extend([item.embedding for item in response.data])
    
    def retrieve(self, query: str, top_k: int = 3) -> List[str]:
        """检索相关文档"""
        # 查询embedding
        query_embed = self.embedder.embeddings.create(
            model="text-embedding-3-small",
            input=query
        ).data[0].embedding
        
        # 简单余弦相似度
        similarities = []
        for i, doc_emb in enumerate(self.embeddings):
            sim = self._cosine_sim(query_emb, doc_emb)
            similarities.append((i, sim))
        
        # 返回top_k最相关的
        similarities.sort(key=lambda x: x[1], reverse=True)
        return [self.documents[i] for i, _ in similarities[:top_k]]
    
    def _cosine_sim(self, a: List[float], b: List[float]) -> float:
        """计算余弦相似度"""
        dot = sum(x * y for x, y in zip(a, b))
        norm_a = sum(x * x for x in a) ** 0.5
        norm_b = sum(x * x for x in b) ** 0.5
        return dot / (norm_a * norm_b)
    
    def query(self, question: str, system_prompt: str = None) -> str:
        """RAG查询"""
        # 1. 检索相关文档
        relevant_docs = self.retrieve(question)
        context = "\n\n".join(relevant_docs)
        
        # 2. 构建prompt
        if system_prompt:
            prompt = f"{system_prompt}\n\n参考信息:\n{context}\n\n问题:{question}"
        else:
            prompt = f"""基于以下参考信息回答问题。如果信息不足以回答,请说明。

参考信息:
{context}

问题:{question}"""
        
        # 3. 调用LLM
        response = self.llm.chat.completions.create(
            model="openai/gpt-4o",
            messages=[{"role": "user", "content": prompt}]
        )
        
        return response.choices[0].message.content

# 使用示例
llm_client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ.get("OPENROUTER_API_KEY")
)

embedder = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ.get("OPENROUTER_API_KEY")
)

rag = RAGSystem(llm_client, embedder)

# 添加知识库
rag.add_documents([
    "Python的装饰器是一种高级语法糖,可以在不修改原函数的情况下增加功能。",
    "装饰器接收一个函数作为参数,返回一个新的函数。",
    "常见的装饰器包括@staticmethod、@classmethod、@property等。"
])

# 问答
answer = rag.query("什么是Python装饰器?")
print(answer)

7.3 流式输出:实时显示响应

python

import os
from anthropic import Anthropic

client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))

# 方法一:官方SDK流式
print("Claude回复: ", end="", flush=True)
with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "写一首关于编程的诗"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
print("\n")

# 方法二:流式打字机效果
def typewriter_stream(prompt: str, provider: str = "claude"):
    """模拟打字机效果的流式输出"""
    if provider == "claude":
        stream = client.messages.stream(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}]
        )
        full_response = []
        with stream as s:
            for text in s.text_stream:
                print(text, end="", flush=True)
                full_response.append(text)
        print()
        return "".join(full_response)
    else:
        # OpenAI兼容格式
        from openai import OpenAI
        openai_client = OpenAI(
            base_url="https://openrouter.ai/api/v1",
            api_key=os.environ.get("OPENROUTER_API_KEY")
        )
        stream = openai_client.chat.completions.create(
            model="openai/gpt-4o",
            messages=[{"role": "user", "content": prompt}],
            stream=True
        )
        for chunk in stream:
            if chunk.choices[0].delta.content:
                print(chunk.choices[0].delta.content, end="", flush=True)

8. 踩坑记录与最佳实践

8.1 我踩过的坑

markdown

## 血泪教训总结

### 网络问题
1. ❌ 直接调官方API → ✅ 用中转站
2. ❌ timeout=30 → ✅ timeout=60(长prompt需要更长)
3. ❌ 没有重试机制 → ✅ 指数退避重试

### 密钥安全
4. ❌ Key写在代码里 → ✅ 环境变量
5. ❌ .env上传GitHub → ✅ .gitignore
6. ❌ 共享账号Key → ✅ 各自独立

### API使用
7. ❌ 不设max_tokens → ✅ 必须设置,防止无限生成
8. ❌ 忽略429限流 → ✅ 实现退避重试
9. ❌ 不监控用量 → ✅ 设置预算告警

### 代码规范
10. ❌ 硬编码模型名 → ✅ 配置化
11. ❌ 没有异常处理 → ✅ try-catch包裹
12. ❌ 同步调用阻塞 → ✅ 考虑异步/流式

8.2 成本优化策略

python

# 成本优化实践

# 1. 模型选择策略
def select_model(task: str) -> str:
    """根据任务类型选择性价比最高的模型"""
    if "分析" in task or "推理" in task:
        return "claude-opus-4-7"  # 复杂任务用强模型
    elif "代码" in task:
        return "claude-sonnet-4-6"  # 编程用Sonnet
    else:
        return "claude-haiku-4-5-20251001"  # 简单任务用Haiku

# 2. 缓存重复请求
from functools import lru_cache
import hashlib

@lru_cache(maxsize=1000)
def cached_complete(prompt_hash: str):
    """缓存常见问题"""
    return None  # 实际实现需要配合缓存系统

# 3. 批量处理减少API调用
def batch_process(items: list, batch_size: int = 10):
    """批量处理,减少API调用次数"""
    for i in range(0, len(items), batch_size):
        batch = items[i:i+batch_size]
        # 将batch合并处理
        yield batch

8.3 监控与告警

python

# 简单的用量监控
import time
from datetime import datetime

class UsageTracker:
    """简单的API用量追踪"""
    
    def __init__(self):
        self.requests = []
        self.tokens = {"input": 0, "output": 0}
    
    def record(self, model: str, input_tokens: int, output_tokens: int, 
               cost: float, success: bool = True):
        self.requests.append({
            "timestamp": datetime.now().isoformat(),
            "model": model,
            "input_tokens": input_tokens,
            "output_tokens": output_tokens,
            "cost": cost,
            "success": success
        })
        self.tokens["input"] += input_tokens
        self.tokens["output"] += output_tokens
    
    def report(self):
        """生成报告"""
        total_cost = sum(r["cost"] for r in self.requests)
        success_rate = sum(1 for r in self.requests if r["success"]) / len(self.requests)
        
        return {
            "total_requests": len(self.requests),
            "total_input_tokens": self.tokens["input"],
            "total_output_tokens": self.tokens["output"],
            "total_cost": total_cost,
            "success_rate": success_rate
        }

# 使用
tracker = UsageTracker()

# 在API调用后记录
tracker.record(
    model="claude-sonnet-4-6",
    input_tokens=1000,
    output_tokens=500,
    cost=0.018  # $2.40/1M input + $12.00/1M output
)

print(tracker.report())

8.4 开发环境配置模板

bash

# .env.example - 环境变量模板
# 复制为 .env 后填入实际值

# Anthropic (Claude)
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxxxxx

# OpenRouter
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxx
OPENROUTER_URL=https://openrouter.ai/api/v1

# DeepSeek (国产替代)
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx

# 国内中转 (可选)
NONELINEAR_API_KEY=sk-xxxxxxxxxxxxxxxx
NONELINEAR_BASE_URL=https://api.nonelinear.com/v1

# 国内聚合 (可选)
API147_KEY=sk-xxxxxxxxxxxxxxxx
API147_BASE_URL=https://api.147api.com/v1

bash

# .gitignore
.env
.env.local
.env.*.local
__pycache__/
*.pyc
.pytest_cache/
.venv/
venv/
node_modules/
*.log
.DS_Store

总结

本文系统性地介绍了国内开发者访问大模型API的完整方案:

markdown

## 方案选择指南

┌─────────────────────────────────────────────────────────────────┐
│                        快速选择决策树                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  你是个人开发者?                                                │
│      │                                                         │
│      ├── 学习/尝鲜 ──→ OpenRouter(免费额度)                    │
│      │                                                         │
│      └── 生产使用 ──→ 非线智能api / ClaudeAPI.com              │
│                            │                                    │
│  你的团队?                                                     │
│      │                                                         │
│      ├── 预算有限 ──→ One-API自建 + 官方Key                     │
│      │                                                         │
│      └── 企业级 ──→ LiteLLM + 多渠道 + 监控                     │
│                            │                                    │
│  你用Claude Code?                                              │
│      └── CC-Switch 一键切换                                     │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

核心要点 :

  1. 安全第一 :永远不要把Key写在代码里,用环境变量
  2. 稳定性优先 :通过中转站访问,避免网络问题
  3. 成本控制 :根据任务选择合适的模型
  4. 架构设计 :从一开始就考虑多模型切换
  5. 监控告警 :设置用量预算,防止意外支出

希望这篇指南能帮助到和我一样在AI开发路上摸索的同学们!如果有问题,欢迎交流。

(本文会持续更新,欢迎收藏)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐