Motus: 프레임워크에 종속되지 않는 오픈소스 AI 에이전트 서빙 인프라

Motus 소개

AI 에이전트를 프로토타입에서 프로덕션 환경으로 배포하는 과정에는 다양한 어려움이 따릅니다. 특정 에이전트 프레임워크에 종속되면 공급자 교체나 모델 스위칭 시 대규모 리팩토링이 필요하고, 복잡한 멀티 스텝 작업을 관리하기 위한 태스크 오케스트레이션, 메모리 관리, 가드레일 구현이 각각 분리된 도구로 흩어져 있는 경우가 많습니다. Motus는 이러한 문제를 해결하기 위해 설계된 오픈소스 에이전트 서빙 플랫폼으로, Lithos AI가 개발했습니다. "노 프레임워크(no-framework)" 철학을 채택하여 OpenAI, Anthropic Claude, Google Gemini, OpenRouter 등 다양한 모델 제공자를 단일 인터페이스로 사용할 수 있으며, 에이전트 워크플로우 정의부터 로컬 서빙, 클라우드 배포까지의 전체 파이프라인을 지원합니다.

Motus의 핵심 설계 원칙은 데이터 흐름 기반 자동 병렬화(task-graph runtime) 입니다. 개발자가 @agent_task 데코레이터로 작업을 정의하면, Motus는 데이터 의존성을 분석하여 독립적인 작업들을 명시적인 DAG 정의 없이도 자동으로 병렬 실행합니다. 이를 통해 복잡한 멀티 에이전트 워크플로우를 간결한 Python 코드로 표현할 수 있습니다. 또한 motus serve 명령어 하나로 로컬 HTTP 서버를 띄울 수 있어, 개발 환경에서 빠른 테스트와 반복이 가능합니다.

Motus는 인터랙티브 HTML 트레이싱(tracing)과 관찰 가능성(observability) 도구를 내장하고 있어, 에이전트가 어떤 도구를 어떤 순서로 호출했는지 시각적으로 확인할 수 있습니다. MCP(Model Context Protocol) 서버 통합, Docker 샌드박스 실행, 사람이 개입하는 승인 워크플로우(Human-in-the-loop), 입출력 가드레일 등 프로덕션 에이전트에 필요한 요소들을 하나의 패키지로 제공합니다.

Motus의 핵심 기능

ReActAgent와 도구 정의: Motus의 기본 에이전트 유형은 ReAct(Reasoning + Acting) 루프를 구현한 ReActAgent입니다. @tool 데코레이터로 Python 함수를 도구로 등록하면, 에이전트가 자연어 지시에 따라 적절한 도구를 선택하고 실행합니다.

from motus.agent import ReActAgent
from motus.models import OpenAIChatClient, AnthropicChatClient
from motus.tools import tool

@tool
async def search_web(query: str) -> str:
    """웹을 검색하여 정보를 찾습니다."""
    # 실제 검색 로직 구현
    return f"검색 결과: {query}"

@tool
async def read_file(path: str) -> str:
    """파일 내용을 읽습니다."""
    with open(path) as f:
        return f.read()

# OpenAI 모델 사용
agent = ReActAgent(
    client=OpenAIChatClient(),
    model_name="gpt-4o",
    tools=[search_web, read_file],
    memory=True,    # 대화 기록 메모리 활성화
)

# Anthropic Claude로 전환도 간단
agent_claude = ReActAgent(
    client=AnthropicChatClient(),
    model_name="claude-opus-4-5",
    tools=[search_web, read_file],
)

태스크 그래프 런타임: @agent_task 데코레이터를 사용하여 복잡한 워크플로우를 선언적으로 정의합니다. Motus는 데이터 의존성을 자동으로 분석하여 병렬 실행 가능한 태스크를 동시에 처리합니다.

from motus.workflow import agent_task

@agent_task
async def fetch_data(url: str) -> dict:
    """데이터를 가져옵니다."""
    ...

@agent_task
async def analyze(data: dict) -> str:
    """데이터를 분석합니다. (fetch_data의 결과에 의존)"""
    ...

@agent_task  
async def summarize(analysis: str) -> str:
    """결과를 요약합니다. (analyze의 결과에 의존)"""
    ...

# Motus가 의존성 그래프를 분석하여 자동으로 실행 순서 결정

멀티 에이전트 구성: 에이전트를 다른 에이전트의 도구로 사용할 수 있어, 계층적 멀티 에이전트 시스템을 구성할 수 있습니다.

# 하위 에이전트를 도구로 등록
research_agent = ReActAgent(client=..., tools=[search_web])
writer_agent = ReActAgent(
    client=...,
    tools=[research_agent.as_tool()]  # 하위 에이전트를 도구로
)

메모리와 가드레일

Motus는 두 가지 메모리 전략을 제공합니다. 기본 추가형(basic append-only) 메모리 는 대화 기록을 그대로 축적하는 방식으로, 짧은 세션에 적합합니다. 자동 요약(auto-summarizing) 메모리 는 컨텍스트 길이가 일정 임계값을 초과하면 과거 대화를 자동으로 요약하여 토큰 사용량을 관리합니다.

입출력 가드레일은 Pydantic 검증을 통해 구현됩니다. 에이전트의 출력이 특정 스키마를 만족하지 않으면 자동으로 거부하거나 재시도할 수 있어, 프로덕션 환경에서 안정성을 보장합니다.

프롬프트 캐싱(prompt caching)은 CachePolicy 옵션으로 설정할 수 있으며, Anthropic의 캐시 API를 활용하여 반복적인 시스템 프롬프트에 대한 비용을 절감합니다.

로컬 서빙과 관찰 가능성

# 패키지 설치
pip install lithosai-motus
# 또는
uv add lithosai-motus

# 로컬 HTTP 서버 실행
motus serve

# 클라우드 배포
motus deploy

motus serve를 실행하면 에이전트가 로컬 HTTP 엔드포인트로 노출되어, curl이나 다른 서비스에서 직접 호출할 수 있습니다. 실행된 에이전트의 모든 도구 호출, 추론 과정, 토큰 사용량은 인터랙티브 HTML 트레이싱 대시보드에서 시각적으로 확인 가능합니다.

라이선스

LithosAI 프로젝트는 Apache 2.0 라이선스로 공개되어 있어 개인, 연구, 상업적 목적으로 자유롭게 사용할 수 있습니다.

:house: Motus 공식 홈페이지

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

더 읽어보기




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

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

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