18. Каталог встроенных инструментов
Инструмент (tool) — это функция, которую модель может вызвать в ходе своего ответа (через function_call в OpenAI API / tool_use в Anthropic API). AstraCode имеет ~30 встроенных инструментов плюс динамические (MCP, custom).
Реализация — крейт tools/. Реестр и диспетчеризация — core::tools (см. 19-agent-loop.md).
1. Архитектура
Типы спецификаций
В tools/src/tool_spec.rs:
pub enum ToolSpec {
Function(ResponsesApiTool), // обычный function-call (name/description/parameters/strict/...)
Namespace(ResponsesApiNamespace), // группа инструментов под одним именем
LocalShell {}, // OpenAI built-in local_shell
Freeform(FreeformTool), // grammar-based (например, apply_patch)
}
Это tuple-варианты enum'а, а не struct с полями (схема выше — концептуальная). Флаг supports_parallel_tool_calls живёт не в самом ToolSpec, а в обёртке ConfiguredToolSpec { spec, supports_parallel_tool_calls }.
Реестр и handlers
Регистрация — build_tool_registry_plan() в tools/src/tool_registry_plan.rs. Возвращает ToolRegistryPlan — список ConfiguredToolSpec (имя + JSON schema + флаг supports_parallel_tool_calls) и соответствующий ToolHandlerSpec для маршрутизации в core.
Enum ToolHandlerKind (tool_registry_plan_types.rs) перечисляет 29 типов handler'ов: Shell, ShellCommand, UnifiedExec, ApplyPatch, Goal, Plan, Mcp, McpResource, SpawnAgentV1/V2, WaitAgentV1/V2, CloseAgentV1/V2, SendInputV1, SendMessageV2, ResumeAgentV1, ListAgentsV2, FollowupTaskV2, AgentJobs, CodeModeExecute, CodeModeWait, RequestUserInput, RequestPermissions, ListDir, ViewImage, DynamicTool, TestSync, ToolSuggest.
Sandbox и approvals
Каждый инструмент маршрутизируется в 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 |
string | ID активной сессии |
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.
Прим.: ниже «инструмент» и
toolиспользуются как синонимы; имена конкретных инструментов и типов (exec_command,ToolHandlerKindи т.п.) не переводятся.
3. Редактирование файлов
apply_patch
Файл: tools/src/apply_patch_tool.rs:89-98.
Freeform-инструмент с 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: ✗ (изменения файлов сериализуются).
4. Multi-agent (v1 и v2)
Agent — это вложенный AstraCode-поток, который parent может запустить как worker. Используется для декомпозиции задач (один агент координирует, sub-agents выполняют части параллельно).
v2 API (актуальный)
spawn_agent (agent_tool.rs:54-87)
| Параметр | Тип | Описание |
|---|---|---|
task_name |
string | Имя задачи (обяз.; lowercase + цифры + подчёркивания) |
message |
string | Начальный prompt для sub-agent'а (обяз.) |
agent_type |
string? | Тип агента |
fork_turns |
string? | Сколько turn'ов форкнуть: none / all (дефолт) / число вроде 3 |
model |
string? | Переопределить модель (по умолчанию наследует модель parent'а) |
Обязательны task_name и message. Возвращает task_name (канонический). Parallel calls: ✗.
send_message (agent_tool.rs:124-150) — non-blocking сообщение запущенному агенту. Параметры: target, message.
followup_task — последующая задача в той же агентной сессии. Handler: FollowupTaskV2.
wait_agent — блокирующее ожидание обновления mailbox любого живого агента. Параметр: timeout_ms. Handler: WaitAgentV2.
close_agent — корректное завершение sub-agent'а. Handler: CloseAgentV2.
list_agents — список активных sub-agents с их статусом. Handler: ListAgentsV2.
v1 API (legacy)
Сохранён для совместимости. Имена методов те же, но spawn_agent не требует task_name, есть send_input (с поддержкой interrupt) и resume_agent. Handler kinds: SpawnAgentV1, SendInputV1, WaitAgentV1, CloseAgentV1, ResumeAgentV1.
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 параллельно (дефолт 16, alias — max_workers) |
max_runtime_seconds |
int? | Timeout на одного worker'а (дефолт 1800 с) |
Блокирующий вызов — возвращается только когда все workers завершились.
report_agent_job_result
Файл: tools/src/agent_job_tool.rs:66-100.
Worker-only инструмент: внутри sub-agent'а вызывается с job_id, item_id, result, stop, чтобы записать строку в output_csv_path. Parent его не вызывает.
6. Планирование и цели
update_plan
Файл: tools/src/plan_tool.rs:6-49.
Обновление плана задачи. Используется в режиме /plan (см. 13-goal-and-modes.md) и в обычных turn'ах для подачи прогресса в UI.
| Параметр | Тип | Описание |
|---|---|---|
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-инструменты
Каждый MCP-сервер регистрирует свои функции — они автоматически попадают в реестр как Namespace { name: "<server_id>", tools: [...] }. См. tools/src/mcp_tool.rs:6-36. Handler — ToolHandlerKind::Mcp.
9. Вспомогательные
list_dir
Файл: tools/src/utility_tool.rs:6-40.
Перечисление содержимого директории.
| Параметр | Тип | Описание |
|---|---|---|
dir_path |
string | Путь (относительный или абсолютный) |
offset |
int? | 1-indexed смещение |
limit |
int? | Сколько записей вернуть |
depth |
int? | Рекурсия (0 = только текущий уровень) |
Parallel: ✓.
view_image
Файл: tools/src/view_image.rs:14-36.
Подгрузить локальное изображение в контекст модели (если она multi-modal).
| Параметр | Тип | Описание |
|---|---|---|
path |
string | Путь к файлу |
detail |
string? | Единственное поддерживаемое значение — original (оригинальное разрешение); опустить поле для дефолтного ресайза |
Parallel: ✓.
tool_suggest
Файл: tools/src/tool_discovery.rs. Инструмент обнаружения: возвращает список доступных инструментов с описаниями. Используется агентом для «осмотреться, что я умею». Parallel: ✓.
10. Code Mode (встроенный JavaScript-движок)
Экспериментальная функция. Включается feature-флагом
code_mode(Stage::UnderDevelopment,default_enabled: false—features/src/lib.rs:602-606); по умолчанию выключена.
code-mode/ крейт — встроенный движок для запуска JavaScript (модель оркестрирует вызовы инструментов кодом). Поддерживается только JavaScript, исполняемый в изолированном V8 isolate (code-mode/src/description.rs:14-20): без Node.js, без файловой системы, без сети, без console. Python не поддерживается. Полезен для оркестрации/композиции tool-вызовов, вычислений, обработки данных.
code_mode (execute)
Файл: tools/src/code_mode.rs:93-120.
| Параметр | Тип | Описание |
|---|---|---|
code |
string | Код для выполнения |
cell_id |
string? | Идентификатор cell (для wait) |
Возвращает stdout/stderr/result. Parallel: ✗.
wait
Wait на завершение асинхронной cell. Handler: CodeModeWait.
11. Тестовые / служебные
test_sync_tool
Файл: tools/src/utility_tool.rs:42-96.
Для интеграционных тестов: позволяет синхронизировать параллельные вызовы инструментов через 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 инструменты (например, от плагинов). Handler: DynamicTool.
Deferred tools — отложенная загрузка: схема инструмента отправляется модели только по запросу (ToolSearch в Claude), чтобы не раздувать system prompt. См. 19-agent-loop.md.
12. Поведение в sandbox и approval
Каждый инструмент маршрутизируется через permission_profile:
| Инструмент | 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-инструменты | по approval_mode сервера |
— | — | — | auto/prompt/approve |
code_mode |
✓ | ✓ (sandboxed) | ✓ (REPL) | по политике | prompt |
request_user_input |
— | — | — | — | сам по себе диалог |
Approval-диалоги — см. 09-security.md.
13. Что НЕ инструмент
В отличие от инструментов, скиллы — это markdown-инструкции, которые подгружаются в контекст; они не имеют JSON-schema, не вызываются как функции. Скилл может использовать инструменты (например, skill-installer использует exec_command для git clone). См. 05-skills.md.
Хуки — это event-listeners на pre/post-tool, не сами инструменты. См. 08-hooks.md.
14. Как добавить свой инструмент
См. подробный recipe в 22-cookbook.md.