DOCAI · 课程 · L2 · 30 分钟
把模型接进自己的代码
从 curl 过渡到代码:用环境变量管 key、用 SDK 或 HTTP 发请求、把 base URL 和模型名做成配置,出问题能逐层定位。
你将学会
- 能在自己的项目里发出一次带鉴权的模型请求
- 能把 base URL、模型名、key 拆成配置而不是硬编码
- 请求失败时能判断问题在网络、鉴权还是参数
先确定三样东西
| 配置 | 从哪来 | 放哪 |
|---|---|---|
| API Key | 服务商控制台 | 环境变量,不进代码库 |
| Base URL | 服务商文档 | 配置文件 |
| 模型名 | 服务商模型列表 | 配置文件 |
把这三样写死进代码,换一个中转站就要改一遍源码——这是最常见的返工原因。
最小代码(Python)
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DOCAI_API_KEY"],
base_url=os.environ.get("DOCAI_BASE_URL"), # 不填则用默认
)
resp = client.chat.completions.create(
model=os.environ["DOCAI_MODEL"],
messages=[{"role": "user", "content": "用一句话解释什么是 API"}],
)
print(resp.choices[0].message.content)
SDK 只是把 HTTP 请求包了一层。看不懂报错时,回到 curl 那一课 用同样的参数发一次,能立刻分清是 SDK 问题还是服务端问题。
四个容易踩的坑
- key 进了 git:用
.gitignore挡住.env;已经提交过的 key 要立刻吊销重发。 - base URL 少了
/v1:表现为 404,见什么是 endpoint。 - 模型名写错:表现为 404 或「模型不存在」,不是 401。
- 没有超时:默认可能等很久。显式设连接超时和总超时。
分层排查
按顺序问三个问题:
- 能不能连上? 换成
/v1/models这类最简单的 endpoint 试。 - 鉴权过不过? 401 说明 key 或请求头有问题,与模型无关。
- 参数对不对? 400 通常是字段名、类型或模型名写错,看响应体的
message。
自测
- 为什么 base URL 和模型名要放进配置,而不是直接写在代码里?
- 同一个 key,curl 能通、SDK 报 401,最可能差在哪?
- 你的请求没有设超时,高峰期会发生什么?