Files
9router/gitbook/content/zh-CN/integration/other-tools.md
T
2026-05-11 11:50:24 +07:00

417 lines
8.5 KiB
Markdown

# 其他工具集成
9Router 兼容任何支持 OpenAI API 格式的工具。本指南介绍各种工具和自定义应用的通用集成模式。
## 概览
9Router 提供 OpenAI 兼容的 API endpoint,可与以下场景配合使用:
- 自定义脚本与应用
- API 客户端与测试工具
- CLI 工具与实用程序
- 第三方集成
- 开发框架
## 通用设置模式
任何 OpenAI 兼容的工具都可以通过以下设置连接到 9Router:
**本地 9Router:**
```
Base URL: http://localhost:20128/v1
API Key: your-api-key-from-dashboard
Model: 任意 9Router 模型(cc/*, cx/*, glm/*, 等)
```
**云端 9Router:**
```
Base URL: https://9router.com/v1
API Key: your-api-key-from-dashboard
Model: 任意 9Router 模型(cc/*, cx/*, glm/*, 等)
```
## 可用模型
### Claude 模型(Anthropic)
- `cc/claude-opus-4-5-20251101`
- `cc/claude-sonnet-4-20250514`
- `cc/claude-haiku-4-20250514`
### DeepSeek 模型
- `cx/deepseek-chat`
- `cx/deepseek-reasoner`
### GLM 模型(Zhipu AI)
- `glm/glm-4-plus`
- `glm/glm-4-flash`
## 集成示例
### Python 使用 OpenAI SDK
```python
from openai import OpenAI
client = OpenAI(
api_key="your-api-key-from-dashboard",
base_url="http://localhost:20128/v1"
)
response = client.chat.completions.create(
model="cc/claude-sonnet-4-20250514",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
```
### Node.js 使用 OpenAI SDK
```javascript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "your-api-key-from-dashboard",
baseURL: "http://localhost:20128/v1"
});
const response = await client.chat.completions.create({
model: "cc/claude-sonnet-4-20250514",
messages: [
{ role: "user", content: "Hello, how are you?" }
]
});
console.log(response.choices[0].message.content);
```
### cURL 命令
```bash
curl http://localhost:20128/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key-from-dashboard" \
-d '{
"model": "cc/claude-sonnet-4-20250514",
"messages": [
{"role": "user", "content": "Hello, how are you?"}
]
}'
```
### HTTP 客户端(Postman、Insomnia)
**Request:**
```
POST http://localhost:20128/v1/chat/completions
```
**Headers:**
```
Content-Type: application/json
Authorization: Bearer your-api-key-from-dashboard
```
**Body:**
```json
{
"model": "cc/claude-sonnet-4-20250514",
"messages": [
{"role": "user", "content": "Hello, how are you?"}
],
"temperature": 0.7,
"max_tokens": 1000
}
```
### LangChain 集成
```python
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
llm = ChatOpenAI(
model_name="cc/claude-sonnet-4-20250514",
openai_api_key="your-api-key-from-dashboard",
openai_api_base="http://localhost:20128/v1",
temperature=0.7
)
messages = [HumanMessage(content="Explain quantum computing")]
response = llm(messages)
print(response.content)
```
### LlamaIndex 集成
```python
from llama_index.llms import OpenAI
llm = OpenAI(
model="cc/claude-sonnet-4-20250514",
api_key="your-api-key-from-dashboard",
api_base="http://localhost:20128/v1"
)
response = llm.complete("What is machine learning?")
print(response.text)
```
## 自定义脚本示例
### 批处理脚本
```python
import openai
import json
openai.api_key = "your-api-key-from-dashboard"
openai.api_base = "http://localhost:20128/v1"
def process_batch(prompts, model="cx/deepseek-chat"):
results = []
for prompt in prompts:
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
results.append({
"prompt": prompt,
"response": response.choices[0].message.content
})
return results
prompts = [
"Explain AI in one sentence",
"What is machine learning?",
"Define neural networks"
]
results = process_batch(prompts)
print(json.dumps(results, indent=2))
```
### 流式响应处理
```javascript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "your-api-key-from-dashboard",
baseURL: "http://localhost:20128/v1"
});
async function streamResponse(prompt) {
const stream = await client.chat.completions.create({
model: "cc/claude-sonnet-4-20250514",
messages: [{ role: "user", content: prompt }],
stream: true
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || "";
process.stdout.write(content);
}
}
streamResponse("Write a short story about AI");
```
### 多模型对比
```python
from openai import OpenAI
client = OpenAI(
api_key="your-api-key-from-dashboard",
base_url="http://localhost:20128/v1"
)
models = [
"cc/claude-sonnet-4-20250514",
"cx/deepseek-chat",
"glm/glm-4-plus"
]
prompt = "Explain quantum computing in simple terms"
for model in models:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
print(f"\n=== {model} ===")
print(response.choices[0].message.content)
```
## 常见集成模式
### 环境变量
安全地存储凭据:
```bash
# .env file
ROUTER_API_KEY=your-api-key-from-dashboard
ROUTER_BASE_URL=http://localhost:20128/v1
ROUTER_MODEL=cc/claude-sonnet-4-20250514
```
```python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("ROUTER_API_KEY"),
base_url=os.getenv("ROUTER_BASE_URL")
)
```
### 错误处理
```python
from openai import OpenAI, OpenAIError
client = OpenAI(
api_key="your-api-key",
base_url="http://localhost:20128/v1"
)
try:
response = client.chat.completions.create(
model="cc/claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)
except OpenAIError as e:
print(f"Error: {e}")
```
### 重试逻辑
```python
import time
from openai import OpenAI, RateLimitError
client = OpenAI(
api_key="your-api-key",
base_url="http://localhost:20128/v1"
)
def chat_with_retry(prompt, max_retries=3):
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model="cc/claude-sonnet-4-20250514",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
except RateLimitError:
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # Exponential backoff
else:
raise
```
## 故障排除
### 连接问题
**问题:** 无法连接到 9Router
```bash
# 检查 9Router 是否运行
curl http://localhost:20128/health
# 预期响应:
{"status": "ok"}
```
**方案:**
- 确认 9Router 正在运行
- 检查 20128 端口未被阻止
- 确保 base URL 正确(包含 `/v1`)
### 认证错误
**问题:** 401 Unauthorized
```
Error: Invalid API key
```
**方案:**
- 在仪表盘中确认 API key
- 检查 Authorization 头格式:`Bearer your-api-key`
- 确保 API key 中没有多余的空格或换行
### 模型未找到
**问题:** 404 Model not found
```
Error: Model 'cc/claude-opus' not found
```
**方案:**
- 使用精确的模型名(大小写敏感)
- 查看可用模型:`curl http://localhost:20128/v1/models`
- 确认套餐中已启用该模型
### 超时问题
**问题:** 请求超时
```
Error: Request timed out after 30s
```
**方案:**
- 在客户端配置中增大超时
- 时间敏感任务使用更快的模型
- 检查到 9Router 的网络连接
### 速率限制
**问题:** 429 Too Many Requests
```
Error: Rate limit exceeded
```
**方案:**
- 实现指数退避
- 降低请求频率
- 在仪表盘中查看速率限制
- 考虑升级套餐
## 最佳实践
### 安全
- 将 API key 存储在环境变量中
- 绝不将 API key 提交到版本控制
- 云端部署使用 HTTPS
- 定期轮换 API keys
### 性能
- 根据任务复杂度选择合适的模型
- 对重复查询实现缓存
- 长响应使用流式输出
- 尽可能批量请求
### 错误处理
- 始终用 try-catch 块包裹
- 添加带指数退避的重试逻辑
- 记录错误以便调试
- 提供回退机制
### 成本优化
- 简单任务选择高性价比的模型
- 适当时缓存响应
- 在仪表盘监控使用
- 在代码中设置请求上限
## 下一步
- [配置 Cursor](cursor.md) 进行 IDE 集成
- [设置 Continue](continue.md) 用于 VSCode
- [探索 CLI 用法](../cli/basic-usage.md)
- [了解模型选择](../models/overview.md)
- [API 参考](../api/reference.md)