文档

多轮对话

对话接口是无状态的 —— 服务端不记上下文,每一轮请求都要把之前的完整对话历史再发一次。

无状态意味着什么

平台不在服务端保存你的会话。每次请求的 messages 都要包含:

  • system 消息(如果有);
  • 之前所有轮次的 user 与 assistant 消息;
  • 本轮新的 user 消息。

漏掉历史,模型就不知道上下文;历史顺序错乱,回答也会跟着错。

一轮一轮怎么拼

第一轮只发这一句:

{
  "model": "<模型名>",
  "messages": [
    { "role": "user", "content": "世界上最高的山是哪座?" }
  ]
}

拿到回复后,把这条 assistant 消息原样追加到 messages 末尾,再追加新的提问:

{
  "model": "<模型名>",
  "messages": [
    { "role": "user", "content": "世界上最高的山是哪座?" },
    { "role": "assistant", "content": "世界上最高的山是珠穆朗玛峰。" },
    { "role": "user", "content": "第二高的呢?" }
  ]
}

这就是多轮对话的全部要点:把助手说过的话当成历史的一部分带回去。

请求示例

curl https://open.feiyutoken.com/v1/chat/completions \
  -H "Authorization: Bearer <你的飞鱼Token API Key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<模型名>",
    "messages": [
      { "role": "user", "content": "世界上最高的山是哪座?" },
      { "role": "assistant", "content": "世界上最高的山是珠穆朗玛峰。" },
      { "role": "user", "content": "第二高的呢?" }
    ]
  }'

两个要注意的成本与限制

  • 历史越长越贵:计费按整段请求算,usage.prompt_tokens 会随轮次一直增长。 长时间的会话建议只保留最近若干轮,或把早期内容总结成一段再带上。
  • 有长度上限:历史累加到超过上下文长度时这一轮会失败(具体错误码以实际返回为准)。

不想自己回传历史的话,用 Responses API: 它支持把上一轮的 id 作为 previous_response_id 传过来, 不必每次都把整段对话再发一遍。Anthropic 格式的 Claude Messages API 同样是无状态的, 拼法与这里一致。