Spaces:
Build error
Build error
| # Phase 2: PlannerAgent & 4-Agent MVP System - Design Document | |
| **Date**: January 2025 | |
| **Author**: BeatDebate Team | |
| **Status**: Revised (to match implementation) | |
| **Review Status**: Approved | |
| --- | |
| ## 0. References | |
| * Main Project Design: [Plans/beatdebate-design-doc.md](Plans/beatdebate-design-doc.md) | |
| * Implemented Agent: `src/agents/planner_agent.py` | |
| * State Model: `src/models/agent_models.py` (MusicRecommenderState) | |
| --- | |
| ## 1. Problem Statement | |
| **Objective**: Implement a 4-agent MVP system with sophisticated planning capabilities to demonstrate agentic behavior for the AgentX competition. | |
| **Current State**: We have validated Last.fm data sources and a working API client. Now we need to build the core agent system that showcases strategic planning and coordination. | |
| **Value Proposition**: | |
| - Demonstrate advanced agentic planning behavior (AgentX core requirement) | |
| - Show sophisticated multi-agent coordination | |
| - Provide transparent reasoning chains for all decisions | |
| - Create a working MVP that can be extended in later phases | |
| --- | |
| ## 2. Goals & Non-Goals | |
| ### β In Scope (Phase 2) | |
| - **PlannerAgent**: Strategic query analysis, coordination planning, and definition of evaluation framework. Relies on an LLM for generation with fallback mechanisms. | |
| - **GenreMoodAgent**: Strategy-guided genre/mood search implementation (primarily using Last.fm data for MVP) | |
| - **DiscoveryAgent**: Strategy-guided similarity/discovery search implementation (primarily using Last.fm similarity and data for MVP) | |
| - **JudgeAgent**: Strategy-informed multi-criteria decision making | |
| - **LangGraph Workflow**: Complete orchestration of 4-agent process | |
| - **State Management**: Shared state across agents | |
| - **Basic Testing**: Unit tests for each agent | |
| ### β Out of Scope (Phase 2) | |
| - Frontend implementation (Phase 3) | |
| - Complex UI/UX features (Phase 3) | |
| - Advanced caching optimization (Phase 3) | |
| - Performance monitoring (Phase 3) | |
| - User authentication (Post-MVP) | |
| - Full playlist generation (Post-MVP) | |
| --- | |
| ## 3. Technical Architecture | |
| ### 3.1 Agent Architecture Overview | |
| ``` | |
| User Query: "I need focus music for coding" | |
| β | |
| π§ PlannerAgent: Strategic Analysis & Coordination Planning | |
| ββ Task Analysis: Analyzes query for intent, complexity, mood, genres (LLM-driven) | |
| ββ Agent Coordination Strategy: Defines search parameters for advocates (LLM-driven) | |
| ββ Evaluation Framework: Sets evaluation criteria & diversity targets for judge (LLM-driven) | |
| ββ Execution Monitoring Plan: Defines basic monitoring protocols (LLM-driven) | |
| β | |
| Coordinated Advocate Execution (Parallel): | |
| ββ πΈ GenreMoodAgent: Genre/mood-based search with strategy | |
| ββ π DiscoveryAgent: Similarity/discovery search with strategy | |
| β | |
| βοΈ JudgeAgent: Strategy-Informed Decision Making | |
| ββ Applies PlannerAgent's evaluation criteria | |
| ββ Multi-criteria analysis of candidate tracks | |
| ββ Generates explanations with reasoning transparency | |
| β | |
| π΅ Response: 3 strategically selected tracks with full reasoning chains | |
| ``` | |
| ### 3.2 LangGraph State Management | |
| ```python | |
| from typing import Dict, List, Any, Optional | |
| from pydantic import BaseModel | |
| class MusicRecommenderState(BaseModel): | |
| """Shared state across all agents in the workflow""" | |
| user_query: str | |
| user_profile: Optional[Dict[str, Any]] = None | |
| # Planning phase | |
| planning_strategy: Optional[Dict[str, Any]] = None # Generated by PlannerAgent | |
| # execution_plan: Optional[Dict[str, Any]] = None # This is now part of planning_strategy | |
| # Advocate phase | |
| genre_mood_recommendations: List[Dict] = [] # List of track data dicts | |
| discovery_recommendations: List[Dict] = [] # List of track data dicts | |
| # Judge phase | |
| final_recommendations: List[Any] = [] # List[TrackRecommendation] after JudgeAgent processing | |
| # Reasoning transparency | |
| reasoning_log: List[str] = [] | |
| agent_deliberations: List[Dict] = [] # Potentially for more detailed logs from each agent | |
| # Metadata | |
| processing_start_time: Optional[float] = None | |
| total_processing_time: Optional[float] = None | |
| ``` | |
| ### 3.3 Agent Specifications | |
| #### 3.3.1 PlannerAgent | |
| **Responsibility**: Strategic coordination and planning engine. Uses an LLM to generate planning components and has fallback mechanisms if LLM calls fail. | |
| **Key Methods**: | |
| ```python | |
| class PlannerAgent(BaseAgent): | |
| def __init__(self, config: AgentConfig, gemini_client=None): | |
| # ... initialization ... | |
| async def process(self, state: MusicRecommenderState) -> MusicRecommenderState: | |
| """Main method to create the comprehensive music discovery strategy. | |
| Updates state.planning_strategy and returns the updated state. | |
| """ | |
| # ... orchestrates calls to internal helpers ... | |
| pass | |
| async def _analyze_user_query(self, user_query: str) -> Dict[str, Any]: | |
| """Analyzes user query for complexity, intent, context, mood, genres using LLM or fallback. | |
| """ | |
| pass | |
| async def _plan_agent_coordination(self, user_query: str, task_analysis: Dict[str, Any]) -> Dict[str, Any]: | |
| """Plans coordination strategy for GenreMoodAgent and DiscoveryAgent using LLM or fallback. | |
| """ | |
| pass | |
| async def _create_evaluation_framework(self, user_query: str, task_analysis: Dict[str, Any]) -> Dict[str, Any]: | |
| """Creates evaluation framework (weights, diversity, explanations) for JudgeAgent using LLM or fallback. | |
| """ | |
| pass | |
| async def _setup_execution_monitoring(self, task_analysis: Dict[str, Any]) -> Dict[str, Any]: | |
| """Sets up basic execution monitoring protocols based on task analysis using LLM or fallback. | |
| """ | |
| pass | |
| # Other helpers: _parse_json_response, _enhance_*, _fallback_*, _initialize_*, call_llm | |
| ``` | |
| **Strategy Output Format (`state.planning_strategy`)**: | |
| ```python | |
| { | |
| "task_analysis": { | |
| "primary_goal": "concentration_music", | |
| "complexity_level": "medium", | |
| "context_factors": ["work", "focus", "instrumental_preference"], | |
| "mood_indicators": ["calm", "focused"], | |
| "genre_hints": ["ambient", "instrumental"] | |
| }, | |
| "coordination_strategy": { | |
| "genre_mood_agent": { | |
| "focus_areas": ["instrumental", "ambient", "post-rock"], | |
| "energy_level": "medium-low", | |
| "search_tags": ["focus", "study", "instrumental"], | |
| "mood_priority": "focused_calm", | |
| "genre_constraints": ["no_vocals"] | |
| }, | |
| "discovery_agent": { | |
| "novelty_priority": "high", | |
| "similarity_base": "coding_music_archetypes", | |
| "underground_bias": 0.7, | |
| "discovery_scope": "medium", | |
| "exploration_strategy": "prioritize lesser-known artists similar to ambient focus music" | |
| } | |
| }, | |
| "evaluation_framework": { | |
| "primary_weights": { // Criteria for JudgeAgent to score TrackRecommendation attributes | |
| "relevance_score": 0.3, // General relevance to query | |
| "novelty_score": 0.2, | |
| "quality_score": 0.2, // e.g., production, artist recognition (if available) | |
| "mood_match_score": 0.2, // How well it matches mood_indicators | |
| "concentration_friendliness_score": 0.1 // Specific to focus goal | |
| }, | |
| "diversity_targets": { // For JudgeAgent's _ensure_diversity method | |
| "attributes": ["genres", "era"], // Attributes on TrackRecommendation model | |
| "genres": 2, | |
| "era": 1, | |
| "artist": 3 // Example: Target 3 unique artists | |
| }, | |
| "explanation_style": "concise" // For JudgeAgent's _generate_final_explanations | |
| }, | |
| "execution_monitoring": { | |
| "max_advocate_candidates": 20, // Max tracks each advocate should aim for | |
| "timeout_seconds_advocates": 120, | |
| "fallback_threshold_judge": 1 // Min candidates before judge uses simplified logic | |
| } | |
| } | |
| ``` | |
| #### 3.3.2 GenreMoodAgent | |
| **Responsibility**: Strategy-guided genre and mood-based search. Receives its part of `coordination_strategy`. | |
| **Key Methods**: | |
| ```python | |
| class GenreMoodAgent(BaseAgent): | |
| # Updated to reflect process(state) pattern | |
| async def process(self, state: MusicRecommenderState) -> MusicRecommenderState: | |
| """Executes strategy to find genre/mood tracks, updates state.genre_mood_recommendations. | |
| """ | |
| # ... extracts its strategy from state.planning_strategy ... | |
| # ... calls internal methods like _search_by_mood_tags, _apply_genre_filters ... | |
| # ... appends List[Dict] to state.genre_mood_recommendations ... | |
| pass | |
| # async def _search_by_mood_tags(self, strategy_params: Dict) -> List[Dict] | |
| # async def _apply_genre_filters(self, tracks: List[Dict], strategy_params: Dict) -> List[Dict] | |
| # ... other internal helpers ... | |
| ``` | |
| #### 3.3.3 DiscoveryAgent | |
| **Responsibility**: Strategy-guided similarity and underground discovery. Receives its part of `coordination_strategy`. | |
| **Key Methods**: | |
| ```python | |
| class DiscoveryAgent(BaseAgent): | |
| # Updated to reflect process(state) pattern | |
| async def process(self, state: MusicRecommenderState) -> MusicRecommenderState: | |
| """Executes strategy to find similar/novel tracks, updates state.discovery_recommendations. | |
| """ | |
| # ... extracts its strategy from state.planning_strategy ... | |
| # ... calls internal methods like _find_similar_underground_tracks, _apply_novelty_scoring ... | |
| # ... appends List[Dict] to state.discovery_recommendations ... | |
| pass | |
| # async def _find_similar_underground_tracks(self, strategy_params: Dict) -> List[Dict] | |
| # async def _apply_novelty_scoring(self, tracks: List[Dict], strategy_params: Dict) -> List[Dict] | |
| # ... other internal helpers ... | |
| ``` | |
| #### 3.3.4 JudgeAgent | |
| **Responsibility**: Strategy-informed multi-criteria decision making. Uses `evaluation_framework` from `planning_strategy`. | |
| **Key Methods (refer to `Design/phase2_judge_agent_design.md` for updated details)**: | |
| ```python | |
| class JudgeAgent(BaseAgent): | |
| async def evaluate_and_select(self, state: MusicRecommenderState) -> MusicRecommenderState: | |
| # ... (updates state.final_recommendations with List[TrackRecommendation]) ... | |
| pass | |
| # def _apply_evaluation_framework(self, candidates: List[Dict], primary_weights: Dict[str, float]) -> List[TrackRecommendation]: | |
| # def _ensure_diversity(self, candidates: List[TrackRecommendation], diversity_targets: Dict[str, int], num_recommendations: int) -> List[TrackRecommendation]: | |
| # async def _generate_final_explanations(self, selections: List[TrackRecommendation], evaluation_framework: Dict) -> List[TrackRecommendation]: | |
| ``` | |
| --- | |
| ## 4. Implementation Plan | |
| ### 4.1 Development Phases | |
| #### Week 2 Phase 2.1: Core Agent Infrastructure (Days 1-2) | |
| - [β ] Create base agent class with common functionality | |
| - [β ] Implement PlannerAgent with strategic planning logic (LLM-driven with fallbacks) | |
| - [β ] Set up LangGraph state management (`MusicRecommenderState`) | |
| - [β ] Create agent factory and configuration system | |
| - [β ] Basic unit tests for PlannerAgent | |
| #### Week 2 Phase 2.2: Advocate Agents (Days 3-4) | |
| - [β ] Implement GenreMoodAgent with strategy execution | |
| - [β ] Implement DiscoveryAgent with novelty scoring | |
| - [β ] Integration with Last.fm API client | |
| - [β ] Unit tests for advocate agents. | |
| #### Week 2 Phase 2.3: Judge Agent & Workflow (Days 5-7) | |
| - [β ] Implement JudgeAgent with multi-criteria evaluation | |
| - [β ] Complete LangGraph workflow orchestration (`src/services/recommendation_engine.py`) | |
| - [β ] End-to-end integration testing (ongoing, some tests skipped) | |
| - [β ] Error handling and recovery mechanisms (basic) | |
| - [β ] Performance optimization and logging (basic logging implemented) | |
| ### 4.2 File Structure | |
| ``` | |
| src/ | |
| βββ agents/ | |
| β βββ __init__.py | |
| β βββ base_agent.py # Common agent functionality | |
| β βββ planner_agent.py # Strategic planning and coordination (LLM-driven) | |
| β βββ genre_mood_agent.py # Genre/mood-based search | |
| β βββ discovery_agent.py # Similarity/discovery search | |
| β βββ judge_agent.py # Multi-criteria decision making | |
| βββ services/ | |
| β βββ recommendation_engine.py # LangGraph workflow orchestration | |
| β βββ __init__.py | |
| β # βββ state_manager.py # (State is managed via LangGraph and Pydantic models directly) | |
| β # βββ reasoning_chain.py # (Reasoning is appended to state.reasoning_log) | |
| βββ models/ | |
| βββ agent_models.py # Pydantic models for state (MusicRecommenderState) and agent configs | |
| βββ recommendation_models.py # Pydantic model for TrackRecommendation | |
| ``` | |
| ### 4.3 Testing Strategy | |
| - **Unit Tests**: Each agent class with mocked dependencies (β Implemented for core logic) | |
| - **Integration Tests**: Full workflow with test data (β Some implemented, some skipped due to mocking complexities) | |
| - **Performance Tests**: Response time and resource usage (Future phase) | |
| - **Demo Scenarios**: Curated examples for AgentX presentation (Future phase) | |
| --- | |
| ## 5. Success Criteria | |
| ### 5.1 Functional Requirements | |
| - [β ] PlannerAgent creates sophisticated strategy objects (LLM-generated or fallback) | |
| - [β ] Advocate agents execute strategies and populate their respective recommendation lists in the state. | |
| - [β ] JudgeAgent applies evaluation frameworks effectively to `TrackRecommendation` objects. | |
| - [β ] Complete workflow processes queries end-to-end. | |
| - [β ] All agent interactions are logged for transparency (`state.reasoning_log`). | |
| ### 5.2 Performance Requirements | |
| - [ ] End-to-end response time: 2-5 minutes (acceptable for demo quality) | |
| - [ ] Strategy generation: < 30 seconds (LLM dependent) | |
| - [ ] Each advocate search: < 60 seconds | |
| - [ ] Judge evaluation: < 30 seconds | |
| - [ ] 95% success rate on test queries (requires comprehensive test suite) | |
| - [ ] Memory usage: < 1GB during operation | |
| - [ ] API rate limit compliance: Stay within Last.fm (3 req/sec) and Gemini (15 req/min) limits (requires careful management) | |
| ### 5.3 AgentX Competition Requirements | |
| - [β ] Demonstrates sophisticated agentic planning behavior (via PlannerAgent's LLM use and structured output) | |
| - [β ] Shows clear agent coordination and communication (via `planning_strategy` and shared state) | |
| - [β ] Provides transparent reasoning chains for all decisions (`state.reasoning_log`) | |
| - [β ] Handles complex queries with strategic decomposition (PlannerAgent's `task_analysis`) | |
| - [β ] Showcases innovation in multi-agent orchestration (LangGraph usage) | |
| --- | |
| ## 6. Risk Mitigation | |
| ### 6.1 Technical Risks | |
| **Risk**: API rate limiting during agent coordination | |
| **Mitigation**: Implemented basic `asyncio.sleep` in some API-heavy loops. More robust queuing/caching for future phases. | |
| **Risk**: LangGraph state management complexity | |
| **Mitigation**: Using Pydantic models for state clarity (β Implemented). | |
| **Risk**: Agent reasoning quality inconsistency (especially LLM-dependent parts) | |
| **Mitigation**: Comprehensive prompt engineering. Fallback mechanisms implemented in PlannerAgent (β Implemented). Continuous testing and refinement needed. | |
| ### 6.2 Timeline Risks | |
| **Risk**: Agent coordination more complex than expected | |
| **Mitigation**: Incremental workflow development was followed (β ). | |
| **Risk**: LLM response latency impacting demo | |
| **Mitigation**: Fallback mechanisms in PlannerAgent help. Response caching and async optimization are future considerations. | |
| --- | |
| ## 7. Next Steps | |
| 1. **Immediate**: Review and merge updated design documents. | |
| 2. **Post-Review**: Address skipped integration tests, particularly mocking for `RecommendationEngine`. | |
| 3. **Week 3 Start (Conceptual)**: Move to Phase 3 frontend implementation (if applicable). | |
| 4. **Ongoing**: Document all design decisions for AgentX submission. Continue refining tests and prompts. | |
| This design positions us to showcase sophisticated agentic planning behavior while maintaining a clear implementation timeline for the AgentX competition deadline. | |
| --- | |
| ## 8. Future Considerations (Post-MVP) | |
| - **ChromaDB Integration and Custom Embedding Implementation**: | |
| - Integrate ChromaDB as a local vector store. | |
| - Transition `DiscoveryAgent` to use custom embeddings (e.g., based on `genre + tags + mood + similar_artists` as per main design document) with ChromaDB as the primary source for similarity searches. | |
| - **Advanced Caching**: Implement more sophisticated caching beyond basic API client caching. | |
| - **Performance Monitoring**: Integrate detailed performance monitoring tools. | |
| - **Frontend Enhancements**: Develop complex UI/UX features. | |
| - **Expanded Agent Capabilities**: Further refine agent reasoning, negotiation, and learning. |