| name | find-doctor |
| description | Поиск врача или медицинской услуги — анализ отзывов, рейтингов, цен, расстояния. Сравнение и рекомендация.
Триггеры: «найди врача», «найди [специальность]», «где принимает», «хороший терапевт», «поиск врача», «find doctor», «куда пойти к [специальность]»
|
Find Doctor — поиск врача и медицинских услуг
Назначение
Найти лучшего врача нужной специальности или медицинскую услугу: агрегировать данные с платформ отзывов, сравнить по рейтингу, цене, расстоянию и доступности. Предложить оптимальный вариант.
Запрос пользователя
$ARGUMENTS
Локация и доступ к медицине
Читать из Data/context/environment.json, не из этого файла. Адрес и страховка в тексте скилла устаревают при первом же переезде и расходятся с данными.
| Что нужно | Откуда брать |
|---|
| Город, район, улица, ближайшее метро | location.city, location.district, location.street, location.nearest_metro |
| Страховка | healthcare_access.insurance |
| Есть ли ДМС и какой | healthcare_access.dms, healthcare_access.dms_details |
| Готовность ездить | healthcare_access.travel_readiness, healthcare_access.max_travel_time_min |
| Транспорт | healthcare_access.preferred_transport |
Ниже по тексту [метро], [район], [город] — подстановки из этих полей.
Если файл отсутствует или нужные поля пусты — спросить пользователя один раз, использовать ответ в текущем поиске и предложить записать его в Data/context/environment.json, чтобы не спрашивать снова.
Workflow
1. Уточнить запрос
Из сообщения пользователя определить:
- Специальность (обязательно) — терапевт, ортопед, гастроэнтеролог и т.д.
- Цель визита (если указана) — конкретная жалоба, обследование, second opinion
- Срочность — плановый / нужно быстро
- Бюджет — если есть ограничения
- Предпочтения — пол врача, возраст, конкретная клиника
Если специальность неясна → спросить. Остальное — опционально, не допрашивать.
2. Проверить существующие контакты
Прочитать Data/doctors/contacts.json → doctors[].
Статусы врача:
| Статус | Значение |
|---|
active | Наблюдается сейчас или готов пойти повторно |
historical | Был в прошлом: другой город, детство, разовый визит. Не отбрасывать — это опыт пациента |
rejected | Отказался идти повторно. Не предлагать снова |
Записи без поля status считать historical.
Искать врачей нужной специальности любого статуса, кроме rejected, и разбирать по случаям:
- Есть
active → «У тебя уже есть [ФИО] в [клиника]. Ищем нового или к нему?»
- Есть только
historical → упомянуть и пояснить, почему это не готовый вариант: «Был [ФИО], [клиника], [period] — [город, если не текущий]. Продолжаем искать нового?»
- Есть
rejected → в выдаче не предлагать; если тот же врач всплывёт в результатах поиска, пометить «🚩 отказ в прошлом»
- Ничего нет → идти дальше молча
Фильтр только по active не годится: сейчас у всех записей статус historical, и такой шаг не сработал бы ни разу.
Специальность сопоставлять по вхождению подстроки, а не по точному совпадению: в данных встречается «травматолог-ортопед, к.м.н.», «нейрофизиолог (ЭЭГ, РЭГ)», «педиатр (участковый)».
Прочитать Data/doctors/visits/_index.json:
- Были ли визиты к врачам этой специальности?
- Если были → кратко: «Последний визит: [дата] к [ФИО], [клиника]»
3. Два пути — ОМС и частный
Всегда показывать оба варианта:
3a. ОМС-путь (приоритетный)
WebSearch: [специальность] по ОМС [город] ЕМИАС запись
Выяснить:
- Доступна ли эта специальность по ОМС напрямую или нужно направление от терапевта
- Как записаться через ЕМИАС / Госуслуги
- Ближайшие поликлиники к
[метро] с этим специалистом
- Примерные сроки ожидания
Если в healthcare_access.dms стоит true — добавить третий путь: что покрывает ДМС по dms_details.
3b. Частный путь
Переходить к шагам 4–7 ниже.
4. Поиск врачей на платформах
ВАЖНО: трёхэтапная верификация!
Радиус поиска:
- По умолчанию:
[район] + соседние районы. Соседние определять по карте, а не по списку в этом файле
- Если пользователь готов ездить дальше (
healthcare_access.travel_readiness) → расширять до всего города. Добавить запросы без привязки к метро: [специальность] [город] рейтинг отзывы, лучший [специальность] [город]
- Если пользователь ищет по цене → обязательно искать по всему городу: дешёвые варианты могут быть не рядом
Этап 1 — WebSearch (найти кандидатов):
Параллельные запросы:
site:prodoctorov.ru [специальность] [метро] [город] рейтинг
site:prodoctorov.ru [специальность] [район] рейтинг
site:docdoc.ru [специальность] метро [метро]
site:napopravku.ru [специальность] [метро]
- Если цель конкретная:
лучший [специальность] [город] [цель] отзывы
Из результатов — собрать 5–8 кандидатов с URL их профилей.
Этап 2 — WebFetch агрегаторов (рейтинг и отзывы, НЕ цены):
Для каждого кандидата → WebFetch(profile_url):
- Рейтинг (число + количество отзывов)
- Стаж работы
- Клиника и адрес
- Ближайшая запись (если есть на странице)
- Ключевые отзывы — паттерны: что хвалят, на что жалуются
- Название клиники и её домен — понадобится для этапа 3
⚠️ Цены с агрегаторов НЕ брать — они часто устаревшие и вводят в заблуждение.
Этап 3 — WebFetch официальных сайтов (цены — ground truth):
Для каждого топ-кандидата (топ-5):
- WebSearch:
site:[домен-клиники] прайс или site:[домен-клиники] цены [специальность]
- WebFetch прайс-страницы клиники
- Найти цену первичного и повторного приёма
Это ЕДИНСТВЕННЫЙ авторитетный источник цен. Если официальный сайт не отдаёт цены (таймаут, нет прайса, цена за услугу не найдена) → в таблице писать «⚠️ уточнять по тел.». Не подставлять цену с агрегатора.
Если кандидат упоминается как «топ» на нескольких платформах — повышать приоритет.
Правила работы с ценами
- Агрегаторы — ТОЛЬКО для рейтингов и отзывов. Цены на них часто устаревшие. Перечень — в разделе «Платформы для поиска» ниже, он единственный. Любой не перечисленный там сайт-агрегатор подпадает под то же правило
- Официальный сайт клиники — ЕДИНСТВЕННЫЙ источник цен. Искать страницу «прайс» / «цены» / «стоимость»
- Всегда различать тип цены: за 1 зуб, за 1 челюсть, комплексная (обе челюсти), за приём и т.д. В таблице указывать ТИП цены
- Если на сайте клиники цена не найдена → писать «уточнять», НЕ подставлять цену с агрегатора
- При поиске услуги (чистка, МРТ и т.д.) — искать прайс-страницу конкретной услуги:
site:[домен-клиники] прайс [услуга]
5. Анализ и скоринг
Для каждого кандидата рассчитать условный скор:
Базовые веса (по умолчанию):
| Фактор | Вес | Как оценивать |
|---|
| Рейтинг | 25% | Нормализовать к 5.0, учесть количество отзывов (>50 надёжнее) |
| Отзывы (качество) | 25% | Паттерны: внимательность, точность диагнозов, результат лечения |
| Цена | 20% | Нормализовать: дешевле = лучше (но не демпинг) |
| Расстояние | 20% | Минуты от [метро] (метро/авто) |
| Доступность | 10% | Ближайшая запись: быстрее = лучше |
Адаптация весов: если пользователь явно указал приоритет (например «цена — основное», «главное — близко», «нужен лучший специалист»), перераспределить веса:
- Приоритетный фактор → 40%
- Остальные факторы делят оставшиеся 60% пропорционально базовым весам
- Пример: пользователь сказал «цена — основное» → Цена 40%, Рейтинг 15%, Отзывы 15%, Расстояние 15%, Доступность 15%
Корректировки:
- Мало отзывов (<10) → понизить уверенность, пометить «⚠️ мало отзывов»
- Негативные паттерны в отзывах (грубость, ошибки) → красный флаг 🚩
- Врач из клиники, где уже есть другие врачи пользователя → бонус «удобство одного места»
6. Показать пользователю
## Поиск — [специальность] (дата поиска: YYYY-MM-DD)
### ОМС-путь
- [Как попасть бесплатно — направление, ЕМИАС, сроки]
- Ближайшая поликлиника: [название, адрес]
### Частный путь — топ кандидаты
| # | Врач | Клиника | Рейтинг | Отзывы | Цена (источник) | Дорога | Скор |
|---|------|---------|---------|--------|-----------------|--------|------|
| 1 | [ФИО] | [клиника] | ⭐ 4.8 (120) | ✅ хороший | 3 500 ₽ первичный (сайт) | 15 мин | 87 |
| 2 | [ФИО] | [клиника] | ⭐ 4.6 (230) | ✅ отличный | 5 000 ₽ комплекс (сайт) | 25 мин | 82 |
| 3 | [ФИО] | [клиника] | ⭐ 4.9 (45) | ⚠️ мало | уточнять | 10 мин | 78 |
### Детали по кандидатам
#### 1. [ФИО] — [клиника]
- **Стаж:** X лет
- **Адрес:** [адрес], [как добраться от `[метро]`]
- **Цена:** первичный — X ₽, повторный — Y ₽
- **Запись:** ближайшая [дата] / [ссылка на запись]
- **Что хвалят:** [паттерны из отзывов]
- **На что жалуются:** [если есть]
- **Ссылки:** [ПроДокторов] [DocDoc]
#### 2. ...
### Рекомендация
[Кого выбрать и почему — с учётом баланса цена/качество/расстояние]
7. Действия после выбора
Когда пользователь выберет врача:
7a. Сохранить в контакты
Файл Data/doctors/contacts.json — объект-обёртка, а не массив:
{
"version": 1,
"doctors": [ … ]
}
Новую запись добавлять (append) в массив doctors[]. Поле version не трогать. Существующие записи не переписывать. Запись объекта врача в корень файла уничтожит и обёртку, и все 7 имеющихся контактов.
Обязательные поля — те же, что у существующих записей:
{
"name": "[ФИО]",
"specialty": "[специальность]",
"clinic": "[клиника]",
"period": "[YYYY — н.в.]",
"status": "active",
"phone": "[если найден]"
}
Дополнительные поля, которые добавляет этот скилл (опциональны, у старых записей их нет — это нормально):
{
"address": "[адрес]",
"source": "find-doctor",
"found_date": "YYYY-MM-DD",
"checked_date": "YYYY-MM-DD",
"rating": { "prodoctorov": 0.0, "reviews_count": 0 },
"price_initial": 0,
"notes": "[краткие заметки]"
}
Поля id в файле нет ни у одной записи — не выдумывать его. Врач идентифицируется парой name + specialty.
Перед записью проверить, нет ли этого врача в doctors[] уже. Если есть — обновить его запись (status, checked_date, price_initial, rating), а не создавать дубликат.
7b. Создать задачу в Todoist
Задача: «Записаться к [специальность] — [ФИО]»
Description:
- Клиника: [название], [адрес]
- Цена: ~X ₽ (первичный)
- Запись: [ссылка или телефон]
- Цель визита: [если указана]
Priority: p3 (или p2 если срочно)
Due: [если пользователь указал срок]
7c. Привязать к milestone (если есть)
Если поиск связан с направлением в Data/goals/YYYY.json:
- Обновить
cost_estimate_rub на основе цены врача
- Привязать
todoist_task_id
8. Поиск услуги (не врача)
Если пользователь ищет не врача, а услугу (МРТ, УЗИ, процедура):
Адаптировать workflow:
- Вместо профилей врачей → искать клиники/центры с услугой
- WebSearch:
[услуга] цена [город] [метро], site:prodoctorov.ru [услуга] рейтинг
- Дополнительные запросы для цен:
[услуга] [город] цена прайс недорого [текущий год]
[услуга] [город] рейтинг клиник сравнение цен
- Для каждой найденной клиники — WebSearch прайс-страницы:
site:[домен-клиники] прайс [услуга] или site:[домен] цены [услуга]
- Сравнивать по: цена (с официального сайта!), оборудование (для МРТ — теслы), рейтинг клиники, расстояние
- ОМС-путь: доступна ли услуга по ОМС, нужно ли направление
- Цены — только с официальных сайтов клиник (см. «Правила работы с ценами» в разделе 4)
Платформы для поиска
Единый перечень агрегаторов — этот. На него ссылаются «Правила работы с ценами» в разделе 4.
| Платформа | URL | Что берём |
|---|
| ПроДокторов | prodoctorov.ru | Рейтинг, отзывы, стаж, запись |
| DocDoc | docdoc.ru | Запись, отзывы, рейтинг |
| НаПоправку | napopravku.ru | Отзывы, рейтинг |
| Яндекс Карты | yandex.ru/maps | Рейтинг клиники, отзывы, расстояние |
| Стоматология.рф / stom-firms.ru | stom-firms.ru | Профильный агрегатор по стоматологии — рейтинг и отзывы клиник |
Со всех — только рейтинги и отзывы. Цены ни с одной из платформ не брать.
Если сеть недоступна
WebSearch или WebFetch могут не отработать — нет соединения, инструмент недоступен, сайт закрыт для агента.
- WebSearch не работает → поиск невозможен. Сказать об этом прямо, не выдумывать кандидатов и не подставлять клиники по памяти. Показать то, что доступно офлайн: врачи из
Data/doctors/contacts.json по нужной специальности и общий ОМС-путь (направление от терапевта, запись через ЕМИАС). Предложить повторить поиск позже
- WebFetch не работает при живом WebSearch → работать по выдаче поиска: кандидаты и их клиники — да, рейтинги — с пометкой «из поисковой выдачи, не проверено», цены — нет. В колонке цены писать «⚠️ уточнять по тел.»
- Часть кандидатов не открылась → не отбрасывать их молча, показать с пометкой «страница недоступна»
- В шапку результата добавить строку «⚠️ Поиск неполный: [что именно не отработало]»
Никогда не заполнять пробел правдоподобным вымыслом: несуществующая клиника с выдуманной ценой хуже честного «не нашёл».
Актуальность сохранённых данных
rating, price_initial и checked_date в contacts.json — снимок на дату проверки, а не постоянное свойство врача.
| Возраст записи | Что делать |
|---|
| До 3 месяцев | Использовать как есть, указав дату проверки |
| 3–12 месяцев | Показать с пометкой «данные от [дата], могли измениться». Цену перепроверить на сайте клиники, если она влияет на решение |
| Больше 12 месяцев | Считать устаревшими. Не показывать как факт — перепроверить или писать «уточнять» |
После перепроверки обновлять checked_date, price_initial и rating в существующей записи, а не заводить нового врача.
Цены в Data/goals/YYYY.json → cost_estimate_rub, проставленные из старого поиска, при планировании визита старше 6 месяцев тоже перепроверять.
Правила
- ОМС первым — всегда показывать бесплатный путь, даже если пользователь спрашивает про частного
- Трёхэтапная верификация — рейтинги с агрегаторов (WebFetch), цены ТОЛЬКО с официальных сайтов клиник. Агрегаторные цены часто устаревшие и вводят в заблуждение
- Цена — ground truth с сайта клиники — если цена не найдена на официальном сайте, писать «уточнять по тел.», не подставлять данные агрегаторов
- Не рекомендовать безоговорочно — показывать факты, предлагать выбор
- Мало отзывов = низкая уверенность — всегда помечать
- Актуальность — указывать дату поиска, предупреждать что цены могут меняться. TTL сохранённых цен и рейтингов — см. «Актуальность сохранённых данных»
- Локация — из данных —
Data/context/environment.json, а не из текста этого файла
- Запись в контакты — append в
doctors[] — обёртку и version не трогать, существующие записи не переписывать
- Нет данных — так и писать — при недоступной сети не восполнять пробелы догадками
- Не звонить и не записывать — только найти и предложить, запись — действие пользователя
Критерий завершения: ОМС-путь показан первым и содержит конкретику (нужно ли направление, как записаться, сроки); у каждого кандидата в таблице указан источник цены либо честное «уточнять по тел.»; ни одна цена не взята с агрегатора; локация подставлена из environment.json; если врач сохранён — он добавлен в массив doctors[] с checked_date, а файл после записи остаётся валидным JSON с прежним version; все сбои сети отражены в шапке результата.
⚕️ Информация носит справочный характер. Для принятия решений о лечении обратитесь к врачу.