Files
msh-system/scripts/logs/agent-BUG-005-171812.log

46 lines
2.7 KiB
Plaintext
Raw Normal View History

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 的真实回复会显示在列表中,而不再被固定兜底文案覆盖。