18. Каталог встроенных tools
Tool — это функция, которую модель может вызвать в ходе своего ответа (через
function_call в OpenAI API / tool_use в Anthropic API). Точный набор
зависит от feature flags, collaboration mode и провайдера; кроме встроенных
tools доступны динамические MCP/custom tools.
Реализация — крейт tools/. Реестр и диспетчеризация — core::tools (см. 19-agent-loop.md).
1. Архитектура
Типы спецификаций
В tools/src/tool_spec.rs:
pub enum ToolSpec {
Function { name, description, parameters, strict, supports_parallel_tool_calls },
Namespace { name, tools }, // группа tools под одним именем
LocalShell, // OpenAI built-in local_shell
Freeform(FreeformTool), // grammar-based (например, apply_patch); сериализуется как `type: "custom"`
}
FreeformTool содержит поля name, description и format: FreeformToolFormat (где format.type = "grammar", format.syntax = "lark", format.definition = <грамматика Lark>). См. tools/src/responses_api.rs:12 и tools/src/apply_patch_tool.rs:88.
Реестр и handlers
Регистрация — build_tool_registry_plan() в tools/src/tool_registry_plan.rs. Возвращает ToolRegistryPlan — список ConfiguredToolSpec (имя + JSON schema + флаг supports_parallel_tool_calls) и соответствующий ToolHandlerSpec для маршрутизации в core.
Enum ToolHandlerKind (tools/src/tool_registry_plan_types.rs) перечисляет 32 типа handler'а: Shell, ShellCommand, UnifiedExec, ApplyPatch, WriteFile, Goal, Plan, Mcp, McpResource, SpawnAgentV1/V2, WaitAgentV1/V2, CloseAgentV1/V2, SendInputV1, SendMessageV2, ResumeAgentV1, ListAgentsV2, FollowupTaskV2, AgentJobs, CodeModeExecute, CodeModeWait, RequestUserInput, RequestPermissions, ListDir, ViewImage, SearchInFiles, AstraCodeHelp, DynamicTool, TestSync, ToolSuggest.
Sandbox и approvals
Каждый tool маршрутизируется в core::tools::router (см. 19-agent-loop.md) — там применяются permission_profile и approval_policy сессии. Подробнее — 09-security.md.
2. Выполнение команд
exec_command
Файл: tools/src/local_tool.rs:19-89.
Выполнение команды в PTY (unified exec). Может удерживать долгоиграющую сессию.
| Параметр | Тип | Описание |
|---|---|---|
cmd |
string | Команда (передаётся в shell) |
workdir |
string? | Рабочая директория |
shell |
string? | bash/zsh/… (по умолчанию — sticky shell сессии) |
tty |
bool? | Использовать PTY |
yield_time_ms |
int? | Сколько ждать вывода перед возвратом (для long-running) |
max_output_tokens |
int? | Лимит токенов в ответе |
login |
bool? | Login-shell (bash -l) |
Возвращает текст output + опционально session_id (если процесс продолжает работать).
Sandbox: проходит через permission_profile (read/write/shell/network). Approval: по политике (untrusted/on-failure/never).
Parallel calls: ✓ (если sandbox разрешает).
write_stdin
Файл: tools/src/local_tool.rs:92-133.
Запись в stdin активной unified-exec сессии. Использует session_id от предыдущего exec_command.
| Параметр | Тип | Описание |
|---|---|---|
session_id |
number | Числовой ID активной unified-exec сессии |
chars |
string | Что отправить в stdin |
yield_time_ms |
int? | Сколько ждать вывода |
max_output_tokens |
int? | Лимит токенов |
Parallel calls: ✗ (serial по своей природе).
shell (legacy)
Файл: tools/src/local_tool.rs:136+.
Простой однократный shell: получает command: ["arg0", "arg1", ...] массивом и опциональный workdir. Не использует PTY, не держит сессии. Parallel calls: ✓.
shell_command
Альтернативная форма exec_command для legacy провайдеров. Handler: ToolHandlerKind::ShellCommand.
3. Редактирование файлов
apply_patch
Файл: tools/src/apply_patch_tool.rs:89-98.
Freeform tool с grammar (Lark) — не JSON, а специальный формат патчей:
*** Begin Patch *** Update File: path/to/file.rs @@ context line - old line + new line *** End Patch
Поддерживает операции:
- *** Add File: — создать файл (с содержимым).
- *** Update File: — изменить (с контекстом).
- *** Delete File: — удалить.
Approval: по политике; в workspace-write патч в .git/.astracode блокируется sandbox'ом.
Реализация применения — крейт apply-patch/. Поддерживает многосекционные патчи.
Parallel calls: ✗ (изменения файлов сериализуются).
write_file
Файл: tools/src/utility_tool.rs:63-92.
Создаёт новый файл или полностью перезаписывает существующий заданным содержимым. Для точечных правок используйте apply_patch. Лимит: 64 KB содержимого. Перед полной перезаписью существующего файла модель должна прочитать его, чтобы не потерять невидимый контекст.
| Параметр | Тип | Описание |
|---|---|---|
path |
string | Абсолютный путь к файлу |
content |
string | Полное новое содержимое (создаёт или полностью перезаписывает) |
Handler: WriteFile. Approval: по политике (write FS). Parallel calls: ✗.
4. Multi-agent (v1 и v2)
Agent — это вложенный AstraCode-поток, который parent может запустить как worker. Используется для декомпозиции задач (один агент координирует, sub-agents выполняют части параллельно).
По умолчанию AstraCode использует стабильный v1 API: feature multi_agent
включён, а экспериментальный multi_agent_v2 имеет статус
UnderDevelopment и выключен. При включении multi_agent_v2 реестр целиком
заменяет v1-набор tools на v2-набор; одновременно они модели не выдаются.
v1 API (основной)
spawn_agent (agent_tool.rs:28-51)
| Параметр | Тип | Описание |
|---|---|---|
message |
string? | Начальное текстовое задание; используется либо message, либо items |
items |
array? | Структурированный ввод: text/image/local_image/skill/mention |
agent_type |
string? | Роль sub-agent'а; может менять инструкции и назначенную через /submodel пару provider/model |
fork_context |
bool? | При true передать очищенную историю parent thread; по умолчанию false |
Возвращает agent_id (UUID thread) и опциональный nickname. Без явного
fork_context: true новый агент не получает transcript родителя, хотя
наследует runtime config, cwd, permissions и sandbox. При полном fork
передаются user-сообщения и финальные ответы assistant; reasoning,
промежуточные commentary и tool calls/results отфильтровываются.
Parallel calls: ✗.
send_input (agent_tool.rs:89-121) — отправляет существующему агенту message или items. Параметр interrupt: true останавливает текущую задачу и немедленно переключает агента на новый ввод; при false ввод ставится в очередь.
wait_agent — ждёт финальный статус одного из UUID, перечисленных в
targets; принимает опциональный timeout_ms и может вернуть финальный ответ
агента. Handler: WaitAgentV1.
close_agent — завершает указанный по UUID sub-agent thread и его открытых
потомков. Handler: CloseAgentV1.
resume_agent — повторно открывает ранее закрытого агента по UUID, чтобы ему
снова можно было отправлять send_input и ждать его через wait_agent.
Handler: ResumeAgentV1.
v2 API (экспериментальный, по умолчанию выключен)
Включается через feature multi_agent_v2. V2 использует именованное дерево
задач (/root/research/parser) вместо основной адресации по UUID и меняет
семантику передачи истории и межагентного общения.
spawn_agent (agent_tool.rs:53-87)
| Параметр | Тип | Описание |
|---|---|---|
task_name |
string | Обязательное имя задачи из lowercase letters, digits и underscores; формирует канонический путь агента |
message |
string | Обязательное начальное текстовое задание |
agent_type |
string? | Опциональная роль; несовместима с full-history fork |
fork_turns |
string? | none, all или положительное число последних turns; отсутствие поля означает all |
Возвращает канонический task_name и, если metadata не скрыты,
опциональный nickname. Параметр v1 fork_context в v2 отклоняется с ошибкой.
Parallel calls: ✗.
send_message (agent_tool.rs:123-152) — ставит сообщение в mailbox агента, но не запускает новый turn. Параметры: target, message.
followup_task — отправляет следующую задачу и запускает turn свободного
агента; если агент занят, задача выполнится после текущего turn. Handler:
FollowupTaskV2.
wait_agent — ждёт любое обновление mailbox, а не финальный статус
конкретного списка UUID. Принимает опциональный timeout_ms; содержимое
сообщения отдельно доставляется родителю. Handler: WaitAgentV2.
close_agent — завершает агента, адресованного по относительному или
каноническому task path, и его открытых потомков. Handler: CloseAgentV2.
list_agents — перечисляет живых агентов текущего дерева, опционально
ограничивая результат через path_prefix. Handler: ListAgentsV2.
5. Пакетная обработка (Agent Jobs)
Запуск одного и того же агента над CSV-строками с параллелизмом — для batch-задач (массовая обработка тикетов, миграция кода в N файлах, и т.п.).
spawn_agents_on_csv
Файл: tools/src/agent_job_tool.rs:6-63.
| Параметр | Тип | Описание |
|---|---|---|
csv_path |
string | Путь к входному CSV |
instruction |
string | Шаблон с {column_name} плейсхолдерами |
id_column |
string | Колонка-идентификатор |
output_csv_path |
string | Куда писать результаты |
max_concurrency |
int | Сколько workers параллельно |
max_runtime_seconds |
int | Глобальный timeout |
Блокирующий вызов — возвращается только когда все workers завершились.
report_agent_job_result
Файл: tools/src/agent_job_tool.rs:66-100.
Worker-only tool: внутри sub-agent'а вызывается с job_id, item_id, result, stop, чтобы записать строку в output_csv_path. Parent его не вызывает.
6. Планирование и цели
update_plan
Файл: tools/src/plan_tool.rs:6-49.
Обновление checklist плана задачи и прогресса в UI. Это не переключатель
collaboration mode. Handler явно отклоняет update_plan в Plan mode; там план
формируется разговором и итоговым <proposed_plan>, а tool используется в
обычных execution-turns.
| Параметр | Тип | Описание |
|---|---|---|
explanation |
string | Краткое описание изменения плана |
plan |
array of { step: string, status: enum } |
Шаги |
Статусы: pending, in_progress, completed. Parallel: ✗.
get_goal / create_goal / update_goal
Файл: tools/src/goal_tool.rs.
Управление долгоиграющей целью треда (см. 13-goal-and-modes.md):
get_goal— вернуть текущую цель (если есть).create_goal— параметрыobjective(текст),token_budget(опционально, в токенах).update_goal—status: complete | blocked. Только эти два перехода доступны модели (paused/cleared только через UI).
Parallel: ✗.
7. Запросы к пользователю
request_user_input
Файл: tools/src/request_user_input_tool.rs:11-84.
Запрос интерактивного решения у пользователя — TUI рендерит inline-форму с вариантами.
| Параметр | Тип | Описание |
|---|---|---|
questions |
array of { id, header, question, options } |
Список вопросов |
Возвращает массив ответов. Используется, когда модель упирается в неоднозначность и просит уточнить.
request_permissions
Расположение: local_tool.rs:create_request_permissions_tool.
Явный запрос на расширение sandbox-разрешений в текущей сессии. Не обязателен — обычно модель просто пробует команду и реагирует на approval-диалог.
8. MCP (Model Context Protocol)
См. также 06-mcp.md.
list_mcp_resources
Файл: tools/src/mcp_resource_tool.rs:6-32.
Параметры: server (id), cursor (для пагинации). Возвращает список ресурсов.
list_mcp_resource_templates
Файл: tools/src/mcp_resource_tool.rs:34-60.
То же, но для параметризованных ресурсов (с placeholder'ами в URI).
read_mcp_resource
Файл: tools/src/mcp_resource_tool.rs:62-94.
Параметры: server, uri. Возвращает содержимое ресурса (text/json/blob).
Динамические MCP tools
Каждый MCP-сервер регистрирует свои функции — они автоматически попадают в реестр как Namespace { name: "<server_id>", tools: [...] }. См. tools/src/mcp_tool.rs:6-36. Handler — ToolHandlerKind::Mcp.
9. Вспомогательные
search_in_files
Файл: tools/src/utility_tool.rs:94-158.
Полнотекстовый поиск по содержимому файлов под директорией (с учётом .gitignore). Возвращает path:line: text. Предпочтительнее grep/rg/git grep — не требует внешних утилит и не шеллит.
| Параметр | Тип | Описание |
|---|---|---|
query |
string | Текст (или regex, если regex=true) |
path |
string? | Директория поиска (по умолчанию — cwd) |
glob |
string? | Ограничение по файлам (*.rs, src/**/*.py) |
regex |
bool? | Трактовать query как regex (linear-time, ReDoS-safe) |
context_lines |
int? | Контекст вокруг совпадения (0-3) |
max_results |
int? | Лимит совпадений (макс. 200) |
Handler: SearchInFiles. Parallel: ✓.
astracode_help
Файл: tools/src/utility_tool.rs:42-61.
Возвращает авторитетную справку по использованию AstraCode (slash-команды, режимы, лицензия). Используется моделью, когда пользователь спрашивает, как работать с AstraCode. Handler: AstraCodeHelp. Parallel: ✓.
list_dir
Файл: tools/src/utility_tool.rs:6-40.
Перечисление содержимого директории.
| Параметр | Тип | Описание |
|---|---|---|
dir_path |
string | Абсолютный путь к директории |
offset |
int? | 1-indexed смещение |
limit |
int? | Сколько записей вернуть |
depth |
int? | Глубина обхода, целое число не меньше 1 |
Parallel: ✓.
view_image
Файл: tools/src/view_image.rs:14-36.
Подгрузить локальное изображение в контекст модели (если она multi-modal).
| Параметр | Тип | Описание |
|---|---|---|
path |
string | Путь к файлу |
detail |
enum original? |
Опционально запросить исходное разрешение; отсутствие поля использует обычный preview |
Parallel: ✓.
tool_suggest
Файл: tools/src/tool_discovery.rs. Discovery-tool: возвращает список доступных tool'ов с описаниями. Используется агентом для «осмотреться, что я умею». Parallel: ✓.
10. Code Mode (встроенный интерпретатор JavaScript)
code-mode/ крейт — встроенный интерпретатор JavaScript (V8 isolate) для модели. Принимает raw JS-код (без Node, без FS, без сети), выполняет его как async-модуль. Полезен для вычислений, обработки данных, композиции tool-вызовов.
exec
Файл: tools/src/code_mode.rs:138 (create_code_mode_tool; create_wait_tool — на строке 93).
exec — freeform tool: на вход передаётся raw JavaScript, соответствующий Lark
grammar, а не JSON-объект { "code": ... }. Скрипт выполняется как async
module и может вызывать доступные nested tools через объект tools.
Возвращает stdout/stderr/result. Parallel: ✗.
wait
Ожидает завершение ранее yielded cell. Это отдельный function tool с полями
cell_id, опциональными yield_time_ms и max_tokens. Handler:
CodeModeWait.
11. Тестовые / служебные
test_sync_tool
Файл: tools/src/utility_tool.rs:152 (create_test_sync_tool; create_astracode_help_tool — на строке 42).
Для интеграционных тестов: позволяет синхронизировать параллельные tool-вызовы через barrier.
| Параметр | Тип | Описание |
|---|---|---|
sleep_before_ms |
int | Задержка до barrier |
sleep_after_ms |
int | Задержка после |
barrier |
{ id, participants, timeout_ms } |
Барьер |
Не используется моделью в продакшене — только в тестах LLM-режимов.
Dynamic tools
DynamicToolSpec (dynamic_tool.rs:5-13) — runtime-зарегистрированные tools (например, от плагинов). Handler: DynamicTool.
Deferred tools — отложенная загрузка: схема tool'а отправляется модели только по запросу (ToolSearch в Claude), чтобы не раздувать system prompt. См. 19-agent-loop.md.
12. Поведение в sandbox и approval
Каждый tool маршрутизируется через permission_profile:
| Tool | Read FS | Write FS | Shell | Network | Approval по умолчанию |
|---|---|---|---|---|---|
exec_command / shell |
✓ | ✓ (по writable_roots) | ✓ | по network_access |
on-failure |
apply_patch |
✓ | ✓ (workspace) | ✗ | ✗ | on-failure |
list_dir, view_image |
✓ | ✗ | ✗ | ✗ | never |
spawn_agent*, update_plan, *_goal |
— | — | — | — | never (внутренние) |
| MCP tools | по approval_mode сервера |
— | — | — | auto/prompt/approve |
exec (code mode) |
через вызванные nested tools | через вызванные nested tools | JS внутри V8 | напрямую нет | определяется каждым nested tool |
request_user_input |
— | — | — | — | сам по себе диалог |
Approval-диалоги — см. 09-security.md.
13. Что НЕ tool
В отличие от инструментов, скиллы — это markdown-инструкции, которые подгружаются в контекст; они не имеют JSON-schema, не вызываются как функции. Скилл может использовать tools (например, skill-installer использует exec_command для git clone). См. 05-skills.md.
Хуки — это lifecycle event-listeners, а не сами tools. PreToolUse и
PostToolUse покрывают только handlers, которые формируют hook-payload, и
PostToolUse вызывается только после успешного результата. См.
08-hooks.md.
14. Как добавить свой tool
См. подробный recipe в 22-cookbook.md.