Skip to content

Actions 概览

模型只回答文本时,request 层已经够用。问题从“回答”变成“做事”以后,就需要 Actions:查询数据、调用函数、访问 MCP tool、搜索网页、运行 Python 或把结果写回业务系统。

Action 是一次模型请求里的外部能力层。它负责让模型知道有哪些能力可以用、如何调用、如何记录调用结果。它不是长流程编排层。

先看一个最小函数 Action

python
from agently import Agently

agent = Agently.create_agent()

@agent.action_func
async def add(a: int, b: int) -> int:
    """Add two integers."""
    return a + b

agent.use_actions([add])

result = (
    agent
    .input("Use the action to calculate 3333 + 6666.")
    .output({"answer": (int, "calculation result", True)})
    .get_result()
)

data = result.get_data()

这段代码里,模型不是自己心算,而是在一次 request 中选择并调用 add。Action Runtime 负责把调用记录、执行结果和最终响应放回同一条执行链里。

Action 负责什么

负责不负责
Action把一个外部能力暴露给模型工作流生命周期
Action Runtime归一化 action call、分发执行、记录日志分支、并发、暂停恢复
Action Executor真正执行一次函数、MCP、沙箱或内置能力选择业务流程下一步
Execution Environment准备可复用资源,如 MCP server、浏览器、SQLite、Node.js、沙箱业务任务规划
TriggerFlow阶段、分支、并发、事件、等待、恢复tool schema 注册

判断很简单:如果只是“一次回答时需要调用能力”,用 Actions;如果应用要管理多个阶段和运行状态,用 TriggerFlow 把多个 request 或 action 调用编排起来。

工具多了以后,先治理能力面

一个函数 action 很容易接。真正上线时,工具会变成一组持续增长的能力目录:查询类、写入类、MCP tools、浏览、搜索、脚本、沙箱和业务系统 adapter。这个时候不要把所有工具一次性塞给模型。

更稳的结构是四层:

负责什么常见问题
注册工具名、描述、参数 schema、副作用等级和 owner工具散在各处,无处可查
激活按场景、身份、任务阶段裁剪本次可见工具全量暴露导致选错、越权和成本上升
规划模型或规则决定调用哪个工具、填什么参数决策逻辑和执行函数耦合,无法灰度或回退
执行本地函数、HTTP、MCP、沙盒都归一为一次 action result接入新类型就要改 planner

Actions / Action Runtime 负责这条链路的调用面和记录面。ExecutionEnvironment 负责背后的 live resource 生命周期。TriggerFlow 负责把多次 request / action 调用放进可观察流程。

继续读:工具治理与 MCP Host Playbook

常见入口

本地函数

适合业务系统里已经有明确函数的场景,比如计算价格、查询订单、校验库存、格式化报表。

继续读:Action Runtime

内置能力

Agently 提供常见能力入口,例如 Python、shell、workspace file actions、Node.js、SQLite、Search、Browse 等。新项目优先从 Agent Component helpers 和 agently.builtins.actions 开始。

继续读:Action Runtime

MCP

如果能力已经以 MCP server 形式存在,可以把 MCP tool 装进 action surface,让模型在 request 期调用。

继续读:MCP

Execution Environment

当外部能力不是一个纯函数,而是需要启动、复用、健康检查或 policy 控制的资源,比如浏览器、SQLite、Node.js、Docker、MCP server,就进入 Execution Environment。

继续读:Execution Environment

旧 tools 兼容

tool_funcuse_tooluse_toolsextra.tool_logs 等旧入口仍可维护旧项目。新项目不要从这些别名开始。

继续读:工具兼容

Actions 和 TriggerFlow 怎么配合

Action 发生在 request 内,TriggerFlow 管流程。一个常见结构是:

text
TriggerFlow execution
  ├─ chunk A: 调 agent,agent 在 request 内调用 Actions
  ├─ chunk B: 根据结果分支
  └─ chunk C: 推送 runtime stream 或等待人工确认

如果只有一个 agent turn,Actions 就够了。如果要把多个 turn、业务检查、人工审批和恢复串起来,再加 TriggerFlow。

什么时候不要用 Action

  • 只是把输入改写成文本,不需要外部能力。
  • 只是 2-3 步确定性 Python 管道,用普通函数或 async 函数更清楚。
  • 流程需要等待人工审批、外部事件或跨重启恢复。直接读 TriggerFlow 概览
  • 任务图本身来自模型规划或业务系统提交。直接读 Dynamic Task

常见误用

  • 把 Action 当成业务工作流。Action 只解决一次 request 里的能力调用。
  • 把所有外部能力都写成一个巨大函数。更好的做法是拆成语义清楚、输入输出明确的 actions。
  • 在 prompt 里描述“你可以假装查询订单”。真实业务能力应该通过 Action 或 mock 外部系统显式暴露。
  • 新项目继续沿用旧 tools API。兼容可以保留,推荐入口应是 Action Runtime。
  • 没有日志和结果读取就把 Action 接进生产。至少要能看到 action logs、模型最终结果和错误信息。

下一步