
ADK(Agent Development Kit)는 Google에서 개발한 지능형 에이전트 개발 프레임워크이며, A2A(Agent2Agent Protocol)는 표준화된 에이전트 간 통신 프로토콜입니다. ADK 프레임워크는 A2A 에이전트에 대한 완전한 지원을 내장하고 있으며, RemoteA2aAgent와 같은 핵심 구성 요소를 제공하여 개발자가 다음을 수행할 수 있도록 합니다:
중요 참고사항: ADK는 개발 프레임워크이고, A2A는 통신 프로토콜입니다. ADK는 A2A 프로토콜의 구현을 포함하고 있어 개발자가 Agent2Agent 통신을 지원하는 지능형 에이전트 시스템을 쉽게 구축할 수 있습니다. 이 가이드는 ADK 프레임워크 내에서 A2A 기능을 사용하는 방법을 보여줍니다.
# 프로젝트 루트 디렉토리 생성
mkdir adk-a2a-demo
cd adk-a2a-demo
# 가상 환경 생성
python -m venv .venv
# 가상 환경 활성화
# Linux/macOS:
source .venv/bin/activate
# Windows:
# .venv\Scripts\activate
# ADK 핵심 패키지 설치 (A2A 프로토콜 지원 포함)
pip install google-adk[a2a]>=1.6.1
# 설치 확인
adk --version
# .env 파일 생성
echo "GOOGLE_API_KEY=your_gemini_api_key_here" > .env
# 환경 변수 설정 (임시)
export GOOGLE_API_KEY="your_gemini_api_key_here"
adk-a2a-demo/
├── .env # 환경 변수 구성
├── requirements.txt # Python 의존성
├── __init__.py # 메인 프로젝트 초기화
├── agent.py # A2A 클라이언트 에이전트 (RemoteA2aAgent)
├── remote_a2a/ # A2A 서버 측 에이전트 디렉토리
│ └── facts_agent/ # 특정 에이전트 구현
│ ├── __init__.py # 에이전트 패키지 초기화
│ ├── agent.py # 에이전트 핵심 로직
│ └── agent.json # A2A 에이전트 메타데이터 구성
└── README.md # 프로젝트 문서
# 필요한 디렉토리 및 파일 생성
mkdir -p remote_a2a/facts_agent
touch __init__.py agent.py
touch remote_a2a/facts_agent/__init__.py
touch remote_a2a/facts_agent/agent.py
touch remote_a2a/facts_agent/agent.json
touch requirements.txt
서버 측 에이전트는 실제로 비즈니스 로직을 실행하는 핵심 구성 요소입니다. remote_a2a/facts_agent/agent.py에서 구현:
# remote_a2a/facts_agent/agent.py
from google.adk import Agent
from google.adk.tools import google_search
# 서버 측 에이전트 정의
root_agent = Agent(
# 에이전트 고유 식별자
name="facts_agent",
# 사용할 대형 언어 모델
model="gemini-2.0-flash",
# 에이전트 기능 설명
description="흥미로운 사실을 제공하는 에이전트입니다.",
# 에이전트 행동 지침
instruction=(
"당신은 흥미로운 사실을 제공할 수 있는 도움이 되는 에이전트입니다. "
"Google 검색을 사용하여 정확하고 최신 정보를 찾으세요. "
"항상 사실에 대한 출처를 제공하세요."
),
# 사용 가능한 도구 목록
tools=[google_search],
)
remote_a2a/facts_agent/__init__.py에서:
# remote_a2a/facts_agent/__init__.py
# ADK가 발견할 수 있도록 에이전트 구현 가져오기
from . import agent
# 에이전트의 핵심 구성 요소 설명
# 1. 이름 (name)
# - 고유해야 하며, A2A 네트워크에서 에이전트를 식별하는 데 사용
# - 설명적인 이름 사용 권장
# 2. 모델 (model)
# - 사용할 대형 언어 모델 지정
# - Gemini 시리즈 모델 지원
# 3. 설명 (description)
# - 에이전트 기능에 대한 간단한 설명
# - 에이전트 발견 중에 다른 에이전트에게 표시됨
# 4. 지침 (instruction)
# - 상세한 행동 지침
# - 에이전트 성격 및 응답 스타일 정의
# 5. 도구 (tools)
# - 에이전트가 호출할 수 있는 외부 도구
# - 검색, 계산, API 호출 등
클라이언트 측 에이전트는 RemoteA2aAgent를 사용하여 원격 서비스에 연결합니다. agent.py에서 구현:
# agent.py
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent
# 원격 A2A 클라이언트 에이전트 정의
root_agent = RemoteA2aAgent(
# 클라이언트 에이전트 이름
name="facts_agent",
# 기능 설명
description="흥미로운 사실을 제공하는 에이전트입니다.",
# 원격 에이전트 카드 URL
agent_card="http://localhost:8001/a2a/facts_agent/.well-known/agent.json",
)
# 고급 구성 예제
root_agent = RemoteA2aAgent(
name="facts_agent",
description="흥미로운 사실을 제공하는 에이전트입니다.",
agent_card="http://localhost:8001/a2a/facts_agent/.well-known/agent.json",
# 선택적 구성
timeout=300.0, # HTTP 타임아웃 (초)
httpx_client=None, # 사용자 정의 HTTP 클라이언트
)
remote_a2a/facts_agent/agent.json에서 에이전트 메타데이터 정의:
{
"name": "facts_agent",
"description": "흥미로운 사실을 제공하는 에이전트입니다.",
"url": "http://localhost:8001/a2a/facts_agent",
"version": "1.0.0",
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain"],
"capabilities": {
"streaming": true,
"functions": true
},
"skills": [
{
"id": "give_facts",
"name": "흥미로운 사실",
"description": "Google 검색을 사용하여 다양한 주제에 대한 흥미로운 사실을 제공합니다.",
"tags": ["정보", "사실", "지식", "검색", "구글"],
"examples": [
"뉴욕시에 대한 흥미로운 사실을 알려주세요.",
"양자 물리학에 대한 매혹적인 사실을 말해주세요.",
"해양 생물에 대한 특이한 사실은 무엇인가요?"
]
}
]
}
{
// 기본 정보
"name": "에이전트 고유 식별자",
"description": "에이전트 기능에 대한 간단한 설명",
"url": "A2A 서비스 엔드포인트 URL",
"version": "버전 번호 (시맨틱 버전 관리)",
// 입력/출력 모드
"defaultInputModes": ["지원되는 입력 형식"],
"defaultOutputModes": ["지원되는 출력 형식"],
// 에이전트 기능
"capabilities": {
"streaming": "스트리밍 응답 지원 여부",
"functions": "함수 호출 지원 여부"
},
// 스킬 정의
"skills": [
{
"id": "스킬 고유 식별자",
"name": "스킬 표시 이름",
"description": "상세한 스킬 설명",
"tags": ["태그1", "태그2"],
"examples": ["사용 예제 1", "사용 예제 2"]
}
]
}
requirements.txt에서:
google-adk[a2a]>=1.6.1
__init__.py에서:
# 프로젝트 초기화 파일
from . import agent
# 프로젝트 루트 디렉토리에 있고 가상 환경이 활성화되어 있는지 확인
source .venv/bin/activate
# A2A 서버 시작
adk api_server --a2a --port 8001 remote_a2a
# 예상 출력:
# INFO: Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)
# INFO: A2A endpoints enabled for agents: facts_agent
# 에이전트 발견 엔드포인트 테스트
curl http://localhost:8001/a2a/facts_agent/.well-known/agent.json
# 에이전트 구성 JSON 반환 예상
A2A 서버가 시작된 후 다음 엔드포인트를 생성합니다:
에이전트 발견 엔드포인트: /.well-known/agent.json
메시지 처리 엔드포인트: /a2a/{agent_name}
상태 확인 엔드포인트: /health
새 터미널 창에서:
# 가상 환경 활성화
source .venv/bin/activate
# 웹 UI 서버 시작
adk web .
# 예상 출력:
# INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
# INFO: Available agents: facts_agent
웹 UI 접근: 브라우저에서 http://localhost:8000 열기
에이전트 선택: 드롭다운 메뉴에서 facts_agent 선택
대화 테스트: 테스트 메시지 입력, 예를 들어:
"인공지능에 대한 흥미로운 사실을 알려주세요"
응답 관찰: 에이전트가 올바르게 응답하고 Google 검색 도구를 사용하는지 확인
# 테스트 케이스 1: 기본 사실 질의
입력: 만리장성에 대한 흥미로운 사실은 무엇인가요?
예상: 검색 출처를 포함한 만리장성에 대한 흥미로운 사실 반환
# 테스트 케이스 2: 과학 지식 질의
입력: 블랙홀에 대한 매혹적인 사실을 말해주세요.
예상: 블랙홀에 대한 과학적 사실 반환
# 테스트 케이스 3: 시사 질의
입력: 우주 탐사의 최근 발견은 무엇인가요?
예상: 최신 우주 탐사 발견 반환
sequenceDiagram
participant User as 사용자
participant WebUI as ADK 웹 UI<br/>(localhost:8000)
participant Client as 클라이언트 에이전트<br/>(RemoteA2aAgent)
participant A2AServer as A2A 서버<br/>(localhost:8001)
participant Agent as 서버 에이전트<br/>(facts_agent)
participant LLM as Gemini LLM
participant Search as Google 검색
User->>WebUI: 1. 질의 메시지 입력
WebUI->>Client: 2. 클라이언트 에이전트 호출
Note over Client: 3. 에이전트 초기화 확인
Client->>A2AServer: 4. GET /.well-known/agent.json
A2AServer-->>Client: 5. 에이전트 구성 반환
Note over Client: 6. A2A 메시지 구축
Client->>A2AServer: 7. POST /a2a/facts_agent<br/>A2A 메시지 전송
A2AServer->>Agent: 8. 내부 이벤트로 변환
Agent->>LLM: 9. 프롬프트 전송
LLM-->>Agent: 10. 응답 반환 (도구 호출 포함)
Agent->>Search: 11. Google 검색 실행
Search-->>Agent: 12. 검색 결과 반환
Agent->>LLM: 13. 검색 결과 통합
LLM-->>Agent: 14. 최종 응답 생성
Agent-->>A2AServer: 15. 처리 결과 반환
A2AServer-->>Client: 16. A2A 응답 반환
Note over Client: 17. 내부 이벤트로 변환
Client-->>WebUI: 18. 응답 반환
WebUI-->>User: 19. 최종 결과 표시
GET http://localhost:8001/a2a/facts_agent/.well-known/agent.json
응답:
{
"name": "facts_agent",
"url": "http://localhost:8001/a2a/facts_agent",
"skills": [...]
}
POST http://localhost:8001/a2a/facts_agent
Content-Type: application/json
{
"id": "uuid-123",
"params": {
"message": {
"messageId": "msg-456",
"parts": [{"text": "AI에 대한 사실을 알려주세요"}],
"role": "user"
}
}
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"result": {
"messageId": "response-789",
"parts": [{"text": "다음은 흥미로운 AI 사실입니다..."}],
"role": "agent"
}
}
이 가이드를 통해 ADK 프레임워크를 사용하여 A2A 프로토콜을 구현하여 완전한 에이전트 간 통신 시스템을 구축하는 방법을 배웠습니다. 주요 학습 내용은 다음과 같습니다:
ADK의 A2A 구현은 차세대 지능형 에이전트 시스템 구축을 위한 강력한 기반을 제공하여 에이전트 협업을 간단하고 효율적으로 만듭니다. ADK A2A 개발 여정을 시작하세요!
키워드: A2A ADK, Agent Development Kit, A2A 프로토콜, 에이전트 개발, 지능형 에이전트 통신, Google ADK, 에이전트 프로토콜, 분산 에이전트 시스템, RemoteA2aAgent, Gemini API