默认运行时
默认即为 ADK 运行时,无需额外配置:切换执行后端
通过runtime 选择内层循环的执行后端:
使用 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:
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
PIAGENT_BINARY指向的可执行文件;PIAGENT_INSTALL_DIR下的托管缓存,默认为~/.cache/veadk/piagent;- 若缓存不存在,从 PiAgent Release 下载并校验后安装。
自动安装需要运行环境能够访问 PiAgent Release。离线或受限网络环境应预先安装二进制文件,并通过
PIAGENT_BINARY 指定路径。输出持久化
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
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 即可,例如接入身份认证做登录态校验:
AuthRequestProcessor 作为身份认证的开箱即用实现。
自定义处理器
所有处理器都继承抽象基类BaseRunProcessor,实现其 process_run(runner, message) 方法。该方法返回一个包裹本轮「事件流」的装饰器,从而让你:
- 在整轮执行的前后插入逻辑(如鉴权、日志、性能监控);
- 拦截、改写或注入执行过程中产生的事件;
- 在此基础上实现重试等控制逻辑。