完整指南)
Pydantic AI 结合 Restate 实现 Agent 持久化执行Durable Execution完整指南【免费下载链接】pydantic-aiHow Python does AI. Agents, realtime voice, image generation, embeddings. Every model, every interface, typed end to end.项目地址: https://gitcode.com/GitHub_Trending/py/pydantic-ai本文基于 Pydantic AI 仓库中的 Restate 持久化执行文档讲解如何用 Restate 让任意 Pydantic AI Agent 具备跨进程崩溃的持久化执行能力通过 Restate 的日志重放journal replay机制Agent 在中途崩溃后可以从断点恢复LLM 响应不会被重复拉取工具副作用也不会被重复执行。读完本文你将掌握 Restate 持久化 Agent 的三大构件、完整的可运行示例代码以及它与 Pydantic AI 其他持久化后端Temporal、DBOS、Prefect在集成方式上的差异。什么是 Restate 持久化执行Restate 是一个轻量级的持久化执行运行时durable execution runtime对 AI Agent 有一等公民级别的支持。Pydantic AI 与 Restate 的集成由 Restate Python SDK 提供而不是由pydantic_ai包本身提供——这一点与 Temporal、DBOS、Prefect 不同后三者以pydantic_ai.durable_exec下的能力capability形式内置于仓库中。Restate 让 Agent 变得持久durable的方式是把 Agent 执行的每一步都记录到日志journal中。如果进程在执行中途崩溃Restate 会重放replay日志、跳过已经完成的步骤并从恰好中断的位置恢复执行。从部署形态看Agent 运行在 Restateservice内部的一个普通 HTTP handler 中。Restate Server 位于你的应用之前负责编排orchestration、日志记录journaling和重试retries。Service 本身就像普通的 Docker 容器或 Serverless 函数一样运行。一个 Restate 持久化 Agent 由三个构件组成Handler处理器你的 Agent 逻辑以 Restate service 中的 HTTP 端点形式暴露LLM 调用结果被持久化恢复时不会重新拉取模型响应——节省成本和时间工具执行包裹在持久化步骤durable step中确保副作用在恢复时不会被重复执行。下图是文档中给出的整体架构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 Server 后由 Server 管理日志与重试应用进程内的 Restate Service Handler 运行 Agent 的 run loop其中的工具、MCP、模型调用均以 durable step 形式执行再向下访问外部 API、服务与数据库。安装与完整示例任何 Pydantic AI Agent 都可以通过 Restate SDK 提供的RestateAgent包装、并运行在 Restate service handler 内来获得持久化能力。安装 Restate SDKpip/uv-add pydantic-ai restate_sdk[serde]下面是文档中给出的一个完整示例——一个带天气工具、通过 Restate 持久化运行的 Pydantic AI Agentimport restate from pydantic_ai import Agent, RunContext from restate.ext.pydantic import RestateAgent, restate_context weather_agent Agent( # (1)! openai:gpt-5.2, system_promptYou 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)! fGet weather {city}, call_weather_api, citycity ) 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))逐点解读文档中的 6 个标注按平常方式定义 Agent 和工具Agent与agent.tool()的用法与普通 Pydantic AI 完全一致RunContext依旧作为工具函数的第一个参数注入在工具内部使用restate_context()的动作来让执行持久化restate_context().run_typed(Get weather {city}, call_weather_api, citycity)把真实的外部 API 调用包进一个持久化步骤。该步骤的结果被持久化失败会重试直到成功恢复时不会重复产生副作用。注意步骤名fGet weather {city}是持久化标识的一部分应保持稳定RestateAgent包装 Agent让每一次 LLM 响应都保存在 Restate Server 中恢复时直接从日志重放而不是重新调用模型Restate service handleragent_service.handler()装饰的函数为 Agent 提供一个持久化执行上下文并把 Agent 暴露为 HTTP 端点。注意它接收restate.Context参数——这是 Restate 注入的执行上下文restate.app()创建可服务的应用把前面定义的 service 注册进去用 ASGI 服务器运行示例使用 Hypercorn 绑定0.0.0.0:9080。生产环境中Restate service 通常作为 Docker 容器或 Serverless 函数部署。要实际跑起这个 Agent启动 Restate Server、调用 handler 等可参考 Restate 官方的 agent quickstart 文档。Restate 与其他持久化后端的集成方式差异Pydantic AI 官方支持的持久化执行方案共五个Temporal、DBOS、Prefect、Restate、AWS Lambda durable functions另外还有 Kitaru 和 Apache Airflow 两个外部 SDK 集成见 持久化执行总览。Restate 与它们的集成路径有本质区别理解这一点有助于选对架构维度Temporal / DBOS / PrefectRestate集成位置仓库内置pydantic_ai.durable_exec子包Restate Python SDKrestate_sdk[serde]外部维护接入方式给 Agent 附加 capability如DBOSDurabilityAgent 本身保持原样用RestateAgent包装 Agent并放入 Restate service handler运行形态库内嵌如 DBOS 以库形式在进程内运行状态存数据库Restate Server 作为独立组件位于应用之前负责编排、日志与重试从源码结构看仓库内的pydantic_ai.durable_exec公共构建层见 pydantic_ai_slim/pydantic_ai/durable_exec/init.py为第三方运行时提供了一个稳定的后端构建器Temporal、DBOS、Prefect 的完整实现可作为参考而外部集成如 Restate、AWS Lambda、Absurd则展示如何用同一个公共构建器实现 JSON 日志化的引擎后端详见 构建持久化执行后端文档。因此 Restate 集成走的是外部 SDK 公共 builder的路线Pydantic AI 核心只保证 Agent 语义run context、依赖、消息历史、重试、工具集生命周期在持久化边界两侧保持完整。实践要点与注意事项以下要点来自文档本身及仓库内持久化执行的一般性约定副作用必须可安全重放持久化步骤可能在副作用已发生但检查点尚未提交的窗口内重复执行。文档明确说明restate_context()的动作会重试直到成功恢复时副作用不会重复这是 Restate 日志语义提供的保证对于没有该保护的普通代码工具实现应保持幂等。这一先副作用后提交的风险分析在仓库的 持久化后端构建文档 中被列为对所有引擎集成的通用要求。持久化名称是兼容性数据RestateAgent记录的 LLM 响应、run_typed记录的步骤都以步骤名/服务名作为恢复时的定位依据。重命名 service、handler 或步骤名会妨碍进行中的执行找到已记录的工作重命名前应有迁移方案——这与仓库对内置后端的约定一致持久化操作名不依赖 Python 类名重构前需在测试中固定名称集。Agent 定义保持普通 Pydantic AI 风格与 DBOS 集成中Agent 在任何地方都是普通Agent的哲学相同Restate 集成也只需要把工具中的 I/O 放进restate_context()步骤、用RestateAgent包装无需改写 Agent 本身RestateAgent暴露run等常规运行方法示例中调用restate_agent.run(prompt)并读取result.output。部署形态示例用 Hypercorn 直接监听 9080 端口做本地运行文档指出 Restate service 在生产中像普通 Docker 容器或 Serverless 函数一样运行Restate Server 则独立负责 journal、replay 与重试调度。小结与延伸阅读Restate 方案的核心心智模型是三个构件handler 暴露 HTTP 端点、LLM 调用靠RestateAgent持久化、工具执行靠restate_context()的 durable step 持久化。它适合希望引入一个独立编排层而非进程内库来管理 Agent 恢复与重试的场景。延伸阅读均为仓库内文档持久化执行总览各方案的定位与对比DBOS 持久化执行内置 capability 模式的典型示例含步骤配置、重试与流式约束细节构建持久化执行后端面向引擎集成作者的公共 builder 与操作命名规范durable_exec 源码BaseDurabilityCapability、DurableOperationBackend、DurabilityEngineSpec等公共接口定义tests/durable_execDBOS、Temporal、Prefect 等内置后端的测试用例可参考其对重放与恢复场景的验证方式。【免费下载链接】pydantic-aiHow Python does AI. Agents, realtime voice, image generation, embeddings. Every model, every interface, typed end to end.项目地址: https://gitcode.com/GitHub_Trending/py/pydantic-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考