mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-24 19:08:10 +00:00
fix(webui): 聊天记录不再"每次都发完整记录",并修掉视口跳顶
两个都是你指出的症状,都定位到了具体代码路径。
① 「每次都发完整聊天记录」
a) API 缺省值错了:/api/v1/chat/history 的 limit 缺省是 0 = **不限制**,
于是任何不带 limit 的调用每次都拿到整段记录。实测(126 条):
不带 limit 635,297 字节;现在默认只回一页 180,668 字节。
显式 limit=0 仍可整取(逃生口)。WebUI/GUI 本来都带 limit,不受影响。
b) 前端 30s 轮询(以及每次 SSE 报错)都直接拉一页 40 条:
浏览器实测单次 180,813 字节。现在先做"尾巴探测"(limit=1,362 字节),
尾巴一致就直接跳过;不一致才拉整页。
② 「聊天记录会跳到顶部」——两条会导致视口丢失的路径都堵上
a) syncChatFromHistory 在"找不到重合点"时直接 `state.messages = serverMsgs`:
服务端只回一页,而本地可能已经向上翻了好几页;一覆盖,容器立刻变矮,
视口被夹回顶部,用户翻过的旧消息也凭空消失。现在只在服务端页**不短于**本地时
才整体替换。
b) renderChat 全量重建 innerHTML 后,仅在粘底时滚到底;非粘底(用户正在向上读)
时位置没人管。改为重建前记住 scrollTop、非粘底时原样还回去。
浏览器实测(CDP 驱动真实页面,126 条历史):
* 15s/30s 定时器跑满 40s:聊天区滚动位置 **0 px 变化**,未跳顶;
* 期间 chat/history 请求:limit=1 × 2(各 362 字节)+ 首屏 limit=40 一次;
* 控制台无报错;新增消息后轮询仍能正确并进来(尾巴探测→拉整页→合并)。
测试:新增 TestChatHistoryDefaultIsPaged(默认一页 / has_more / limit=0 整取 / 显式分页)。
顺带修测试串味:迁移用例往 os.TempDir() 写共享历史文件,会让其它用例的
NewHandler 加载到脏历史(表现为条数多 1);现在各用例用自己的临时文件。
This commit is contained in:
@ -46,6 +46,9 @@ type ChatToolCall struct {
|
||||
Plugin string `json:"plugin,omitempty"`
|
||||
}
|
||||
|
||||
// defaultChatHistoryLimit 是 /chat/history 不带 limit 时默认返回的页大小。
|
||||
const defaultChatHistoryLimit = 40
|
||||
|
||||
const maxChatHistory = 200
|
||||
|
||||
// ===== client_msg_id 去重(防 GUI 断线重连/超时重试导致的消息重放)=====
|
||||
@ -481,9 +484,14 @@ func (h *Handler) addChatMsg(msg ChatMsg) {
|
||||
// 上下文还原的关键信息,必须完整下发;瘦身只通过分页控制条数。
|
||||
func (h *Handler) handleChatHistory(w http.ResponseWriter, r *http.Request) {
|
||||
q := r.URL.Query()
|
||||
limit := parseIntDefault(q.Get("limit"), 0)
|
||||
// 默认只给**一页**,不是整段历史。
|
||||
//
|
||||
// 原先缺省值 0 = 不限制,于是任何不带 limit 的客户端每次都会拿到完整聊天记录
|
||||
// (生产实例上 ~5MB;本地 126 条实测 635KB)。WebUI/GUI 都显式带 limit,
|
||||
// 所以把默认收到一页不会影响它们;想整取的调用方显式传 limit=0。
|
||||
limit := parseIntDefault(q.Get("limit"), defaultChatHistoryLimit)
|
||||
if limit < 0 {
|
||||
limit = 0
|
||||
limit = defaultChatHistoryLimit
|
||||
}
|
||||
if limit > maxChatHistory {
|
||||
limit = maxChatHistory
|
||||
|
||||
Reference in New Issue
Block a user