Claude Code API
December 17, 2025 · View on GitHub
🦀 cc-sdk v0.4.0 - Claude Code Rust SDK
🎉 与 Python claude-agent-sdk v0.1.14 实现 100% 功能同等!
cc-sdk 是 Claude Code CLI 的官方 Rust SDK,提供:
- 📥 CLI 自动下载 - 找不到 Claude Code CLI 时自动下载
- 📁 文件检查点 - 将文件更改回滚到任意会话节点
- 📊 结构化输出 - 响应的 JSON Schema 验证
- 🔧 完整控制协议 - 权限、钩子、MCP 服务器
- 💰 预算控制 - 支持
max_budget_usd和fallback_model - 🏖️ 沙箱隔离 - Bash 命令的文件系统/网络隔离
use cc_sdk::{query, ClaudeCodeOptions};
use futures::StreamExt;
#[tokio::main]
async fn main() -> cc_sdk::Result<()> {
let options = ClaudeCodeOptions::builder()
.model("claude-opus-4-5-20251101") // 最新 Opus 4.5
.auto_download_cli(true) // 自动下载 CLI
.max_budget_usd(10.0) // 预算限制
.build();
let mut stream = query("你好,Claude!", Some(options)).await?;
while let Some(msg) = stream.next().await {
println!("{:?}", msg?);
}
Ok(())
}
一个高性能的 Rust 实现的 OpenAI 兼容 API 网关,用于 Claude Code CLI。基于强大的 cc-sdk 构建,该项目提供了一个 RESTful API 接口,让您可以使用熟悉的 OpenAI API 格式与 Claude Code 进行交互。
🎉 谁在使用 Claude Code API
- url-preview v0.6.0 - 一个用于从网页提取结构化数据的 Rust 库,使用 LLM 技术。它通过 claude-code-api 提供 Claude 驱动的网页内容提取功能,同时支持 OpenAI。
✨ 特性
- 🔌 OpenAI API 兼容 - 可直接替换 OpenAI API,兼容现有的 OpenAI 客户端库
- 🚀 高性能 - 使用 Rust、Axum 和 Tokio 构建,性能卓越
- 📦 基于 claude-code-sdk-rs - 使用强大的 SDK 实现与 Claude Code CLI 的完整集成
- ⚡ 连接池优化 - 通过优化的连接池复用 Claude 进程,响应速度提升 5-10 倍
- 💬 会话管理 - 内置会话支持,实现多轮对话
- 🖼️ 多模态支持 - 在请求中同时处理图片和文本
- ⚡ 响应缓存 - 智能缓存系统,减少延迟和成本
- 🔧 MCP 支持 - 模型上下文协议集成,可访问外部工具和服务
- 📁 文件访问控制 - 可配置的文件系统权限,确保安全操作
- 🌊 流式响应 - 支持长文本的实时流式传输
- 🛡️ 健壮的错误处理 - 全面的错误处理和自动重试机制
- 📊 统计 API - 监控使用情况和性能指标
- 🔄 多种客户端模式 - OneShot(单次查询)、Interactive(交互式)和 Batch(批处理)模式
- 🔧 工具调用 - 支持 OpenAI tools 格式,用于 AI 工具集成
🚀 快速开始
前置要求
- Rust 1.75 或更高版本
- 已安装并配置 Claude CLI
- (可选)用于扩展功能的 MCP 服务器
安装
方式一:从 crates.io 安装
cargo install claude-code-api
然后运行:
RUST_LOG=info claude-code-api
# 或使用短别名
RUST_LOG=info ccapi
方式二:从源码构建
git clone https://github.com/ZhangHanDong/claude-code-api-rs.git
cd claude-code-api-rs
构建整个工作区(API 服务器 + SDK):
cargo build --release
启动服务器:
./target/release/claude-code-api
注意:API 服务器自动包含并使用 claude-code-sdk-rs 来处理所有与 Claude Code CLI 的交互。
API 服务器将默认在 http://localhost:8080 启动。
快速测试
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-20250514",
"messages": [
{"role": "user", "content": "你好,Claude!"}
]
}'
📖 核心功能
1. OpenAI 兼容的聊天 API
import openai
# 配置客户端使用 Claude Code API
client = openai.OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed" # 不需要 API 密钥
)
response = client.chat.completions.create(
model="claude-opus-4-20250514",
messages=[
{"role": "user", "content": "用 Python 写一个 hello world"}
]
)
print(response.choices[0].message.content)
2. 会话管理
跨多个请求保持上下文:
# 第一次请求 - 创建新会话
response = client.chat.completions.create(
model="claude-opus-4-20250514",
messages=[
{"role": "user", "content": "我叫小明"}
]
)
conversation_id = response.conversation_id
# 后续请求 - 继续会话
response = client.chat.completions.create(
model="claude-opus-4-20250514",
conversation_id=conversation_id,
messages=[
{"role": "user", "content": "我叫什么名字?"}
]
)
# Claude 会记住:"你叫小明"
3. 多模态支持
同时处理图片和文本:
response = client.chat.completions.create(
model="claude-opus-4-20250514",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "这张图片里有什么?"},
{"type": "image_url", "image_url": {"url": "/path/to/image.png"}}
]
}]
)
支持的图片格式:
- 本地文件路径
- HTTP/HTTPS URL
- Base64 编码的 data URL
4. 流式响应
stream = client.chat.completions.create(
model="claude-opus-4-20250514",
messages=[{"role": "user", "content": "写一个长故事"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
5. MCP(模型上下文协议)
让 Claude 能够访问外部工具和服务:
# 创建 MCP 配置
cat > mcp_config.json << EOF
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"
}
}
}
}
EOF
# 启动时启用 MCP 支持
export CLAUDE_CODE__MCP__ENABLED=true
export CLAUDE_CODE__MCP__CONFIG_FILE="./mcp_config.json"
./target/release/claude-code-api
Agent 工具与权限
- SDK 工具控制:在
ClaudeCodeOptions设置allowed_tools/disallowed_tools以及permission_mode(Default/AcceptEdits/Plan/BypassPermissions)。 - 运行时审批(SDK):实现
CanUseTool,对每次工具调用返回{allow, input?/reason?}。 - MCP(API):通过
config/*.toml或mcp_config.json配置,使用script/下脚本(如start_with_mcp.sh)。API 内部复用 SDK 的 MCP 接入。 - 程序化 Agent(SDK):使用
agents与setting_sources将结构化 Agent 定义传给 CLI。
完整示例见 claude-code-sdk-rs/README.md 的 “Agent Tools & MCP”。
🔧 配置
环境变量
# 服务器配置
CLAUDE_CODE__SERVER__HOST=0.0.0.0
CLAUDE_CODE__SERVER__PORT=8080
# Claude CLI 配置
CLAUDE_CODE__CLAUDE__COMMAND=claude
CLAUDE_CODE__CLAUDE__TIMEOUT_SECONDS=300
CLAUDE_CODE__CLAUDE__MAX_CONCURRENT_SESSIONS=10
CLAUDE_CODE__CLAUDE__USE_INTERACTIVE_SESSIONS=true
# 文件访问权限
CLAUDE_CODE__FILE_ACCESS__SKIP_PERMISSIONS=false
CLAUDE_CODE__FILE_ACCESS__ADDITIONAL_DIRS='["/path1", "/path2"]'
# MCP 配置
CLAUDE_CODE__MCP__ENABLED=true
CLAUDE_CODE__MCP__CONFIG_FILE="./mcp_config.json"
CLAUDE_CODE__MCP__STRICT=false
CLAUDE_CODE__MCP__DEBUG=false
# 缓存配置
CLAUDE_CODE__CACHE__ENABLED=true
CLAUDE_CODE__CACHE__MAX_ENTRIES=1000
CLAUDE_CODE__CACHE__TTL_SECONDS=3600
# 会话管理
CLAUDE_CODE__CONVERSATION__MAX_HISTORY_MESSAGES=20
CLAUDE_CODE__CONVERSATION__SESSION_TIMEOUT_MINUTES=30
配置文件
创建 config/local.toml:
[server]
host = "0.0.0.0"
port = 8080
[claude]
command = "claude"
timeout_seconds = 300
max_concurrent_sessions = 10
use_interactive_sessions = false # 默认禁用,因为存在稳定性问题
[file_access]
skip_permissions = false
additional_dirs = ["/Users/me/projects", "/tmp"]
[mcp]
enabled = true
config_file = "./mcp_config.json"
strict = false
debug = false
📦 基于 claude-code-sdk-rs 构建
本 API 服务器基于 claude-code-sdk-rs 构建,这是一个功能强大的 Claude Code CLI Rust SDK,提供:
- 与官方 Python SDK 完全兼容 - 100% 功能对等
- 多种客户端类型:
query()- 简单的一次性查询InteractiveClient- 有状态的会话,保持上下文OptimizedClient- 带连接池和性能优化的高级客户端
- 流式支持 - 实时消息流
- 完整的类型安全 - 使用 serde 提供强类型支持
- 异步/等待 - 基于 Tokio 的高性能异步操作
直接使用 SDK
如果您想构建自己的集成,可以直接使用 SDK:
[dependencies]
cc-sdk = "0.1.5"
tokio = { version = "1.0", features = ["full"] }
use cc_sdk::{query, ClaudeCodeOptions, PermissionMode};
use futures::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 简单查询(流式返回消息)
let mut messages = query("解释量子计算", None).await?;
while let Some(msg) = messages.next().await {
println!("{:?}", msg?);
}
// 使用选项
let options = ClaudeCodeOptions::builder()
.model("claude-3.5-sonnet")
.permission_mode(PermissionMode::AcceptEdits)
.build();
let mut messages = query("写一首俳句", Some(options)).await?;
while let Some(msg) = messages.next().await {
println!("{:?}", msg?);
}
Ok(())
}
📚 API 端点
聊天补全
POST /v1/chat/completions- 创建聊天补全
模型
GET /v1/models- 列出可用模型
会话
POST /v1/conversations- 创建新会话GET /v1/conversations- 列出活跃会话GET /v1/conversations/:id- 获取会话详情
统计
GET /stats- 获取 API 使用统计
健康检查
GET /health- 检查服务健康状态
🛠️ 高级用法
与 LangChain 一起使用
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed",
model="claude-opus-4-20250514"
)
response = llm.invoke("解释量子计算")
print(response.content)
与 Node.js 一起使用
const OpenAI = require('openai');
const client = new OpenAI({
baseURL: 'http://localhost:8080/v1',
apiKey: 'not-needed'
});
async function chat() {
const response = await client.chat.completions.create({
model: 'claude-opus-4-20250514',
messages: [{ role: 'user', content: '你好!' }]
});
console.log(response.choices[0].message.content);
}
使用 curl
# 基本请求
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-20250514",
"messages": [{"role": "user", "content": "你好"}]
}'
# 带会话 ID
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-20250514",
"conversation_id": "uuid-here",
"messages": [{"role": "user", "content": "继续我们的对话"}]
}'
# 带图片
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-20250514",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "这是什么?"},
{"type": "image_url", "image_url": {"url": "/path/to/image.png"}}
]
}]
}'
🔒 安全性
- 通过可配置的权限控制文件访问
- MCP 服务器在隔离的进程中运行
- 无需 API 密钥(依赖 Claude CLI 认证)
- 支持 CORS,适用于 Web 应用
- 请求 ID 跟踪,便于审计
⚡ 性能优化
交互式会话
API 支持交互式会话管理,可显著提升性能:
- 首次请求:5-15 秒(Claude 进程启动)
- 后续请求:< 0.1 秒(带缓存)
由于稳定性问题,交互式会话当前默认禁用:
[claude]
use_interactive_sessions = false # 默认值
注意:交互式会话模式存在已知的并发问题,不建议在生产环境使用。
最佳实践
- 使用会话 ID 为相关请求复用会话
- 启用响应缓存 为频繁重复的查询
- 配置适当的超时 基于您的使用场景
- 监控活跃会话 通过
/stats端点
详细信息请参见 交互式会话指南。
🐛 故障排除
常见问题
-
"权限被拒绝"错误
# 启用文件权限 export CLAUDE_CODE__FILE_ACCESS__SKIP_PERMISSIONS=true # 或使用启动脚本 ./start_with_permissions.sh -
MCP 服务器不工作
# 启用调试模式 export CLAUDE_CODE__MCP__DEBUG=true # 检查 MCP 服务器安装 npx -y @modelcontextprotocol/server-filesystem --version -
首次请求延迟高
- 这是正常的,因为 Claude CLI 需要启动
- 后续请求会因为进程复用而更快
🤝 贡献
欢迎贡献!请随时提交 Pull Request。
- Fork 仓库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'Add some amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 开启 Pull Request
📄 许可证
本项目基于 MIT 许可证 - 详见 LICENSE 文件。
🙏 致谢
- 基于 Claude Code CLI 构建
- 受 OpenAI API 设计启发
- 由 Axum Web 框架驱动
📞 支持
由 Claude Code API 团队用 ❤️ 制作