BUG-005 相关修改已按你的要求做完,结论与改动如下。 --- ## 1. 问题原因 - **前端**:创建对话后从 `response.data.chat` 取 `conversation_id`、`id`,但后端返回的是 `CozeBaseResponse.success(resp)`,`data` 就是 Coze 的 CreateChatResp,没有嵌套的 `chat`,且多为 camelCase(如 `conversationID`)。因此取不到会话/聊天 ID,轮询失败,请求在 catch 里走本地兜底 `getAIResponse(content)`,看起来就像“固定一段话”。 - **后端**:Coze 实现里没有发现硬编码占位词,用户内容来自 `additionalMessages[0].content`。已做的修改是“无用户消息时不发请求”的防护。 --- ## 2. 前端修改(`msh_single_uniapp/pages/tool/ai-nutritionist.vue`) - **创建对话响应解析** - 兼容 `response.data.chat` 与 `response.data`。 - 兼容 `conversation_id` / `conversationID` / `conversationId` 和 `id`。 - 只有拿到 `conversationId` 和 `chatId` 后才调用 `pollChatStatus`,否则抛出明确错误。 - **轮询状态** - 使用 `const chatObj = res.data.chat || res.data` 再取 `status`,避免因结构不同取不到状态。 - **消息列表** - 支持 `res.data.messages` 或 `res.data` 为数组两种结构,用 `rawMessages` 统一处理,保证 AI 回复用 `role: 'ai', content: msg.content` 正确 push 到 `messageList`。 未改 UI,只修了数据流;`sendMessage` / `sendToAI` 里用的始终是 `inputText.trim()` → `content`,请求体已正确带用户输入。 --- ## 3. 后端修改(`ToolCozeServiceImpl.java`) - **无用户消息时不调用 Coze** - `chat()` 与 `chatStream()` 中:若 `buildMessages(request)` 为空,则不再调用 Coze,直接返回错误(如“请提供对话内容”),避免“空请求”导致平台返回欢迎语等固定回复。 未改动 `ToolKieAIServiceImpl.java`:该文件是 Gemini 对话实现,营养师页走的是 Coze(`/api/front/coze/chat`);且其中没有硬编码占位词,prompt 来自 `KieAIGeminiChatRequest.getMessages()`,因此按要求未修改。 --- ## 4. 修改汇总 | 文件 | 修改内容 | |------|----------| | `ai-nutritionist.vue` | 修正 create-chat 响应解析(data / data.chat、camel/snake);轮询与消息列表兼容不同返回结构;保证 AI 回复写入 `messageList`。 | | `ToolCozeServiceImpl.java` | 在 `chat` / `chatStream` 中增加“无用户消息则不请求 Coze”的校验。 | | `ToolKieAIServiceImpl.java` | 未修改(非本接口且无硬编码)。 | 按当前逻辑,用户输入会正确传到 Coze,且能正确解析创建对话与轮询结果,AI 的真实回复会显示在列表中,而不再被固定兜底文案覆盖。