AI-агент первой линии техподдержки: триаж, база знаний, эскалации, баг-репорты
Server has 20 tools with mostly complete schemas and descriptions in Russian. Naming follows verb_noun pattern (find_, create_, list_, etc.). Descriptions are substantive (100-300 chars typical) and explain WHEN to use tools (e.g., 'Вызывать ДО create_bug_report'). However, several critical gaps: (1) Parameter descriptions lack format/constraint details (e.g., 'threshold' has no range guidance; 'impact' enum values documented only in description, not schema); (2) Output schemas are not formally documented, responses inferred from code; (3) Error handling is minimal, no recovery guidance or categorization; (4) Some parameters accept free-form strings where enums would be safer (e.g., 'status', 'category', 'reply_kind'). Tool composition is strong, each tool has one responsibility and outputs chain well (e.g., find_duplicate_issue → link_ticket_to_issue or create_bug_report). Descriptions are LLM-optimized and include dependency hints.
Зафиксировать результат триажа. Приоритет НЕ передаётся напрямую - он вычисляется из impact x urgency по матрице policies/priority_matrix.yaml. Задача модели - оценить только эти два измерения и обосновать выбор.
Посчитать приоритет по матрице, ничего не меняя в тикете.
Завести Bug Report в репозитории разработчиков и связать его с тикетом.
Эскалировать инцидент дежурному L2 в Telegram. summary - сухая техническая выжимка до 400 символов: что сломано, где, с какого момента. Без пересказа эмоций пользователя.
Проверить, не заведён ли уже такой баг. Вызывать ДО create_bug_report.
Получить ответ инженера второй линии по заявке. Если подключён реальный Telegram, читается ответ на сообщение об эскалации: инженер отвечает реплаем, и связь с заявкой получается однозначной. Иначе ответ берётся из фикстуры data/telegram/l2_responses.json. Ответа ещё нет - вернётся pending.
Enum constraints not formalized in schemas. Parameters like 'status' (Новая/В работе/Ожидание ответа/Решена/Закрыта), 'impact' (single_user|team|org_wide), 'urgency' (workaround|degraded|blocked), and 'reply_kind' (solution|status_update|clarification) are documented in descriptions but lack JSON Schema enum declarations. LLMs may hallucinate invalid values.
Output schemas not formally documented. Tool responses are inferred from code (e.g., find_duplicate_issue returns {duplicates_found, candidates, recommendation}). LLMs cannot plan downstream calls without knowing response structure. No documented return types.
Parameter constraints lack specificity. 'threshold' (float) has no min/max guidance; 'top_k' (integer) has no bounds; 'limit' and 'offset' lack ranges. Descriptions should state '0.0-1.0', '1-100', etc. to prevent invalid LLM inputs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Полная карточка одной заявки.
Показать, по каким темам база знаний пуста. Аналитический инструмент: агент не только закрывает тикеты, но и показывает руководству, где именно база знаний не покрывает поток обращений.
Создать новую статью по итогам решённой нетиповой проблемы (самообучение). Вызывается после того, как L2 или разработка подсказали решение: следующий похожий тикет должен закрываться уже по Сценарию А. Статья создаётся в статусе draft - публикует её человек, потому что непроверенная инструкция в базе знаний хуже, чем её отсутствие.
Прочитать статью целиком, чтобы взять из неё точные шаги.
Оглавление базы знаний.
Найти статьи по тексту проблемы. Возвращает retrieval_confidence - нормализованную оценку уверенности поиска (учитывает и абсолютное значение, и отрыв топ-1 от топ-2). Если она низкая, значит готового решения в базе, скорее всего, нет: это сигнал в пользу эскалации или баг-репорта, а НЕ повод пересказать ближайшую попавшуюся статью.
Привязать тикет к уже существующему Issue (случай дубликата).
Список заведённых Issue.
Вернуть очередь заявок.
Предупредить заявителя, что инцидент передан профильному инженеру.
Отправить ответ пользователю. reply_kind определяет, что это за сообщение: solution (решение проблемы с обязательной ссылкой на KB), status_update (уведомление о ходе работы), clarification (уточняющий вопрос). Автозакрытие возможно только для solution и блокируется, если уверенность ниже порога.
Закрыть Issue с описанием решения от разработчиков. Используется в демо-сценарии self-learning: решение из Issue становится основой новой статьи базы знаний.
Ответственный специалист по этой категории. Вызывать перед escalate_to_l2.
Сменить статус заявки вручную.
Error handling lacks recovery guidance. Code returns generic dicts like {error: '...'} or {blocked: True} without actionable next steps. E.g., 'Тикет не найден' should suggest 'Try list_tickets() to find the correct ID.'
Pagination not fully specified. list_tickets and kb_search accept limit/offset but do not document total count or next_cursor in responses. Large result sets risk context window exhaustion.