рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдУрд╡рд░рд╡реНрдпреВ: ADK рдФрд░ A2A рдХреЗ рд╕рд╛рде AI-рд╕рдВрдЪрд╛рд▓рд┐рдд рдЯреНрд░реИрд╡рд▓ рдкреНрд▓рд╛рдирд░
рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдЯреНрд░реИрд╡рд▓ рдкреНрд▓рд╛рдирд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ:
- рдЧрдВрддрд╡реНрдп, рддрд╛рд░реАрдЦреЗрдВ рдФрд░ рдмрдЬрдЯ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред
- рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ:
flight_agent:┬а рдлреНрд▓рд╛рдЗрдЯ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рддрд╛ рд╣реИредstay_agent: рдмрдЬрдЯ рдХреЗ рднреАрддрд░ рд╣реЛрдЯрд▓ рдвреВрдВрдврддрд╛ рд╣реИредactivities_agent: рд░реЛрдЪрдХ рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реБрдЭрд╛рддрд╛ рд╣реИред- рдлрд┐рд░, рд╕рднреА рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреЛ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗрдВрджреНрд░реАрдп
host_agentрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - рдЕрдВрдд рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП Streamlit UI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ FastAPI рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдПрдХ /run рдПрдВрдбрдкреЙрдЗрдВрдЯ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдЪрд╛рд░ рд╕рд╛рдЭрд╛ A2A-рдХрдореНрдкреИрдЯрд┐рдмрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЬрд░рд┐рдП рд╣реЛрддрд╛ рд╣реИред
рдиреЛрдЯ: рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рдЖрдкрдХреА рд▓реЛрдХрд▓ рдорд╢реАрди рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдПрдЬреЗрдВрдЯ рдФрд░ UI рдХреЛ Render, Railway, рдпрд╛ Google Cloud Run рдЬреИрд╕реА рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдореНрд╕ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдбрд┐рдкреНрд▓реЙрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдПрдХреНрд╕реЗрд╕ рдорд┐рд▓ рд╕рдХреЗред
рд╕реНрдЯреЗрдк 1: рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ
рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
pip install google-adk litellm fastapi uvicorn httpx pydantic openai streamlit
рдлрд┐рд░, рдЕрдкрдирд╛ OpenAI API key рд╕реЗрдЯ рдХрд░реЗрдВтАФрдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбрд▓ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред OpenAI рдХрд╛ API key рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ GPT-4o API рдкрд░ рдпрд╣ рд╢реБрд░реБрдЖрддреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реБрдЭрд╛рддрд╛/рд╕реБрдЭрд╛рддреА рд╣реВрдВред
export OPENAI_API_KEY="your_key_here"
рд╕реНрдЯреЗрдк 2: рд╕рд╛рдЭрд╛ рд╕реНрдХреАрдорд╛ рдФрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬрд╝
рдмреБрджреНрдзрд┐рдорд╛рди рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрдкрд╕ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдПрдХ рд╕рд╛рдЭрд╛ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреАред рд╣рдорд╛рд░реЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ, рдпрд╣ рдирд┐рдореНрди рдХреЗ рдЬрд░рд┐рдП рд╣реЛрддрд╛ рд╣реИ:
- рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рд╕реНрдХреАрдорд╛ (Pydantic рдХреЗ рдЬрд░рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд)
- рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП REST рдХреНрд▓рд╛рдЗрдВрдЯ рдпреВрдЯрд┐рд▓рд┐рдЯреА
- рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рдореЗрдВ
/runрдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП REST рд╕рд░реНрд╡рд░ рд░реИрдкрд░
рдХреЛрдб рдХреЛ рдореЙрдбреНрдпреВрд▓рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ shared/ рдФрд░ common/ рдлреЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ-рдПрдХ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред
рдПрдХ shared/schemas.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рд╣рдо Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ TravelRequest рд╕реНрдХреАрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рдЗрдирдХрдорд┐рдВрдЧ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреА рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рд╕рд╣рдордд рд╣реЛрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧрдВрддрд╡реНрдп, рдпрд╛рддреНрд░рд╛ рдХреА рддрд┐рдерд┐рдпрд╛рдБ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдЬрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
from pydantic import BaseModel
class TravelRequest(BaseModel):
destination: str
start_date: str
end_date: str
budget: float
рдпрд╣ рдХреНрд▓рд╛рд╕ рдЗрди рдмрд╛рддреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
- рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХреЛ рд╕реБрд╕рдВрдЧрдд рд░рдЦрдирд╛ред
- FastAPI рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реИрд▓рд┐рдбреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ред
- рдХреЛрдб рд░реА-рдпреВрдЬрд╝ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ред
рдПрдХ common/a2a_client.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдпрд╣ рд╣рд▓реНрдХреА-рдлреБрд▓реНрдХреА async рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд┐рд╕реА рднреА рдПрдЬреЗрдВрдЯ (рд╡рд┐рд╢реЗрд╖рдХрд░ рд╣реЛрд╕реНрдЯ) рдХреЛ /run рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЙрд▓ рдХрд░рдХреЗ A2A рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреВрд╕рд░реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЗрдирд╡реЛрдХ рдХрд░рдиреЗ рджреЗрддреА рд╣реИред
import httpx
async def call_agent(url, payload):
async with httpx.AsyncClient() as client:
response = await client.post(url, json=payload, timeout=60.0)
response.raise_for_status()
return response.json()
рдпрд╣ рдпреВрдЯрд┐рд▓рд┐рдЯреА httpx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рджреВрд╕рд░реЗ рдПрдЬреЗрдВрдЯ рдХреЗ /run рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ POST рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рднреЗрдЬрддреА рд╣реИред рдпрд╣ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рд╣реБрдЖ JSON рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рд▓реМрдЯрд╛рддреА рд╣реИ рдФрд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдЙрдард╛рддреА рд╣реИред
рд╣рдо рдЗрд╕ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдПрдЬреЗрдВрдЯ рдореЗрдВ flight_agent, stay_agent рдФрд░ activities_agent рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рдПрдХ common/a2a_server.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдкреНрд░рддреНрдпреЗрдХ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо FastAPI рд░реВрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ create_app(agent) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЬрд░рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рдореНрди рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ:
/runрдкрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡ рдХрд░рдирд╛- рдпрд╛рддреНрд░рд╛ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рд▓реМрдЯрд╛рдирд╛
from fastapi import FastAPI
import uvicorn
def create_app(agent):
app = FastAPI()
@app.post("/run")
async def run(payload: dict):
return await agent.execute(payload)
return app
рдпрд╣ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдПрдХ рдорд╛рдирдХ /run рд░реВрдЯ рдХреЗ рд╕рд╛рде FastAPI рдРрдк рдмрдирд╛рддреА рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рдПрдЬреЗрдВрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдбреЗрд▓реАрдЧреЗрдЯ рдХрд░рддреА рд╣реИред рдпрд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рдПрдЬреЗрдВрдЯ-рдЯреВ-рдПрдЬреЗрдВрдЯ (A2A) рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИред
рд╕рд╛рде рдорд┐рд▓рдХрд░, рдпреЗ рд╕рд╛рдЭрд╛ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рд╣рдорд╛рд░реЗ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрдзрд┐рдХ рдореЗрдВрдЯреЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп, рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдФрд░ Google рдХреА A2A рдлрд┐рд▓реЙрд╕рдлрд╝реАтАФрд╕рд░рд▓, рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдЗрдВрдЯрд░-рдПрдЬреЗрдВрдЯ рдореИрд╕реЗрдЬрд┐рдВрдЧтАФрдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛рддреЗ рд╣реИрдВред
рд╕реНрдЯреЗрдк 3: ADK рдФрд░ A2A рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдирд╛
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдЭрд╛ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдФрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬрд╝ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЖрдЗрдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрдЬреЗрдВрдЯреНрд╕ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбреНрдпреВрд▓рд░ рдФрд░ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Google рдХреЗ A2A рдкреНрд░реЛрдЯреЛрдХреЙрд▓тАФрдПрдХ рд╕рд░рд▓ HTTP-рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕тАФрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рд╕реБрд╕рдВрдЧрдд рдФрд░ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
A2A (Agent-to-Agent) рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдкреНрд▓рдЧ-рдПрдВрдб-рдкреНрд▓реЗ рдХреЛрдСрд░реНрдбрд┐рдиреЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡реЗ рд▓реЛрдХрд▓ Python рдлрдВрдХреНрд╢рдВрд╕ рд╣реЛрдВ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдкрд░ рд╣реЛрд╕реНрдЯреЗрдбред рдкреНрд░рддреНрдпреЗрдХ рдПрдЬреЗрдВрдЯ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде /run рдПрдВрдбрдкреЙрдЗрдВрдЯ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реЗрд╡рд╛ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдореЗрдВ рдЪрд╛рд░ рдПрдЬреЗрдВрдЯреНрд╕ рд╣реИрдВ:
host_agent: рдЕрдиреНрдп рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИflight_agent: рдЙрдкрдпреБрдХреНрдд рдлреНрд▓рд╛рдЗрдЯ рдвреВрдВрдврддрд╛ рд╣реИstay_agent: рдард╣рд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рддрд╛ рд╣реИactivities_agent: рд╕реНрдерд╛рдиреАрдп рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ
рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИрдВ, 3 рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдПрдХ рд╕рдмрдлреЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде:
agents/
тФЬтФАтФА host_agent/
тФВ тФВ тФЬтФАтФА agent.py # Optional if host logic is minimal
тФВ тФВ тФЬтФАтФА task_manager.py # Calls other agents and aggregates responses
тФВ тФВ тФЬтФАтФА __main__.py # Starts FastAPI app via common/a2a_server.py
тФВ тФВ тФФтФАтФА .well-known/
тФВ тФВ тФФтФАтФА agent.json # A2A Agent Card metadata
тФЬтФАтФА flight_agent/
тФЬтФАтФА stay_agent/
тФФтФАтФА activities_agent/
рд╣рд░ рдПрдЬреЗрдВрдЯ google.adk.agents.Agent, рдПрдХ LiteLlm рдореЙрдбрд▓ рд░реИрдкрд░, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП Runner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред activities_agent рдлреЛрд▓реНрдбрд░ рдХреЗ рднреАрддрд░ рдирд┐рдореНрди рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдпрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ flight_agent рдФрд░ stay_agent рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдПрдБред
рдПрдХ agent.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдЕрдм рд╣рдо рдЕрдкрдиреЗ activities_agent рдХреА рд▓реЙрдЬрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдпрд╛рддреНрд░рд╛ рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реЛрдЪрдХ рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрднрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред┬а
рд╕реНрдЯреЗрдк 1: рдЗрдореНрдкреЛрд░реНрдЯреНрд╕
рд╣рдо рдЕрдкрдиреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.genai import types
import json
рдпрд╣ рдПрдЬреЗрдВрдЯ Google ADK рдХреЗ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдЬреИрд╕реЗ Agent, ' Runner, ' рдФрд░ LiteLlm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ InMemorySessionService рдХреЗ рдЬрд░рд┐рдП рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред Types рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддреА рд╣реИред
рд╕реНрдЯреЗрдк 2: рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдЬрд╝ рдПрдЬреЗрдВрдЯ┬а
рдЕрдм, рд╣рдо ADK рдХреА Agent рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рд╣реА рдЗрдВрд╕реНрдЯреИрдВрд╢рд┐рдПрдЯ рдХрд░рддреЗ рд╣реИрдВред
activities_agent = Agent(
name="activities_agent",
model=LiteLlm("openai/gpt-4o"),
description="Suggests interesting activities for the user at a destination.",
instruction=(
"Given a destination, dates, and budget, suggest 2-3 engaging tourist or cultural activities. "
"For each activity, provide a name, a short description, price estimate, and duration in hours. "
"Respond in plain English. Keep it concise and well-formatted."
)
)
instruction рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ LLM рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдЖрд╕рд╛рди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП instruction рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╣реЗрддреБ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдЯреЗрдк 3: рд╕реЗрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рдВрд╕ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде Runner рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред
session_service = InMemorySessionService()
runner = Runner(
agent=activities_agent,
app_name="activities_app",
session_service=session_service
)
USER_ID = "user_activities"
SESSION_ID = "session_activities"
Runner рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдРрдк рд╕реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддрд╛ рд╣реИред рд╡рд╣реАрдВ InMemorySessionService рдХреНрд▓рд╛рд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рд╣рдо рдпреВрдЬрд╝рд░ рдФрд░ рд╕реЗрд╢рди IDs рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрдбрдХреНрд╢рди рдореЗрдВ рдпреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рдпрд╛ рдпреВрдЬрд╝рд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ LLM рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЛрдИ рдкреНрд░реЙрдореНрдкреНрдЯ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ ADK рд╕реЗрд╢рди рдореМрдЬреВрдж рд╣реЛред
рд╕реНрдЯреЗрдк 4: рдПрдЬреЗрдВрдЯ рд▓реЙрдЬрд┐рдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛
execute() рдлрд╝рдВрдХреНрд╢рди рдЗрдирдХрдорд┐рдВрдЧ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЙрдореНрдкреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдореЙрдбрд▓ рдХреЛ рдЗрдирд╡реЛрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред
async def execute(request):
session_service.create_session(
app_name="activities_app",
user_id=USER_ID,
session_id=SESSION_ID
)
prompt = (
f"User is flying to {request['destination']} from {request['start_date']} to {request['end_date']}, "
f"with a budget of {request['budget']}. Suggest 2-3 activities, each with name, description, price estimate, and duration. "
f"Respond in JSON format using the key 'activities' with a list of activity objects."
)
message = types.Content(role="user", parts=[types.Part(text=prompt)])
async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=message):
if event.is_final_response():
response_text = event.content.parts[0].text
try:
parsed = json.loads(response_text)
if "activities" in parsed and isinstance(parsed["activities"], list):
return {"activities": parsed["activities"]}
else:
print("'activities' key missing or not a list in response JSON")
return {"activities": response_text} # fallback to raw text
except json.JSONDecodeError as e:
print("JSON parsing failed:", e)
print("Response content:", response_text)
return {"activities": response_text} # fallback to raw text
execute() рдлрд╝рдВрдХреНрд╢рди рдЗрдирдХрдорд┐рдВрдЧ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕тАФрдЬреИрд╕реЗ рдЧрдВрддрд╡реНрдп, рддрд╛рд░реАрдЦреЗрдВ рдФрд░ рдмрдЬрдЯтАФрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░реЙрдореНрдкреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЕрдВрджрд░рдЦрд╛рдиреЗ рдпрд╣ рд╣реЛрддрд╛ рд╣реИ:
- рдкреНрд░реЙрдореНрдкреНрдЯ рдореЙрдбрд▓ рдХреЛ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕рдореЗрдЯреЗ рд╣реБрдП рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИред
- рдПрдХ
ContentрдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ ADK Runner рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдХреЗ рдЕрдВрддрд┐рдо рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред - рдЬрдм рдЕрдВрддрд┐рдо рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ, рдПрдЬреЗрдВрдЯ рдХрдЪреНрдЪреЗ рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
- рдпрджрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдлрд▓ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд activities рдХреБрдВрдЬреА рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдпрджрд┐ рдХреБрдВрдЬреА рдЧреБрдо рд╣реИ рдпрд╛ рд╡рд┐рдХреГрдд рд╣реИ, рддреЛ рдлреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЙ рдЯреЗрдХреНрд╕реНрдЯ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ UI рдХреЗ рдкрд╛рд╕ рдлрд┐рд░ рднреА рдЙрдкрдпреЛрдЧреА рдЖрдЙрдЯрдкреБрдЯ рд╣реЛред
- рдпрд╣ рдбреБрдЕрд▓-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рднреА рд╕рд╣рдЬ рдЕрдиреБрднрд╡ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм LLM рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рдХреА рдмрдЬрд╛рдп рд╕рд╛рджрд╛ рдЯреЗрдХреНрд╕реНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ рд░рдгрдиреАрддрд┐ рдордЬрд╝рдмреВрддреА рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдореЙрдбрд▓ рдЖрдЙрдЯрдкреБрдЯ рддрд╛рдкрдорд╛рди рдпрд╛ рдкреНрд░реЙрдореНрдкреНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдереЛрдбрд╝рд╛-рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ task_manager.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
agent.py рдХреЗ рдЕрдВрджрд░ execute() рд▓реЙрдЬрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рд╣рдо рдЗрд╕реЗ task_manager.py рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ADK-рдХрдореНрдкреИрдЯрд┐рдмрд▓ рд╕рд░реНрд╡рд░ рд╕реЗрдЯрдЕрдк рдореЗрдВ рд╡рд╛рдпрд░ рдХрд░рддреЗ рд╣реИрдВред
from .agent import execute
async def run(payload):
return await execute(payload)
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд execute() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдкрддрд▓рд╛ рд░реИрдкрд░ рдХрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ run() рдореЗрдердб рдХреЛ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓реНрд╕тАФрдЦрд╛рд╕рдХрд░ __main__.py рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯтАФрдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреА рд╣реИред
рдПрдХ __main__.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
__main__.py рдлрд╝рд╛рдЗрд▓ рдкреЛрд░реНрдЯ 8003 рдкрд░ рдПрдХ FastAPI рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд░рддреА рд╣реИ, рдЬреЛ рдПрдЬреЗрдВрдЯ рдХреЛ /run рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рд╕рд░реНрд╡ рдХрд░рддреА рд╣реИред
from common.a2a_server import create_app
from .task_manager import run
app = create_app(agent=type("Agent", (), {"execute": run}))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, port=8003)
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
create_app()(common/a2a_server.py рд╕реЗ) рд╣рдорд╛рд░реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рдорд╛рдирдХ A2A-рдХрдореНрдкреИрдЯрд┐рдмрд▓ FastAPI рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд░реИрдк рдХрд░рддрд╛ рд╣реИред- рд╣рдо рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ
execute()рдореЗрдердб рд╣реЛ рддрд╛рдХрд┐ ADK,run()рдХреЛ рдареАрдХ рд╕реЗ рдЗрдирд╡реЛрдХ рдХрд░ рд╕рдХреЗред - рдпрд╣ рдкреГрдердХреНрдХрд░рдг рд╣рдореЗрдВ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ API рдЗрдВрдЯрд░рдлреЗрд╕реЗрдЬрд╝ рдмрдирд╛рдП рд░рдЦрдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрд░ рдПрдЬреЗрдВрдЯ рд▓реЙрдЬрд┐рдХ рдХреЛ рд░реА-рдпреВрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ .well-known/agent.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рд╣рдо рдЗрд╕ JSON рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ A2A (Agent-to-Agent) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдЬреЗрдВрдЯ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдЙрджреНрджреЗрд╢реНрдп рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
{
"name": "activity_agent",
"description": "Agent providing activity details."
}
рдиреЛрдЯ: рднрд▓реЗ рд╣реА рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдЬреЗрдВрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ .well-known/agent.json рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛, рдпрд╣ A2A рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИ рдФрд░ LangGraph, CrewAI рдпрд╛ Google рдХреЗ рдПрдЬреЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдЬреИрд╕реЗ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХрд╡рд░реА, рдЗрдВрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрд╢рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЗрд╕реА рддрд░рд╣ рдХреА рд▓реЙрдЬрд┐рдХ flight_agent рдФрд░ stay_agent рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рд╣реЛрддреА рд╣реИред
рд╕реНрдЯреЗрдк 4: host_agent рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдп
host_agent рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдкреНрд▓рд╛рдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред host_agent рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдореНрд╕ рдореЗрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдгрдп-рдирд┐рд░реНрдорд╛рдг рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдПрдЬреЗрдВрдЯ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХреЗ, рдЬрдмрдХрд┐ рд╕рдордиреНрд╡рдп рд▓реЙрдЬрд┐рдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдореНрд╕ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рддреАрдиреЛрдВ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдЙрдирдХреЗ рдПрдХреНрд╕рдкреЛрдЬрд╝реНрдб /run APIs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рди payload рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП host_agent рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрди рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдПрдХ agent.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдмреЗрд╕рд┐рдХ рдЗрдореНрдкреЛрд░реНрдЯреНрд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.genai import types
рдпрд╣ рдЗрдореНрдкреЛрд░реНрдЯ рдмреНрд▓реЙрдХ Google ADK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ LLM-рдЖрдзрд╛рд░рд┐рдд рдПрдЬреЗрдВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреЛрд░ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рд▓рд╛рддрд╛ рд╣реИ: Agent рдХреНрд▓рд╛рд╕, рд▓рд╛рдЗрдЯрд╡реЗрдЯ LLM рд░реИрдкрд░, рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП Runner, рдФрд░ рдЗрди-рдореЗрдореЛрд░реА рд╕реЗрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯред
host_agent = Agent(
name="host_agent",
model=LiteLlm("openai/gpt-4o"),
description="Coordinates travel planning by calling flight, stay, and activity agents.",
instruction="You are the host agent responsible for orchestrating trip planning tasks. "
"You call external agents to gather flights, stays, and activities, then return a final result."
)
session_service = InMemorySessionService()
runner = Runner(
agent=host_agent,
app_name="host_app",
session_service=session_service
)
USER_ID = "user_host"
SESSION_ID = "session_host"
рдКрдкрд░ рдХрд╛ рдХреЛрдб рдкреВрд░реНрдг рдЯреНрд░рд┐рдк рдкреНрд▓рд╛рди рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЯреЙрдк-рд▓реЗрд╡рд▓ ADK рдПрдЬреЗрдВрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдЗрд╕ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рд╣рдо LLM рд╕реЗ рд╕рдм-рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдЗрдирд╡реЛрдХ рдирд╣реАрдВ рдХрд░рддреЗ, рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рдРрд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛ рддрдп рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ LLM рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЯреВрд▓-рдпреВрдЬрд╝ рдФрд░ рдореЗрдЯрд╛-рд░реАрдЬрд╝рдирд┐рдВрдЧ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
async def execute(request):
# Ensure session exists
session_service.create_session(
app_name="host_app",
user_id=USER_ID,
session_id=SESSION_ID
)
prompt = (
f"Plan a trip to {request['destination']} from {request['start_date']} to {request['end_date']} "
f"within a total budget of {request['budget']}. Call the flights, stays, and activities agents for results."
)
message = types.Content(role="user", parts=[types.Part(text=prompt)])
async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=message):
if event.is_final_response():
return {"summary": event.content.parts[0].text}
рдпрд╣ execute() рдлрд╝рдВрдХреНрд╢рди рд╣реЛрд╕реНрдЯ рдПрдЬреЗрдВрдЯ рдХреЗ LLM рдХреЗ рдореБрдЦреНрдп рдПрдВрдЯреНрд░реА рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣:
- рдПрдХ рд╕реЗрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ (рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдореЗрдореЛрд░реА рд╕рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП)
- рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реВрдк рд╕реЗ рдпреВрдЬрд╝рд░ рдкреНрд░реЙрдореНрдкреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ
- ADK рдХреЗ runner.run_async()
рдореЗрдердбрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдореЙрдбрд▓ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ - рдЕрдВрддрддрдГ, рдЕрдВрддрд┐рдо рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ
рдПрдХ task_manager.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдЯрд╛рд╕реНрдХ рдореИрдиреЗрдЬрд░ рд░рд┐рдореЛрдЯ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдФрд░ рдкреВрд░реНрдг рдЯреНрд░рд┐рдк-рдкреНрд▓рд╛рдирд┐рдВрдЧ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдХреЗ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рд▓реЙрдЬрд┐рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рдЗрд▓реНрдб рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд┐рд╕ URLs рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ A2A /run рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдЭрд╛ TravelRequest` JSON рд╕реНрдХреАрдорд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
from common.a2a_client import call_agent
FLIGHT_URL = "http://localhost:8001/run"
STAY_URL = "http://localhost:8002/run"
ACTIVITIES_URL = "http://localhost:8003/run"
рдЕрдм, рд╣рдо payload рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
async def run(payload):
#Print what the host agent is sending
print("Incoming payload:", payload)
flights = await call_agent(FLIGHT_URL, payload)
stay = await call_agent(STAY_URL, payload)
activities = await call_agent(ACTIVITIES_URL, payload)
# Log outputs
print("flights:", flights)
print("stay:", stay)
print("activities:", activities)
# Ensure all are dicts before access
flights = flights if isinstance(flights, dict) else {}
stay = stay if isinstance(stay, dict) else {}
activities = activities if isinstance(activities, dict) else {}
return {
"flights": flights.get("flights", "No flights returned."),
"stay": stay.get("stays", "No stay options returned."),
"activities": activities.get("activities", "No activities found.")
}
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди call_agent() рд╣реЗрд▓реНрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ payload рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╕реЗрд╡рд╛ рддрдХ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдЪреНрдЪрд╛ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рд▓реЙрдЬрд┐рдХ рд░рд╣рддрд╛ рд╣реИред
рдПрдХ __main__.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
__main__.py рдлрд╝рд╛рдЗрд▓ рдЙрд╕ FastAPI рд╕рд░реНрд╡рд░ рдХреЗ рдПрдВрдЯреНрд░реА рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ рдЬреЛ рд╣реЛрд╕реНрдЯ рдПрдЬреЗрдВрдЯ рдХреЛ рд░реИрдк рдХрд░рддрд╛ рд╣реИред┬а
from common.a2a_server import create_app
from .task_manager import run
app = create_app(agent=type("Agent", (), {"execute": run}))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, port=8000)
рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдпрд╣ рдХрд░рддреА рд╣реИ:
- рдпрд╣
common/a2a_server.pyрдХреАcreate_app()рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдорд╛рдирдХреАрдХреГрдд/runрдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде FastAPI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬрдирд░реЗрдЯ рдХрд░рддреА рд╣реИред - рдлрд┐рд░, рдпрд╣
execute()рдореЗрдердб рд╡рд╛рд▓реЗ рдПрдХ рд╕рд░рд▓ рдПрдЬреЗрдВрдЯ-рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреА рд╣реИ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗtask_manager.run()рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреЗрд▓реАрдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИред - рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ (рдЖрдорддреМрд░ рдкрд░ 8000) рдкрд░
uvicornрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ FastAPI рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреА рд╣реИред
рдпрд╣ рд╣реЛрд╕реНрдЯ рдПрдЬреЗрдВрдЯ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрдиреНрдп рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рднрд░ рдореЗрдВ рд╕реБрд╕рдВрдЧрддрддрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред
рдПрдХ .well-known/agent.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдкреИрдЯрд░реНрди рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдиреЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдбреЗрд▓реАрдЧреЗрдЯ рдФрд░ рдХрдВрдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИред┬а
{
"name": "host_agent",
"description": "Coordinates travel planning among specialized agents."
}
рдпрджреНрдпрдкрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЬреИрд╕рд╛ рдкрд╣рд▓реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛, рдЗрд╕реЗ рд╕рднреА рдПрдЬреЗрдВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрднреНрдпрд╛рд╕ рд╣реИред
рд╕реНрдЯреЗрдк 5: Streamlit рдХреЗ рд╕рд╛рде UI рдмрдирд╛рдирд╛
рдЕрдВрддрддрдГ, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдРрдк рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ рджрд░реНрдЬ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдпрд╛рддреНрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ travel_ui.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рдирд┐рдореНрди рдХреЛрдб рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
import streamlit as st
import requests
рд╣рдо UI рд╕рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП Streamlit рдФрд░ requests рдЬреИрд╕реА рдмреЗрд╕рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
st.set_page_config(page_title="ADK-Powered Travel Planner", page_icon="тЬИя╕П")
st.title("ЁЯМН ADK-Powered Travel Planner")
origin = st.text_input("Where are you flying from?", placeholder="e.g., New York")
destination = st.text_input("Destination", placeholder="e.g., Paris")
start_date = st.date_input("Start Date")
end_date = st.date_input("End Date")
budget = st.number_input("Budget (in USD)", min_value=100, step=50)
if st.button("Plan My Trip тЬи"):
if not all([origin, destination, start_date, end_date, budget]):
st.warning("Please fill in all the details.")
else:
payload = {
"origin": origin,
"destination": destination,
"start_date": str(start_date),
"end_date": str(end_date),
"budget": budget
}
response = requests.post("http://localhost:8000/run", json=payload)
if response.ok:
data = response.json()
st.subheader("тЬИя╕П Flights")
st.markdown(data["flights"])
st.subheader("ЁЯПи Stays")
st.markdown(data["stay"])
st.subheader("ЁЯЧ║я╕П Activities")
st.markdown(data["activities"])
else:
st.error("Failed to fetch travel plan. Please try again.")
Streamlit рдРрдк, ADK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдиреЗ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдЯреНрд░реИрд╡рд▓ рдкреНрд▓рд╛рдирд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдиреБрдХреВрд▓ UI рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╣рдо рдХреБрдЫ рдмрд╛рддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВред
- рдпрд╣ origin, destination, рддрд╛рд░реАрдЦреЗрдВ рдФрд░ рдмрдЬрдЯ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
text_input,date_inputрдФрд░number_inputрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - тАЬPlan My TripтАЭ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдЦрд╛рд▓реА рди рд░рд╣реЗред
- рдпрджрд┐ рд╡реИрдз рд╣реИ, рддреЛ рдпрд╣ рдПрдХ JSON payload рдмрдирд╛рддрд╛ рд╣реИ рдФрд░
http://localhost:8000/run.рдкрд░host_agentрдХреЛ POST рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рднреЗрдЬрддрд╛ рд╣реИред host_agentрд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдПрдЬреЗрдВрдЯреНрд╕ (рдлреНрд▓рд╛рдЗрдЯ, рд╕реНрдЯреЗ, рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА) рдХреЛ рдЗрдирд╡реЛрдХ рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреЗ рд░рд┐рд╕реНрдкреЙрдиреНрд╕реЗрдЬ рдХреЛ рдПрдЧреНрд░реАрдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдПрдХреАрдХреГрдд рдЯреНрд░реИрд╡рд▓ рдкреНрд▓рд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред- рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ рдлреНрд▓рд╛рдЗрдЯреНрд╕, рд╕реНрдЯреЗрдЬрд╝ рдФрд░ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдЬрд╝ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЗрдбрд░реНрд╕ рдХреЗ рдЕрдВрддрд░реНрдЧрдд
st.markdown()рдХреЗ рдЬрд░рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдпрджрд┐ рдмреИрдХрдПрдВрдб рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ
st.error()рдХреЗ рдЬрд░рд┐рдП рдПрдХ рдлреЙрд▓рдмреИрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм, рдЕрдкрдиреА рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд▓реЛрдХрд▓реА рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
uvicorn agents.host_agent.__main__:app --port 8000 &
uvicorn agents.flight_agent.__main__:app --port 8001 &
uvicorn agents.stay_agent.__main__:app --port 8002 &
uvicorn agents.activities_agent.__main__:app --port 8003 &
streamlit run travel_ui.py
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ тАЬPlan My TripтАЭ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛/рдХрд░рддреА рд╣реИ, рддреЛ рд╣реЛрд╕реНрдЯ рдПрдЬреЗрдВрдЯ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрднрд╛рд▓ рд▓реЗрддрд╛ рд╣реИ, рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ UI рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

рдЖрдкрдХреА рд╕рдордЧреНрд░ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧреА:
ADK_demo/
тФЬтФАтФА agents/
тФВ тФЬтФАтФА host_agent/
тФВ тФВ тФЬтФАтФА agent.py
тФВ тФВ тФЬтФАтФА task_manager.py
тФВ тФВ тФЬтФАтФА __main__.py
тФВ тФВ тФФтФАтФА .well-known/
тФВ тФВ тФФтФАтФА agent.json
тФВ тФВ
тФВ тФЬтФАтФА flight_agent/
тФВ тФВ тФЬтФАтФА agent.py
тФВ тФВ тФЬтФАтФА task_manager.py
тФВ тФВ тФЬтФАтФА __main__.py
тФВ тФВ тФФтФАтФА .well-known/
тФВ тФВ тФФтФАтФА agent.json
тФВ тФВ
тФВ тФЬтФАтФА stay_agent/
тФВ тФВ тФЬтФАтФА agent.py
тФВ тФВ тФЬтФАтФА task_manager.py
тФВ тФВ тФЬтФАтФА __main__.py
тФВ тФВ тФФтФАтФА .well-known/
тФВ тФВ тФФтФАтФА agent.json
тФВ тФВ
тФВ тФФтФАтФА activities_agent/
тФВ тФЬтФАтФА agent.py
тФВ тФЬтФАтФА task_manager.py
тФВ тФЬтФАтФА __main__.py
тФВ тФФтФАтФА .well-known/
тФВ тФФтФАтФА agent.json
тФВ
тФЬтФАтФА common/
тФВ тФЬтФАтФА a2a_client.py # Utility to send requests to other agents
тФВ тФФтФАтФА a2a_server.py # Shared FastAPI A2A-compatible server template
тФВ
тФЬтФАтФА shared/
тФВ тФФтФАтФА schemas.py # Shared Pydantic schema
тФВ
тФЬтФАтФА streamlit_app.py # Frontend UI for user input and response rendering
тФЬтФАтФА requirements.txt
тФФтФАтФА README.md




рдФрд░ рдмрд╕! рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рд╣рдордиреЗ рдмрдирд╛рдпрд╛ рд╣реИ, рдЙрд╕реЗ рдЗрд╕ GitHub рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕рд┐рд░реНрдл рдХреБрдЫ FastAPI рдРрдкреНрд╕ рдФрд░ ADK рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдЯреНрд░реИрд╡рд▓ рдкреНрд▓рд╛рдирд░ рдмрдирд╛рдпрд╛ рдЬреЛ:
- A2A рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЬрд░рд┐рдП рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ
- рдлреНрд▓рд╛рдЗрдЯ, рд╕реНрдЯреЗ рдФрд░ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдЬрд╝ рдХреЗ рд▓рд┐рдП LLM рдПрдЬреЗрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
- рдирддреАрдЬреЛрдВ рдХреЛ рд╕рд╛рдл-рд╕реБрдерд░реЗ Streamlit UI рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ
рднрд▓реЗ рд╣реА рд╕рднреА рдПрдЬреЗрдВрдЯреНрд╕ рднреАрддрд░рдЦрд╛рдиреЗ рдПрдХ рд╣реА рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реЛрдВ, рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╣реИтАФрдпрд╛рдиреА рдПрдЬреЗрдВрдЯреНрд╕ рдХреА рднреВрдорд┐рдХрд╛рдПрдБ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдБ рдкреГрдердХ рд╣реИрдВ рдФрд░ рд╕рдВрдЪрд╛рд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрд╕рд╛рдзрди рдпрд╣рд╛рдБ рд╣реИрдВ:
рдореИрдВ рдПрдордПрд▓ (Gen AI) рдореЗрдВ Google Developers Expert, Kaggle 3x Expert, рдФрд░ Women Techmakers рдПрдВрдмреЗрд╕рдбрд░ рд╣реВрдБ, рддрдерд╛ рддрдХрдиреАрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ 3+ рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд░рдЦрддреА рд╣реВрдБред рдореИрдВрдиреЗ 2020 рдореЗрдВ рдПрдХ рд╣реЗрд▓реНрде-рдЯреЗрдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреА рд╕рд╣-рд╕реНрдерд╛рдкрдирд╛ рдХреА рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Georgia Tech рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдХрд░ рд░рд╣реА рд╣реВрдБ, рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрд╖реЗрддреНрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╣реИред

рдЗрд╕ рдмреНрд▓реЙрдЧ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ Google рдХреЗ рдирдП рдУрдкрди-рд╕реЛрд░реНрд╕ Agent Development Kit (ADK) рдФрд░ A2A (Agent-to-Agent) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ, AI-рд╕рдВрдЪрд╛рд▓рд┐рдд рдЯреНрд░реИрд╡рд▓ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╕рд┐рдЦрд╛рдКрдВрдЧрд╛ред
рд╣рдо рдлреНрд▓рд╛рдЗрдЯ, рд╣реЛрдЯрд▓ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ REST APIs рдФрд░ FastAPI рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдЬрд░рд┐рдП рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗред рдЕрдВрдд рдореЗрдВ, рд╕рд╣рдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░реЗ Streamlit рдлреНрд░рдВрдЯрдПрдВрдб рдореЗрдВ рд╕рдореЗрдЯреЗрдВрдЧреЗред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╣рдорд╛рд░реА Building AI Agents With Google ADK рдХреЛрд░реНрд╕ рд▓реЗрдХрд░ ADK рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдорд░-рд╕рдкреЛрд░реНрдЯ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдХрд░ рдЕрдкрдирд╛ рд╕реАрдЦрдирд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛/рджреЗрддреА рд╣реВрдВред
рд╣рдо рдЕрдкрдиреЗ рдкрд╛рдардХреЛрдВ рдХреЛ AI рдХреА рддрд╛рдЬрд╝рд╛ рдЦрдмрд░реЛрдВ рд╕реЗ рдЕрдкрдбреЗрдЯ рд░рдЦрддреЗ рд╣реИрдВ The Median рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗтАФрд╣рдорд╛рд░рд╛ рдореБрдлрд╝реНрдд рд╢реБрдХреНрд░рд╡рд╛рд░ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдЬреЛ рд╣рдлреНрддреЗ рдХреА рдореБрдЦреНрдп рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдФрд░ рд╣рд░ рд╣рдлреНрддреЗ рдЪрдВрдж рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд░рд╣реЗрдВ:
Google рдХреА Agent Development Kit (ADK) рдХреНрдпрд╛ рд╣реИ?
Google рдХреА ADK, LLM-рд╕рдВрдЪрд╛рд▓рд┐рдд рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓рд░, рдкреНрд░реЛрдбрдХреНрд╢рди-рд░реЗрдбреА рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдпрд╣реА рдЯреВрд▓рдХрд┐рдЯ Google рдХреЗ рдЙрддреНрдкрд╛рджреЛрдВтАФрдЬреИрд╕реЗ Agentspace рдФрд░ Customer Engagement SuiteтАФрдХреЗ рднреАрддрд░ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рд╢рдХреНрддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдм рдУрдкрди-рд╕реЛрд░реНрд╕ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд▓рдЪреАрд▓реЗ рдФрд░ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд▓ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
Agent Development Kit (ADK) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?
ADK, Python рдХреА рд▓рдЪреАрд▓рд╛рдкрди рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ, рдХреЙрд▓рдмреИрдХреНрд╕, рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ, рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджреЗрдЦреЗрдВ:
LiteLlmрдХреЗ рдЬрд░рд┐рдП Gemini, GPT-4o, Claude, Mistral рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИредGoogle рдХрд╛ Agent2Agent (A2A) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрдпрд╛ рд╣реИ?
Agent2Agent (A2A) рдкреНрд░реЛрдЯреЛрдХреЙрд▓, Google рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдУрдкрди, рд╡реЗрдВрдбрд░-рдиреНрдпреВрдЯреНрд░рд▓ рдорд╛рдирдХ рд╣реИ рдЬреЛ рд╡рд┐рд╡рд┐рдз рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдореНрд╕ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ рдкрд░ AI рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рди рд╕рдВрдЪрд╛рд░ рдФрд░ рд╕рд╣рдпреЛрдЧ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
ADK рдПрдЬреЗрдВрдЯреНрд╕ рдПрдХ рдорд╛рдирдХ
/runHTTP рдПрдВрдбрдкреЙрдЗрдВрдЯ рдФрд░.well-known/agent.jsonрдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдПрдЬреЗрдВрдЯ рдбрд┐рд╕реНрдХрд╡рд░реА рдФрд░ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рди рд╕рдВрдЪрд╛рд░ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдмрд╛рд╣рд░реА рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░реНрд╕ рдЬреИрд╕реЗ LangGraph рдпрд╛ CrewAI рдХреЗ рд╕рд╛рде рднреА)редрд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ, A2A рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдкрдХреЗ рдПрдЬреЗрдВрдЯреНрд╕ рдПрдЬреЗрдВрдЯ рдЯреВрд▓реНрд╕ рдФрд░ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдпрд╛ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбреНрд╕-рдСрди ADK рдХреЛрд░реНрд╕ рдореЗрдВ Google ADK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВред┬а