面板:修复WorkBuddy模型失忆(WB_SESS标记判断resume/session-id,不再猜jsonl路径)
This commit is contained in:
parent
6202a6b183
commit
961caed3e2
@ -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 认识的模型 id(hy3 / 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 子进程,边解析边把事件流式推给前端,返回累计文本。"""
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user