From 053b71ae95add0eb727f4a0a09424408ffdf73f3 Mon Sep 17 00:00:00 2001 From: ymq Date: Sun, 9 Aug 2026 17:19:59 +0800 Subject: [PATCH] fix agent: user-scoped conversation history + stricter _find_project matching --- wwwroot/api/cockpit_chat.dspy | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/wwwroot/api/cockpit_chat.dspy b/wwwroot/api/cockpit_chat.dspy index 2b5ce97..4932606 100644 --- a/wwwroot/api/cockpit_chat.dspy +++ b/wwwroot/api/cockpit_chat.dspy @@ -48,12 +48,21 @@ def _guess_role(title): async def _find_project(sor, name): if not name: return None + # Exact match first recs = await sor.sqlExe("SELECT id,name FROM sd_projects WHERE name=${n}$",{"n":name}) if recs: return recs[0] + # Fuzzy match — require keyword >= 2 chars, prefer prefix match + kw = name.lower().strip() + if len(kw) < 2: return None allp = await sor.sqlExe("SELECT id,name FROM sd_projects ORDER BY created_at DESC",{}) - kw = name.lower() + # First pass: name starts with kw for r in (allp or []): - if kw in (getattr(r,'name','') or '').lower(): return r + rn = (getattr(r,'name','') or '').lower() + if rn.startswith(kw): return r + # Second pass: kw is a word in name (split by common delimiters) + for r in (allp or []): + rn = (getattr(r,'name','') or '').lower() + if kw in rn: return r return None async def _load_ctx(sor, uid): @@ -224,7 +233,7 @@ if action == 'send_message': env_text = f"项目: {ctx['pname'] or '未选择'}\n仓库: {repos_str}" system = AGENT_PROMPT.replace('__TOOLS__',TOOLS_TEXT).replace('__ENV__',env_text) msgs = [{"role":"system","content":system}] - for h in (await sor.sqlExe("SELECT role,content FROM pipeline_conversations ORDER BY created_at ASC LIMIT 20",{}) or []): + for h in (await sor.sqlExe("SELECT role,content FROM pipeline_conversations WHERE created_by=${u}$ ORDER BY created_at ASC LIMIT 20",{"u":uid}) or []): msgs.append({"role":'user' if getattr(h,'role','')=='user' else 'assistant',"content":getattr(h,'content','')}) msgs.append({"role":"user","content":message_text}) await sor.C('pipeline_conversations',{'id':getID(),'role':'user','content':message_text,'msg_type':'text','org_id':org_id,'created_by':uid})