Agent 应用开发会员账号
知识目录选择核心方向与细分内容

SYSTEMATIC LEARNING / 分层专题

工具调用的结构、授权与业务契约

从一个格式合法却跨租户的请求开始,逐层解释工具请求怎样成为可执行动作。

学习目标:能够区分结构、语义、权限和状态检查,并给每层构造反例。

内容核对 2026-10-04 · 每层有独立讲解、任务与检查

按这个知识点的熟悉程度选择起点。当前层:资深 · 解释取舍。完成任务后可以继续下一层;阅读与自检不自动代表掌握。

本层学习目录

先补齐必要概念

适合:需要评审工具平台或跨团队集成。

Schema
描述字段形状、类型和约束的契约;字段合法不证明调用者拥有操作权限。
可信上下文
服务端认证后得到的身份与租户,不能直接相信模型填写的身份。
副作用
对外部世界的写入,例如付款、发布或删除。
状态版本
资源当前状态的版本,用于发现检查之后发生的变化。

原理怎样一步步成立?

  1. 候选参数

    模型提出动作与参数。

  2. 结构与语义

    检查字段、类型、单位和关联约束。

  3. 身份与状态

    核对真实权限与当前业务状态。

  4. 执行与回执

    有条件地执行,并校验结果及业务证据。

资深 · 解释取舍

让契约贯穿请求、审批与结果

本层目标:能够分配每层检查责任,并设计版本兼容与结果核对。

按责任划分系统

模型生成候选,协议适配器解析调用,执行网关核验可信身份与策略,业务服务负责资源状态与原子写入,结果适配器提供可核对回执。每层都需要清楚的输入、输出和失败类型。不要把全部权限检查塞进一段提示词。

契约包括错误和结果

结构化成功结果应说明动作状态、资源标识和必要证据;超时可能表示结果未知,不能一律表示未执行。错误是否可重试需要由契约给出。返回字段合法还不够,调用方要核对业务效果与目标资源是否匹配。

兼容策略也是契约

保存任务使用的工具版本。兼容变更可以通过适配器处理;不兼容变更必须重新校验或迁移。审批绑定具体参数和必要资源版本,避免先批准一个动作,执行时却变成另一个。机制会增加状态与运维成本,应依据副作用风险选择。

运行实验,观察反例

特定工具的手动参数与授权检查;无真实付款、不实现完整 Schema、事务扣款或动态权限平台。

Python 3.10+ · 默认运行只使用标准库 · 在你的电脑运行

  1. 运行格式合法但跨租户的反例
  2. 改变可信身份和权限,比较错误分支
  3. 设计检查后状态变化的额外测试
下载 tool_contracts.py ↓
python3 tool_contracts.py
查看本入口脚本
"""A specific tool's manual validator, not a JSON Schema implementation."""
import json


def validate_shape(params):
    if type(params) is not dict or set(params) != {"account", "amount_cents"}:
        raise ValueError("shape")
    if not isinstance(params["account"], str) or not params["account"]:
        raise ValueError("account")
    if type(params["amount_cents"]) is not int or params["amount_cents"] <= 0:
        raise ValueError("amount")


def authorize(params, actor, accounts):
    validate_shape(params)
    account = accounts.get(params["account"])
    if account is None or account["tenant"] != actor["tenant"]:
        raise PermissionError("not allowed")
    if "pay" not in actor["permissions"]:
        raise PermissionError("not allowed")
    if params["amount_cents"] > account["balance"]:
        raise ValueError("balance")


def demo():
    params = dict(account="B", amount_cents=100)
    actor = dict(tenant="tenant-a", permissions=["pay"])
    accounts = {"B": dict(tenant="tenant-b", balance=1000)}
    validate_shape(params)
    try:
        authorize(params, actor, accounts)
    except PermissionError:
        return dict(shape_valid=True, authorized=False, business_writes=0)
    raise AssertionError("cross-tenant request was accepted")


if __name__ == "__main__":
    print(json.dumps(demo(), sort_keys=True))

本地运行的预期输出

{"authorized": false, "business_writes": 0, "shape_valid": true}
  • 结构与授权结果分别呈现
  • 跨租户请求没有业务效果
  • 线上业务竞态需要另行验证
查看运行环境、输出和校验记录 →

继续做进阶研究实验

把只读工具边界推进到审批边界

先观察审批等待时是否已经产生业务效果,再按 README 核对动作绑定与恢复。

阅读全文与故障分析 → · 下载可靠性实验 v3 ↓

python3 approval_cli.py submit
python3 approval_cli.py run
python3 approval_cli.py inspect
# 审查 draft 和 action_json 后,按 README 使用对应 binding_hash 批准并恢复

保留证据,逐条核对

  • 状态 waiting_approval,尚无报告服务写入。
  • 审查动作、目标、作用域、输入与内容摘要,再批准对应 binding_hash。
  • 分别运行拒绝、取消与修改内容的测试,说明旧批准为什么不能复用。

本地审批夹具;--actor 不是登录或生产认证。默认无网络。

本层验收任务

画出模型、适配器、网关和业务服务四层职责,为每层写出一条验收条件。

完成后逐条核对

  • 可信身份不来自模型参数
  • 状态约束落实到执行边界
  • 说明兼容版本、未知结果与审批失效的处理方式

保存自己的过程、代码与结果。这里提供验收要求,暂不自动评分或保存课程掌握状态。

收起答案,检查理解

“模型从不产生越权参数”能否作为唯一授权措施?

延伸原理与知识练习

遇到不熟悉的原理,先阅读实现、连续追问和迁移案例,再独立说明前提与边界。作答与笔记保存到原有账号记录。

本专题的全部关联解析与练习(3 道)

依据与验证范围

原理依据来自公开资料;数字、案例和任务是本站教学设计。离线实验验证本页注明的范围,学习效果仍需通过独立任务与反馈判断。