工作方式
每条用户消息对应一次同步的 POST /v1/ai 请求。不需要 WebSocket,也不需要 webhook。
- 第一次请求不带
session_id。ModelRiver 会开始一段对话,并在meta.session_id中返回它的 ID。 - 之后的每次请求都带上这个
session_id,并且只发送新的用户消息。ModelRiver 会自行加入之前的对话(最近的几轮加上滚动摘要),所以你无需保存或重新发送历史记录。
开始之前
- 一个项目 API 密钥(
mr_live_…)。参见 API 密钥。 - 一个开启了 Session memory(会话记忆)的聊天工作流。该选项位于工作流的 Advanced(高级)设置中,默认关闭。本页使用名为
my_chatbot的工作流。 - 在 Project settings → Request logs 中保持 Save full request and response text 开启。会话记忆基于已保存的文本构建。
第一条消息
发送工作流和用户消息:
Bash
curl https://api.modelriver.com/v1/ai \ -H "Authorization: Bearer $MODELRIVER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "workflow": "my_chatbot", "messages": [{"role": "user", "content": "Hi, my name is Sam."}] }'响应(已精简)包含回复和新的会话 ID:
JSON
1{2 "status": "success",3 "data": {4 "choices": [5 { "message": { "role": "assistant", "content": "Nice to meet you, Sam! How can I help?" } }6 ]7 },8 "meta": {9 "workflow": "my_chatbot",10 "session_id": "9f8c2c1e-5b8a-4d0e-9a51-2f6f0f1d7a10"11 }12}- 回复文本位于
data.choices[0].message.content。这适用于所有未配置结构化输出的聊天工作流;如果配置了结构化输出,data则是解析后的 JSON 对象。参见响应格式。 - 先检查
status。如果提供商请求失败,ModelRiver 仍返回200,但带有"status": "error"和一个error对象。参见错误处理。
后续消息
发送相同的工作流、session_id,以及仅新的一条消息:
Bash
curl https://api.modelriver.com/v1/ai \ -H "Authorization: Bearer $MODELRIVER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "workflow": "my_chatbot", "session_id": "9f8c2c1e-5b8a-4d0e-9a51-2f6f0f1d7a10", "messages": [{"role": "user", "content": "Do you remember my name?"}] }'模型能看到第一轮对话,因此可以回答“Sam”。整段对话中 session_id 保持不变。
不要把之前的消息加入 messages。服务器会为你合并会话记忆,再次发送历史记录会造成重复。
用 Node.js 写一个终端聊天
将下面的代码保存为 chat.mjs,用 Node.js 18 或更高版本运行。输入消息后按回车;输入空行即退出。
JAVASCRIPT
1import readline from "node:readline/promises";2 3const rl = readline.createInterface({ input: process.stdin, output: process.stdout });4let sessionId = null;5 6while (true) {7 const text = await rl.question("you> ");8 if (!text.trim()) break;9 10 const res = await fetch("https://api.modelriver.com/v1/ai", {11 method: "POST",12 headers: {13 Authorization: `Bearer ${process.env.MODELRIVER_API_KEY}`,14 "Content-Type": "application/json",15 },16 body: JSON.stringify({17 workflow: "my_chatbot",18 ...(sessionId && { session_id: sessionId }),19 messages: [{ role: "user", content: text }],20 }),21 });22 const body = await res.json();23 24 if (body.status !== "success") {25 console.error(body.error ?? body);26 continue;27 }28 sessionId = body.meta.session_id;29 console.log("bot>", body.data.choices[0].message.content);30}31rl.close();Bash
MODELRIVER_API_KEY=mr_live_your_key node chat.mjs在 Web 应用中,请在你的服务器上发送同样的请求,确保 API 密钥不会到达浏览器,并为每段对话保存一个 session_id。
重新开始
要重置记忆,删除会话,然后发送下一条消息时不带 session_id:
Bash
curl -X DELETE https://api.modelriver.com/v1/sessions/9f8c2c1e-5b8a-4d0e-9a51-2f6f0f1d7a10 \ -H "Authorization: Bearer $MODELRIVER_API_KEY"也可以在控制台的日志 → 会话中删除会话。发送已删除或不存在的 session_id 会返回 422 session_not_found。
读取历史记录
ModelRiver 会保存每一轮对话,所以你不需要自己保留一份。GET /v1/sessions/:id 按从旧到新的顺序返回对话内容,GET /v1/sessions 列出项目中的对话。参见 Sessions API。
更进一步
聊天机器人教程基于同样的会话记忆构建了一个完整的 React 和 Node.js 应用,包含异步请求、实时 WebSocket 交付、后端回调和结构化回复。如需逐 token 返回回复,请参见流式传输。