|
|
"""Background agent worker that autonomously completes tasks.""" |
|
|
|
|
|
import asyncio |
|
|
import random |
|
|
from app.database import SessionLocal |
|
|
from app.models import Task, TaskStatus, Project, AI_AGENT_USER_ID |
|
|
from app.tools.memory import complete_task |
|
|
|
|
|
|
|
|
async def agent_loop(): |
|
|
"""Background loop that processes tasks for agent-enabled projects.""" |
|
|
print("[Agent] Worker started, waiting for initial delay...") |
|
|
|
|
|
await asyncio.sleep(10) |
|
|
|
|
|
while True: |
|
|
try: |
|
|
await process_one_task() |
|
|
except Exception as e: |
|
|
print(f"[Agent] Error: {e}") |
|
|
|
|
|
|
|
|
wait_time = random.uniform(25, 35) |
|
|
await asyncio.sleep(wait_time) |
|
|
|
|
|
|
|
|
async def process_one_task(): |
|
|
"""Pick a random todo task from agent-enabled projects and complete it.""" |
|
|
db = SessionLocal() |
|
|
try: |
|
|
|
|
|
projects = db.query(Project).filter(Project.agent_enabled == True).all() |
|
|
if not projects: |
|
|
return |
|
|
|
|
|
|
|
|
project = random.choice(projects) |
|
|
|
|
|
|
|
|
todo_tasks = db.query(Task).filter( |
|
|
Task.project_id == project.id, |
|
|
Task.status == TaskStatus.todo |
|
|
).all() |
|
|
|
|
|
if not todo_tasks: |
|
|
return |
|
|
|
|
|
task = random.choice(todo_tasks) |
|
|
print(f"[Agent] Starting task: {task.title}") |
|
|
|
|
|
|
|
|
task.status = TaskStatus.in_progress |
|
|
task.working_by = AI_AGENT_USER_ID |
|
|
db.commit() |
|
|
|
|
|
|
|
|
await asyncio.sleep(random.uniform(2, 5)) |
|
|
|
|
|
|
|
|
result = await complete_task( |
|
|
task_id=task.id, |
|
|
project_id=project.id, |
|
|
user_id=AI_AGENT_USER_ID, |
|
|
what_i_did=f"Implemented {task.title}. {task.description or 'Completed the task as specified.'}", |
|
|
actor_type="agent" |
|
|
) |
|
|
|
|
|
if result.get("success"): |
|
|
print(f"[Agent] Completed task: {task.title}") |
|
|
else: |
|
|
print(f"[Agent] Failed to complete task: {result.get('error')}") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"[Agent] Error in process_one_task: {e}") |
|
|
db.rollback() |
|
|
finally: |
|
|
db.close() |
|
|
|