# Debug Session: knowledge-chat-401 - **Status**: [OPEN] - **Issue**: 04 知识库应用发送问题后,原先会看到 `LLM 返回 401: {"error":{"message":"No cookie auth credentials found","code":401}}`;修复目标是让问题路由正确,并且不要把底层模型鉴权报错直接暴露给前台。 - **Debug Server**: http://127.0.0.1:7777/event - **Log File**: .dbg/trae-debug-log-knowledge-chat-401.ndjson ## Reproduction Steps 1. 启动前端、Go 后端与知识服务。 2. 打开 `04 知识库应用`。 3. 发送闲聊、FAQ、总结类问题,例如: - `给我讲个小故事` - `你好,你是怎么工作的` - `请根据知识库总结规则制度库里关于审批的要点` ## Hypotheses & Verification | ID | Hypothesis | Likelihood | Effort | Evidence | |----|------------|------------|--------|----------| | A | 后端把知识服务或模型服务地址调错了 | High | Low | Rejected | | B | 当前运行进程不是最新版本 | Medium | Low | Rejected | | C | LLM 兜底层命中了未配置 API Key 的 OpenRouter 路由,所以把 401 直接抛给了前台 | High | Low | Confirmed | | D | 第一层分类器把闲聊 / 总结类问题分错了,所以问题走错层级 | High | Low | Confirmed | ## Instrumentation Plan - A: `frontend/src/api/ai.js` 记录请求入口与非 200 响应 - B: `backend-go/internal/api/ai_chat.go` 记录聊天入口、四层计划、LLM 路由与错误 - C: `backend-go/internal/ai/llm.go` 记录真实下游 URL、状态码与错误体前缀 - D: `backend-go/internal/ai/knowledge_service_client.go` 记录知识服务调用状态 ## Log Evidence - 知识服务稳定命中本地 `http://127.0.0.1:10233/classify` 和 `/search` - 分类修复后: - `给我讲个小故事` -> `intent=smalltalk`、`layer=bert_classifier` - `你好,你是怎么工作的` -> `intent=smalltalk`、`layer=bert_classifier` - `请根据知识库总结规则制度库里关于审批的要点` -> `intent=document`、`layer=llm_fallback` - 进入 `llm_fallback` 时,埋点显示: - 目标地址:`https://openrouter.ai/api/v1/chat/completions` - `hasAPIKey=false` - `authHeader=false` - 修复前下游直接返回 401 `No cookie auth credentials found` - 修复后,同类问题不再把 401 暴露给前台,而是返回“当前没有可用 LLM 兜底服务”的业务化提示 ## Verification Conclusion - **pre-fix** - 闲聊 / 总结类问题会被误路由 - 一旦进入 `llm_fallback`,前台直接看到 OpenRouter 401 / cookie 报错 - **post-fix** - 第一层分类已改成规则优先,闲聊与总结类问题路由更符合预期 - `llm_fallback` 不再直抛 401,而是返回更友好的业务化提示 - **Remaining Blocker** - 当前剩余不是代码 Bug,而是运行环境缺口: - OpenRouter 未配置 API Key - 本地 `Ollama` 未启动(`127.0.0.1:11434` refused)