ИИ-инструменты
Инструменты дают ИИ-ассистенту возможности, опирающиеся на код вашего расширения. Объявление находится в contributes.tools — имя, описание и схема входа, реализацию предоставляет sdk.ai.
Объявление
| Поле | Обязательно | Описание |
| --- | --- | --- |
| id | да | Короткий идентификатор инструмента — тот же, что вы передаёте в registerTool. |
| name | да | Человекочитаемое имя. |
| description | да | Когда и как ассистенту использовать инструмент. |
| inputSchema | да | JSON схема входа инструмента. |
| needsApproval | | Помечает инструмент как требующий подтверждения пользователя перед запуском. |
Ассистенту предлагаются только инструменты, объявленные в манифесте, поэтому обработчик, зарегистрированный для незадекларированного id, никогда не вызывается.
{
"contributes": {
"tools": [
{
"id": "getWeather",
"name": "Get weather",
"description": "Возвращает текущую погоду для города.",
"inputSchema": {
"type": "object",
"properties": { "city": { "type": "string" } },
"required": ["city"]
}
}
]
}
}
registerTool
registerTool(id: string, handler: (input: unknown) => unknown | Promise<unknown>): IDisposable
Зарегистрируйте обработчик с тем же id, что и в манифесте — Fragmenta добавит к нему id вашего расширения, таким образом полный id инструмента — <publisher>.<name>.<id>.
- Обработчик получает только
input— аргументы, которые ассистент сформировал по вашейinputSchema. Сигнала отмены или контекста вызова нет.inputимеет типunknown: приведите его к форме схемы или валидируйте, если не можете полагаться на то, что ассистент следует схеме. - Всё, что возвращает обработчик или значение, в которое разрешается его промис, передаётся обратно ассистенту как результат инструмента.
- Если обработчик выбрасывает исключение или отклоняется, ассистент получает ошибку инструмента с
messageэтой ошибки. inputи результат пересекают границу хоста расширения, поэтому должны быть сериализуемыми: простые объекты, массивы, строки, числа, логические значения иnull.- Если у задекларированного инструмента нет зарегистрированного обработчика — например, после освобождения регистрации, — вызов завершается ошибкой инструмента.
- Регистрации удаляются при деактивации расширения.
export function activate(context: ExtensionContext) {
context.subscriptions.push(
sdk.ai.registerTool('getWeather', async (input) => {
const { city } = input as { city: string }
return fetchWeather(city)
}),
)
}