最佳实践
本文档总结了使用庆霄云计算 API Key 分发服务的最佳实践,帮助您更高效、安全地使用服务。
架构设计最佳实践
1. 多环境隔离
为不同环境使用独立的 API Key:
开发环境 → API Key (dev-xxx)
测试环境 → API Key (test-xxx)
生产环境 → API Key (prod-xxx)
优势:
- 避免开发测试影响生产环境
- 独立的调用统计和监控
- 独立的限额控制
- 降低密钥泄露风险
2. 服务端代理模式
推荐使用服务端代理模式,而非客户端直连:
客户端 → 您的服务端 → 庆霄云计算 API
实现方式:
// 您的服务端代理接口
app.post('/api/chat', async (req, res) => {
const response = await fetch('https://ai.qingxiaoyun.net/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.QINGXIAO_API_KEY}`
},
body: JSON.stringify(req.body)
});
const data = await response.json();
res.json(data);
});
优势:
- API Key 不暴露给客户端
- 可添加自定义的业务逻辑
- 统一的错误处理和日志记录
- 更好的安全性
3. 负载均衡
对于高并发场景,建议实现负载均衡:
// 使用多个 API Key 实现负载均衡
const apiKeys = [
process.env.QINGXIAO_API_KEY_1,
process.env.QINGXIAO_API_KEY_2,
process.env.QINGXIAO_API_KEY_3
];
function getRandomKey() {
return apiKeys[Math.floor(Math.random() * apiKeys.length)];
}
性能优化最佳实践
1. 请求合并
对于多个小请求,考虑合并为一个大请求:
不推荐:
// 多次请求
for (const text of texts) {
await client.chat.completions.create({
model: 'glm-5',
messages: [{ role: 'user', content: text }]
});
}
推荐:
// 批量请求
const combinedText = texts.join('\n---\n');
await client.chat.completions.create({
model: 'glm-5',
messages: [{ role: 'user', content: combinedText }]
});
2. 缓存策略
对于重复的请求,实现缓存机制:
const cache = new Map();
async function getCachedResponse(prompt) {
const cacheKey = `chat_${prompt}`;
// 检查缓存
if (cache.has(cacheKey)) {
return cache.get(cacheKey);
}
// 调用 API
const response = await client.chat.completions.create({
model: 'glm-5',
messages: [{ role: 'user', content: prompt }]
});
// 存入缓存(有效期 1 小时)
cache.set(cacheKey, response);
setTimeout(() => cache.delete(cacheKey), 3600000);
return response;
}
3. 流式响应
对于长文本生成,使用流式响应提升用户体验:
const stream = await client.chat.completions.create({
model: 'glm-5',
messages: [{ role: 'user', content: '写一篇长文章' }],
stream: true
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || '';
process.stdout.write(content);
}
错误处理最佳实践
1. 重试机制
实现智能重试机制:
async function callWithRetry(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
// 不重试的错误
if (error.status === 401 || error.status === 403) {
throw error;
}
// 最后一次重试失败
if (i === maxRetries - 1) {
throw error;
}
// 指数退避
const delay = Math.pow(2, i) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
2. 错误分类处理
根据错误类型采取不同策略:
try {
const response = await client.chat.completions.create({...});
} catch (error) {
switch (error.status) {
case 401:
console.error('API Key 无效或已过期');
break;
case 429:
console.warn('请求频率超限,等待重试');
await sleep(60000);
break;
case 500:
case 502:
case 503:
console.error('服务暂时不可用,请稍后重试');
break;
default:
console.error('未知错误:', error.message);
}
}
监控与日志最佳实践
1. 结构化日志
记录结构化的调用日志,便于分析和排查问题。
2. 性能监控
监控 API 调用性能,及时发现异常。
3. 用量统计
实时统计用量,避免超限。
成本优化最佳实践
1. 选择合适的模型
根据任务复杂度选择合适的模型:
| 使用场景 | 推荐模型 | 说明 |
|---|---|---|
| 代码生成 | glm-5, kimi-k2.6 | 代码能力强 |
| 代码审查 | glm-5.1 | 专业代码分析 |
| 文档编写 | MiniMax-M2.7 | 长文本处理 |
| 日常对话 | doubao-seed-2.0-pro, deepseek-v3.2 | 综合能力强 |
2. 控制输出长度
限制输出长度,避免不必要的 Token 消耗:
const response = await client.chat.completions.create({
model: 'glm-5',
messages: [{ role: 'user', content: prompt }],
max_tokens: 500 // 限制输出长度
});
3. 使用套餐
对于稳定业务,购买套餐更划算,可节省 20%-60% 的成本。
