Автономная система мониторинга AI-экосистемы Саудовской Аравии 24/7 — вакансии, новости и LinkedIn-активность ключевых лиц, с оценкой релевантности и доставкой в Telegram.
Один Docker-контейнер на RUVDS запускает 6 параллельных asyncio-циклов, оркеструя 4 внешних API с персистентностью на SQLite и без тяжёлых зависимостей.
Три вектора сбора работают параллельно — вакансии, новости и LinkedIn-разведка — используя Firecrawl как универсальный скрейпинговый движок.
Firecrawl /search · каждые 6ч
Firecrawl /search · каждые 12ч
Firecrawl + Google · Воскресенье 08:37
LinkedIn-разведка работает исключительно через поиск Google + Firecrawl, устраняя риск блокировки аккаунта. Bayt.com и GulfTalent скрейпятся через встроенную схему JSON-извлечения Firecrawl. Никакой браузерной автоматизации, никакого управления сессиями.
Оценка релевантности на базе Groq с профилем Тима, вшитым в каждый промпт. 5 стратегий извлечения JSON гарантируют почти нулевой процент ошибок парсинга.
Основной скорер
100K токенов/день бесплатно
~16K токенов/день использую (запас 6x)
Резервный LLM
$20/мес фиксированно
Активируется после 5 сбоев Groq
Мульти-агентные системы · AI-архитектура · консалтинг · senior/director · удалёнка
Лид AI/ML-инженерии · AI-стратегия · роли в HUMAIN/SDAIA/NEOM
Общая AI/ML-роль · интересная компания · стоит мониторить
Косвенно связанная · неподходящий уровень
Не та область · junior-позиция · чистый ресёрч · требуется PhD
Удаление markdown-блоков ```json ... ```
Прямой json.loads() из текста ответа
Regex по ключам: "score", "category"
Жадный поиск {[\s\S]*} в любом месте
Исправление trailing commas + одинарные→двойные кавычки
Имя: Тим Зинин · Мульти-агентный архитектор · База: Каш, Турция (3.5ч до Эр-Рияда) · Ставка: $250/ч · Языки: русский (родной), английский (свободно) · Основное: продакшн мульти-агентные AI-системы (7+ агентов), AI-автоматизация контента, Web3+AI, консалтинг, SaaS. НЕ подходит: чистый ML-ресёрч, junior-позиции, требуется PhD, только data engineering.
Система запущена на RUVDS и собрала 115 вакансий за первый цикл. 20 оценено немедленно (лимит батча Groq), из них 12 прошли порог для мгновенных алертов в Telegram.
Четыре типа сообщений доставляются через long-polling. Inline-клавиатуры передают данные обратно в SQLite через callback_loop. Максимум 5 мгновенных алертов за цикл предотвращает усталость от уведомлений.
Фаза 1 обнаруживает. Фаза 2 конвертирует. Когда Тим нажимает «Интересно», система обогащает вакансию, генерирует персонализированный питч, направляет в правильный канал и отслеживает каждый ответ.
Оценённые вакансии лежат в SQLite со статусом=interested, но ничего не происходит. Нет питча, нет отклика, нет трекинга. Фаза 2 замыкает цикл.
| Инструмент | Тип | Метод | Объём | Стоимость |
|---|---|---|---|---|
| AIHawk 29K звёзд | OSS | Selenium + LinkedIn Easy Apply | 50/день (лимит LinkedIn) | Бесплатно |
| LazyApply | Коммерческий | Chrome-расширение, мульти-борды | 4 500/мес | $99–299/мес |
| Sonara | Коммерческий | Фильтр по качеству (score >80%) | ~20/день | $99/мес |
| Expandi | Коммерческий | Облачный браузер, аутрич LinkedIn | 80-100 коннектов/нед | $99/мес |
| Unipile | API | REST API поверх сессии LinkedIn | Программно | €5/аккаунт/мес |
Нужно 3-5 персонализированных питчей в неделю — не 50/день. Email рекрутерам и нанимающим менеджерам конвертирует лучше, чем заполнение форм. LinkedIn-запросы с персонализированными заметками работают лучше InMail на уровне senior. Качество > объём.
| MCP | Доступные инструменты | Применение в аутриче | Статус |
|---|---|---|---|
mcp__claude_ai_Gmail |
create_draft, search_messages, read_message, list_labels | Черновики сопроводительных писем, отправка, трекинг ответов | Подключён |
mcp__claude_ai_Google_Calendar |
create_event, list_events, find_free_time | Планирование интервью, напоминания о follow-up | Подключён |
mcp__playwright |
navigate, fill_form, click, snapshot | Заполнение форм на карьерных страницах | Подключён |
mcp__firecrawl |
scrape, search | Извлечение деталей вакансий, поиск email рекрутеров | Подключён |
mcp__tg-communicator |
notify_user, ask_user | Рабочий процесс согласования с Тимом | Подключён |
unipile-linkedin-mcp |
send_message, send_connection_request | LinkedIn-аутрич | Рекомендуется (€5/мес) |
Три пути от нажатия «Интересно» до закрытой сделки. Вариант B — правильная отправная точка: полный email-пайплайн без сложностей LinkedIn.
Расширение callback-обработчика, добавление таблицы outreach в схему, интеграция Gmail MCP create_draft
Gmail send_message, create_label, create_filter, новый asyncio-цикл reply_checker (интервал 2ч)
Ежедневный followup_sender в 10:00 МСК, создание событий в Google Calendar, LLM-извлечение дат интервью
Добавить stickerdaniel + Unipile после того, как email-пайплайн докажет ценность. Мульти-канальный аутрич.
9 Python-файлов, плоская структура, минимальная площадь атаки. Каждое архитектурное решение обменивает полноту функций на операционную простоту.
| Компонент | Технология | Примечания |
|---|---|---|
| Runtime | Python 3.12-slim | Docker-контейнер |
| Планировщик | asyncio.sleep | Нулевая зависимость от APScheduler |
| Скрейпинг | Firecrawl API v1 | search() + scrape() |
| LLM основной | Groq Llama 3.3 70B | Бесплатно 100K токен/день |
| LLM резервный | MiniMax M2.5 | $20/мес фиксированно |
| База данных | aiosqlite | Один файл, async |
| Уведомления | httpx → TG Bot API | Без SDK |
| HTTP-клиент | httpx (async) | Connection pooling |
| Контейнер | Docker Compose | restart: unless-stopped |
# Обновить и пересобрать
ssh root@88.218.248.114 \
'cd /opt/saudi-hunter && git pull && docker compose up -d --build'
# Проверить запуск
docker ps | grep saudi-hunter
docker logs saudi-hunter --tail 20
# Статистика БД
docker exec saudi-hunter python -c "
import sqlite3; db = sqlite3.connect('/app/data/hunter.db')
print('Jobs:', db.execute('SELECT COUNT(*) FROM jobs').fetchone()[0])
print('Scored:', db.execute('SELECT COUNT(*) FROM jobs WHERE fit_score > 0').fetchone()[0])
print('High-fit:', db.execute('SELECT COUNT(*) FROM jobs WHERE fit_score >= 70').fetchone()[0])"
Известные сценарии сбоев и их митигация. KPI для отслеживания эффективности пайплайна после запуска Фазы 2.
| Риск | Вероятность | Митигация |
|---|---|---|
| Истечение токена Gmail MCP | Средний | Авто-обновление OAuth, алерт при истечении через tg-communicator |
| Бан аккаунта LinkedIn | Средний | Платный API Unipile снижает риск. Объём <20 коннектов/неделю |
| Рекрутер воспринимает как спам | Низкий | Фильтрация по качеству (только score >70), персональные питчи, макс. 5/неделю |
| Rate limit Groq при генерации питча | Низкий | Резерв MiniMax, запас 6x в день, батч в нагрузочные часы |
| Follow-up отправлен после отказа | Средний | LLM классифицирует ответ как отказ до запуска follow-up |
| Rate limiting джоб-бордов | Средний | Jitter, интервалы 6-12ч, встроенная ротация прокси Firecrawl |
| SQLite-инъекция | Низкий | Параметризованные запросы везде в store.py |
| Безопасность контейнера | Низкий | Нет открытых портов. Только исходящий трафик. .env никогда не коммитится в git |
| API | Операция | Запросов/мес | Лимит | Запас |
|---|---|---|---|---|
| Firecrawl search | Запросы вакансий (12 × 4/день) | 480/мес | 5 000 | 10x |
| Firecrawl search | Новостные запросы (10 × 2/день) | 600/мес | включено | – |
| Firecrawl scrape | Страницы джоб-бордов | 300/мес | 100 000 | 333x |
| Groq токены | Скоринг + анализ | ~16K/день | 100K/день | 6x |
| Итого Firecrawl | Все операции | ~1 460/мес | 5 000 | 3.4x |