教程
如何通过 hiapi API 使用 deepseek-v4.1-flash:curl、Python 及可用的请求示例
deepseek-v4.1-flash 是一款可通过 hiapi 统一 API 调用的快速、低成本推理模型。目前在模型页面上标记为预览版(Preview),这意味着底层构建可能轮换,而公开的模型 ID(deepseek-v4.1-flash)保持稳定——轮换发生时你无需修改任何代码。本指南展示一个确实可用的请求:正确的端点、正确的字段、正确的认证头。
前提条件
- 一个 hiapi API 密钥(
sk-...)。从你的 hiapi 控制台获取,然后导出:
export HIAPI_API_KEY="sk-your-key-here"
- 任何 HTTP 客户端均可。以下示例使用
curl和 Python 的requests,并附有使用官方 OpenAI SDK 的说明。
最小可用示例
hiapi 提供两个文本端点。/v1/responses 是规范的推荐端点(OpenAI Responses API 形态,语义化 SSE 事件)。/v1/chat/completions 是兼容旧版的端点(OpenAI Chat Completions 形态)——仅在你移植现有 Chat Completions 集成时使用。本指南使用 /v1/responses。
curl
curl https://api.hiapi.ai/v1/responses \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"input": [
{"role": "user", "content": "Explain what a hash map is in two sentences."}
]
}'
成功响应会返回一个 output 数组,其中包含模型的回复,以及一个 usage 块:
{
"id": "resp_...",
"model": "deepseek-v4.1-flash-expires-on-0910",
"status": "completed",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{"type": "output_text", "text": "A hash map stores key-value pairs..."}
]
}
],
"usage": {
"input_tokens": 14,
"output_tokens": 42,
"total_tokens": 56,
"output_tokens_details": {"reasoning_tokens": 0}
}
}
请注意响应中的 model 字段被标记为 deepseek-v4.1-flash-expires-on-0910——这是当前为这个预览版模型提供服务的固定内部构建。这是 hiapi 上预览版模型的预期行为,并非模型即将下线的信号;继续请求裸的 deepseek-v4.1-flash ID,hiapi 会自动将你路由到当前构建。
Python
import os
import requests
resp = requests.post(
"https://api.hiapi.ai/v1/responses",
headers={
"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "deepseek-v4.1-flash",
"input": [
{"role": "user", "content": "Explain what a hash map is in two sentences."}
],
},
timeout=60,
)
resp.raise_for_status()
data = resp.json()
print(data["output"][0]["content"][0]["text"])
print(data["usage"])
改用 OpenAI SDK
hiapi 的 /v1/responses 和 /v1/chat/completions 与官方 OpenAI SDK 兼容——只需将 base URL 指向 hiapi,并保持模型 ID 为裸名:
from openai import OpenAI
client = OpenAI(
api_key=os.environ["HIAPI_API_KEY"],
base_url="https://api.hiapi.ai/v1",
)
resp = client.responses.create(
model="deepseek-v4.1-flash",
input=[{"role": "user", "content": "Explain what a hash map is in two sentences."}],
)
print(resp.output[0].content[0].text)
生产环境实践
请求是无状态的——需重放完整对话
hiapi 不为该模型保留服务端对话状态。每个请求都必须在 input 中包含完整消息历史。不要发送 store、previous_response_id、conversation、background 或 context_management——这些均不受支持,会被忽略或拒绝。对于多轮对话,请自行将每一轮新的 user/assistant 消息追加到 input 数组,并在每次请求时发送整个数组。
history = [{"role": "user", "content": "What's a hash map?"}]
# ... call, get a reply, then append it and the next question ...
history.append({"role": "assistant", "content": "<model's previous reply>"})
history.append({"role": "user", "content": "How is that different from a hash set?"})
推理强度
deepseek-v4.1-flash 接受一个 reasoning 对象,用于控制其在回答前进行多少内部推理。该模型的 effort 枚举为 none | high | max——请注意这不是 hiapi 上某些其他推理模型使用的 low/medium/high 档位,因此不要假设它可以直接套用。
{
"model": "deepseek-v4.1-flash",
"input": [{"role": "user", "content": "Prove that the square root of 2 is irrational."}],
"reasoning": {"effort": "high"}
}
推理 token 按输出 token 计费,并单独报告在 usage.output_tokens_details.reasoning_tokens 中,因此 high/max 强度的请求即使可见答案长度相同,也可能比 none 明显更贵。在为生产流量设置默认强度之前,请先在定价页面查看当前的每 token 费率。
流式传输
传入 "stream": true 可获得 Server-Sent Events 而非单个 JSON 数据块。/v1/responses 流式传输的是语义化事件,而非包裹在 Chat-Completions 风格 [DONE] 标记中的原始文本增量。一次正常完成的的事件序列为:
response.created
response.in_progress
response.output_item.added
response.content_part.added
response.output_text.delta (repeated, one per chunk of text)
response.output_text.done
response.content_part.done
response.output_item.done
response.completed
将 response.completed 作为成功终止事件处理。同时也要将 response.incomplete(例如触及 token/长度限制)和 response.failed(服务端错误)作为终止状态处理——不要假设每个流都以 response.completed 结束。
import json
import requests
with requests.post(
"https://api.hiapi.ai/v1/responses",
headers={
"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "deepseek-v4.1-flash",
"input": [{"role": "user", "content": "Count to 5."}],
"stream": True,
},
stream=True,
timeout=60,
) as r:
for line in r.iter_lines():
if not line or not line.startswith(b"data: "):
continue
event = json.loads(line[len(b"data: "):])
if event.get("type") == "response.output_text.delta":
print(event["delta"], end="", flush=True)
elif event.get("type") in ("response.completed", "response.incomplete", "response.failed"):
break
错误处理
无效或缺失的 API 密钥会返回 HTTP 401,并附带结构化错误响应体:
{"error": {"code": "permission_denied", "message": "..."}}
检查 resp.status_code 并根据 error.code 分支处理,而不要解析消息字符串,因为消息文案可能在不通知的情况下更改措辞。
相关文档
常见问题
deepseek-v4.1-flash 是可用于生产,还是仅用于测试?
它标记为预览版,在 hiapi 上这意味着模型已上线且可正常调用,但底层构建可能按 hiapi 的安排轮换。轮换时公开模型 ID 不会变化——你的代码无需修改即可继续工作。如果你需要非预览版的正式承诺,请查看模型列表中非预览版的 DeepSeek v4 变体。
为什么响应显示的模型名称与我请求的不同?
你会在响应的 model 字段中看到类似 deepseek-v4.1-flash-expires-on-0910 的值。那是当前在 deepseek-v4.1-flash ID 下为你的请求提供服务的特定固定构建——这是预览版模型的预期行为,不是错误。
我可以使用 /v1/chat/completions 代替 /v1/responses 吗?
可以,hiapi 为该模型同时支持两者。/v1/chat/completions 使用 OpenAI Chat Completions 的请求/响应形态(messages 数组、choices[0].message.content),而非 /v1/responses 的 input/output 形态。选择与你现有集成匹配的那个;新集成应默认使用 /v1/responses。
hiapi 会存储我的对话历史,以便我只发送最新消息吗?
不会。该模型没有 previous_response_id 或服务端对话状态——每次请求都要在 input 中发送完整的消息历史。
reasoning.effort: "none" 实际跳过了什么?
它完全跳过模型的内部推理过程,直接作答。对于受益于多步推理的任务(数学、多约束逻辑),请使用 "high" 或 "max";强度越高,输出 token 用量和延迟也会相应增加。
流式请求和非流式请求需要单独的 API 密钥吗?
不需要——同一个 Authorization: Bearer sk-... 密钥对两者都适用。流式传输完全由请求体中的 "stream": true 字段控制。