mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 20:00:47 +00:00
417 lines
8.5 KiB
Markdown
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)
|