# EzVibeR+ LLM 对话能力 — 实施记录 > 作者:MiniMax-M3 (2026-06-01~02) > 目的:给后续 agent / 接手人一个完整工作记录,方便理解和回归 > 关联:`docs/PLAN-CHAT.md`(早期设计稿)、`docs/impl/report.md`(历史报告) --- ## 0. 起点(接手时的状态) `EzVibeR+` 是一个 Tauri 2 + Vue 3 桌宠,原有功能: - Live2D 模型显示(pixi-live2d-display + 本地模型文件) - 情绪引擎(EmotionEngine,5 个状态) - 60s 后台调度器(TaskScheduler:喝水/伸展/早安问候等确定性行为) - 记忆系统(MemorySystem + RAG,但 embedder 是 DummyEmbedder,无真实语义) - 大脑引擎(AgentBrain)— 已实现 `LLMProvider` 抽象 - `NoopLLMProvider` 占位符,`commands::chat` 已存在但**实际不会调任何 LLM** **用户最初诉求**:「桌宠可以和用户对话」 --- ## 1. 完整工作流(按用户需求顺序) ### 1.1 路线一:本地 llama.cpp 内嵌 **用户**:先要本地化、最简方案 **实现**:写了 `llama_cpp_rs = "0.3.0"` Provider,含懒加载 / Mutex 串行化 / unsafe Send 包装 **踩坑**: - `llama_cpp_rs 0.3.0` build.rs 有一处 bug(找不到独立 `ggml.o`,已 patch 到 `~/.cargo/registry/.../build.rs`) - crate 内部用 *非常老* 的 llama.cpp(2023年中),**不支持 Qwen2 架构** - 用户下载的 `Qwen2.5-Coder-0.5B-Instruct-Q4_K_M.gguf` 加载报错 `unknown model architecture: 'qwen2'` **结论**:本地路线被用户否决 ### 1.2 路线二:云端 API(最终方案) **用户要求**: - ❌ 删所有本地模型代码 - ✅ 走 API key 模式 - ✅ 兼容 OpenAI 协议 + Anthropic 协议 **实现**: - 新增 `src-tauri/src/modules/openai.rs`(Chat Completions 协议) - 新增 `src-tauri/src/modules/anthropic.rs`(Messages API,system 字段提到顶层) - 全部用 `reqwest = "0.11"` async HTTP - `AppConf` 加 `llm_provider` / `llm_model` / `llm_base_url` / `llm_api_key` 字段 - `main.rs` 工厂:按 provider 字符串分发 - `commands::get_llm_status` Tauri 命令 - `Config.vue` 加 LLM 设置区(provider 下拉、model、key、base_url) - `ChatPanel.vue` 改"未配置"提示 ### 1.3 UX 改进 按用户逐条要求: | # | 用户要求 | 改动文件 | |---|---|---| | 1 | 持久聊天面板(右侧) | 新建 `components/ChatPanel.vue` + `hooks/useChat.ts` + `components/MessageBubble.vue` | | 2 | 思考气泡(`...` 可折叠) | `MessageBubble.vue` 改:整块可点 + 鲁棒正则(含 `` 和未闭合兜底) | | 3 | 禁双击全屏 | `index.vue` `onMounted` 加 `dblclick` 全局 capture listener | | 4 | 模型位置(往右 / 居中) | `loadModel` + `recenterModel` 函数 | | 5 | 聊天面板可收缩 | `chatCollapsedRef` + `toggleChat` + waifu-tool 加 `fui-chat` 按钮 | | 6 | 健康提示 → 气泡 + LLM 提示词 | 改 `BrainConfig::default()` 加 tip 引导;`useChat.ts` 监听 `ezvibe:reminder` 事件塞气泡 | ### 1.4 Bug 修复 - **双击气泡没反应**(用户报告):`MessageBubble.vue` 把 `