SuperAPI AI 工具集

ai-python-durable-execution

智能体与模型

查看项目

更新于 10-16 04:06

技能介绍

用途

当智能体运行必须经受重启、worker 迁移或长时间等待时,应使用持久化执行。AI SDK for Python 本身不提供持久化能力,需要自行构建可重放的工作流。

主要能力

  • 自定义 Agent.loop,将副作用放入持久化步骤中。
  • 需要放入持久化步骤的副作用包括:模型调用、工具 I/O、审批或恢复边界。
  • 保持工作流可重放:持久化步骤应接收 JSON 输入并返回 JSON 输出。

消息序列化

data = message.model_dump(mode="json")
message = ai.messages.Message.model_validate(data)

模型步骤

持久化的模型步骤应在步骤内部消费 ai.stream(...),并返回一条完整的 assistant Message。

@workflow.step
async def llm_step(
    model_data: dict[str, object],
    messages_data: list[dict[str, object]],
    tools_data: list[dict[str, object]],
) -> dict[str, object]:
    model = ai.Model.model_validate(model_data)
    messages = [
        ai.messages.Message.model_validate(message)
        for message in messages_data
    ]
    tools = [ai.Tool.model_validate(tool) for tool in tools_data]

    async with ai.stream(model, messages, tools=tools) as stream:
        async for _event in stream:
            pass

        if stream.message is None:
            raise RuntimeError("LLM stream ended without a message")

        return stream.message.model_dump(mode="json")

持久化工具

优先将工具体包裹在持久化步骤中:

@ai.tool
@workflow.step
async def ask_mothership(question: str) -> str:
    response = await mothership_client.ask(question)
    return response.summary

如果工作流系统需要独立的活动调度,则调度一个零参数可调用对象,返回 ai.tool_result(...)。不要直接调用 tool.fn。

Agent 循环

将模型步骤的结果作为一条完整消息使用。不要用 ai.Stream、ai.events.replay_message_events 或 ai.util.merge 包裹它——这些工具用于非持久化应用中的流式分发,而在工作流环境中不可行,因为流被视为副作用。

class DurableAgent(ai.Agent):
    async def loop(self, context: ai.Context):
        while context.keep_running():
            result = await llm_step(
                context.model.model_dump(mode="json"),
                [m.model_dump(mode="json") for m in context.messages],
                [t.model_dump(mode="json") for t in context.tools],
            )

            assistant_message = ai.messages.Message.model_validate(result)
            context.add(assistant_message)

            async with ai.ToolRunner() as runner:
                for tool_call in assistant_message.tool_calls:
                    runner.schedule(context.resolve(tool_call))

                async for event in runner.events():
                    yield event

                context.add(runner.get_tool_message())

适用场景

  • 智能体运行需要跨进程重启或 worker 迁移继续执行。
  • 工作流中存在长时间等待、审批或恢复边界。
  • 需要将模型调用与工具 I/O 作为可重放步骤管理。

限制

该模式不会向调用方流式输出模型 token。这通常是持久化工作流的合理取舍,因为许多持久化系统不支持异步生成器。可以构建基于队列的旁路通道来实现流式输出;但这类流不能用于调度工具或直接影响控制流。