Skip to main content
运行时决定智能体「内层循环」如何执行——即每一轮如何调用模型、解析意图、调用工具。默认运行时基于 Google ADK 的内置执行流程,开箱即用;你也可以切换执行后端,或在执行流程上插入统一的处理逻辑,而无需改动智能体本身。

默认运行时

默认即为 ADK 运行时,无需额外配置:

同步工具并行执行

在默认的 ADK 运行时中,当模型在同一轮中发起多个同步工具调用时,这些调用默认串行执行,会阻塞事件循环。通过 Agent 的 tool_thread_pool_config 参数配置线程池后,同步工具(如 run_code)可在独立线程中并行执行,不再阻塞事件循环。
agent.py
也可以在 RunConfig 中设置 tool_thread_pool_config,优先级高于 Agent 上的配置。 ToolThreadPoolConfig 参数:
该配置仅影响默认 ADK 运行时中的同步工具执行;codex 和 piagent 等外部运行时具有各自的工具执行机制,不受此配置影响。
当配置了线程池且同一轮中存在多个 run_code 调用时,每个调用的沙箱会话标识会附加各自的函数调用标识,确保各调用在相互隔离的沙箱中执行。可通过环境变量 VEADK_RUN_CODE_ISOLATE_PARALLEL_CALLS 控制此行为,详见代码沙箱。

切换执行后端

通过 runtime 选择内层循环的执行后端:
codex 和 piagent 运行时不构建 LiteLLM 客户端,因此 model_fallbacks 参数会被忽略。如需模型回退能力,请使用默认的 ADK 运行时,或在 model 参数传入的自定义模型对象上配置回退。详见模型。

使用 Codex 运行时

Codex 运行时依赖可选依赖组 codex,该依赖不会随 VeADK 默认安装。使用前安装所需依赖:
codex 依赖组包含 OpenAI Codex SDK 与 Codex CLI 二进制文件。 模型名称、API 地址与 API Key 仍使用智能体的模型配置:
工具和技能沿用标准的 Agent 配置,无需为 Codex 运行时单独注册:
  • tools 中的函数工具会作为可调用工具提供给模型;
  • tools 中的 MCPToolset会完成工具发现与调用;
  • 通过 SkillToolset 或 VeADK 旧入口加载的技能会交由 Codex 的技能机制使用。

Codex 安全配置

Codex 运行时默认采用面向多租户服务的最小权限配置:每次调用使用会话隔离的工作区、workspace_write 沙箱、禁用网络访问,并拒绝需要提权的操作。需要扩大权限时必须显式配置。 通过 Agent 的 codex_runtime_config 参数传入 CodexRuntimeConfig:
agent.py
CodexRuntimeConfig 的全部参数如下: 以下环境变量可在不修改代码的情况下覆盖 CodexRuntimeConfig 的对应字段,优先级高于 codex_runtime_config:
sandbox="full_access" 与 reuse_workspace=True 会放宽不同调用之间的文件系统边界,仅应在受信任的环境中开启。生产环境应使用最小权限的隔离容器,并限制可访问的凭证、文件与网络目标。

Codex 可观测性

Codex 原生生命周期通知与 ADK Function/MCP 工具调用都会转换为标准 ADK Event,因此工具调用、结果、状态变更、确认与鉴权过程均可进入 Session、Trace 与前端展示。运行日志使用稳定的 codex_* 事件名,并包含 invocation_id、call_id、tool、status、duration_ms 等可归因字段。日志不会记录工具参数、工具结果、API Token、凭证或后端地址;Token 用量通过 codex_event_type=token_usage 事件及对应日志提供。

配置临时错误重试

Codex 运行时调用模型后端时,会对限流、服务端错误、服务过载和超时等临时错误进行重试。默认最多重试两次,可通过环境变量调整:

使用 PiAgent

VeADK 不在 Python 安装包中内置 PiAgent 二进制文件。运行时按以下顺序查找:
  1. PIAGENT_BINARY 指向的可执行文件;
  2. PIAGENT_INSTALL_DIR 下的托管缓存,默认为 ~/.cache/veadk/piagent;
  3. 若缓存不存在,从 PiAgent Release 下载并校验后安装。
自动安装需要运行环境能够访问 PiAgent Release。离线或受限网络环境应预先安装二进制文件,并通过 PIAGENT_BINARY 指定路径。

智能体转移

Google ADK 的 transfer_to_agent 工具允许一个 LLM 智能体在运行时将控制权移交给智能体树中的另一个智能体,由目标智能体在同一个调用上下文中继续执行并直接输出结果。在默认的 ADK 运行时中,该能力由 ADK 的执行流程内置支持;codex 和 piagent 运行时现在同样支持该能力。 当使用 codex 或 piagent 运行时的智能体存在可移交的目标智能体时,运行时会自动注册 transfer_to_agent 工具,并在系统指令中追加可用目标智能体的名称与描述。模型根据任务需要决定是否调用该工具进行移交;调用后,目标智能体在当前调用上下文中执行,其产生的事件正常输出到会话与链路中。 可移交的目标由智能体树结构决定: mode 为 single_turn 或 task 的智能体不会作为移交目标,也不会接收移交指令。 以下示例在 codex 运行时中使用多智能体树,根智能体可将任务移交给子智能体:
agent.py
智能体转移依赖 Runner 驱动的调用链。目标智能体在同一个调用上下文中执行,其 output_key 等配置照常生效。

输出持久化

Agent 继承自 Google ADK 的 LlmAgent,支持通过 output_key 参数将智能体的最终文本回复写入会话状态(session state)。同一会话中后续执行的其他智能体可以读取该状态,从而在多智能体工作流中传递结果。
output_key 在所有运行时中均生效,包括默认的 ADK 运行时以及 codex、piagent 等外部运行时。使用外部运行时时,最终回复同样会写入会话状态。
以下示例使用 SequentialAgent 串联两个智能体:规划智能体的输出通过 output_key="plan" 写入会话状态,写作智能体在同一会话中读取该状态:
pipeline.py
运行后,会话状态中的 plan 和 draft 分别保存规划智能体与写作智能体的最终回复。

模型回调

Agent 继承自 Google ADK 的 LlmAgent,可通过 before_model_callback、after_model_callback 与 on_model_error_callback 在模型调用的前后及异常时插入自定义逻辑。这些回调与 ADK 插件(继承 BasePlugin)的同名方法在所有运行时中均生效,包括默认的 ADK 运行时以及 codex、piagent 等外部运行时。在外部运行时中,回调按 ADK 顺序执行:先运行插件回调,再运行智能体回调。
外部运行时构建的 LlmRequest 仅包含回调所需的稳定字段(对话内容、系统指令、输出 schema、工具与生成配置),不会执行 ADK 完整的预处理流水线。依赖 ADK 内部预处理阶段的回调行为在外部运行时中可能不一致。
回调可以是同步函数,也可以是异步函数(async def)。以下示例在 Codex 运行时中用 before_model_callback 把 PDF 附件渲染为图片,使视觉模型可以读取文档内容:
agent.py
使用 on_model_error_callback 在模型调用失败时返回兜底回复,避免异常直接抛给调用方:
agent.py

按工具选择执行位置

运行时决定的是智能体整体的内层循环,而 RuntimeProvider 在更细的粒度上决定每一次工具调用在哪里执行,模型推理循环本身不变。它作为 ADK 插件工作:通过拦截 before_tool_callback,在 Google ADK 实际调用工具实现之前接管该调用,因此本地实现不会被重复执行。 VeADK 提供以下公开类:

使用示例

以下示例把所有非 MCP 工具的执行派发到远端 Runtime,MCP 工具保留原本的 ADK 实现:
agent.py
上例中所有非 MCP 工具只会经过 dispatch_task,不会再次执行本地函数。传入具体工具名集合时,只派发集合中的非 MCP 工具。派发函数可以是同步或异步函数。 如果直接在 Agent 上注册而非通过 Runner 的 plugins,可以将 DispatchRuntimeProvider 的 before_tool_callback 传入 Agent 的 before_tool_callback 参数:
agent.py

DispatchRuntimeProvider 参数

ToolCall 字段

MCP 工具始终保留其原本的 ADK 实现,不受 dispatchable_tools 配置影响。这是因为 MCP 工具的调用需要通过其自身的 MCP 会话管理器进行。

请求处理

在不侵入业务逻辑的前提下,可为每次执行插入统一的横切处理。将处理器传入 run_processor 即可,例如接入身份认证做登录态校验:
不设置时使用默认处理器,不改变任何行为。VeADK 内置 AuthRequestProcessor 作为身份认证的开箱即用实现。

自定义处理器

所有处理器都继承抽象基类 BaseRunProcessor,实现其 process_run(runner, message) 方法。该方法返回一个包裹本轮「事件流」的装饰器,从而让你:
  • 在整轮执行的前后插入逻辑(如鉴权、日志、性能监控);
  • 拦截、改写或注入执行过程中产生的事件;
  • 在此基础上实现重试等控制逻辑。
最后修改于 2026年9月19日