agenticAi / agents /planning_agent.py
Cline
Initial commit
0af0a55
raw
history blame
3.35 kB
from typing import Dict, Any, List
from loguru import logger
from utils.llm_orchestrator import LLMOrchestrator
class PlanningAgent:
def __init__(self, llm_api_key: str):
"""Initialize the Planning Agent."""
logger.info("Initializing PlanningAgent")
self.llm_orchestrator = LLMOrchestrator(llm_api_key)
self.capabilities = [
"task_planning",
"goal_decomposition",
"plan_refinement",
"task_prioritization"
]
self.setup_logger()
def setup_logger(self):
"""Configure logging for the agent."""
logger.add("logs/planning_agent.log", rotation="500 MB")
async def generate_plan(
self, goal: str, available_agents: List[str]) -> Dict[str, Any]:
"""Generate a task plan based on a high-level goal."""
logger.info(f"Generating plan for goal: {goal}")
try:
prompt = f"""
You are an expert planner. Generate a detailed task plan to achieve the following goal:
Goal: {goal}
Available agents: {', '.join(available_agents)}
Think step-by-step and explain your reasoning for each step.
The plan should be a list of steps, each with:
- A clear description of the task.
- The agent best suited to execute the task.
- Any necessary input or parameters for the task.
Example:
1. Task: Summarize the latest news on topic X.
Agent: web_browsing_agent
Input: topic=X
Reasoning: To get the latest news, we need to use the web_browsing_agent to search for news on topic X.
2. Task: Analyze the sentiment of the news summary.
Agent: data_analysis_agent
Input: summary from step 1
Reasoning: To analyze the sentiment, we can use the data_analysis_agent to process the summary from the previous step.
"""
plan_str = await self.llm_orchestrator.generate_completion(prompt)
plan = self.parse_plan(plan_str)
logger.info(f"Plan generated successfully: {plan}")
return {
"status": "success",
"plan": plan
}
except Exception as e:
logger.error(f"Error generating plan: {str(e)}")
return {
"status": "error",
"message": str(e)
}
def parse_plan(self, plan_str: str) -> List[Dict[str, Any]]:
"""Parse the plan generated by the LLM into a structured format."""
plan = []
steps = plan_str.strip().split("\n")
current_step = {}
for line in steps:
if line.startswith(tuple(f"{i}." for i in range(1, 10))):
if current_step:
plan.append(current_step)
current_step = {"task": line.split("Task: ")[1]}
elif "Agent: " in line:
current_step["agent"] = line.split("Agent: ")[1]
elif "Input: " in line:
current_step["input"] = line.split("Input: ")[1]
elif "Reasoning: " in line:
current_step["reasoning"] = line.split("Reasoning: ")[1]
if current_step:
plan.append(current_step)
return plan