文档

构建简单聊天机器人

每条消息一次请求。把 session_id 发回来,ModelRiver 就会记住对话,你无需重新发送历史记录。

工作方式

每条用户消息对应一次同步的 POST /v1/ai 请求。不需要 WebSocket,也不需要 webhook。

  1. 第一次请求不带 session_id。ModelRiver 会开始一段对话,并在 meta.session_id 中返回它的 ID。
  2. 之后的每次请求都带上这个 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 返回回复,请参见流式传输。