12 KiB
Qwen Code Core: Tools API
Ядро Qwen Code (packages/core) предоставляет надежную систему для определения, регистрации и выполнения инструментов. Эти инструменты расширяют возможности модели, позволяя ей взаимодействовать с локальной средой, получать веб-контент и выполнять различные действия, выходящие за рамки простой генерации текста.
Основные концепции
-
Инструмент (
tools.ts): Интерфейс и базовый класс (BaseTool), определяющие контракт для всех инструментов. Каждый инструмент должен иметь:name: Уникальное внутреннее имя (используется в API-вызовах к модели).displayName: Удобочитаемое имя.description: Четкое описание того, что делает инструмент. Эта информация передается модели.parameterSchema: JSON-схема, определяющая параметры, которые принимает инструмент. Это важно для того, чтобы модель понимала, как правильно вызывать инструмент.validateToolParams(): Метод для валидации входящих параметров.getDescription(): Метод, возвращающий человекочитаемое описание того, что инструмент сделает с конкретными параметрами перед выполнением.shouldConfirmExecute(): Метод, определяющий, требуется ли подтверждение от пользователя перед выполнением (например, для потенциально деструктивных операций).execute(): Основной метод, выполняющий действие инструмента и возвращающийToolResult.
-
ToolResult(tools.ts): Интерфейс, определяющий структуру результата выполнения инструмента:llmContent: Фактическое содержимое, которое будет включено в историю и отправлено обратно LLM для контекста. Это может быть простая строка илиPartListUnion(массив объектовPartи строк) для richer content.returnDisplay: Удобочитаемая строка (часто в формате Markdown) или специальный объект (например,FileDiff) для отображения в CLI.
-
Возврат rich content: Инструменты не ограничены простым текстом.
llmContentможет бытьPartListUnion, то есть массивом, содержащим как объектыPart(для изображений, аудио и т.д.), так и строки. Это позволяет одному вызову инструмента возвращать несколько элементов rich content. -
Реестр инструментов (
tool-registry.ts): Класс (ToolRegistry), отвечающий за:- Регистрацию инструментов: Хранит коллекцию всех доступных встроенных инструментов (например,
ReadFileTool,ShellTool). - Обнаружение инструментов: Также может динамически находить инструменты:
- Обнаружение через команду: Если в настройках указан
toolDiscoveryCommand, эта команда будет выполнена. Ожидается, что она выведет JSON с описанием пользовательских инструментов, которые затем регистрируются как экземплярыDiscoveredTool. - Обнаружение через MCP: Если указан
mcpServerCommand, реестр может подключиться к серверу по протоколу Model Context Protocol (MCP), получить список инструментов и зарегистрировать их какDiscoveredMCPTool.
- Обнаружение через команду: Если в настройках указан
- Предоставление схем: Экспонирование схем
FunctionDeclarationвсех зарегистрированных инструментов модели, чтобы она знала, какие инструменты доступны и как их использовать. - Получение инструментов: Позволяет ядру получить конкретный инструмент по имени для выполнения.
- Регистрацию инструментов: Хранит коллекцию всех доступных встроенных инструментов (например,
Встроенные инструменты
Ядро поставляется с набором предопределённых инструментов, обычно расположенных в packages/core/src/tools/. Среди них:
- Инструменты для работы с файловой системой:
LSTool(ls.ts): Выводит содержимое директории.ReadFileTool(read-file.ts): Читает содержимое одного файла. Принимает параметрabsolute_path, который должен быть абсолютным путем.WriteFileTool(write-file.ts): Записывает данные в файл.GrepTool(grep.ts): Ищет совпадения по шаблону в файлах.GlobTool(glob.ts): Находит файлы, соответствующие glob-шаблонам.EditTool(edit.ts): Выполняет замену содержимого файла "на месте" (часто требует подтверждения).ReadManyFilesTool(read-many-files.ts): Читает и объединяет содержимое нескольких файлов или glob-шаблонов (используется командой@в CLI).
- Инструменты выполнения:
ShellTool(shell.ts): Выполняет произвольные shell-команды (требует тщательной песочницы и подтверждения от пользователя).
- Web-инструменты:
WebFetchTool(web-fetch.ts): Получает данные по URL.WebSearchTool(web-search.ts): Выполняет поиск в интернете.
- Инструменты памяти:
MemoryTool(memoryTool.ts): Взаимодействует с памятью ИИ.
Каждый из этих инструментов наследуется от BaseTool и реализует необходимые методы для своей конкретной функциональности.
Порядок выполнения инструмента
- Запрос модели: Модель, основываясь на запросе пользователя и предоставленных схемах инструментов, решает использовать инструмент и возвращает часть
FunctionCallв своем ответе, указывая имя инструмента и аргументы. - Ядро получает запрос: Ядро парсит этот
FunctionCall. - Получение инструмента: Оно ищет запрашиваемый инструмент в
ToolRegistry. - Валидация параметров: Вызывается метод инструмента
validateToolParams(). - Подтверждение (если необходимо):
- Вызывается метод инструмента
shouldConfirmExecute(). - Если он возвращает данные для подтверждения, ядро передает их обратно в CLI, который запрашивает решение у пользователя.
- Решение пользователя (например, продолжить, отменить) отправляется обратно в ядро.
- Вызывается метод инструмента
- Выполнение: Если параметры прошли валидацию и получено подтверждение (или подтверждение не требуется), ядро вызывает метод инструмента
execute()с переданными аргументами иAbortSignal(для возможной отмены). - Обработка результата:
ToolResultиз методаexecute()получает ядро. - Ответ модели:
llmContentизToolResultупаковывается какFunctionResponseи отправляется обратно модели, чтобы она могла продолжить генерацию ответа для пользователя. - Отображение пользователю:
returnDisplayизToolResultотправляется в CLI, чтобы показать пользователю, что сделал инструмент.
Расширение с помощью пользовательских инструментов
Хотя прямая программная регистрация новых инструментов пользователями не описана явно как основной сценарий использования в предоставленных файлах для типичных конечных пользователей, архитектура поддерживает расширение через:
- Обнаружение на основе команд: Продвинутые пользователи или администраторы проекта могут определить
toolDiscoveryCommandвsettings.json. Эта команда, при запуске ядром, должна выводить JSON-массив объектовFunctionDeclaration. Затем ядро сделает их доступными как экземплярыDiscoveredTool. Соответствующая командаtoolCallCommandбудет отвечать за фактическое выполнение этих пользовательских инструментов. - MCP сервер(ы): Для более сложных сценариев можно настроить один или несколько MCP серверов через параметр
mcpServersвsettings.json. Ядро сможет обнаруживать и использовать инструменты, предоставляемые этими серверами. Как упоминалось ранее, если у вас несколько MCP серверов, имена инструментов будут иметь префикс с именем сервера из вашей конфигурации (например,serverAlias__actualToolName).
Эта система инструментов предоставляет гибкий и мощный способ расширения возможностей модели, делая Qwen Code универсальным помощником для широкого спектра задач.