forked from cardosofelipe/fast-next-template
- Add Celery app configuration with Redis broker/backend - Add task modules: agent, workflow, cost, git, sync - Add task stubs for: - Agent execution (spawn, heartbeat, terminate) - Workflow orchestration (start sprint, checkpoint, code review) - Cost tracking (record usage, calculate, generate report) - Git operations (clone, commit, push, sync) - External sync (import issues, export updates) - Add task tests directory structure - Configure for production-ready Celery setup Implements #18 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
151 lines
4.2 KiB
Python
151 lines
4.2 KiB
Python
# app/tasks/agent.py
|
|
"""
|
|
Agent execution tasks for Syndarix.
|
|
|
|
These tasks handle the lifecycle of AI agent instances:
|
|
- Spawning new agent instances from agent types
|
|
- Executing agent steps (LLM calls, tool execution)
|
|
- Terminating agent instances
|
|
|
|
Tasks are routed to the 'agent' queue for dedicated processing.
|
|
"""
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
from app.celery_app import celery_app
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@celery_app.task(bind=True, name="app.tasks.agent.run_agent_step")
|
|
def run_agent_step(
|
|
self,
|
|
agent_instance_id: str,
|
|
context: dict[str, Any],
|
|
) -> dict[str, Any]:
|
|
"""
|
|
Execute a single step of an agent's workflow.
|
|
|
|
This task performs one iteration of the agent loop:
|
|
1. Load agent instance state
|
|
2. Call LLM with context and available tools
|
|
3. Execute tool calls if any
|
|
4. Update agent state
|
|
5. Return result for next step or completion
|
|
|
|
Args:
|
|
agent_instance_id: UUID of the agent instance
|
|
context: Current execution context including:
|
|
- messages: Conversation history
|
|
- tools: Available tool definitions
|
|
- state: Agent state data
|
|
- metadata: Project/task metadata
|
|
|
|
Returns:
|
|
dict with status and agent_instance_id
|
|
"""
|
|
logger.info(
|
|
f"Running agent step for instance {agent_instance_id} with context keys: {list(context.keys())}"
|
|
)
|
|
|
|
# TODO: Implement actual agent step execution
|
|
# This will involve:
|
|
# 1. Loading agent instance from database
|
|
# 2. Calling LLM provider (via litellm or anthropic SDK)
|
|
# 3. Processing tool calls through MCP servers
|
|
# 4. Updating agent state in database
|
|
# 5. Scheduling next step if needed
|
|
|
|
return {
|
|
"status": "pending",
|
|
"agent_instance_id": agent_instance_id,
|
|
}
|
|
|
|
|
|
@celery_app.task(bind=True, name="app.tasks.agent.spawn_agent")
|
|
def spawn_agent(
|
|
self,
|
|
agent_type_id: str,
|
|
project_id: str,
|
|
initial_context: dict[str, Any],
|
|
) -> dict[str, Any]:
|
|
"""
|
|
Spawn a new agent instance from an agent type.
|
|
|
|
This task creates a new agent instance:
|
|
1. Load agent type configuration (model, expertise, personality)
|
|
2. Create agent instance record in database
|
|
3. Initialize agent state with project context
|
|
4. Start first agent step
|
|
|
|
Args:
|
|
agent_type_id: UUID of the agent type template
|
|
project_id: UUID of the project this agent will work on
|
|
initial_context: Starting context including:
|
|
- goal: High-level objective
|
|
- constraints: Any limitations or requirements
|
|
- assigned_issues: Issues to work on
|
|
- autonomy_level: FULL_CONTROL, MILESTONE, or AUTONOMOUS
|
|
|
|
Returns:
|
|
dict with status, agent_type_id, and project_id
|
|
"""
|
|
logger.info(
|
|
f"Spawning agent of type {agent_type_id} for project {project_id}"
|
|
)
|
|
|
|
# TODO: Implement agent spawning
|
|
# This will involve:
|
|
# 1. Loading agent type from database
|
|
# 2. Creating agent instance record
|
|
# 3. Setting up MCP tool access
|
|
# 4. Initializing agent state
|
|
# 5. Kicking off first step
|
|
|
|
return {
|
|
"status": "spawned",
|
|
"agent_type_id": agent_type_id,
|
|
"project_id": project_id,
|
|
}
|
|
|
|
|
|
@celery_app.task(bind=True, name="app.tasks.agent.terminate_agent")
|
|
def terminate_agent(
|
|
self,
|
|
agent_instance_id: str,
|
|
reason: str,
|
|
) -> dict[str, Any]:
|
|
"""
|
|
Terminate an agent instance.
|
|
|
|
This task gracefully shuts down an agent:
|
|
1. Mark agent instance as terminated
|
|
2. Save final state for audit
|
|
3. Release any held resources
|
|
4. Notify relevant subscribers
|
|
|
|
Args:
|
|
agent_instance_id: UUID of the agent instance
|
|
reason: Reason for termination (completion, error, manual, budget)
|
|
|
|
Returns:
|
|
dict with status and agent_instance_id
|
|
"""
|
|
logger.info(
|
|
f"Terminating agent instance {agent_instance_id} with reason: {reason}"
|
|
)
|
|
|
|
# TODO: Implement agent termination
|
|
# This will involve:
|
|
# 1. Loading agent instance
|
|
# 2. Updating status to terminated
|
|
# 3. Saving termination reason
|
|
# 4. Cleaning up any pending tasks
|
|
# 5. Sending termination event
|
|
|
|
return {
|
|
"status": "terminated",
|
|
"agent_instance_id": agent_instance_id,
|
|
}
|