OpenAI SDK
使用 OpenAI Python 或 Node.js SDK 调用 HopBase。
现有 OpenAI SDK 项目只需切换 Base URL、分组密钥和模型 ID;请保留当前的框架与错误处理。
| 项目 | 填写值 |
|---|---|
| Base URL | https://api.hop-base.com/v1 |
| 密钥环境变量 | HOPBASE_OPENAI_API_KEY |
| 适用模型 | GPT、Gemini、GLM 对话模型,以及 OpenAI 兼容模型 |
| 模型 ID | 以当前密钥调用 GET /v1/models 的返回值为准 |
安装并发送最小请求
安装 SDK:
python -m pip install openai发送请求:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.hop-base.com/v1",
api_key=os.environ["HOPBASE_OPENAI_API_KEY"],
)
resp = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)先将提示词设为「只回复 ok」完成最小验证;只有项目实际使用流式时,再加入 stream: true 并确认 SSE 事件可以逐段到达。
- GPT 对话与 Responses:「Codex Plus」「Codex Pro」或「GPT 官方直连(Azure)」分组。Gemini、GLM 等其他对话模型在各自的分组。
- 生图(
gpt-image-*):「GPT Image 全系」分组含全系列;「GPT 官方直连(Azure)」分组也有gpt-image-2.5-flare与gpt-image-2.5-sunburst。密钥里没有含该型号的分组时返回 404。用法见图片生成 API。 - 同一个项目两者都用时,把两个分组加进同一把密钥;或像上面的示例那样用两把密钥,分别放进不同的环境变量(例如另设
HOPBASE_IMAGE_API_KEY)。
不要把真实密钥写进源码。请通过部署平台、.env 或系统环境变量注入 HOPBASE_OPENAI_API_KEY,并确保 .env 不会提交到 Git。
支持的请求参数
下表只列网关会检查、改写或拒绝的字段(POST /v1/chat/completions 与 POST /v1/responses);未列出的 OpenAI 字段原样转发,取值范围按模型官方规格。各模型的上下文与输出上限见模型列表;Gemini 的分组差异见 Gemini 对话。
| 参数 | 必填 | 类型与限制 | 默认 | 说明 |
|---|---|---|---|---|
model | 必填 | string,当前密钥分组内的模型 ID | — | 分组不包含该模型时返回 404 model_not_found;gpt-image-* 等图片模型调对话端点返回 400 image models do not support Chat Completions, please use the Images API |
messages | Chat Completions 必填 | array,至少 1 条 | — | 缺失返回 400 missing messages field,空数组返回 400 messages must not be an empty array |
input | Responses 必填 | string 或 array | — | 字串会自动包成单条用户消息 |
max_tokens / max_completion_tokens / max_output_tokens | 可选 | integer;网关不截断、不改写 | 模型默认 | 上限按模型官方规格;超出由模型返回错误 |
stream | 可选 | boolean | false | true 返回 SSE |
stream_options.include_usage | 可选 | boolean | false | 流式时传 true 才会收到最后一个只带 usage 的事件;不传则不下发(计费不受影响) |
tools / tool_choice | 可选 | OpenAI function tools 格式 | — | 原样转发 |
service_tier | 可选 | 只保留 priority / flex;fast 视为 priority | — | 其他取值会被移除后再转发,不报错。Fast(priority)仅在所用分组支持时生效并按 Fast 价计费,不支持时按标准档处理、按标准价计费 |
previous_response_id | — | 不支持(Responses) | — | 网关会移除此字段,不会接续上一轮;多轮对话请在 input 里带上完整历史 |
store | — | 固定为 false(Responses) | false | 服务端不保存响应,不能事后按 ID 取回 |
整个请求体上限 60 MB,超过返回 413。
- 型号名与 OpenAI 官方一致。对话:
gpt-6-sol、gpt-6-luna、gpt-6-astra、gpt-6.1-sol、gpt-5.6-sol、gpt-5.6-terra、gpt-5.6-luna、gpt-5.5、gpt-5.4;生图:gpt-image-2.5-flare、gpt-image-2.5-sunburst(/v1/images/generations与/v1/images/edits,同步返回 Base64)。不含codex-*与gpt-image-2。 - 不支持
service_tier: "priority"(含fast):按标准档处理、按标准价计费。 - 响应里的
model可能是带日期的快照名(例如gpt-5.5-2026-04-24),与 OpenAI 官方 API 行为一致;计费按请求的模型 ID,控制台「使用记录」也可能显示快照名。不要用response.model == request.model做断言。
流式输出并取得用量
传 stream_options.include_usage 后,最后一个事件的 choices 为空,usage 是本次 token 用量。
stream = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "用三句话介绍你自己"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if chunk.usage: # 最后一个事件:choices 为空,只带用量
print()
print(chunk.usage)读取本次扣费
计费的非流式请求会在响应头 X-HopBase-Cost-USD 里返回本次实际从余额扣除的美元金额,X-HopBase-Cost 是同一笔扣费的人民币金额,X-HopBase-Currency 是 X-HopBase-Cost 的币种(恒为 CNY);JSON 响应的 usage 里也有同样的 cost、cost_usd 与 currency,SDK 会把它们当作额外字段保留。流式响应都不带,扣费请到控制台「使用记录」查看。完整口径见扣费说明。
raw = client.chat.completions.with_raw_response.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "只回复 ok"}],
)
print(raw.headers.get("x-hopbase-cost"), raw.headers.get("x-hopbase-cost-usd"), raw.headers.get("x-hopbase-currency"))
resp = raw.parse() # 与不带 with_raw_response 时的返回值相同
print(resp.usage.cost, resp.usage.cost_usd, resp.usage.currency) # 额外字段,与响应头同值工具调用
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
messages = [{"role": "user", "content": "上海今天天气怎样?"}]
resp = client.chat.completions.create(model="gpt-5.6-sol", messages=messages, tools=tools)
msg = resp.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
print(call.function.name, call.function.arguments)
# 执行工具后把结果带回去,tool_call_id 必须与上一轮的 call.id 一致
messages += [msg, {"role": "tool", "tool_call_id": call.id, "content": "晴,26°C"}]
resp = client.chat.completions.create(model="gpt-5.6-sol", messages=messages, tools=tools)
print(resp.choices[0].message.content)超时与重试
openai-python 与 openai-node 默认读超时 600 秒、自动重试 2 次。长输出建议用流式;并发上限与超时见并发、超时与计费。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.hop-base.com/v1",
api_key=os.environ["HOPBASE_OPENAI_API_KEY"],
timeout=600, # 秒;长输出建议改用流式
max_retries=2, # 连接错误、429 与 5xx 的自动重试次数
)下一步
- 生图见图片生成 API
- Gemini 对话见 Gemini 对话
- Claude 模型改用 Anthropic SDK
- 报错时看报错速查