Skip to content

自定义工具——进阶模式

本章目标

超越装饰器。学完你能:

  • ToolsManager 手动注册工具(会话级控制)
  • custom_run 模式在工具内触达框架
  • 使用完整 JSON Schema 约束集

基础在哪里? 工具概念、@simple_tool / @on_tools 装饰器与执行路径在 工具系统(概念)教程 2。 本页只覆盖它们没有的内容。

ToolsManager 手动注册

装饰器注册进全局容器。需要会话级控制时,自己注册进管理器实例:

python
from amrita_core.tools.manager import ToolsManager

manager = ToolsManager()
manager.register(schema, handler, custom_run=False)
# 把 manager 作为会话的 ability.tools 传入(见数据层)

MultiToolsManager 持有多个命名管理器;会话解析分配给它的那一个。

custom_run——需要框架访问的工具

需要框架(流式、会话状态)的工具使用 custom_run:handler 接收 ToolContext 而非裸 dict。

python
from amrita_core import on_tools
from amrita_core.tools.models import (
    FunctionDefinitionSchema,
    FunctionParametersSchema,
    FunctionPropertySchema,
    ToolContext,
)

STATUS_DEFINITION = FunctionDefinitionSchema(
    name="report_progress",
    description="Report the agent's current progress to the user",
    parameters=FunctionParametersSchema(type="object", properties={}),
)


@on_tools(STATUS_DEFINITION)
async def report_progress(tool_ctx: ToolContext) -> str:
    # tool_ctx.data  —— 校验后的参数(dict)
    # tool_ctx.ctx   —— StrategyContext(config、io_stream……)
    stream = tool_ctx.ctx.io_stream
    await stream.yield_response("Working on it...")
    return "progress reported"

原理call_tool() 检测 handler 签名——有 ToolContext 参数即切换为 custom_run 模式。

校验约束

FunctionPropertySchema 支持完整 JSON Schema 约束集:

  • 数值:minimummaximumexclusiveMinimumexclusiveMaximummultipleOf
  • 字符串:minLengthmaxLengthpatternformat
  • 数组:itemsminItemsmaxItemsuniqueItems
  • 对象:propertiesrequiredadditionalProperties
  • 特殊:enumconstdefault
  • 联合:type 为列表(仅手动 schema)

参数在 handler 运行前校验;非法调用永远到不了你的函数。

工具调用模式

config.builtin.tool_calling_mode 控制可用性:

模式行为
"agent"完整工具调用(含内置工具)
"rag"一轮检索,然后停止
"none"完全无工具

下一步

MCP 服务器——把 MCP 工具暴露给 agent。

Apache 2.0 许可证(一些内容可能没有完全翻译成中文,请以英文文档为准。)