Spaces:
Sleeping
A newer version of the Gradio SDK is available:
6.6.0
Technical Documentation
System Architecture
Overview
The Fantasy Draft Multi-Agent Demo showcases a sophisticated multi-agent system where AI agents with distinct personalities compete in a mock fantasy football draft. The system supports two execution modes:
- Basic Multiagent Mode: Single-process, shared memory, direct method calls
- A2A (Agent-to-Agent) Mode: Distributed agents on HTTP servers, true isolation
Core Components
fantasy-draft-agent/
βββ apps/
β βββ app.py # Main Gradio interface with A2A support
β βββ multiagent_draft.py # Core draft logic and agent management
β βββ multiagent_scenarios.py # UI formatting and visualization
βββ core/
β βββ agent.py # Base agent classes and strategies
β βββ constants.py # Configuration constants
β βββ data.py # Player data and rankings
β βββ dynamic_a2a_manager.py # Dynamic port allocation for A2A
β βββ a2a_helpers.py # A2A communication utilities
A2A Implementation
Dynamic Port Allocation
The system uses dynamic port allocation to support multiple concurrent A2A sessions:
class DynamicA2AAgentManager:
PORT_RANGE = (5000, 9000) # Available port range
active_sessions = {} # Track active sessions
def __init__(self, session_id):
self.session_id = session_id
self.allocated_ports = self._allocate_ports()
Each session gets 6 consecutive ports for the 6 agents, ensuring no conflicts between users.
A2A Communication Protocol
Agents communicate using the any-agent framework's A2A protocol:
- Agent Registration: Each agent starts an HTTP server
- Message Format: Structured requests/responses with task_id for context
- Async Communication: Non-blocking calls between agents
Example A2A interaction:
# Agent makes a pick
result = await a2a_tool_async(
f"http://localhost:{port}/make_pick",
model=agent_config.model,
task_id=task_id, # Maintains conversation context
params={
"available_players": available,
"round_number": round_num
}
)
Task ID and Context Management
The A2A framework uses task_id to maintain conversation continuity:
- Each draft session has a unique task_id
- Agents automatically maintain conversation history per task_id
- No manual conversation tracking needed in A2A mode
- Enables true stateless HTTP communication
Multi-User Support
Session-Based Architecture
The app uses Gradio's gr.State to maintain separate sessions:
# Each user gets their own app instance
app_state = gr.State(None)
def run_draft(mode, app):
if app is None:
app = EnhancedFantasyDraftApp()
# ... rest of logic
return output, app # Return updated state
Concurrency Handling
- Basic Mode: Full multi-user support, each user has isolated state
- A2A Mode: Dynamic ports prevent conflicts between sessions
- Resource Management: Automatic cleanup when sessions end
Limitations
- A2A mode requires available ports in the 5000-9000 range
- Each A2A session uses ~6 ports (one per agent)
- Maximum concurrent A2A sessions limited by port range
Agent Architecture
Base Agent Design
class FantasyDraftAgent(TinyAgent):
def __init__(self, team_num, team_name, strategy, personality):
super().__init__(
name=f"Team {team_num} - {team_name}",
instructions=self._build_instructions(),
model="gpt-4",
temperature=0.7
)
Strategy Implementation
Each agent has a distinct drafting strategy:
- Zero RB: Avoids RBs early, loads up on WRs
- Best Player Available (BPA): Pure value drafting
- Robust RB: Prioritizes RBs in early rounds
- Upside Hunter: Seeks high-risk, high-reward players
Memory and Context
Agents maintain context through:
- Conversation history (automatic in any-agent)
- Draft state passed with each request
- Strategy-specific decision making
Communication Flow
Pick Phase
- Commissioner announces current picker
- Agent evaluates available players
- Agent makes selection with reasoning
- Commissioner confirms pick
- Other agents may comment (limited by MAX_COMMENTS_PER_PICK)
Comment System
- Rivals prioritized for comments
- Maximum 2-3 comments per pick (configurable)
- Natural conversation flow with trash talk
Performance Optimization
Typing Effects
- Configurable delays for realistic feel
- TYPING_DELAY_SECONDS: Time showing "..."
- MESSAGE_DELAY_SECONDS: Pause between messages
Parallel Processing
- A2A agents process independently
- Async communication prevents blocking
- Dynamic timeout handling (30s default)
Resource Management
- Automatic port cleanup on session end
- Graceful fallback from A2A to simulation
- Memory-efficient state management
Error Handling
A2A Failures
- Automatic fallback to simulation mode
- Clear error messages in UI
- Session cleanup on errors
Port Allocation
- Retry logic for port binding
- Session tracking prevents conflicts
- Cleanup of abandoned sessions
Security Considerations
- API keys never exposed to frontend
- Each session isolated from others
- Port range restrictions for A2A
- No direct file system access from agents
Future Enhancements
Potential improvements:
- WebSocket support for real-time updates
- Database persistence for draft history
- Custom model support beyond GPT-4
- Extended player database
- League customization options