Перейти к содержимому

Tool-шаг

ToolStepDescription выполняет Python-функцию, зарегистрированную вами в контексте. Поведение настраивается с помощью ToolStepConfig.

Инструменты ищутся по имени в реестре инструментов контекста:

def calculate_growth(data: str) -> dict:
return {"growth_rate": 0.15, "trend": "positive"}
context.register_tool("calculate_growth", calculate_growth)
ПолеТипПо умолчаниюНазначение
tool_namestr— (обязательное)Имя зарегистрированного инструмента.
tool_descriptionstr""Описание того, что делает инструмент.
parameterslist[ToolParameter][]Объявленные входные параметры.
input_mappingdict[str, str]{}Отображение имён параметров инструмента → ссылок на контекст (например, "$history[-1]").
output_keystr"result"Ключ, под которым вывод сохраняется в результате шага.
timeoutfloat30.0Таймаут выполнения в секундах.
retry_on_errorboolTrueПовторять ли попытку при ошибке.
error_recoveryToolErrorRecovery | NoneNoneСтратегия повторных попыток + запасной вариант (ниже).
allowed_tool_tagslist[str] | NoneNoneБелый список тегов; исполнитель отказывает инструментам, чьи теги не пересекаются.
from mmar_carl import ToolStepDescription, ToolStepConfig
ToolStepDescription(
number=2,
title="Calculate growth",
dependencies=[1],
config=ToolStepConfig(
tool_name="calculate_growth",
input_mapping={"data": "$history[-1]"}, # feed step 1's output
),
)

ToolErrorRecovery добавляет повторные попытки и запасные инструменты:

ПолеТипПо умолчаниюНазначение
retry_maxint0Дополнительные попытки после первого сбоя.
retry_delayfloat0.0Секунды между попытками.
on_timeoutstr | NoneNoneИмя запасного инструмента при таймауте.
on_exceptionstr | NoneNoneИмя запасного инструмента после исчерпания попыток.
from mmar_carl import ToolStepConfig, ToolErrorRecovery
ToolStepConfig(
tool_name="web_search",
error_recovery=ToolErrorRecovery(
retry_max=2,
retry_delay=1.0,
on_timeout="cached_search", # registered fallback tool
on_exception="cached_search",
),
)

Запасной инструмент получает те же именованные аргументы, что и основной.

Регистрация множества инструментов сразу

Заголовок раздела «Регистрация множества инструментов сразу»

Используйте декоратор @carl_tool + динамическое обнаружение, чтобы регистрировать инструменты пакетно (из модуля, по glob-шаблону или из фабрики) вместо вызова register_tool по одному за раз.