4.5 API 接入 AI 能力
什么是 API?用餐厅比喻彻底搞懂
上一章我们说前端是前厅,后端是厨房。那 API 是什么?API 就是菜单 + 服务员 + 点餐规则的完整体系。
让我们把这个比喻展开,一步步走完:
第 1 步:走进餐厅(客户端发起请求)——你不会直接冲进厨房喊"给我做份红烧肉"。服务器也一样,它只通过 API 跟你对话。
第 2 步:看菜单(查阅 API 文档)——菜单告诉你有什么菜可点(可用的接口)、每道菜多少钱(计费)、需要等多久(响应时间)、有什么特殊要求可以提(请求参数)。
第 3 步:点菜(发送请求)——你跟服务员说"来一份红烧肉,不要辣,米饭换成面条",相当于发一个请求附带参数。
第 4 步:厨房做菜(服务器处理)——你不知道有几个厨师、用什么锅、食材从哪来,你只需要等。
第 5 步:端菜(返回响应)——要么你收到想要的结果,要么告诉你"今天的鱼卖完了"(错误响应)。
你(客户端)→ 看菜单(API文档)→ 点菜(发送请求)→ 厨房做菜(服务器处理)→ 端菜(返回响应)
AI API 调用完整流程图
HTTP 方法:请求的"语气"
| 方法 | 类比 | 实际用途 |
|---|---|---|
| GET | "给我看看菜单" | 获取数据,查天气、获取用户列表 |
| POST | "我要点一份新菜" | 创建数据,发聊天消息、提交表单 |
| PUT | "我的菜改成不要辣" | 更新数据,修改用户信息 |
| DELETE | "这道菜我不要了" | 删除数据 |
调用 AI API 用的是 POST——因为你是在"提交"一个请求让 AI 生成内容。
AI API:给你的产品加上大脑
你不需要训练自己的 AI 模型,直接调用现成的能力就行。主流选择:
- OpenAI API —— GPT-4o 系列,文档最齐全,社区资源最多
- Anthropic Claude API —— 长文本处理强,最高 200K Token
- 通义千问 API(阿里)—— 中文理解好,价格便宜
- 文心一言 API(百度)—— 百度生态集成方便
- 智谱 API(清华系)—— GLM 系列,性价比高
学会一个,其他的也就会了。
实战:调用 OpenAI Responses API
新项目优先使用 Responses API。Chat Completions 仍常见,但不要把某个模型名和价格永久写死在业务代码里。
Python 版本
# pip install openai python-dotenv
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def generate_copywriting(product: str) -> str:
response = client.responses.create(
model=os.getenv("OPENAI_MODEL", "gpt-4o-mini"),
instructions="你是一个资深的电商文案专家。",
input=f"请为以下产品写一段 100 字左右的营销文案:{product}",
max_output_tokens=500,
)
return response.output_text
print(generate_copywriting("蓝牙降噪耳机"))
JavaScript 版本
// npm install openai dotenv
import OpenAI from 'openai'
import 'dotenv/config'
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })
async function generateCopywriting(product) {
const response = await client.responses.create({
model: process.env.OPENAI_MODEL || 'gpt-4o-mini',
instructions: '你是一个资深的电商文案专家。',
input: `请为以下产品写一段 100 字左右的营销文案:${product}`,
max_output_tokens: 500,
})
return response.output_text
}
console.log(await generateCopywriting('蓝牙降噪耳机'))
实战:调用 Claude API
Python 版本
# pip install anthropic python-dotenv
import os
from anthropic import Anthropic
from dotenv import load_dotenv
load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "用简单的语言解释什么是量子计算"}],
)
print(response.content[0].text)
JavaScript 版本
// npm install @anthropic-ai/sdk dotenv
import Anthropic from '@anthropic-ai/sdk'
import 'dotenv/config'
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [{ role: 'user', content: '用简单的语言解释什么是量子计算' }],
})
console.log(response.content[0].text)
注意格式差异:OpenAI 用 choices[0].message.content,Claude 用 content[0].text。
错误处理与重试
API 调用可能失败:网络超时、速率限制、额度用完。你需要优雅地处理:
import time
from openai import OpenAI, APIError, RateLimitError, APITimeoutError
def call_with_retry(func, max_retries=3, base_delay=1):
"""带指数退避重试"""
for attempt in range(max_retries):
try:
return func()
except (RateLimitError, APITimeoutError):
wait_time = base_delay * (2 ** attempt)
print(f"请求失败,等待 {wait_time} 秒后重试...")
time.sleep(wait_time)
except APIError as e:
if attempt < max_retries - 1:
time.sleep(base_delay * (2 ** attempt))
else:
raise
raise Exception("重试次数用完")
# 使用
result = call_with_retry(lambda: client.chat.completions.create(
model=os.environ["OPENAI_MODEL"],
messages=[{"role": "user", "content": "你好"}],
))
指数退避:第一次等 1 秒,第二次 2 秒,第三次 4 秒。不要疯狂重试,否则 API 会把你拉黑。
环境变量:保护你的密钥
API Key 就像银行密码——绝对不能写在代码里。
.env 文件(不提交到 Git):
OPENAI_API_KEY=***
ANTHROPIC_API_KEY=***
.env.example 文件(提交到 Git,告诉协作者需要哪些变量):
OPENAI_API_KEY=***
ANTHROPIC_API_KEY=***
.gitignore 加上:
.env
.env.local
代码中读取:
# Python
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
// Node.js
import 'dotenv/config'
const apiKey = process.env.OPENAI_API_KEY
部署到 Vercel 时,在项目设置里配置环境变量即可。
API 速率限制
每个 API 都有速率限制。超限会返回 429 Too Many Requests。简单应对:
import time
class RateLimiter:
def __init__(self, max_calls_per_minute=20):
self.max_calls = max_calls_per_minute
self.calls = []
def wait_if_needed(self):
now = time.time()
self.calls = [t for t in self.calls if now - t < 60]
if len(self.calls) >= self.max_calls:
sleep_time = 60 - (now - self.calls[0])
time.sleep(sleep_time)
self.calls.append(time.time())
limiter = RateLimiter(max_calls_per_minute=20)
for question in questions:
limiter.wait_if_needed()
result = ask_claude(question)
流式响应:像 ChatGPT 一样实时输出
普通调用要等全部生成完才返回。流式响应(Streaming)让用户实时看到内容逐渐出现。
# Python 流式
stream = client.chat.completions.create(
model=os.environ["OPENAI_MODEL"],
messages=[{"role": "user", "content": "讲一个笑话"}],
stream=True,
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
// JavaScript 流式
const stream = await client.chat.completions.create({
model: process.env.OPENAI_MODEL,
messages: [{ role: 'user', content: '讲一个笑话' }],
stream: true,
})
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content
if (content) process.stdout.write(content)
}
任何面向用户的 AI 功能,强烈建议都用流式。
实战项目:10 行代码给网站加个 AI 聊天框
前端(HTML):
<div id="chat" style="height:300px;overflow:auto;border:1px solid #ccc;padding:10px;"></div>
<input id="input" style="width:70%;" placeholder="输入问题..." />
<button onclick="send()">发送</button>
<script>
async function send() {
const msg = document.getElementById('input').value
if (!msg) return
document.getElementById('input').value = ''
document.getElementById('chat').innerHTML += ``
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: msg }),
})
const data = await res.json()
document.getElementById('chat').innerHTML += ``
}
</script>
后端(Next.js app/api/chat/route.ts):
import OpenAI from 'openai'
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })
export async function POST(request: Request) {
const { message } = await request.json()
if (typeof message !== 'string' || message.length === 0 || message.length > 2000) {
return Response.json({ error: 'message 长度必须在 1-2000 字之间' }, { status: 400 })
}
const response = await client.chat.completions.create({
model: process.env.OPENAI_MODEL,
messages: [{ role: 'user', content: message }],
})
return Response.json({ reply: response.choices[0].message.content })
}
这是最小演示,不是可直接上线的接口。生产环境还要加身份验证、限流、超时和错误监控。
成本管理
价格参考方式
模型价格和上下文限制变化很快。上线前建立一张自己的成本表,记录“模型、输入单价、输出单价、一次典型请求的 Token 数、每日请求量”,并链接到供应商官方价格页。不要依据教程里的历史价格做预算。
Token 与中文字数不是固定换算关系,应使用目标模型对应的 tokenizer 或控制台用量统计测量真实请求。
控制成本的技巧
- 选对模型:简单分类用 mini,复杂任务才用贵模型
- 设 max_tokens:防止回复过长
- 设消费上限:OpenAI 后台可设置 Usage Limits
- 缓存结果:相同请求不重复调用
import hashlib, json, os
cache = {}
def cached_call(messages, model=os.environ["OPENAI_MODEL"]):
key = hashlib.md5(json.dumps(messages, ensure_ascii=False).encode()).hexdigest()
if key in cache:
return cache[key]
result = client.chat.completions.create(model=model, messages=messages)
cache[key] = result
return result
接入其他 AI 供应商
部分供应商提供 OpenAI 兼容接口,但“兼容”通常只覆盖部分参数。接入前从供应商官方文档确认 base_url、模型 ID、流式格式、结构化输出和限流规则。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AI_API_KEY"],
base_url=os.environ["AI_BASE_URL"],
)
response = client.chat.completions.create(
model=os.environ["AI_MODEL"],
messages=[{"role": "user", "content": "用三句话解释区块链"}],
)
print(response.choices[0].message.content)
把供应商差异放进环境变量和独立适配层,不要在业务组件里到处判断厂商名称。切换供应商前要重新跑流式输出、错误处理和结构化结果测试。
把 AI 接入你的产品
核心原则:密钥必须放后端。前端代码用户能看到,密钥暴露 = 被盗刷。
// Next.js API 路由:app/api/generate/route.ts
import OpenAI from 'openai'
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })
export async function POST(request: Request) {
const { prompt } = await request.json()
if (typeof prompt !== 'string' || prompt.length === 0 || prompt.length > 2000) {
return Response.json({ error: 'prompt 长度必须在 1-2000 字之间' }, { status: 400 })
}
const response = await client.responses.create({
model: process.env.OPENAI_MODEL || 'gpt-4o-mini',
input: prompt,
})
return Response.json({ result: response.output_text })
}
前端调用 /api/generate 传入 prompt 即可。公开上线前还必须增加用户身份验证、持久化限流、消费上限和滥用监控;只把密钥放到后端并不能防止接口被盗刷。
小结
API 就是连接外部能力的桥梁。五个关键要点:
- API Key 永远放环境变量,不要写在代码里
- 后端调用 AI API,前端不直接接触密钥
- 加上错误处理和重试,代码不会一碰就碎
- 用流式响应,用户体验提升一个档次
- 选对模型控成本,简单任务用便宜模型
几行代码,让你的产品拥有 AI 能力。这件事本身就很酷,不是吗? HEREDOC_END