Strands를 이용한 간단한 A2A 구현
요약
Strands를 활용하여 에이전트 간 통신(A2A)을 간소화하여 구현하는 방법을 소개합니다. a2a-sdk를 직접 다루는 대신 Strands의 자동화된 기능을 통해 에이전트 카드와 기술(skills)을 효율적으로 구성할 수 있습니다.
핵심 포인트
- Strands를 사용하면 A2A 서버와 클라이언트를 매우 간단하게 구축할 수 있음
- 에이전트 카드를 자동으로 가져오는 간소화된 접근 방식 제공
- 도구(Tools)를 추가하면 Strands가 이를 자동으로 기술(skills)로 변환함
- uv 패키지 매니저를 이용한 빠른 프로젝트 초기화 및 의존성 관리
A2A는 에이전트 간 통신 (agent to agent communication)을 가능하게 하는 표준처럼 자리 잡았습니다. 우리는 a2a-sdk를 사용하여 a2a 서버를 실행하고 에이전트 카드 (agent card), 에이전트 기술 (agent skills), 에이전트 실행기 (agent executor), 요청 처리기 (request handler) 등의 기능을 구성할 수 있습니다. 하지만 여기서는 에이전트 카드를 자동으로 가져오는 Strands를 사용하여 간소화된 접근 방식을 취해 보겠습니다. 시작해 봅시다!
서버 (Server)
a2a 서버를 위한 uv 프로젝트를 초기화하고 해당 디렉토리로 이동합니다.
uv init ~/strands-a2a-server
cd ~/strands-a2a-server
필요한 패키지를 추가합니다.
uv add python-dotenv==1.2.2 strands-agents[a2a]==1.42.0
main.py의 코드를 아래와 같이 변경합니다.
$ cat main.py
from dotenv import load_dotenv
from strands import Agent
...
위에서 보시는 바와 같이, 저는 이곳의 단순함이 마음에 듭니다. Strands 내에서 단 몇 줄의 코드만으로 기본적인 a2a 서버를 시작하는 것이 매우 간단하며, a2a-sdk를 별도로 설치할 필요도 없었습니다.
코드를 실행하여 a2a 서버를 시작합니다.
$ uv run main.py
INFO: Started server process [18006]
...
클라이언트 (Client)
이제 별도의 터미널에서 클라이언트 부분을 진행해 보겠습니다. 프로젝트를 초기화하고 디렉토리를 이동합니다.
uv init ~/strands-a2a-client
cd ~/strands-a2a-client
main.py 코드를 다음과 같이 수정합니다.
import asyncio
from strands.agent.a2a_agent import A2AAgent
...
우리는 우리의 a2a 서버인 원격 엔드포인트 (remote endpoint)를 호출하고 스트림 (stream)을 반복합니다. 또한 원격 에이전트의 에이전트 카드 (agent card)를 가져와 출력합니다.
코드를 실행합니다.
$ uv run main.py
Invoking remote agent with agent card:
additional_interfaces : None
...
도구 (Tools)
위의 출력 결과에서 볼 수 있듯이, 현재로서는 원격 에이전트 카드 (agent card)에 아무런 기술 (skills)이 표시되지 않았습니다. 서버에 도구 (tool)를 추가하면 Strands의 A2A 래퍼 (wrapper)가 이를 자동으로 기술 (skills)로 변환해 줍니다. 따라서 기술 (skills)을 수동으로 정의할 필요가 없으며, 이 과정에서 노력을 절약할 수 있습니다. 직접 시도해 봅시다. 단순화를 위해 Strands 자체의 내장 도구 (built-in tool)를 사용하겠습니다. 해당 패키지를 추가해 보겠습니다. 그 전에, 서버가 실행 중이라면 Ctrl+C를 눌러 먼저 중단할 수 있습니다...
uv add strands-agents-tools==0.8.0
A2A 서버의 main.py에서 몇 가지 변경을 수행해야 합니다. 파일 상단에 도구 (tool)를 임포트 (import)해야 합니다.
from strands_tools import http_request
그리고 에이전트 (agent)에서 이것을 사용하기만 하면 됩니다.
tools=[http_request],
따라서 업데이트된 코드는 다음과 같습니다:
$ cat main.py
from dotenv import load_dotenv
from strands import Agent
...
uv run main.py 명령어로 서버를 다시 실행할 수 있습니다.
다른 터미널에서 클라이언트 (client)도 실행하십시오.
$ uv run main.py
Invoking remote agent with agent card:
...
위에서 보시는 바와 같이, 추가된 도구 (tool)로부터 기술 (skill)을 자동으로 가져왔습니다. 매우 멋진 기능인 것 같습니다. 프롬프트 (prompt)를 입력해 봅시다.
User: check fruityvice.com and find out the fruit that has more calories
AI: <thinking> The data retrieved from the website provides a list of fruits along with their nutritional information, including calories. To determine which fruit has the most calories, I need to iterate through the list and compare the calorie values.</thinking>
...
멋지네요, 잘 작동합니다... 좋습니다, 이번 포스트는 여기까지입니다. 우리는 Strands 내부의 기능들을 사용하여 A2A 서버를 만들었고, Strands 자체로 클라이언트를 생성하여 서버와 통신하고 응답을 받아올 수 있었습니다. 또한 기술 (skills)을 정의하지 않고도 에이전트 카드 (agent card)와 기술 (skills)을 자동으로 가져올 수 있었습니다. 감사합니다..
Strands에 관한 몇 가지 영상을 여기에서 확인해 보세요.
이미지 출처: excallidraw.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기