面板:修复WorkBuddy模型失忆(WB_SESS标记判断resume/session-id,不再猜jsonl路径)

This commit is contained in:
Zhuyuan Operations 2026-08-04 01:36:18 +08:00
parent 6202a6b183
commit 961caed3e2

View File

@ -51,6 +51,33 @@ def _save_oc_sess():
print("OC_SESS_SAVE_ERR:", repr(e))
OC_SESS = _load_oc_sess() # eed_sid -> {"sid": oc_sid, "ts": 时间戳}
# WorkBuddy 会话标记2026-08-04 接入):记录哪些 eed_sid 已在 codebuddy 侧开过会话。
# codebuddy 按 cwd 落 jsonl路径不好猜所以用标记判断"本场该 resume 还是新开"。
WB_SESS_FILE = os.path.expanduser("~/.codebuddy/wb_sess.json")
WB_SESS_TTL = 24 * 3600
def _load_wb_sess():
try:
with open(WB_SESS_FILE, encoding="utf-8") as f:
d = json.load(f)
now = time.time()
return {k: v for k, v in d.items()
if isinstance(v, dict) and now - (v.get("ts") or 0) < WB_SESS_TTL}
except Exception:
return {}
def _save_wb_sess():
try:
os.makedirs(os.path.dirname(WB_SESS_FILE), exist_ok=True)
tmp = WB_SESS_FILE + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(WB_SESS, f, ensure_ascii=False)
os.replace(tmp, WB_SESS_FILE)
except Exception as e:
print("WB_SESS_SAVE_ERR:", repr(e))
WB_SESS = _load_wb_sess() # eed_sid -> {"ts": 时间戳}(开过 codebuddy 会话的标记)
# 蛋蛋主脑工作目录:面板与终端共用同一个 CodeBuddy 项目库(记忆 + 会话都落这里)
# 对应 ~/.codebuddy/projects/home-ls/。改这里 = 换脑,务必与 SESSION_DIR 保持一致。
EED_CWD = "/home/ls"
@ -2890,25 +2917,24 @@ class Handler(http.server.BaseHTTPRequestHandler):
def _stream_workbuddy(self, message, model, eed_sid, token):
"""WorkBuddy 免费积分大脑codebuddy CLI 路径(苍耳 2026-08-04 接入)。
model 形如 wb/<实际模型id>多轮会话靠 codebuddy 自己的 jsonl 会话文件
SESSION_DIR/<sid>.jsonl首次用 --session-id 开新场后续 --resume 续聊
解析 codebuddy stream-json 输出 翻译成前端 delta/thinking/tool/usage"""
model 形如 wb/<实际模型id>多轮会话靠 codebuddy 自己的会话文件续聊
本场 sid 已在 codebuddy 开过WB_SESS 有记录 --resume 接续记忆
没开过 --session-id 开新场并记录下次就能 resume
2026-08-04 修复之前靠猜 jsonl 路径判断 resume路径不对 每次当新会话 完全失忆"""
# wb/ 前缀剥掉,得到 codebuddy 认识的模型 idhy3 / glm-5.2 / kimi-k3-1 ...
cb_model = model.split("/", 1)[1] if "/" in model else model
# 会话:面板侧 eed_sid 直接当 codebuddy 的 sid 用(jsonl 落在 SESSION_DIR
# 会话:面板侧 eed_sid 直接当 codebuddy 的 sid 用(稳定的 eed_ 前缀 = 同一场对话
sid = eed_sid if eed_sid and eed_sid.startswith("eed_") else ("eed_" + uuid.uuid4().hex[:12])
sess_file = os.path.join(SESSION_DIR, sid + ".jsonl")
resume = os.path.exists(sess_file)
cmd = [CODEBUDDY, "--print", "--model", cb_model,
"--tools", "Read,WebSearch,Bash",
"--output-format", "stream-json",
"--system-prompt", EED_SYS]
if resume:
cmd += ["--resume", sid]
else:
cmd += ["--session-id", sid]
cmd += ["-p", message]
return self._stream_cmd(cmd, token)
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
def _stream_cmd(self, cmd, token=""):
"""跑一次 codebuddy 子进程,边解析边把事件流式推给前端,返回累计文本。"""