87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
"""
|
|
Orchestrator Agent - Coordinates between Research and Analysis agents.
|
|
Speaks AG-UI Protocol to the UI, delegates tasks to A2A agents via middleware.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
import os
|
|
import uvicorn
|
|
from fastapi import FastAPI
|
|
from ag_ui_adk import ADKAgent, add_adk_fastapi_endpoint
|
|
from google.adk.agents import LlmAgent
|
|
|
|
orchestrator_agent = LlmAgent(
|
|
name="OrchestratorAgent",
|
|
model="gemini-2.5-pro",
|
|
instruction="""
|
|
You are an orchestrator agent that coordinates research and analysis tasks.
|
|
|
|
AVAILABLE SPECIALIZED AGENTS:
|
|
|
|
1. **Research Agent** (LangGraph) - Gathers and summarizes information about a topic
|
|
2. **Analysis Agent** (ADK) - Analyzes research findings and provides insights
|
|
|
|
CRITICAL CONSTRAINTS:
|
|
- You MUST call agents ONE AT A TIME, never make multiple tool calls simultaneously
|
|
- After making a tool call, WAIT for the result before making another tool call
|
|
- Do NOT make parallel/concurrent tool calls - this is not supported
|
|
|
|
WORKFLOW FOR RESEARCH TASKS:
|
|
|
|
When the user asks to research a topic:
|
|
|
|
1. **Research Agent** - First, gather information about the topic
|
|
- Pass: The user's research query or topic
|
|
- Wait for structured JSON response with research findings
|
|
|
|
2. **Analysis Agent** - Then, analyze the research results
|
|
- Pass: The research results from step 1
|
|
- Wait for structured JSON with analysis and insights
|
|
|
|
3. Present the complete research and analysis to the user
|
|
|
|
IMPORTANT WORKFLOW DETAILS:
|
|
- Always call the Research Agent first to gather information
|
|
- Then call the Analysis Agent to analyze the findings
|
|
- Wait for each agent to complete before calling the next one
|
|
- Build your final response using information from both agents
|
|
|
|
RESPONSE STRATEGY:
|
|
- After each agent response, briefly acknowledge what you received
|
|
- Build up the complete answer incrementally
|
|
- At the end, present a well-organized summary
|
|
- Don't just list agent responses - synthesize them into a cohesive answer
|
|
|
|
IMPORTANT: Once you have received a response from an agent, do NOT call that same
|
|
agent again for the same information. Use the information you already have.
|
|
""",
|
|
)
|
|
|
|
# Wrap with AG-UI middleware to expose via AG-UI Protocol
|
|
adk_orchestrator_agent = ADKAgent(
|
|
adk_agent=orchestrator_agent,
|
|
app_name="orchestrator_app",
|
|
user_id="demo_user",
|
|
session_timeout_seconds=3600,
|
|
use_in_memory_services=True,
|
|
)
|
|
|
|
app = FastAPI(title="A2A Orchestrator (ADK + AG-UI Protocol)")
|
|
add_adk_fastapi_endpoint(app, adk_orchestrator_agent, path="/")
|
|
|
|
if __name__ == "__main__":
|
|
if not os.getenv("GOOGLE_API_KEY"):
|
|
print("⚠️ Warning: GOOGLE_API_KEY not set!")
|
|
print(" Set it with: export GOOGLE_API_KEY='your-key-here'")
|
|
print(" Get a key from: https://aistudio.google.com/app/apikey")
|
|
print()
|
|
|
|
port = int(os.getenv("ORCHESTRATOR_PORT", 9000))
|
|
print(f"🚀 Starting Orchestrator Agent (ADK + AG-UI) on http://localhost:{port}")
|
|
uvicorn.run(app, host="0.0.0.0", port=port)
|