Вызов инструмента не происходит, параметры отклоняются или Agent зацикливается после ошибки.

Сначала определите слой сбоя — вывод модели, Schema, исполнитель, возврат результата или контекст. Исправляйте критические ограничения в коде, а не только в промпте.

Эта статья предназначена для трёх групп:

  • инженеров, создающих инструментальных Agent на Muse Spark 1.2;
  • разработчиков платформы, поддерживающей оркестрацию и функции;
  • команд, которым нужна стабильная автоматизация с повторяемыми результатами.

Последнее обновление: 12 августа 2026 года. Статус возможностей сверялся с официальными материалами Meta и документацией Meta Model API; конкретные поля и коды ошибок необходимо перепроверять перед каждым обновлением интеграции.

Граница ответственности: модель против фреймворка

Muse Spark создавался для агентных сценариев, кодирования и работы с инструментами. В официальном описании семейства Muse указана поддержка tool use и многокомпонентной оркестрации, а в материалах по Meta Model API отдельно упоминаются структурированный вывод и параллельные вызовы инструментов. Это подтверждает наличие нужного класса возможностей, но не гарантирует, что конкретный SDK, адаптер или ваш исполнительный слой передаёт их без изменений.

Проверяйте цепочку по времени:

  1. ваш код отправил список инструментов;
  2. API вернул ответ модели;
  3. фреймворк извлёк вызов функции;
  4. Schema проверила аргументы;
  5. исполнитель запустил операцию;
  6. результат был сериализован;
  7. результат вернулся в правильном сообщении;
  8. модель продолжила задачу или завершила её.

Если первый вызов не появился в ответе API, проблема находится до исполнителя. Если вызов есть, но ваш код его не запускает, промпт уже не является главным подозреваемым. Если инструмент отработал, но модель снова просит сделать то же самое, проверяйте сообщение с результатом и состояние операции.

Для ориентира сохраните три объекта: исходный запрос, необработанный ответ модели и финальное сообщение, которое получил Agent. Логи только последнего шага недостаточны: они скрывают, где именно данные изменились.

Muse Spark 1.1, представленный 9 июля 2026 года, официально получил доступ через Meta Model API в режиме публичного предварительного просмотра. В материалах Meta также заявлено управление контекстом до 1 миллиона токенов. Эти сведения показывают направление платформы, но не заменяют проверку текущего поведения версии 1.2 в вашем окружении: режимы API, имена полей и формат событий могли измениться. Сверяйтесь с официальным описанием Muse Spark и Meta Model API и актуальным разделом для разработчиков.

Выбор инструмента: ясное описание против свободного выбора

Почему Muse Spark 1.2 не вызывает инструмент, хотя он передан в запросе?

Чаще всего модель не видит однозначного основания для вызова. В манифесте может быть несколько похожих функций, а условие выбора спрятано в длинном описании. Ещё одна причина — фреймворк отправляет инструменты не в том поле или удаляет их при преобразовании запроса.

Сначала выполните контрольное сравнение. Отправьте одну и ту же задачу в двух вариантах:

  • с полным списком инструментов;
  • с одним заведомо подходящим инструментом.

Если при одном инструменте вызов появляется, проблема вероятнее всего связана с конкуренцией описаний или неоднозначным условием выбора. Если вызова нет и в минимальном запросе, сравните формат запроса с документацией API и проверьте, что адаптер действительно передаёт массив инструментов.

Описание функции должно отвечать на три вопроса:

  • какое действие она выполняет;
  • в какой ситуации её нужно выбрать;
  • когда её выбирать нельзя.

Слабое описание:

{
  "name": "search",
  "description": "Ищет данные"
}

Более диагностичное описание:

{
  "name": "search_orders",
  "description": "Ищет заказы по номеру или адресу электронной почты. Вызывайте только после явного указания пользователем номера заказа или адреса. Не используйте для каталога товаров и общих вопросов."
}

Не смешивайте выбор инструмента с бизнес-авторизацией. Модель может решить, что операция нужна, но не должна сама определять, разрешено ли менять данные. Проверка роли, владельца ресурса, лимита и текущего статуса выполняется программно.

Schema: ожидаемый JSON против фактических аргументов

Как обработать ошибку формата параметров инструмента?

Не исправляйте её повторным запросом вслепую. Запишите исходный фрагмент аргументов и полный результат валидатора. Затем классифицируйте проблему:

  • отсутствует обязательное поле;
  • передан неверный тип;
  • значение не входит в допустимый перечень;
  • объект вложен не на том уровне;
  • число или дата пришли в неподходящем формате;
  • модель вернула JSON внутри строки вместо JSON-объекта.

Типичная ошибка выглядит так:

{
  "action": "create_task",
  "arguments": {
    "title": "Проверить отчёт",
    "priority": "urgent",
    "due_date": "завтра"
  }
}

Если Schema допускает только low, normal и high, значение urgent должно быть отклонено исполнительным слоем. То же относится к дате: слово «завтра» требует вычисления относительно часового пояса и текущей даты. Модель не должна получать право самостоятельно превращать неоднозначную дату в операцию записи.

Используйте валидатор до запуска инструмента. При отказе возвращайте модели структурированную причину:

{
  "status": "rejected",
  "stage": "schema_validation",
  "field": "priority",
  "reason": "value_not_allowed",
  "allowed": ["low", "normal", "high"],
  "retryable": true
}

Это не официальный код ошибки Muse Spark 1.2, а внутренний формат диагностики вашего приложения. Не называйте его ответом API. Конкретные поля Meta Model API следует сверять по официальной документации перед внедрением.

Полезно разделить две Schema:

  1. входную — для аргументов, которые предлагает модель;
  2. доменную — для правил вашей системы.

Например, входная Schema может разрешить строковый идентификатор, но доменная проверка должна дополнительно выяснить, существует ли объект, доступен ли он пользователю и не закрыт ли уже другой операцией.

Для проверки структуры используйте официальную спецификацию JSON Schema. Если инструменты подключаются через MCP, отдельно сверяйте спецификацию протокола MCP: наличие инструмента в каталоге ещё не означает, что ваш клиент правильно передал его описание и обработал ответ.

Ошибки транспортного слоя также не стоит принимать за ошибки модели. При тайм-ауте, разрыве соединения или неполном ответе фиксируйте состояние запроса отдельно от результата функции. Для семантики HTTP-ответов, повторной доставки и обработки сетевых ошибок полезно сверяться с официальным стандартом HTTP Semantics RFC 9110.

Исполнитель: отклонение против реального запуска

Между валидной Schema и успешным действием есть ещё один слой. Исполнитель должен проверить разрешения, тайм-аут, соединение, текущий статус объекта и возможность безопасного повтора.

Соберите для каждой операции следующие поля:

  • run_id;
  • tool_name;
  • хэш аргументов;
  • время постановки;
  • время старта;
  • время завершения;
  • итоговый статус;
  • причина отказа;
  • идентификатор внешней операции.

Не записывайте секреты и токены в исходный лог. Для чувствительных данных применяйте маскирование до отправки на хранение. На тестовом Mac-узле можно держать отдельный журнал событий и сверять его с выводом консоли через раздел консоли MacPng.

Если операция изменяет состояние, добавьте идемпотентный ключ. Например:

idem_key = hash(run_id + tool_name + canonical_arguments)

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

Не передавайте модели необработанный stack trace. Возвращайте короткую причину, признак повторяемости и следующий допустимый шаг:

{
  "status": "failed",
  "stage": "executor",
  "retryable": false,
  "reason": "permission_denied",
  "next_action": "request_approval"
}

Модель может объяснить отказ пользователю, но окончательное решение о повторе принимает программа.

Возврат результата: полный ответ против пригодного состояния

Почему длинный результат инструмента теряется в задаче?

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

Проверьте пять признаков:

  1. результат добавлен в историю после вызова, а не перед ним;
  2. имя инструмента и идентификатор вызова совпадают;
  3. содержимое передано в ожидаемом формате;
  4. ошибка и успешный ответ не перепутаны;
  5. после тайм-аута старый результат не добавляется как новый.

Большие ответы нельзя без фильтра помещать обратно в контекст. Сначала сохраните полный документ во внешнем хранилище, затем верните модели сводку, идентификатор объекта, ключевые поля и ссылку на получение следующей порции.

Пример полезного ответа:

{
  "status": "success",
  "result_id": "r_8f31",
  "items_returned": 20,
  "items_total": 240,
  "next_cursor": "page_2",
  "summary": "Найдено 240 записей, первые 20 готовы к обработке."
}

Так модель понимает, что операция завершена, но данные не обязательно полностью загружены. Для длинных задач сохраняйте состояние отдельно от переписки. Контекст — это рабочая память модели, а не надёжная база данных.

Официальные материалы Meta описывают работу с длинными агентными сессиями и сжатие контекста, однако конкретная реализация в вашем фреймворке может отличаться. Поэтому измеряйте не только размер запроса, но и факт сохранения контрольных полей после каждого этапа. Дополнительные правила обработки персональных данных соберите в руководстве MacPng по приватности.

Повторы: автоматический retry против зацикливания

Почему Agent повторяет одно и то же действие?

Обычно причина находится в одном из трёх мест:

  • исполнитель вернул ошибку без признака завершённости;
  • результат не связан с исходным вызовом;
  • фреймворк повторно отправил старое состояние после тайм-аута.

У каждого вызова должен быть конечный жизненный цикл:

planned → started → succeeded
                  ↘ failed
                  ↘ timed_out
                  ↘ cancelled

Повтор разрешайте только для временных сбоев: кратковременного разрыва соединения, временной недоступности сервиса или ответа без подтверждения результата. Для ошибок Schema, разрешений и отсутствующего объекта автоматический повтор обычно бесполезен.

Попросите модель перед повтором сформулировать причину отказа и изменение аргументов. Это помогает в отладке, но не является защитой. Жёсткие ограничения задаются программой:

  • максимальное количество попыток на один run_id;
  • задержка между попытками;
  • запрет повторять неизменённые аргументы;
  • обязательная проверка состояния внешнего объекта;
  • ручное подтверждение опасных действий.

Отдельно различайте повтор запроса и продолжение операции. Если внешний сервис принял действие, но ответ потерялся, новый вызов может создать дубль. Сначала выполняйте запрос статуса по идемпотентному ключу, затем решайте, нужен ли повтор.

Длинная задача: исходная цель против изменившегося состояния

В длинном процессе цель может сместиться не из-за «плохого мышления» модели. Измениться могли файлы, права, записи в базе, ветка проекта или входные данные.

Ставьте контрольные точки после каждого крупного этапа. В контрольной записи храните:

  • исходную цель;
  • текущий план;
  • выполненные действия;
  • ожидаемое следующее действие;
  • актуальные разрешения;
  • состояние внешних ресурсов;
  • время последней проверки.

На каждой контрольной точке Agent должен заново подтвердить три вещи: цель не изменилась, разрешения всё ещё действуют, предыдущий шаг действительно завершён. Если контекст был сжат, не полагайтесь на пересказ модели. Загружайте контрольное состояние из внешнего хранилища.

Что делать, если результат инструмента исчезает в длинном процессе?

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

Пошаговый маршрут диагностики Agent

Следуйте этому порядку. Переход к следующему пункту делайте только после фиксации результата предыдущего.

Шаг 1. Заморозьте воспроизведение

Создайте минимальную задачу с одним инструментом, короткими аргументами и отключёнными второстепенными middleware. Сохраните идентификатор модели, версию SDK, тело запроса и необработанный ответ.

Шаг 2. Проверьте доступность инструмента

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

Шаг 3. Провалидируйте аргументы отдельно

Запустите тот же JSON через локальный валидатор. Если Schema отклоняет данные без участия модели, исправляйте контракт. Если локальная проверка проходит, а исполнитель отказывает, ищите доменное правило или несовпадение формата API.

Шаг 4. Запустите исполнитель вручную

Подайте заранее подготовленные валидные аргументы напрямую в инструмент. Это отделяет сбой модели от сбоя сети, разрешений, тайм-аута и бизнес-логики.

Шаг 5. Проверьте сообщение результата

Сравните tool_name, идентификатор вызова, роль сообщения и сериализованное содержимое. Убедитесь, что результат не обрезан и не добавлен дважды.

Шаг 6. Добавьте идемпотентность

Для операций записи создайте стабильный ключ и проверку статуса. Повторяйте только явно разрешённые временные ошибки.

Шаг 7. Включите контрольные точки

После завершения этапа сохраняйте цель, план, состояние и результат. При восстановлении продолжайте с чтения состояния, а не с повторного запуска последнего действия.

Решение по симптомам

Ниже — быстрый выбор между изменением промпта, контрактом Schema и исправлением исполнительного слоя.

Если наблюдается Вероятный слой Первое действие
Инструмент отсутствует в ответе Модель или адаптер Сравнить список инструментов и упростить описание
Вызов есть, JSON не проходит Schema Сохранить ошибку валидатора и исправить контракт
JSON валиден, операция не стартует Исполнитель Проверить права, сеть и доменные ограничения
Операция успешна, модель повторяет её Возврат результата Сверить идентификатор вызова и сообщение результата
После сжатия контекста цель меняется Состояние Ввести контрольную точку и загрузку внешнего состояния

Временная шкала проверки

Такой порядок помогает не тратить часы на переписывание системного промпта, когда причина находится в обработчике ответа.

Момент Что фиксировать Критерий перехода
До запроса Инструменты, Schema, разрешения Запрос содержит ожидаемый контракт
После ответа модели Сырой вызов и аргументы Понятно, был ли выбран инструмент
Перед исполнением Результат валидации Аргументы безопасны и допустимы
После исполнения Статус и внешний идентификатор Операция имеет однозначный итог
Перед продолжением Сообщение результата и контрольная точка Agent видит актуальное состояние

Условие выбора исправления

Используйте следующие ветки вместо универсального совета «улучшите промпт»:

  • Если вызов отсутствует даже с одним инструментом, исправляйте формат запроса, адаптер или доступность API.
  • Если вызов есть, но аргументы не проходят Schema, меняйте контракт и обработку ошибки, а не только инструкцию модели.
  • Если валидные аргументы не выполняются, проверяйте разрешения, сетевой слой и бизнес-правила.
  • Если действие завершилось, но Agent начинает его снова, исправляйте возврат результата, идемпотентность и лимит повторов.
  • Если проблема появляется только в длинной сессии, добавляйте внешнее состояние, контрольные точки и повторную проверку цели.
Вариант Когда выбирать Когда откатиться
Уточнить описание инструмента Модель выбирает не ту функцию Инструмент не виден в сыром запросе
Изменить Schema Ошибка структуры или типа Локальная Schema проходит, а API отклоняет запрос
Исправить исполнитель Ошибка прав, сети или статуса Исполнитель получил неполный вызов
Исправить историю сообщений Результат потерян или дублирован Операция фактически не завершена
Ввести контрольную точку Сбой возникает после долгой работы Задача короткая и воспроизводится сразу

Что проверить перед обновлением

Перед переключением версии модели или SDK запустите минимальный набор регрессий:

  • выбор одного инструмента;
  • обязательное поле;
  • неверный тип;
  • значение вне перечисления;
  • временный сбой с разрешённым повтором;
  • постоянный отказ без повтора;
  • успешный результат с пустым массивом;
  • длинный результат с пагинацией;
  • восстановление после тайм-аута;
  • отмена операции пользователем.

Не переносите старые предположения о полях и событиях в новую версию. В публичных материалах Meta заявлены общие возможности Muse Spark и Meta Model API, но ваш рабочий контракт определяется фактической схемой API, SDK и промежуточного фреймворка. Для каждой новой версии повторяйте минимальную программу и сохраняйте различия в необработанном ответе.

Текущий стек против отдельного Mac-узла

Если вы отлаживаете всё на общей рабочей машине, у вас появляются три типичных недостатка: окружение меняется между запусками, фоновые процессы и права доступа искажают результат, а исходные логи часто смешиваются с данными других задач. Облачный или общий сервер добавляет ещё зависимость от сетевого маршрута, задержек и правил доступа.

Для короткого эксперимента это допустимо. Для воспроизводимой диагностики инструментов удобнее отдельный Mac-узел: фиксированное окружение, отдельный журнал, контролируемый доступ к ключам и возможность повторить тот же сценарий после обновления SDK. Если вам нужен временный стенд для проверки Muse Spark 1.2, сохраните исходные вызовы и результаты на изолированной машине, а затем сравните их после изменения Schema или исполнительного слоя. В этом случае MacPng может быть практичнее покупки отдельного устройства, если задача ограничена тестированием, миграцией или коротким циклом диагностики Agent.

Не стоит выбирать аренду для постоянной тяжёлой нагрузки, обязательного физического оборудования или среды, которую вы обязаны полностью контролировать годами. Но для временного API-стенда аренда позволяет не привязывать эксперимент к вашему основному компьютеру и быстрее повторять регрессионные проверки. Подробности о доступных вариантах размещения смотрите только после оценки требований к доступу, журналам и сроку работы.

Сбой вызова инструментов Muse Spark 1.2 почти никогда не диагностируется одной правкой промпта. Разделите модель, Schema, исполнитель, возврат результата и состояние; сохраните сырой журнал; добавьте идемпотентность и контрольные точки. Такой порядок превращает неясное поведение Agent в последовательность проверяемых фактов.