Restate와 함께하는 지속 실행

Restate와 함께하는 지속 실행 (Durable Execution with Restate)

Restate는 AI 에이전트를 퍼스트클래스로 지원하는 가벼운 지속 실행 런타임이에요. Pydantic AI 통합은 Restate Python SDK를 통해 제공됩니다. Restate Server가 실행을 저널링하고 재시도하는 방식으로 에이전트를 지속으로 만드는 법을 정리할게요.

출처: 문서

본문

자세한 내용은 Restate 문서를 방문하세요.

지속 실행 (Durable Execution)

Restate는 실행의 매 단계를 저널에 기록해서 에이전트를 지속으로 만들어요. 프로세스가 실행 중간에 크래시하면 Restate가 저널을 재생하고, 완료된 스텝을 건너뛰며, 정확히 그 지점부터 재개합니다.

여러분의 에이전트는 Restate 서비스 안의 일반 HTTP 핸들러에서 실행됩니다. Restate Server는 애플리케이션 앞에 자리하며 오케스트레이션, 저널링, 재시도를 관리합니다. 서비스는 일반 Docker 컨테이너나 서버리스 함수처럼 실행돼요.

지속 에이전트는 세 가지 구성 요소로 이루어집니다:

  1. 핸들러 (handler): 에이전트 로직. Restate 서비스의 HTTP 엔드포인트로 노출됩니다.
  2. LLM 호출: 영속화되어 회복 시 응답을 다시 가져오지 않습니다 — 비용과 시간을 절약해요.
  3. 도구 실행: 지속 스텝으로 감싸져 사이드 이펙트가 중복되지 않습니다.
                  Clients
              (HTTP, Kafka, etc.)
                     |
                     v
            +---------------------+
            |   Restate Server    |      (Journals execution,
            +---------------------+       retries on failure,
                     ^                    manages state)
                     |
        Journal      |   Replay on
        steps,       |   recovery,
        retries      |   schedule calls
                     v
+------------------------------------------------------+
|               Application Process                    |
|   +----------------------------------------------+   |
|   |         Restate Service Handler              |   |
|   |           (Agent Run Loop)                   |   |
|   |    [ Durable Steps (Tool, MCP, Model) ]      |   |
|   +----------------------------------------------+   |
|         |           |                |               |
+------------------------------------------------------+
          |           |                |
          v           v                v
      [External APIs, services, databases, etc.]

Restate의 지속 에이전트 문서를 참고하세요.

지속 에이전트 (Durable Agent)

Restate SDK의 RestateAgent로 감싸고 Restate 서비스 핸들러 안에서 실행하면 어떤 Pydantic AI 에이전트든 지속으로 만들 수 있어요.

Restate SDK를 설치합니다:

pip install pydantic-ai "restate_sdk[serde]"
uv add pydantic-ai "restate_sdk[serde]"

다음은 Restate로 만든 지속 Pydantic AI 에이전트의 완전한 예제입니다:

import restate
from pydantic_ai import Agent, RunContext
from restate.ext.pydantic import RestateAgent, restate_context

weather_agent = Agent(  # (1)
    'openai:gpt-5.2',
    system_prompt='You are a helpful agent that provides weather updates.',
)


@weather_agent.tool()
async def get_weather(_run_ctx: RunContext, city: str) -> dict:
    """Get the current weather for a given city."""

    # Do durable tool steps using the Restate context
    async def call_weather_api(city: str) -> dict:
        return {'temperature': 23, 'description': 'Sunny and warm.'}

    return await restate_context().run_typed(  # (2)
        f'Get weather {city}', call_weather_api, city=city
    )


restate_agent = RestateAgent(weather_agent)  # (3)

agent_service = restate.Service('WeatherAgent')


@agent_service.handler()
async def run(_ctx: restate.Context, prompt: str) -> str:  # (4)
    result = await restate_agent.run(prompt)
    return result.output


app = restate.app(services=[agent_service])  # (5)

if __name__ == "__main__":  # (6)
    import hypercorn
    import asyncio
    conf = hypercorn.Config()
    conf.bind = ["0.0.0.0:9080"]
    asyncio.run(hypercorn.asyncio.serve(app, conf))
  • (1) 에이전트와 도구를 평소처럼 Pydantic AI로 정의하세요.
  • (2) 도구 안에서 restate_context() 액션을 사용해 실행을 지속으로 만드세요. 결과는 성공할 때까지 영속화되고 재시도됩니다. 사이드 이펙트는 회복 시 중복되지 않아요.
  • (3) RestateAgent가 에이전트를 감싸서 모든 LLM 응답이 Restate Server에 저장되고 회복 중 재생되게 합니다.
  • (4) Restate 서비스 핸들러가 에이전트에 지속 실행 컨텍스트를 주고 HTTP 엔드포인트로 노출합니다.
  • (5) restate.app()이 서빙할 수 있는 애플리케이션을 만듭니다.
  • (6) Hypercorn 같은 ASGI 서버로 애플리케이션을 실행합니다.

에이전트 실행 방법은 Restate agent quickstart를 참고하세요.

더 알아보기 (Learn more)