【安心陪诊 Agent】Node.js 20 + Express 4 实战:/api/plan 与 /api/chat 验证
2026/7/10 23:09:30 网站建设 项目流程

【安心陪诊 Agent】Node.js API 设计:/api/plan 与 /api/chat 如何支撑 Agent

项目名称:安心陪诊 Agent。本文解决一个具体工程问题:陪诊类 Agent 不能只做聊天入口,它必须把用户输入拆成就医任务、材料清单、安全边界和家属同步结果,并且要能在前端页面和 Node.js 接口里复查。

一、实际问题:陪诊 Agent 为什么不能只接一个聊天框

真实就医场景里,用户通常不是问一个孤立问题,而是同时包含出发地、医院、症状描述、陪诊时间、材料准备和家属通知。若后端只返回一段自然语言,前端就无法稳定展示任务卡片,也无法判断哪些信息需要人工确认。

输入类型前端表现后端处理
出发地与医院生成行程卡片校验必填字段
症状描述生成问诊问题过滤诊断、剂量、处方类高风险词
家属联系方式生成同步摘要只做本地展示,不自动发送隐私信息

二、运行环境与版本

项目版本用途
Node.js20.11.1运行本地 API 服务
Express4.18.3提供 /api/plan 与 /api/chat
Chrome126+验证 Web Demo、移动端响应式布局和接口调用
HarmonyOS 迁移目标ArkTS / ArkUI后续把任务卡片迁移成原生页面

三、接口结构:/api/plan 负责稳定输出任务卡片

import express from "express"; const app = express(); app.use(express.json()); app.post("/api/plan", (req, res) => { const { start, hospital, visitTime, symptoms, familyPhone } = req.body; if (!start || !hospital) { return res.status(400).json({ code: "MISSING_ROUTE", message: "请补充出发地和医院名称", fields: ["start", "hospital"] }); } const riskWords = ["诊断", "处方", "剂量", "停药"]; const hitRisk = riskWords.some((word) => String(symptoms || "").includes(word)); if (hitRisk) { return res.json({ code: "SAFE_GUARD", message: "系统只整理就医准备信息,请以医生现场判断为准", tasks: ["携带病历", "记录既往用药", "向医生确认下一步检查"] }); } return res.json({ code: "OK", route: { start, hospital, visitTime }, tasks: ["预约提醒", "材料清单", "问诊问题", "家属同步摘要"], notifyFamily: Boolean(familyPhone) }); });

这段代码的边界很明确:/api/plan 不做诊断,只把就医准备拆成稳定的结构化结果。前端拿到 tasks 后可以渲染为卡片,拿到 SAFE_GUARD 后可以展示医疗安全提示。

四、对话接口:/api/chat 只回答陪诊流程相关问题

app.post("/api/chat", (req, res) => { const text = String(req.body.text || "").trim(); if (!text) { return res.status(400).json({ code: "EMPTY_TEXT", message: "请输入就医需求" }); } const allowTopics = ["材料", "挂号", "复查", "检查", "家属", "路线"]; const matched = allowTopics.some((topic) => text.includes(topic)); if (!matched) { return res.json({ code: "OUT_OF_SCOPE", reply: "我只能协助整理就医流程、材料清单和家属同步内容。" }); } res.json({ code: "OK", reply: "建议先准备身份证、医保卡、既往病历,并把想问医生的问题列成清单。", nextActions: ["生成材料清单", "生成问诊问题", "同步给家属"] }); });

五、前端如何消费接口结果

async function submitPlan(form) { const response = await fetch("/api/plan", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(form) }); const data = await response.json(); if (data.code === "MISSING_ROUTE") return showFormError(data.message); if (data.code === "SAFE_GUARD") return showSafetyCard(data.message, data.tasks); return renderTaskCards(data.tasks, data.route); }

前端不直接解析自然语言,而是根据 code 字段决定展示错误、提醒还是任务卡片。这样做的好处是:页面状态稳定、测试路径清楚、后续迁移 ArkUI 时也能保留同样的数据结构。

六、实操验证记录

curl -X POST http://localhost:5188/api/plan ^ -H "Content-Type: application/json" ^ -d "{"start":"杭州西湖文化广场","hospital":"浙江省人民医院","visitTime":"周三上午","symptoms":"复查材料准备"}" HTTP/1.1 200 OK { "code": "OK", "tasks": ["预约提醒", "材料清单", "问诊问题", "家属同步摘要"], "notifyFamily": false }
验证项输入预期结果
正常规划出发地、医院、时间完整返回任务卡片通过
缺少医院hospital 为空返回 MISSING_ROUTE通过
风险词包含处方或剂量返回 SAFE_GUARD通过
非陪诊问题询问无关内容返回 OUT_OF_SCOPE通过

七、排错记录

问题原因处理方式
页面只显示一段文本接口没有结构化字段统一返回 code、tasks、nextActions
医疗风险过高用户输入包含诊断、剂量、处方进入 SAFE_GUARD 分支
移动端卡片拥挤任务字段过长卡片只展示标题,详情折叠

八、迁移到 ArkTS 页面时怎么保留边界

如果把这个 Web Demo 迁移到 HarmonyOS ArkTS,建议不要把接口返回结果直接拼到一个长文本里,而是保留 PlanResult、TaskItem、GuardMessage 三类模型。这样页面可以分别处理正常任务、缺字段提示和医疗安全边界。

interface TaskItem { title: string; detail: string; done: boolean; } interface PlanResult { code: 'OK' | 'MISSING_ROUTE' | 'SAFE_GUARD'; message?: string; tasks: TaskItem[]; } function toTaskCards(result: PlanResult): TaskItem[] { if (result.code !== 'OK') { return [{ title: '需要人工确认', detail: result.message || '请补充信息', done: false }]; } return result.tasks; }

这个模型的价值在于:UI 层只负责渲染状态,不承担医疗判断;服务层只负责整理流程,不越界输出诊断。对于参赛 Demo 来说,这种分层能让评委更容易看懂工程边界。

九、发布前检查清单

检查点通过标准说明
接口输入空输入、正常输入、风险输入都能返回明确 code避免前端只能靠文本猜状态
页面状态任务卡片、错误提示、安全提醒三类状态可见用户知道下一步该做什么
隐私边界不自动上传家属电话和病情细节医疗辅助类项目必须保守处理
演示材料截图、接口样例、测试表和项目说明一致避免文章、Demo 和 PPT 互相矛盾

十、结论

安心陪诊 Agent 的核心不是“能聊天”,而是把就医需求转成可展示、可验证、可迁移的任务链。接口需要明确输入、输出和安全边界;前端需要围绕 code 字段展示状态;文章复查时则重点看版本、代码、验证记录和异常路径是否完整。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询