Software_Engineer_Agent / backend /agents /planner_agent.py
G-Madhuri's picture
deploy to hf space
7e2f74d
Raw
History Blame Contribute Delete
3.99 kB
import json
from typing import Dict, Any, List
from pydantic import BaseModel, Field
from agents.base_agent import BaseAgent
class PlannerDecision(BaseModel):
retrieve_memory: bool = Field(
description="Whether to retrieve past conversation history or context for the current query."
)
run_semantic_search: bool = Field(
description="Whether to query the vector database for matching chunks from the codebase."
)
invoke_tools: List[str] = Field(
description="List of tool names to invoke, from: ['repository_search', 'graph_query', 'dependency_lookup', 'file_reader', 'architecture_lookup', 'api_lookup']."
)
run_agents: bool = Field(
description="Whether specialized agents should be executed."
)
selected_agents: List[str] = Field(
description="List of agent names selected to run if run_agents is true, from: ['ArchitectureAgent', 'SecurityAgent', 'ApiAgent', 'DependencyAgent', 'QualityAgent', 'OnboardingAgent']."
)
execution_order: List[List[str]] = Field(
description="Execution order for agents (e.g., [['SecurityAgent', 'ApiAgent'], ['ArchitectureAgent']]) if run_agents is true."
)
synthesize_final_answer: bool = Field(
description="Whether the response synthesizer should combine everything into the final answer. Set to True unless a direct tool/search result is sufficient."
)
reasoning: str = Field(
description="Explanation of why these pipeline decisions and agent executions were chosen."
)
class PlannerAgent(BaseAgent):
async def run(
self,
profile: Dict[str, Any],
graph: Dict[str, Any],
summary: Dict[str, Any],
report: str,
query: str
) -> Dict[str, Any]:
prompt = f"""
You are the Agent Orchestration Planner. Your task is to analyze the user's query and decide the best execution pipeline to resolve it.
The execution pipeline consists of:
1. retrieve_memory: Fetching past chat history/turns.
2. run_semantic_search: Finding relevant code snippets via vector embeddings.
3. invoke_tools: Executing direct lookup/search tools.
4. run_agents: Launching specialized agents in parallel or sequential stages.
5. synthesize_final_answer: Combining all info into a clean final markdown explanation.
Available Tools:
- repository_search: Semantic search over indexed repo chunks.
- graph_query: Query dependency graph, business flows, entry points.
- dependency_lookup: Look up project languages, frameworks, packages.
- file_reader: Retrieve specific source code file content.
- architecture_lookup: Query high-level architecture pattern and major folders.
- api_lookup: Look up HTTP endpoints, authentication details.
Available Agents:
1. ArchitectureAgent: Focuses on architectural patterns, component interaction, data flow, component responsibilities, and business flows.
2. SecurityAgent: Focuses on authentication, authorization, API keys, secrets, security risks, vulnerability findings, and unsafe practices.
3. ApiAgent: Focuses on endpoints, routes, HTTP methods, request/response models, and external APIs.
4. DependencyAgent: Focuses on libraries, frameworks, cloud stack, dependencies, and infrastructure setup.
5. QualityAgent: Focuses on complexity, maintainability, dead code, refactoring suggestions, and testing hints.
6. OnboardingAgent: Focuses on developer onboarding walkthrough, where to start reading, and execution setup.
Repository Profile:
{json.dumps(profile, indent=2)}
Repository Summary:
{json.dumps(summary, indent=2)}
User Query:
{query}
Determine:
1. Which pipeline components should run (retrieve_memory, run_semantic_search, invoke_tools, run_agents, synthesize_final_answer).
2. Which agents and tools are needed and their execution plan.
3. The reasoning behind your plan.
Return your decision in structured JSON format matching the schema.
"""
return await self._call_llm_json(prompt, PlannerDecision, temperature=0.1)