feat(support): AI-ассистент поддержки — FAQ (RAG) + тикеты через MCP - #18
Conversation
/support <вопрос> [#T-1024] — отвечает на вопрос о продукте по FAQ (RAG) с учётом контекста тикета/пользователя (через MCP). Брат-близнец /help: FAQ вместо доков, тикеты вместо git-ветки. - infra/faq_retrieval.py::MarkdownFaqRetrievalEngine — RAG по docs/support-faq/*.md (реализует порт RetrievalEngine, лексический поиск, ноль зависимостей; взаимозаменяем с FAISS-движком). - infra/ticket_store_client.py::TicketStoreClient — in-process McpClient над JSON users/tickets (по образцу LocalFilesystemClient), тулы support__get_ticket · get_user · search_tickets. Заменить на реальную CRM = поднять внешний MCP-сервер, use case не меняется. - app/support_assistant.py::answer_support_question — оркеструет RetrievalEngine + SupportChat (ToolRouter или PlainChatAdapter-деградация). - cli/support_commands.py + проводка в cli/main.py (сидирование тикетов, диспетчер, синхронизация при смене провайдера), справка, CLAUDE.md. - Демо examples/support_agent_demo.py (JARVIS_DEMO_SCRIPTED=1, без ключа). - Тесты: ticket store, FAQ-движок, use case на фейках (31 шт.). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPCiJi7DVBdV2fjN2x3HMd
🤖 AI-ревью🐞 Потенциальные баги— замечаний нет 🏛 Архитектурные проблемы
💡 Рекомендации
Контекст (RAG): app/ports.py · cli/views.py — ── help ──────────────────────────────────────────────────────────────────── · cli/rag_commands.py · cli/main.py Сгенерировано jarvis-cli · review_pr.py |
Что это
Мини-сервис поддержки пользователей на базе jarvis-cli. Команда
/support <вопрос> [#T-1024]отвечает на вопрос о продукте по FAQ (RAG) с учётом контекста тикета/пользователя (через MCP). Брат-близнец/help: FAQ вместо доков, тикеты вместо git-ветки.Сценарий из задания «Почему не работает авторизация? #T-1024» работает end-to-end: агент сам поднимает тикет (тариф Free + вход через SSO ⇒ ошибка 403), читает FAQ и отвечает адресно.
Изменения по слоям
infra/faq_retrieval.pyMarkdownFaqRetrievalEngine— RAG поdocs/support-faq/*.md, реализует портRetrievalEngine, ноль зависимостей (взаимозаменяем с FAISS-движком)infra/ticket_store_client.pyTicketStoreClient— in-processMcpClientнад JSON users/tickets (по образцуLocalFilesystemClient), тулыsupport__get_ticket · get_user · search_ticketsapp/support_assistant.pyanswer_support_question+ портSupportChat+PlainChatAdapter(деградация без tool calling)cli/support_commands.py,main.py,config.py,views.py/support, проводка в composition root, сидирование тикетов, справкаdocs/support-faq/{auth,billing,account}.mdexamples/support_agent_demo.pyJARVIS_DEMO_SCRIPTED=1)tests/Соответствие требованиям
/support)RetrievalEngine, заменяется на FAISS без правок use case)support__get_ticket/get_userв tool-loopTicketStoreClientстоит вMcpRegistry; замена на реальную CRM = внешний MCP-сервер, код use case не меняется)Проверка
```bash
JARVIS_DEMO_SCRIPTED=1 python3 examples/support_agent_demo.py # без ключа
python3 chat.py # затем: /support Почему не работает авторизация? #T-1024
pytest # 544 passed
```
Полный доступ к тикетам работает при
provider=deepseek(tool calling); на других провайдерах/supportдеградирует до ответа только по FAQ.🤖 Generated with Claude Code
https://claude.ai/code/session_01WPCiJi7DVBdV2fjN2x3HMd