75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
"""Agent loop — fetches tasks, executes with LLM, delivers results."""
|
|
import asyncio
|
|
import json
|
|
import logging
|
|
|
|
logger = logging.getLogger("pipeline.agent_loop")
|
|
|
|
|
|
async def run_agent_loop(project_id, role_name, model_name=None):
|
|
"""Single iteration: fetch pending task, execute, deliver."""
|
|
from sqlor.dbpools import DBPools
|
|
|
|
db = DBPools()
|
|
async with db.sqlorContext("pipeline") as sor:
|
|
recs = await sor.sqlExe(
|
|
"SELECT id, title, params, pipeline_id FROM pipeline_tasks "
|
|
"WHERE state='submitted' AND tenant_id=${pid}$ LIMIT 1",
|
|
{"pid": project_id},
|
|
)
|
|
if not recs:
|
|
return {"status": "idle", "message": "No pending tasks"}
|
|
|
|
task = recs[0]
|
|
task_id = task.id
|
|
await sor.sqlExe(
|
|
"UPDATE pipeline_tasks SET state='running' WHERE id=${tid}$",
|
|
{"tid": task_id},
|
|
)
|
|
|
|
from pipeline_service.llm_bridge import llm_call
|
|
|
|
title = getattr(task, "title", "")
|
|
params_str = getattr(task, "params", "{}")
|
|
prompt = (
|
|
f"Execute this development task:\n"
|
|
f"Title: {title}\n"
|
|
f"Params: {params_str}\n\n"
|
|
f"Provide the result."
|
|
)
|
|
try:
|
|
result = await llm_call(prompt, model=model_name)
|
|
except Exception as e:
|
|
await sor.sqlExe(
|
|
"UPDATE pipeline_tasks SET state='failed' WHERE id=${tid}$",
|
|
{"tid": task_id},
|
|
)
|
|
return {"status": "failed", "task_id": task_id, "error": str(e)[:200]}
|
|
|
|
from appPublic.uniqueID import getID
|
|
|
|
did = getID()
|
|
await sor.C("pipeline_deliverables", {
|
|
"id": did, "project_id": project_id, "task_id": task_id,
|
|
"deliverable_type": "code", "title": title, "content": result,
|
|
"quality_score": 80, "review_status": "pending",
|
|
"created_by": role_name,
|
|
})
|
|
await sor.sqlExe(
|
|
"UPDATE pipeline_tasks SET state='completed' WHERE id=${tid}$",
|
|
{"tid": task_id},
|
|
)
|
|
return {"status": "completed", "task_id": task_id, "deliverable_id": did}
|
|
|
|
|
|
async def agent_loop(project_id, role_name, model_name=None, max_iterations=10):
|
|
"""Run agent loop until idle or max reached."""
|
|
results = []
|
|
for _ in range(max_iterations):
|
|
r = await run_agent_loop(project_id, role_name, model_name)
|
|
results.append(r)
|
|
if r["status"] == "idle":
|
|
break
|
|
await asyncio.sleep(2)
|
|
return results
|