Files
2026-07-13 12:58:18 +08:00

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)