Plano: 에이전트 앱을 위한 AI 네이티브 프록시 서버이자 데이터 플레인

Plano 소개

Plano는 에이전트 애플리케이션을 위한 AI 네이티브 프록시 서버이자 데이터 플레인(data plane)입니다. 에이전트 데모를 만드는 일은 쉽지만, 이를 안전하고 반복 가능하게 프로덕션까지 올리는 일은 어렵습니다. 빠른 프로토타입을 지나 실제 배포 단계에 이르면, 올바른 에이전트로 요청을 보내는 라우팅 로직, 안전성과 모더레이션을 위한 가드레일, 지속적인 개선을 위한 관찰 가능성(observability) 연결, 그리고 프레임워크마다 흩어진 모델·프로바이더별 예외 처리 같은 "숨은 미들웨어"를 직접 만들게 됩니다. Plano는 이런 공통 관심사를 애플리케이션 코드 밖의 하나의 데이터 플레인으로 옮겨, 매 코드베이스마다 다시 짜던 배관 작업을 걷어냅니다.

Plano를 만든 katanemo 팀은 이 프로젝트가 Envoy 위에서, Envoy의 핵심 기여자들이 직접 구축했다고 밝히고 있습니다. Envoy는 대규모 서비스에서 검증된 프록시 인프라이며, Plano는 그 위에 에이전트 앱에 특화된 오케스트레이션과 LLM 라우팅 계층을 얹은 형태입니다. 프록시 코어는 Rust로 작성되어 있고, 애플리케이션과는 별도 프로세스(out-of-process)로 동작하기 때문에 특정 언어나 AI 프레임워크에 묶이지 않습니다.

Plano의 핵심은 오케스트레이션, 모델 관리, 관찰 가능성을 각각 독립적인 구성 요소로 다룬다는 점입니다. 필요한 기능만 골라 켤 수 있어서, 에이전트 오케스트레이션과 가드레일을 위한 엣지 프록시로만 쓰거나, 서비스 안에서 LLM 라우팅 용도로만 쓰거나, 둘을 함께 쓸 수도 있습니다. 본 게시물에서는 Plano가 해결하는 문제, 네 가지 핵심 기능, 그리고 간단한 멀티 에이전트 예제를 통한 사용법을 정리합니다.

Plano가 해결하는 문제: 프로덕션의 숨은 미들웨어

에이전트 앱을 프로덕션으로 올릴 때 반복적으로 등장하는 배관 작업이 있습니다. 요청을 알맞은 에이전트로 보내는 의도 분류기와 라우팅 로직, 탈옥(jailbreak)·모더레이션을 막는 가드레일 훅, 지속적인 학습을 위한 평가·관찰 연결, 그리고 각 프로바이더의 API 특성을 흡수하는 어댑터가 그것입니다. 이 코드들은 대개 프레임워크와 애플리케이션 코드 곳곳에 흩어져, 코드베이스마다 다시 작성됩니다.

Plano는 이 관심사들을 애플리케이션 밖의 통합 데이터 플레인으로 끌어냅니다. 아래 시퀀스 다이어그램은 사용자 인터페이스에서 시작한 요청이 Plano의 가드레일 필터를 거쳐 에이전트로 전달되고, 에이전트의 LLM 호출이 다시 Plano를 통해 프록시되며, 그 과정에서 트레이스와 시그널이 자동으로 생성되는 전체 흐름을 보여줍니다.

Plano의 네 가지 핵심 기능

Plano는 프로덕션 배포에 필요한 관심사를 네 가지 모듈형 구성 요소로 제공합니다.

오케스트레이션 (Orchestration) 은 에이전트 사이의 저지연 라우팅을 담당합니다. 새 에이전트를 추가할 때 애플리케이션 코드를 고칠 필요 없이, 설정 파일에 에이전트를 선언하는 것만으로 연결됩니다. Plano는 이 라우팅에 GPT-4 같은 대형 모델이나 무거운 프레임워크 대신 목적에 맞게 만든 경량 LLM을 사용합니다. 저자는 예제에서 plano_orchestrator_v1 이라는 4B 파라미터 규모의 라우팅 모델을 사용하며, 이를 통해 비용과 지연을 낮춘 프로덕션급 라우팅을 얻을 수 있다고 설명합니다.

모델 민첩성 (Model Agility) 은 모델을 이름이나 별칭(semantic name)으로 지정하거나, 선호 설정에 따라 자동으로 라우팅하는 기능입니다. 여러 프로바이더의 API 차이를 통합 LLM API 뒤로 숨기므로, 애플리케이션 코드를 바꾸지 않고 모델을 교체할 수 있습니다.

에이전틱 시그널 (Agentic Signals) 은 모든 에이전트에 걸쳐 시그널과 OpenTelemetry(OTEL) 트레이스·메트릭을 코드 없이 수집합니다. 지속적인 평가와 개선을 위한 학습 데이터를 별도 파이프라인 구축 없이 확보할 수 있습니다.

필터 체인 (Filter Chains) 은 탈옥 방지, 모더레이션 정책, 메모리 훅을 일관된 방식으로 붙이는 메커니즘입니다. 안전성과 관련된 처리를 애플리케이션마다 흩뿌리지 않고 데이터 플레인 한 곳에서 관리합니다.

Plano로 에이전트 앱 만들기

Plano의 사용 흐름은 크게 세 단계입니다. 먼저 에이전트를 YAML로 선언하고, 각 에이전트를 OpenAI 호환 HTTP 서버로 작성한 뒤, Plano를 띄워 질의합니다. 아래는 저자가 제공하는 여행 도우미 예제를 간추린 것으로, 날씨 에이전트와 항공편 에이전트를 하나의 대화에서 라우팅합니다.

먼저 에이전트의 URL과 자연어 설명, 모델 프로바이더, 리스너를 설정 파일에 선언합니다. 라우팅 로직이나 프로바이더 어댑터를 직접 작성하지 않는 점이 핵심입니다.

# config.yaml
version: v0.3.0

agents:
  - id: weather_agent
    url: http://localhost:10510
  - id: flight_agent
    url: http://localhost:10520

model_providers:
  - model: openai/gpt-4o
    access_key: $OPENAI_API_KEY
    default: true
  - model: anthropic/claude-3-5-sonnet
    access_key: $ANTHROPIC_API_KEY

listeners:
  - type: agent
    name: travel_assistant
    port: 8001
    router: plano_orchestrator_v1  # 4B 파라미터 라우팅 모델. 다른 모델로 교체 가능
    agents:
      - id: weather_agent
        description: |
          Gets real-time weather and forecasts for any city worldwide.
      - id: flight_agent
        description: |
          Searches flights between airports with live status and schedules.

tracing:
  random_sampling: 100  # 평가용 트레이스 자동 캡처

각 에이전트는 OpenAI 호환 chat completions 엔드포인트를 구현한 HTTP 서버이면 됩니다. 언어나 프레임워크는 자유이며, LLM 호출은 Plano의 게이트웨이(http://localhost:12001/v1)를 향하도록 두면 모델 라우팅을 Plano가 대신 처리합니다.

# weather_agent.py
from openai import AsyncOpenAI

# Plano의 LLM 게이트웨이를 가리키면 모델 라우팅은 Plano가 처리
llm = AsyncOpenAI(base_url="http://localhost:12001/v1", api_key="EMPTY")

설정과 에이전트가 준비되면 Plano를 실행하고 리스너 포트로 질의합니다. 하나의 요청 안에서 Plano가 날씨 에이전트와 항공편 에이전트로 각각 라우팅해 통합된 응답을 돌려줍니다.

# Plano 실행
planoai up config.yaml

# 질의 — Plano가 두 에이전트로 라우팅
curl http://localhost:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "다음 주에 NYC에서 파리로 여행하려는데, 날씨와 항공편을 알려줘"}
    ]
  }'

모든 요청은 별도의 계측 코드 없이 OpenTelemetry로 end-to-end 트레이싱됩니다. 아래는 저자가 제공하는 자동 트레이싱 화면 예시입니다.

Plano를 쓰면 직접 만들지 않아도 되는 것

저자는 README에서 Plano가 있을 때와 없을 때 직접 구현해야 하는 작업의 차이를 다음 표로 정리하고 있습니다.

인프라 관심사 Plano 없이 Plano로
에이전트 오케스트레이션 의도 분류기 + 라우팅 로직 직접 구현 YAML에 에이전트 설명 선언
모델 관리 프로바이더별 API 특성 개별 처리 상태 관리를 포함한 통합 LLM API
트레이싱 모든 서비스에 OTEL 계측 삽입 자동 end-to-end 트레이스·로그
학습 시그널 span 캡처·내보내기 파이프라인 구축 코드 없는 에이전틱 시그널
에이전트 추가 라우팅 코드 수정, 테스트, 재배포 config에 추가 후 재시작

Plano와 Plano-Orchestrator 같은 Plano 계열 LLM은 첫 사용 경험을 위해 US-central 리전에서 무료로 호스팅됩니다. 프로덕션 규모로 확장할 때는 이 LLM들을 로컬에서 직접 실행하거나 개발팀에 문의해 API 키를 받는 방식을 안내하고 있습니다.

Plano의 라이선스

Plano는 Apache License 2.0으로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:house: Plano 공식 홈페이지

https://planoai.dev

:books: Plano 문서 사이트

:github: Plano 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: