feat: 后台轮询器 — add_startup 自动执行 role_task
- _role_poller 每10秒扫描 pipeline_tasks 中 submitted 的 role_task - 逐条 dispatch 给对应角色 agent_loop 异步执行 - 修复 agent_loop 中 agent_ask 导入为相对导入
This commit is contained in:
parent
4cb406003e
commit
4c0b349718
@ -166,7 +166,7 @@ async def role_agent_run(project_id: str, role: str, agent_id: str = None, model
|
|||||||
|
|
||||||
# 缺信息 → 提问回路:任务置 waiting,等主agent/客户回答
|
# 缺信息 → 提问回路:任务置 waiting,等主agent/客户回答
|
||||||
if parsed.get("status") == "need_info" and parsed.get("question"):
|
if parsed.get("status") == "need_info" and parsed.get("question"):
|
||||||
from pipeline_service.questions import agent_ask
|
from .questions import agent_ask
|
||||||
qid = await agent_ask(project_id, task_id, role, parsed["question"],
|
qid = await agent_ask(project_id, task_id, role, parsed["question"],
|
||||||
context={"partial": parsed.get("partial", ""), "title": title})
|
context={"partial": parsed.get("partial", ""), "title": title})
|
||||||
return {"status": "need_info", "task_id": task_id,
|
return {"status": "need_info", "task_id": task_id,
|
||||||
|
|||||||
@ -8,6 +8,8 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
from ahserver.serverenv import ServerEnv
|
from ahserver.serverenv import ServerEnv
|
||||||
from appPublic.uniqueID import getID
|
from appPublic.uniqueID import getID
|
||||||
from appPublic.log import debug
|
from appPublic.log import debug
|
||||||
@ -427,5 +429,35 @@ def load_pipeline_service():
|
|||||||
env.question_list = list_questions
|
env.question_list = list_questions
|
||||||
env.question_qna = get_task_qna
|
env.question_qna = get_task_qna
|
||||||
|
|
||||||
|
# Background poller: auto-dispatch submitted role_tasks to role agents
|
||||||
|
_logger = logging.getLogger("pipeline.agent_poller")
|
||||||
|
|
||||||
|
async def _role_poller():
|
||||||
|
"""轮询 pipeline_tasks 中待执行的 role_task,交给对应角色agent执行。"""
|
||||||
|
from sqlor.dbpools import DBPools
|
||||||
|
poll_db = DBPools()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
async with poll_db.sqlorContext("pipeline") as sor:
|
||||||
|
recs = await sor.sqlExe(
|
||||||
|
"SELECT id, tenant_id, role FROM pipeline_tasks "
|
||||||
|
"WHERE state='submitted' AND pipeline_id='role_task' "
|
||||||
|
"AND claimed_by IS NULL ORDER BY created_at ASC LIMIT 5",
|
||||||
|
{})
|
||||||
|
for rec in (recs or []):
|
||||||
|
tid = getattr(rec, 'id', '')
|
||||||
|
pid = getattr(rec, 'tenant_id', '')
|
||||||
|
r = getattr(rec, 'role', '')
|
||||||
|
if tid and pid and r:
|
||||||
|
_logger.info(f"dispatching task={tid} role={r}")
|
||||||
|
asyncio.ensure_future(
|
||||||
|
role_agent_loop(pid, r, agent_id=f"poller-{r}"))
|
||||||
|
except Exception as e:
|
||||||
|
_logger.error(f"error: {e}")
|
||||||
|
await asyncio.sleep(10)
|
||||||
|
|
||||||
|
from ahserver.configuredServer import add_startup
|
||||||
|
add_startup(_role_poller())
|
||||||
|
|
||||||
debug(f"[{MODULE_NAME}] v{MODULE_VERSION} loaded — pipeline engine with role-agent + question loop")
|
debug(f"[{MODULE_NAME}] v{MODULE_VERSION} loaded — pipeline engine with role-agent + question loop")
|
||||||
return True
|
return True
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user