API调用
OpenAI API
安装与配置
bash
# 安装OpenAI SDK
npm install openai
# 或使用Python
pip install openai环境配置
bash
# 设置API密钥
export OPENAI_API_KEY="sk-xxxxx"
# 可选:设置代理(国内需要)
export HTTPS_PROXY="http://127.0.0.1:7890"基础调用
JavaScript/TypeScript
javascript
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
// 简单对话
async function chat(prompt) {
const response = await client.chat.completions.create({
model: "gpt-4-turbo",
messages: [{ role: "user", content: prompt }]
});
return response.choices[0].message.content;
}
// 流式输出
async function streamChat(prompt) {
const stream = await client.chat.completions.create({
model: "gpt-4-turbo",
messages: [{ role: "user", content: prompt }],
stream: true
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}
}Python
python
from openai import OpenAI
client = OpenAI(api_key="sk-xxxxx")
# 简单对话
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
# 流式输出
stream = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": "讲个故事"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")国产模型API
智谱AI(GLM)
javascript
import OpenAI from 'openai';
const zhipu = new OpenAI({
apiKey: 'your-api-key',
baseURL: 'https://open.bigmodel.cn/api/paas/v4'
});
// 调用GLM-4
const response = await zhipu.chat.completions.create({
model: 'glm-4',
messages: [{ role: 'user', content: '你好' }]
});阿里通义千问
javascript
import OpenAI from 'openai';
const qwen = new OpenAI({
apiKey: 'your-api-key',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1'
});
// 调用通义千问
const response = await qwen.chat.completions.create({
model: 'qwen-turbo',
messages: [{ role: 'user', content: '你好' }]
});百度文心一言
javascript
import OpenAI from 'openai';
const wenxin = new OpenAI({
apiKey: 'your-api-key',
baseURL: 'https://qianfan.baidubce.com/v2'
});
const response = await wenxin.chat.completions.create({
model: 'ernie-4.0-8k-latest',
messages: [{ role: 'user', content: '你好' }]
});Embedding API
文本向量化
javascript
// OpenAI Embedding
const embedding = await client.embeddings.create({
model: "text-embedding-3-small",
input: "要向量化的文本"
});
const vector = embedding.data[0].embedding;
console.log(`维度: ${vector.length}`); // text-embedding-3-small: 1536维批量向量化
javascript
const texts = [
"第一段文本",
"第二段文本",
"第三段文本"
];
const response = await client.embeddings.create({
model: "text-embedding-3-small",
input: texts
});
response.data.forEach((item, index) => {
console.log(`文本${index + 1}的向量:`, item.embedding.slice(0, 5), "...");
});错误处理
javascript
import { RateLimitError, APIError } from 'openai';
try {
const response = await client.chat.completions.create({
model: "gpt-4-turbo",
messages: [{ role: "user", content: prompt }]
});
} catch (error) {
if (error instanceof RateLimitError) {
console.log('请求过于频繁,等待后重试...');
await sleep(60000);
} else if (error instanceof APIError) {
console.log(`API错误: ${error.status} - ${error.message}`);
} else {
console.log(`未知错误: ${error.message}`);
}
}最佳实践
1. 合理设置超时
javascript
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 60000);
const response = await client.chat.completions.create({
model: "gpt-4-turbo",
messages: [{ role: "user", content: prompt }],
signal: controller.signal
});
clearTimeout(timeout);2. 实现重试机制
javascript
async function chatWithRetry(prompt, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await client.chat.completions.create({
model: "gpt-4-turbo",
messages: [{ role: "user", content: prompt }]
});
} catch (error) {
if (i === maxRetries - 1) throw error;
await sleep(1000 * Math.pow(2, i)); // 指数退避
}
}
}3. 成本优化
javascript
// 1. 尽可能使用更小更快的模型
const useModel = useSimpleTask ? 'gpt-3.5-turbo' : 'gpt-4-turbo';
// 2. 减少不必要的上下文
const messages = [
{ role: "system", content: "简洁回答" },
{ role: "user", content: truncateLongContext(longText)) }
];
// 3. 使用压缩工具
import { tokenCounter } from './utils';
// 检查token数量
const estimatedTokens = await countTokens(prompt);
if (estimatedTokens > 100000) {
console.log('警告:输入可能超过模型限制');
}