开发者文档 多轮聊天
多轮聊天
把上一轮的消息完整带回请求,继续同一段对话。
使用前确认
需要:提供 Chat Completions 协议的文本对话模型,即控制台模型详情的调用方式中列有 OpenAI Chat Completions。先完成快速开始中的环境变量配置,并把 YOUR_MODEL_ID 换成这把密钥可用的模型 ID。
完整示例
可从页头“下载代码”保存为 .py 文件,在配置好环境的服务端运行。
import os, json, urllib.request, urllib.error
BASE = os.environ["MOSSHUB_API_BASE"].rstrip("/")
KEY = os.environ["MOSSHUB_API_KEY"]
MODEL = "YOUR_MODEL_ID"
def chat(messages, **options):
body = {"model": MODEL, "messages": messages, "stream": False, **options}
request = urllib.request.Request(
BASE + "/v1/chat/completions",
data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
headers={"Authorization": "Bearer " + KEY,
"Content-Type": "application/json"}, method="POST")
try:
with urllib.request.urlopen(request, timeout=60) as response:
result = json.load(response)
except urllib.error.HTTPError as error:
raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from error
choices = result.get("choices", [])
if not choices or not isinstance(choices[0].get("message"), dict):
raise RuntimeError("未返回有效消息,请检查错误信息与模型能力")
if choices[0].get("finish_reason") == "length":
raise RuntimeError("回答因输出上限而截断,请调整预算后重试")
return choices[0]["message"]
messages = [{"role": "system", "content": "你是一个简洁的中文助手。"}]
for question in ["给一个周末做饭计划。", "把刚才的计划改成两人份,并列出购物清单。"]:
messages.append({"role": "user", "content": question})
answer = chat(messages)
if answer.get("tool_calls") or not isinstance(answer.get("content"), str):
raise RuntimeError("当前返回不是普通文本回答")
print(answer["content"])
messages.append({"role": "assistant", "content": answer["content"]})运行后检查
第二次回答应能引用第一次的计划。网关不保存对话,每次请求只带着你发送的 messages;切换模型或新开请求都不会自动带上上一轮记录。
接入应用时
- 按原顺序保存
user/assistant消息,系统指令放在开头;模型返回工具调用时见工具调用。 - 长对话需要裁剪或摘要:输入与输出共同受模型上下文窗口限制,控制台模型详情列出上下文窗口与最大输出。
- 示例的
timeout=60由客户端决定。请求已转给上游后客户端超时或断开,网关会取消上游请求,但仍按估算的输入用量计费;模型回答较慢时调大超时。需要边生成边显示时见流式输出。
继续阅读
实际可调用的模型、授权与价格以控制台为准。
页面字体:MiSans(小米,依《MiSans 字体知识产权许可协议》使用);Google Sans Flex(SIL Open Font License 1.1)。
页面字体:MiSans(小米,依《MiSans 字体知识产权许可协议》使用);Google Sans Flex(SIL Open Font License 1.1)。