Vision-Agents는 Stream의 에지 네트워크를 기반으로 하는 오픈소스 비전 에이전트 프레임워크로, 다양한 모델과 영상 제공자를 빠르게 연결해 초저지연 실시간 상호작용을 가능하게 한다. 본문에서는 이 프레임워크가 gRPC를 활용해 서비스 간 효율적인 통신을 구현하는 방식과 그 설계 원리를 살펴본다.
gRPC를 Vision-Agents 통신 기반으로 선택한 이유
분산 환경에서 서비스 간 데이터 교환 효율은 전체 시스템 성능을 좌우한다. Vision-Agents가 gRPC를 채택한 이유는 다음과 같다.
- 바이너리 직렬화 효율: JSON이나 XML 대신 Protocol Buffers를 사용해 데이터 크기를 대폭 줄이고 파싱 속도를 높임
- 계약 기반 인터페이스:
.proto파일로 서비스 경계를 명확히 정의해 빌드 시점에 타입 오류를 방지 - 폴리글랏 지원: 여러 언어용 클라이언트 및 서버 스텁을 자동 생성해 다양한 플러그인 생태계에 대응
- 스트리밍 모델: 단일 요청·응답부터 양방향 스트림까지 4가지 통신 패턴을 제공해 실시간 영상 파이프라인에 적합
Protobuf 기반 이벤트 모델 설계
Vision-Agents는 서비스 간 일관된 데이터 교환을 위해 Protobuf로 통합 이벤트 스키마를 관리한다. SFU(Selective Forwarding Unit) 이벤트를 자동으로 파이썬 데이터 클래스로 변환하는 핵심 도구는 다음 경로에 있다.
agents-core/vision_agents/_generate_sfu_events.py
이 스크립트는 Protobuf 정의를 읽어 타입 안전한 래퍼 클래스를 생성한다. 예를 들어 다음과 같은 구조가 만들어진다.
@dataclass
class AudioLevelEvent(BaseEvent):
"""video.sfu.event.events_pb2.AudioLevel에 대응하는 이벤트 클래스"""
type: str = field(default="stream.video.sfu.event.AudioLevel", init=False)
payload: Optional[events_pb2.AudioLevel] = field(default=None, repr=False)
@property
def user_id(self) -> Optional[str]:
if self.payload is None:
return None
return getattr(self.payload, "user_id", None)
생성된 코드는 agents-core/vision_agents/core/edge/sfu_events.py에 위치하며, 모든 SFU 이벤트 타입의 변환 규칙을 담고 있다.
gRPC 통신 아키텍처 구성
이벤트 중심 메시지 체계
모든 서비스 간 상호작용은 사전 정의된 이벤트 타입을 통해 이루어진다. 이벤트의 등록과 라우팅을 담당하는 중앙 모듈은 다음과 같다.
agents-core/vision_agents/core/events/manager.py
SFU 이벤트 처리 파이프라인
실시간 영상 통신의 핵심인 SFU와의 gRPC 연동은 전용 모듈에서 처리된다. 연결 품질 변화 이벤트의 예시는 다음과 같다.
@dataclass
class ConnectionQualityChangedEvent(BaseEvent):
type: str = field(
default="stream.video.sfu.event.ConnectionQualityChanged", init=False
)
payload: Optional[events_pb2.ConnectionQualityChanged] = field(
default=None, repr=False
)
@property
def connection_quality_updates(self) -> Optional[List[Any]]:
if self.payload is None:
return None
return getattr(self.payload, "connection_quality_updates", None)
플러그인 간 통신适配
외부 AI 모델 서비스와의 연결도 표준화된 gRPC 인터페이스를 통해 이루어진다. OpenAI 플러그인의 통신 구현 예시는 다음 경로를 참고한다.
plugins/openai/vision_agents/plugins/openai/
실전 적용: 실시간 영상 분석 파이프라인
양방향 스트림을 활용한 전형적인 영상 처리 워크플로우는 다음과 같다.
- 캡처 모듈이 gRPC 스트림으로 원본 프레임을 추론 서비스로 전송
- 추론 서비스가 객체 인식·행위 분석 등을 수행해 구조화된 결과 산출
- 결과 메타데이터를 gRPC를 통해 대시보드 또는 알림 서비스로 전파
성능 최적화 전략
압축 알고리즘 적용
대역폭이 중요한 환경에서는 채널 옵션으로 압축을 명시적으로 설정한다.
conn = grpc.insecure_channel(
'inference.cluster.local:50051',
options=[
('grpc.default_compression_algorithm', grpc.Compression.Gzip),
]
)
연결 재활용
매 요청마다 연결을 새로 만드는 비효율을 피하기 위해 Vision-Agents는 연결 풀을 운영한다. 관련 로직은 다음 파일에서 확인할 수 있다.
agents-core/vision_agents/core/mcp/mcp_manager.py
비동기 I/O 활용
처리량 극대화를 위해 gRPC의 비동기 API를 활용한 구현체는 다음 경로에 있다.
agents-core/vision_agents/core/runner/http/api.py
시작 가이드
gRPC 통신 기능을 직접 확인하려면 다음 단계를 따른다.
# 저장소 복제
git clone https://gitcode.com/GitHub_Trending/vi/Vision-Agents
# 의존성 설치
cd Vision-Agents
pip install -e .
# gRPC 서비스 샘플 실행
python examples/08_agent_server_example/agent_server_example.py
클라이언트 측에서는 자동 생성된 스텁을 다음과 같이 활용한다.
from vision_agents.core.edge.sfu_events import AudioLevelEvent
def on_audio_level(evt: AudioLevelEvent):
print(f"사용자 {evt.user_id}의 음성 레벨: {evt.level}")
Vision-Agents는 gRPC와 Protobuf의 조합을 통해 분산 비전 에이전트 시스템에 필요한 낮은 지연과 높은 처리량을 달성하고 있으며, 이 패턴은 실시간 영상 분석, 다중 모델 오케스트레이션, 에지-클라우드 협업 등 다양한 시나리오로 확장 가능하다.