Standard Tool: попытка унифицировать описание инструментов для LLM

Habr AI · оригинал

Материал подготовлен автоматизированной редакционной системой. Факты можно сверить по указанному первоисточнику.

Разработчики предлагают стандарт StandardToolV0, который позволяет описывать инструменты для языковых моделей независимым от фреймворков объектом. Это решение устраняет необходимость переписывания кода при смене AI-библиотеки и упрощает интеграцию с различными провайдерами.

Стандартизация интерфейсов инструментов снижает технический долг в AI-проектах, позволяя переиспользовать код между разными фреймворками и провайдерами моделей без создания отдельных адаптеров для каждого стека.

В экосистеме больших языковых моделей (LLM) распространена проблема фрагментации инструментов. Чтобы предоставить модели доступ к внешним функциям, разработчики создают «инструменты» — функции с описанием и схемой аргументов. Однако каждый популярный фреймворк, такой как AI SDK, Genkit или MCP, требует собственной обёртки для этих функций. В результате одна и та же логика часто переписывается трижды: под tool() из AI SDK, registerTool из MCP-сервера и defineTool из Genkit. При этом сами функции остаются неизменными, меняется лишь синтаксис объявления, что создает лишнюю нагрузку на поддержку кода.

Для решения этой проблемы авторы библиотек валидации Zod, Valibot и ArkType предложили подход, основанный на стандартах. Ключевую роль здесь играет Standard Schema — TypeScript-интерфейс, который позволяет коду принимать схемы валидации от любой поддерживающей спецификацию библиотеки без необходимости писать отдельные адаптеры. Эта спецификация реализована более чем 30 библиотеками и поддерживается десятками проектов, включая tRPC, TanStack Form и Hono. Поскольку интерфейс состоит только из типов и не содержит рантайм-кода, его можно легко скопировать в проект или импортировать как тип.

Вторая часть головоломки — Standard JSON Schema. Прежде чем модель вызовет инструмент, она должна получить описание аргументов в формате JSON Schema. Разные провайдеры требуют разных диалектов: OpenAI и Anthropic используют draft 2020-12, тогда как Gemini ожидает формат OpenAPI 3.0. Standard JSON Schema добавляет в объект схемы метод конвертации в нужный формат, разделяя при этом схемы входа и выхода. Это важно, так как схема может преобразовывать данные (например, приводить строку к числу), и входной тип может отличаться от выходного.

На основе этих двух стандартов формируется интерфейс StandardToolV0. Он описывает инструмент как объект с полями name, description, inputSchema, outputSchema и функцией execute. Такой объект является независимым от фреймворка: его можно вызвать напрямую в скрипте, использовать для генерации документации или экспортировать из библиотеки. Пользователи такой библиотеки смогут запускать инструменты или передавать их моделям, не устанавливая при этом конкретный AI-фреймворк. Это особенно полезно для RPC-процедур tRPC или oRPC, которые уже имеют схемы и обработчики.

Интеграция с провайдерами моделей сводится к двум шагам: сборке описания инструмента из полей объекта и запуску функции execute при вызове модели. Адаптер для конкретного провайдера (например, Anthropic или OpenAI) пишется один раз и не требует изменений при добавлении новых инструментов. В отличие от фреймворков, где объекты инструментов часто не взаимозаменяемы и требуют установки зависимостей конкретного стека, стандартный объект остается частью вашего кода.

Важно отметить, что StandardToolV0 на данный момент является предложением (пропозалом), а не устоявшимся стандартом. Форма интерфейса заморожена в версии V0, чтобы обеспечить стабильность, но широкая поддержка со стороны сообщества пока отсутствует. В отличие от Standard Schema, за которой стоят создатели популярных библиотек, у этого предложения один мейнтейнер. Тем не менее, если другие проекты начнут создавать и читать такие объекты, это может стать новым конкурентным форматом, упрощающим работу с LLM-инструментами.