diff --git a/pipeline_service/agent_loop_v2.py b/pipeline_service/agent_loop_v2.py index a140b99..df8373e 100644 --- a/pipeline_service/agent_loop_v2.py +++ b/pipeline_service/agent_loop_v2.py @@ -185,16 +185,28 @@ class AgentExecutor: if action_type == "reply": # 任何轮次,只要没成功调过工具就 reply → 强制注入工具调用 if self._tool_call_count == 0: - hint_tool = "diagnose_project" - if any(kw in user_input.lower() for kw in ["任务", "task", "list"]): + # 意图识别:新需求描述(长文本+需求特征词)→ create_task 推进 + req_keywords = ["实现", "开发", "建设", "系统", "功能", "需求", "模块", + "支持", "切换", "监控", "备份", "同步", "要做", "设计", "平台"] + is_requirement = (len(user_input) > 40 and + any(kw in user_input for kw in req_keywords)) + if is_requirement: + hint_tool = "create_task" + elif any(kw in user_input.lower() for kw in ["任务", "task", "list"]): hint_tool = "list_tasks" elif any(kw in user_input.lower() for kw in ["问题", "question"]): hint_tool = "list_questions" + else: + hint_tool = "diagnose_project" yield json.dumps({ "type": "auto_tool", "message": f"未调工具,自动注入 {hint_tool}", }, ensure_ascii=False) + "\n" self._msgs.append({"role": "assistant", "content": f"已调用 {hint_tool}"}) - self._msgs.append({"role": "user", "content": f"请调用 {hint_tool} 工具,只输出 {{\"action\":\"tool_call\",\"tool\":\"{hint_tool}\",\"params\":{{}}}}"}) + if hint_tool == "create_task": + self._msgs.append({"role": "user", "content": + "用户描述了新需求,请用 create_task 创建任务推进(可先 role=requirement 做需求分析,再拆分到 develop),填好 title/role/description 参数,输出 tool_call JSON。"}) + else: + self._msgs.append({"role": "user", "content": f"请调用 {hint_tool} 工具,只输出 {{\"action\":\"tool_call\",\"tool\":\"{hint_tool}\",\"params\":{{}}}}"}) continue # 调了工具但太少(1-2次),LLM 想停 → 推它继续深入(最多3次) @@ -576,6 +588,31 @@ class AgentExecutor: # ── 工具实现 ── + async def _persist_project(self, sor, pid): + """持久化当前项目到 pipeline_agent_settings(user_id 唯一键)。 + + 只改 self.project_id 不够——AgentExecutor 每轮新建,run 结束即销毁, + 下一轮 cockpit_chat_v2 又从 pipeline_agent_settings 读回旧项目。 + """ + if not self.user_id or not pid: + return + try: + from appPublic.uniqueID import getID + await sor.sqlExe( + "UPDATE pipeline_agent_settings SET current_project_id=${pid}$ " + "WHERE user_id=${uid}$", + {"pid": pid, "uid": self.user_id}) + exists = await sor.sqlExe( + "SELECT 1 FROM pipeline_agent_settings WHERE user_id=${uid}$", + {"uid": self.user_id}) + if not exists: + await sor.sqlExe( + "INSERT INTO pipeline_agent_settings (id, user_id, current_project_id) " + "VALUES (${id}$, ${uid}$, ${pid}$)", + {"id": getID(), "uid": self.user_id, "pid": pid}) + except Exception as e: + logger.warning(f"persist project failed: {e}") + async def _t_switch_project(self, sor, p, pid): name = p.get("project_name", "").strip() if not name: @@ -587,6 +624,7 @@ class AgentExecutor: if recs: r = recs[0] self.project_id = getattr(r, "id", "") + await self._persist_project(sor, self.project_id) return f"OK: 已切换到 {getattr(r, 'name', name)}" # LLM 分类匹配 @@ -605,6 +643,7 @@ class AgentExecutor: if recs2: r = recs2[0] self.project_id = getattr(r, "id", "") + await self._persist_project(sor, self.project_id) return f"OK: 已切换到 {getattr(r, 'name', matched)}" except Exception: pass @@ -630,6 +669,7 @@ class AgentExecutor: "iteration_type": "default", "status": "active", "priority": 1, }) self.project_id = pid_val + await self._persist_project(sor, pid_val) return f"OK: 已创建项目 {name}" async def _t_create_task(self, sor, p, pid):