From f82c349cd6867b5ead0d9afd6fcb55cf5d589d1a Mon Sep 17 00:00:00 2001 From: ymq Date: Sun, 9 Aug 2026 22:32:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20prevent=20spurious=20project=20switch=20?= =?UTF-8?q?=E2=80=94=20prompt=20warns=20check=20current,=20switch=20return?= =?UTF-8?q?s=20early=20if=20already=20in=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wwwroot/api/cockpit_chat.dspy | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/wwwroot/api/cockpit_chat.dspy b/wwwroot/api/cockpit_chat.dspy index b558777..d9646d3 100644 --- a/wwwroot/api/cockpit_chat.dspy +++ b/wwwroot/api/cockpit_chat.dspy @@ -17,7 +17,8 @@ dbname = get_module_dbname('pipeline-sdlc') AGENT_PROMPT = """你是开发产线驾驶舱 Agent。用工具获取数据,用 reply 回复。 工作流: -- 切换项目:先 list_projects 看有哪些项目,再 switch_project +- 项目操作:当前项目已在环境信息中。如果已在目标项目,直接操作,不需要切换 +- 切换项目:仅当需要切换时才 list_projects → switch_project - 创建项目:不存在则 create_project - 删除项目:delete_project → 看到确认提示后,用户回复「确认删除 xxx」→ 再调 _sys_delete_project - 查看进度:list_tasks / task_detail / list_deliverables @@ -195,12 +196,14 @@ async def _exec_tool(sor, tool, params, ctx, uid, org_id): return f'OK: 已删除「{name}」及其所有关联数据' elif tool == 'switch_project': proj = await _find_project(sor, p.get('project','')) - if proj: - await _save_ctx(sor, uid, proj.id) - ctx['pid'] = proj.id; ctx['pname'] = proj.name - return 'OK: 已切换到「'+proj.name+'」' - allp = await sor.sqlExe("SELECT name FROM sd_projects ORDER BY created_at DESC LIMIT 15",{}) - return 'FAIL: 未找到。可用: '+', '.join([getattr(r,'name','') for r in (allp or [])]) + if not proj: + allp = await sor.sqlExe("SELECT name FROM sd_projects ORDER BY created_at DESC LIMIT 15",{}) + return 'FAIL: 未找到。可用: '+', '.join([getattr(r,'name','') for r in (allp or [])]) + if proj.id == ctx['pid']: + return f'已在「{proj.name}」项目中,无需切换' + await _save_ctx(sor, uid, proj.id) + ctx['pid'] = proj.id; ctx['pname'] = proj.name + return 'OK: 已切换到「'+proj.name+'」' elif tool == 'create_task': if not ctx['pid']: return 'FAIL: 请先切换到项目' title = p.get('title','')[:100] @@ -433,7 +436,7 @@ if action == 'send_message': return repos_str = ', '.join([r['n'] for r in ctx['repos']]) or '无' - env_text = f"当前项目: {ctx['pname'] or '未选择'}\n工作空间: {ctx['ws'] or '未设置'}\n仓库: {repos_str}" + env_text = f"【当前项目: {ctx['pname'] or '未选择'}】\n工作空间: {ctx['ws'] or '未设置'}\n仓库: {repos_str}\n⚠️ 在调用 switch_project 之前,先确认当前项目是否已经是目标项目" 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 WHERE created_by=${u}$ ORDER BY created_at ASC LIMIT 20",{"u":uid}) or []):