Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Агент ИИ вызывает средства: HTTP API, серверы MCP и другие службы. Эти средства завершаются по тайм-ауту, упираются в лимиты запросов, возвращают ошибки и отправляют данные в структурах, которых вы не ожидали. Модель решает, что делать дальше на основе того, что ваш код передает обратно в него. Если ваш код возвращает исключение, пустую строку или ничего не возвращает вообще после длительного ожидания, агент ведет себя по-другому, чем если он получает четкую ошибку.
Как происходят сбои инструментов
- Агент зависает. Вызов средства без тайм-аута держит пользователя в ожидании.
- Агент зацикливается. Модель снова и снова вызывает неисправный инструмент, используя маркеры и ограничение скорости инструмента.
- Агент скрывает это. Код подавляет ошибку, и модель отвечает, как будто инструмент отработал успешно.
- Агент аварийно завершает работу. Необработанное исключение прерывает весь диалог.
Как устранять сбои инструментов
- Задайте время ожидания для каждого вызова средства и бюджет для всего хода. Спецификация MCP говорит, что клиенты должны реализовывать время ожидания для вызовов инструментов.
- Повторите попытку при временных ошибках в коде. Обрабатывайте ответы 429 и 503 в коде инструмента, учитывайте
Retry-Afterи ограничивайте число попыток, чтобы модели не приходилось решать, когда повторять попытку. - Возвращать модели сбои в виде четких результатов. MCP отделяет ошибки протокола, такие как неизвестный инструмент или недопустимые аргументы, от ошибок выполнения инструмента, таких как сбой API. Он сообщает об ошибках выполнения в результате работы инструмента
isError: true, поэтому модель может увидеть, что пошло не так. Скажите, что не удалось и имеет ли смысл повторить попытку. - Ограничьте количество вызовов инструментов за ход. После заданного количества сбоев остановите и сообщите пользователю.
- Проверяйте результаты средства перед передачей их в модель. Спецификация MCP говорит, что клиенты должны делать это и должны проверять структурированные результаты по схеме выходных данных инструмента, если таковая имеется.
- Сообщите пользователю, что не работало. Ответ, основанный на неудачном вызове инструмента, должен прямо указать на это.
Как протестировать обработку сбоев инструмента в агенте
| Approach | Что вы найдете | Чего вам не хватает |
|---|---|---|
| Проводите модульное тестирование оболочки средства с клиентом-заглушкой | Как код сопоставляет ошибку, которую вы описали | То, что модель делает с ней, и как настоящий инструмент не справляется |
| Нарушить работу реального инструмента, например остановить сервер или отозвать ключ | Реальный отказ такого рода | Лимиты частоты запросов, медленные ответы и неправильные данные, которые невозможно вызвать по запросу |
| Напишите поддельный API или сервер MCP | Любой ответ, который вы прописываете | Вам нужно указать агенту на подделку, и он отклоняется от реального инструмента |
| Перехват реального трафика инструмента агента и внедрение сбоев | Что агент и модель делают с ошибками, задержками и плохими данными из реального средства | Ваш код в изоляции. Оставьте это для модульных тестов. |
Выходные данные модели могут отличаться от запуска к запуску, поэтому запустите каждый сценарий сбоя несколько раз.
Попробуйте в вашем приложении
Dev Proxy находится между агентом и его инструментами и внедряет сбои без изменений в коде агента.
Для инструментов, вызывающих HTTP API, объединяйте случайные ошибки, задержку и убедитесь, что агент ожидает столько, сколько запрашивает API:
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "LatencyPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "latencyPlugin"
},
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "errorsContosoApi"
}
],
"urlsToWatch": [
"https://api.contoso.com/*"
],
"latencyPlugin": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/latencyplugin.schema.json",
"minMs": 2000,
"maxMs": 10000
},
"errorsContosoApi": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
"errorsFile": "errors-contoso-api.json",
"rate": 50
}
}
Определите ошибки в errors-contoso-api.json, как описано в Протестируйте мое приложение со случайными ошибками. Установите для Retry-After значение @dynamic в ваших ответах 429. RetryAfterPlugin проверяет только их.
Для серверов MCP, использующих STDIO, запустите сервер через devproxy stdio с конфигурацией, которая включает MockStdioResponsePlugin, как показано в stdio примере конфигурации. Сохраните его как devproxyrc-stdio.json. Затем поместите это в stdio-mocks.json, чтобы вернуть ошибку выполнения средства для каждого tools/call запроса:
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/mockstdioresponseplugin.mocksfile.schema.json",
"mocks": [
{
"request": {
"bodyFragment": "tools/call"
},
"response": {
"stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Failed to fetch weather data: API rate limit exceeded\"}],\"isError\":true}}\n"
}
}
]
}
devproxy stdio --config-file devproxyrc-stdio.json npx -y @modelcontextprotocol/server-filesystem
Чтобы ваш агент использовал это, измените команду в конфигурации сервера MCP агента, чтобы сервер запускался через devproxy stdio. Используйте nth свойство у mock-объекта, чтобы завершить только определенный вызов, и добавьте LatencyPlugin, чтобы замедлить ответы сервера.
Чтобы проверить, что делает агент при сбое самой модели, LanguageModelFailurePlugin заставляет модель галлюцинировать, игнорировать инструкции или отвечать в неправильном формате. См. статью "Тестирование приложения с ошибками языковой модели".
Чтобы установить Dev Proxy, см. статью «Настройка Dev Proxy».