From 451a3dca26f0b63d3a417035059a65d71eb5f97d Mon Sep 17 00:00:00 2001 From: Zhuyuan Operations Date: Tue, 4 Aug 2026 03:02:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=A2=E6=9D=BF=EF=BC=9A=E4=B8=A4=E8=BE=B9?= =?UTF-8?q?=E8=AE=B0=E5=BF=86=E7=BB=9D=E5=AF=B9=E4=B8=80=E8=87=B4=E2=80=94?= =?UTF-8?q?=E2=80=94DeepSeek=E4=B8=8EWorkBuddy=E7=BB=9F=E4=B8=80=E7=94=A8?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=AE=8C=E6=95=B4=E5=8E=86=E5=8F=B2=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=EF=BC=88=E4=B8=8D=E5=86=8D=E5=90=84=E8=87=AAsession?= =?UTF-8?q?=E8=AE=B0=E5=90=84=E8=87=AA=E7=9A=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/eed_web_opencode.py | 43 +++++++++++++++---------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/scripts/eed_web_opencode.py b/scripts/eed_web_opencode.py index 4757abb..d4b10ef 100644 --- a/scripts/eed_web_opencode.py +++ b/scripts/eed_web_opencode.py @@ -2840,17 +2840,14 @@ class Handler(http.server.BaseHTTPRequestHandler): try: self._chunk_end() except Exception: pass - def _stream_opencode(self, message, model, eed_sid, token): - """OpenCode 引擎:opencode run --agent egg -m [-s oc_sid] --format json -- + def _stream_opencode(self, message, model, eed_sid, token, history=None): + """OpenCode 引擎:opencode run --agent egg -m --format json -- 解析 NDJSON 事件流,翻译成前端要的 delta/thinking/tool/tool_result/usage/error。 - 多轮对话靠 OpenCode 自己的 session:后端维护 eed_sid -> oc_sid 映射。""" - oc_sid = None - _oc = OC_SESS.get(eed_sid) - if _oc: - oc_sid = _oc.get("sid") + ★ 记忆统一以「前端完整历史」为准(与 WorkBuddy 共享同一份记忆 · 两边绝对一致): + 每次调用都用 build_prompt 把完整对话历史拼进消息,不依赖 opencode session。""" + if history: + message = build_prompt(history, message) cmd = [OPENCODE, "run", "--agent", AGENT_NAME, "-m", model, "--format", "json", "--auto", "--thinking"] - if oc_sid: - cmd += ["-s", oc_sid] cmd += ["--", message] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, bufsize=1, start_new_session=True, cwd=EED_CWD) @@ -2919,29 +2916,22 @@ class Handler(http.server.BaseHTTPRequestHandler): def _stream_workbuddy(self, message, model, eed_sid, token, history=None): """WorkBuddy 免费积分大脑:codebuddy CLI 路径(苍耳 2026-08-04 接入)。 - model 形如 wb/<实际模型id>。多轮会话靠 codebuddy 自己的会话文件续聊: - ① 本场 sid 已在 codebuddy 开过(WB_SESS 有记录)→ --resume 接续记忆; - ② 没开过 → --session-id 开新场,并把前端传来的 history(含 DeepSeek 聊过的内容) - 拼进消息前缀 → WorkBuddy 一上来就知道之前聊过什么(跨大脑记忆共享)。 - (2026-08-04 修复:之前靠猜 jsonl 路径判断 resume,路径不对 → 每次当新会话 → 完全失忆)""" + model 形如 wb/<实际模型id>。 + ★ 记忆统一以「前端完整历史」为准(与 DeepSeek 共享同一份记忆 · 两边绝对一致): + 每次调用都用 build_prompt 把完整对话历史拼进消息。 + session-id 用固定 sid 便于 codebuddy 保持会话文件,但记忆不依赖它。""" # wb/ 前缀剥掉,得到 codebuddy 认识的模型 id(hy3 / glm-5.2 / kimi-k3-1 ...) cb_model = model.split("/", 1)[1] if "/" in model else model # 会话:面板侧 eed_sid 直接当 codebuddy 的 sid 用(稳定的 eed_ 前缀 = 同一场对话) sid = eed_sid if eed_sid and eed_sid.startswith("eed_") else ("eed_" + uuid.uuid4().hex[:12]) + if history: + message = build_prompt(history, message) cmd = [CODEBUDDY, "--print", "--model", cb_model, "--tools", "Read,WebSearch,Bash", "--output-format", "stream-json", - "--system-prompt", EED_SYS] - # 每次都用前端最新的完整历史当权威上下文(DeepSeek/WB 切换后也不丢新增内容), - # codebuddy 会话文件只用来给模型"参考之前自己说过什么"。 - if history: - message = build_prompt(history, message) - if sid in WB_SESS: - return self._stream_cmd(cmd + ["--resume", sid, "-p", message], token) - acc = self._stream_cmd(cmd + ["--session-id", sid, "-p", message], token) - WB_SESS[sid] = {"ts": time.time()} - _save_wb_sess() - return acc + "--system-prompt", EED_SYS, + "--session-id", sid, "-p", message] + return self._stream_cmd(cmd, token) def _stream_cmd(self, cmd, token=""): """跑一次 codebuddy 子进程,边解析边把事件流式推给前端,返回累计文本。""" @@ -3142,7 +3132,8 @@ class Handler(http.server.BaseHTTPRequestHandler): # WorkBuddy 免费积分大脑:走 codebuddy CLI(不花 DeepSeek 余额) acc = self._stream_workbuddy(message, model, sid, token, history) else: - acc = self._stream_opencode(message, model, sid, token) + # DeepSeek 大脑:同样基于前端完整历史(与 WB 共享同一份记忆) + acc = self._stream_opencode(message, model, sid, token, history) if not acc: acc = "(蛋蛋没回话,换个说法试试~)" self._event("done", {"text": acc, "session_id": sid, "compacted": False})