Проблема

Привет мои чьюваки, по классике решил вкатиться в IT после 30 и найти свою первую работу мечты. И вот с чем я столкнулся по пути к своей мечте.

Вакансий много, откликаться долго. К каждой надо писать сопроводительное письмо, чтобы выделиться среди сотен( кого я обманываю - тысяч) других откликов.

Главная боль

Не умею писать сопроводительные письма. Надо как-то себя презентовать, показать заинтересованность. Если отправлять всем один шаблон — компании это даже читать не будут.( хотя есть подозрение что они вобще не читают ни чего)

Что делать?

Ожидание: Сделать полный автоотклик на все 1500+ вакансий с уникальными письмами для каждой.

Реальность: В публичном API HeadHunter нет функции автоотклика. В приватном API тоже не нашел такой возможности (плюс нужна регистрация приложения).

Решение!: Если нельзя автоматизировать отклики — автоматизирую хотя бы генерацию писем!

Потрясающий ход
Потрясающий ход

Архитектура решения

Решение получилось очень простое и понятное каждому, сейчас покажу.

Сделал систему из двух частей:

🔧 Chrome Extension

  • Расширение Встраивается в страницы HH.ru

  • Забирает куки авторизации для доступа к моему резюме

  • Извлекает ID вакансии из URL страницы

  • Добавляет кнопки "Сохранить резюме" и "Сгенерить письмо"

  • Показывает готовый текст в попапе

⚙️ NestJS Backend

  • REST API для работы с резюме и вакансиями

  • Интеграция с OpenAI GPT для парсинга и генерации

  • Запросы к приватному API HH.ru (через куки)

  • Запросы к публичному API HH.ru (для вакансий)

  • Локальное хранение данных в файлах

🤖 AI-движок

  • Парсит HTML резюме → извлекает структурированные данные

  • Получает данные вакансии через публичное API HH.ru

  • Сопоставляет навыки из резюме с требованиями вакансии

  • Генерирует персональное сопроводительное письмо на основе данных вакансии и резюме

Стек: TypeScript, NestJS, Chrome Extension

Как это работает?

Интерфейс расширения
Интерфейс расширения

Этап 1: Сохраняем резюме

  1. Переходим на страницу своего резюме на HH.ru

  2. Открываем расширение и жмем "Сохранить резюме"

  3. Расширение забирает куки с авторизацией

  4. Отправляет запрос на HH.ru с ключами авторизации

  5. Получает HTML нашего резюме в ответе

  6. Отправлят HTML в OpenAI для очистки и структурирования

  7. AI возвращает чистые данные резюме в удобном JSON формате

Пример кода для сохранения резюме
sendButton.addEventListener('click', async () => {
  sendButton.disabled = true;
  sendButton.textContent = "Сохранение...";
  statusDiv.textContent = "Сохранение резюме на бэкенд...";

  try {
    // Отправляем сообщение
    const response = await chrome.runtime.sendMessage({action: 'saveResume'});
    
    if (response.success) {
      statusDiv.textContent = "✅ Резюме успешно сохранено и проанализировано!";
      statusDiv.className = "status success";
    } else {
      throw new Error(response.error || 'Неизвестная ошибка');
    }
  } catch (error) {
    console.error("Resume save failed:", error);
    statusDiv.textContent = `❌ Ошибка: ${error.message}`;
    statusDiv.className = "status error";
  }
});

Этап 2: Генерируем письмо для вакансии

  1. Переходим на страницу вакансии которая интересует

  2. Жмем "Сгенерировать письмо" в расширении

  3. Расширение забирает ID вакансии из URL

  4. Запрашивает данные через бесплатное API HH.ru

  5. Отправляет резюме + вакансию в OpenAI

  6. AI генерирует персональное письмо на основе промпта

  7. Показываем письмо в попапе для копирования

Пример промта для создания сопроводительного письма
export const USER_PROMPTS = {
  COVER_LETTER: (resumeData: any, vacancyData: any) => `
Напиши короткое сопроводительное письмо на основе резюме и вакансии.

РЕЗЮМЕ:
${JSON.stringify(resumeData, null, 2)}

ВАКАНСИЯ:
${JSON.stringify(vacancyData, null, 2)}

Правила:
- Начинай с "Здравствуйте! Заинтересовала ваша вакансия"
- Максимум 2 абзаца
- Пиши как живой человек - естественно и без формальностей
- Упомяни конкретные технологии и проекты из резюме
- Покажи, что читал вакансию - упомяни название позиции, но НЕ название компании
- Свяжи свой опыт с требованиями вакансии
- Используй живые фразы: "хочется", "интересно", "готов"
- Избегай: "выразить интерес", "отличная возможность", "профессиональный рост"
- НЕ упоминай названия компаний/проектов - пиши про технологии и задачи
- Пиши от первого лица
- Закончи естественно, без "С уважением"
- НЕ придумывай лишние детали

Пример стиля:
"Здравствуйте! Заинтересовала ваша вакансия Node.js-разработчика — у меня есть реальные проекты на Node.js и TypeScript. Строил микросервисный бэкенд на NestJS с PostgreSQL, делал gRPC-интеграции и AI-классификацию, писал Telegram-бота с оплатами и API Gateway. Хочется применять эти технологии в новых проектах."

Ответ: только текст письма.
`
};

// Системный промпт
export const SYSTEM_PROMPTS = {
  COVER_LETTER: 'Ты пишешь короткие сопроводительные письма. Пиши как живой человек - естественно, но профессионально. Избегай шаблонов и формальностей. Фокусируйся на конкретных технологиях и опыте.'
};
Сгенерированное сопроводительное к конкретной вакансии
Сгенерированное сопроводительное к конкретной вакансии

Проблемы и решения

Проблема №1: Слишком формальные сопроводительные

Решение: Оптимизация промпта:

  • Живые фразы: «хочется», «интересно», «готов»

  • Избегать: «выразить интерес», «отличная возможность»

  • Пример желаемого стиля прямо в промпте

Проблема №2: Доступ к OpenAI в России

Решения:

  • Российские решения — YandexGPT или GigaChat от Сбера

  • Локальная LLM — лучший вариант! Бесплатно и без ограничений

Рекомендую: Модель T-Pro 2.0 от Тинькофф (квантизированная версия). Спокойно запустил на старушке RTX 4070 Ti — работает отлично!

Итоги

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

Юзайте посаны кому надо все фри, как картофель: