AI-агент для управления задачами сотрудников через Telegram с обработкой голосовых сообщений
Telegram-бот, который:
Что реализуем: Бот принимает голосовые сообщения только от руководителя (фильтр по Telegram ID). Аудио скачивается через Telegram Bot API и передаётся далее на транскрипцию.
Тонкости:
send_chat_action) пока идёт обработка, иначе пользователь не поймёт, что происходитПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 Таймаут скачивания | Большие файлы могут скачиваться медленно | Добавить retry-логику с таймаутом 30 сек |
| 🟡 Фоновый шум | Голосовое на улице / в машине → плохое распознавание | Предупреждать руководителя при низком качестве, Whisper prompt помогает |
| 🟡 Не голосовое | Пользователь может отправить аудио-файл вместо голосового | Обрабатывать оба типа: filters.VOICE и filters.AUDIO |
Что реализуем:
Отправка OGG-аудио в OpenAI Whisper API (model="whisper-1", language="ru"), получение текста.
Тонкости:
language="ru" обязателен — без него Whisper может определить язык неправильно (особенно при коротких командах)prompt улучшает качество: передать туда типичные имена сотрудников и термины бизнесаПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 Имена искажаются | Whisper может транскрибировать «Серёга» как «Серёга», «Серега», «Сирёга» | Передать имена сотрудников в поле prompt Whisper |
| 🟡 Длинные голосовые | >5 минут — качество падает, модель «забывает» начало | Разбить файл на чанки по 3 мин, транскрибировать отдельно, склеить |
| 🟡 Технические термины | Специфические слова бизнеса распознаются неточно | Добавить словарь терминов в prompt |
| 🟢 Стоимость | $0.006/мин — контролируемая, но нужен мониторинг | Логировать длительность каждого голосового |
Что реализуем: GPT-4o с Structured Outputs получает транскрипцию + список сотрудников и возвращает типизированный список задач (Pydantic-модель).
Тонкости:
Подводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 Неверное сопоставление имён | «Серёга» может не сопоставиться с «Сергей Иванов» | Поле name_aliases в документе сотрудника + передать все варианты в промпт |
| 🔴 Галлюцинации в дедлайнах | GPT может «придумать» дедлайн, который не был озвучен | Валидация: если дедлайн в прошлом — отвергнуть, показать руководителю для подтверждения |
| 🟡 Одна задача на несколько человек | «Серёга и Вася, подготовьте отчёт» → нужны 2 задачи | В промпте явно указать: «если задача для нескольких — создай отдельную для каждого» |
| 🟡 Нечёткие задачи | «Ну вы там разберитесь» → GPT не знает кому и что | GPT ставит assignee_name="Не указан", руководитель выбирает вручную |
| 🟢 Refusal (отказ GPT) | GPT может отказаться парсить — например, нецензурная лексика | Обработка message.refusal — вежливое уведомление руководителю |
Что реализуем: После подтверждения руководителем каждая задача отправляется сотруднику в личный чат с ботом, с inline-кнопками для управления статусом.
Тонкости:
/start — без этого Telegram Bot API не позволяет отправлять сообщения/add_employee бот генерирует deep link: https://t.me/<bot>?start=register_<token>parse_mode="Markdown" для красивого форматированияПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 Сотрудник не писал боту | Telegram API вернёт ошибку Forbidden: bot was blocked by the user |
Обработать исключение, уведомить руководителя: «Сотрудник не активировал бот» |
| 🔴 Сотрудник заблокировал бота | Аналогичная ошибка | Пометить сотрудника как is_active=false, уведомить руководителя |
| 🟡 Markdown-спецсимволы | Если в задаче есть _, *, ` — Markdown сломается |
Экранировать спецсимволы или использовать parse_mode="HTML" |
| 🟡 Длинное описание | Telegram ограничивает сообщения до 4096 символов | Разбивать длинные задачи на несколько сообщений |
Что реализуем:
Команды для просмотра задач (/tasks, /my_tasks, /task <id>), фильтрация по статусу и сотруднику, inline-клавиатуры для обновления статусов.
Тонкости:
new → sent → acknowledged → in_progress → on_review → completedtask_updates — это полная историяПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🟡 ID задач в Firestore | Автоматические ID в Firestore — длинные строки (20 символов) | Показывать пользователю короткий номер, хранить task_number — auto-increment счётчик |
| 🟡 Callback data limit | Telegram ограничивает callback_data до 64 байт |
Использовать короткие префиксы: ack_, wip_, done_ + короткий ID |
| 🟡 Устаревшие кнопки | Сотрудник нажимает кнопку на старом сообщении, статус уже другой | Проверять текущий статус перед обновлением, показать ошибку если устарел |
| 🟢 Пагинация | Если >20 задач — список не помещается в одно сообщение | Реализовать постраничную навигацию inline-кнопками (« Назад / Вперёд ») |
Что реализуем:
JobQueue проверяет каждый час все активные задачи. Если с момента последнего напоминания прошло reminder_interval_days дней — отправляем напоминание. Интервал настраивается для каждой задачи.
Тонкости:
reminder_interval_days = 2 (каждые 2 дня)last_reminder_at хранится в Firestore — переживает перезапуск ботаПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 JobQueue in-memory | При перезапуске бота все запланированные джобы теряются | Не хранить конкретные джобы — запускать один повторяющийся джоб-чекер, данные в Firestore |
| 🟡 Назойливость | Слишком частые напоминания раздражают сотрудников | Минимальный интервал — 1 день, возможность сотруднику «отложить» напоминание |
| 🟡 Часовые пояса | Напоминание в 3 ночи — плохо | Добавить timezone в профиль сотрудника, отправлять только в рабочие часы (9:00-18:00) |
| 🟡 Дублирование | Два инстанса бота → двойные напоминания | Гарантировать один инстанс (Docker restart: unless-stopped, без масштабирования) |
| 🟢 Эскалация | Задача просрочена на 3+ дня — руководитель не знает | Автоматическое уведомление руководителю при просрочке дедлайна |
Что реализуем:
История всех изменений статусов (кто, когда, из какого в какой статус, с каким комментарием). Команда /stats для руководителя со сводной статистикой.
Тонкости:
task_updates хранит каждое изменение — это audit log/stats показывает: сколько задач в каждом статусе, средняя скорость выполнения, % просроченных/progress <id> <текст> — это сохраняется как task_update с комментариемПодводные камни:
| Проблема | Описание | Решение |
|---|---|---|
| 🟡 Рост данных | task_updates растёт быстро при активном использовании |
Firestore бесплатно хранит 1 ГБ (~500K документов), этого хватит на годы |
| 🟡 Нет файловых вложений | Сотрудник не может приложить скриншот к отчёту | Фаза 2: принимать фото/документы, хранить file_id от Telegram |
| 🟢 Аналитика | Руководитель хочет видеть тренды (ускоряется ли команда?) | Считать на лету: среднее время от sent до completed за неделю/месяц |
| 🟢 Экспорт | Нужно выгрузить данные в Excel для отчёта | Фаза 2: команда /export → CSV-файл через bot.send_document |
| Критерий | YouGile | Trello | Jira | Notion |
|---|---|---|---|---|
| Язык интерфейса | ✅ Русский | ⚠️ English | ⚠️ English | ⚠️ English |
| Telegram-интеграция | ✅ Встроенная | ⚠️ Power-Up | ❌ Нет | ❌ Нет |
| Бесплатный план | ✅ 10 юзеров, полный функционал | ✅ 10 досок, безлимит карточек | ✅ 10 юзеров | ✅ Безлимит блоков (1 чел) |
| Python API | ✅ REST + yougile-api (PyPI) |
✅ REST + py-trello |
✅ REST + jira (PyPI) |
⚠️ REST, нет офиц. SDK |
| Простота API | 🟢 Простой REST | 🟢 Простой REST | 🟡 Сложный | 🟡 Средний |
| Kanban-доска | ✅ | ✅ | ✅ | ⚠️ Поверх базы данных |
| Rate limit | 50 req/мин | 100 req/10сек | Tier-based | 3 req/сек |
| Стоимость | $0 (до 10 чел) | $0 (до 10 досок) | $0 (до 10 чел) | $0 (1 чел) |
Почему YouGile — лучший выбор для данного проекта:
requestsyougile-api на PyPI, поддерживает pydantic| Событие | Firestore → YouGile | YouGile → Firestore |
|---|---|---|
| Создание задачи | ✅ Бот создаёт карточку | ❌ Не нужно |
| Смена статуса | ✅ Бот перемещает карточку в колонку | ⚠️ Фаза 2: webhook |
| Дедлайн | ✅ Бот устанавливает дату | ❌ Не нужно |
| Комментарий сотрудника | ✅ Бот добавляет комментарий | ❌ Не нужно |
[!IMPORTANT] Firestore остаётся «единственным источником правды» (source of truth). YouGile — визуальная витрина. Все изменения идут через бота → Firestore → YouGile. Обратная синхронизация (YouGile → Firestore) — опциональна, в Фазе 2.
| Колонка YouGile | Статус Firestore | Цвет |
|---|---|---|
| 📥 Новые | new, sent |
Серый |
| 👀 В работе | acknowledged, in_progress |
Синий |
| 📝 На проверке | on_review |
Жёлтый |
| ✅ Готово | completed |
Зелёный |
| ❌ Отменено | cancelled |
Красный |
| Проблема | Описание | Решение |
|---|---|---|
| 🔴 Rate limit 50 req/мин | При массовом создании задач из длинного голосового | Батчить запросы, использовать очередь |
| 🟡 Двухсторонняя синхронизация | Если кто-то переместит карточку в YouGile — Firestore не узнает | Фаза 1: только Firestore → YouGile. Фаза 2: webhook YouGile → бот |
| 🟡 YouGile ID → Firestore | Нужно хранить ID карточки YouGile в документе задачи | Добавить поле yougile_card_id в коллекцию tasks |
| 🟢 Доступ сотрудников к доске | Сотрудники должны быть добавлены в YouGile-проект | Автоматическое приглашение через API при /add_employee |
| Роль | Описание | Возможности |
|---|---|---|
| Руководитель | Единственный пользователь с полными правами | Голосовые, создание/удаление задач, просмотр всех задач и статистики |
| Сотрудник | Зарегистрированный в системе | Просмотр своих задач, обновление статусов, отправка отчётов |
| Критерий | Google Firestore | Supabase | Airtable |
|---|---|---|---|
| Нужен SQL | ❌ Нет | ⚠️ Частично | ❌ Нет |
| Python SDK | ✅ Отличный (async) | ✅ Хороший | ⚠️ Базовый |
| Бесплатный план | ✅ 50K чтений/день | ✅ 500 МБ, 50K MAU | ⚠️ 1000 строк |
| Визуальная консоль | ✅ Firebase Console | ✅ Dashboard | ✅ Spreadsheet UI |
| Сложность интеграции | 🟢 Простая | 🟡 Средняя | 🟡 Средняя |
| Реальное время | ✅ Real-time listeners | ✅ Real-time | ❌ Нет |
| Rate limits | 🟢 Щедрые | 🟢 Щедрые | 🔴 5 req/sec |
| Компонент | Технология | Назначение |
|---|---|---|
| Язык | Python 3.11+ | Основной язык разработки |
| Telegram Bot | python-telegram-bot 22.5 | Обёртка над Telegram Bot API (async, встроенный JobQueue) |
| AI: Транскрипция | OpenAI Whisper API | Распознавание русской речи |
| AI: Анализ текста | OpenAI GPT-4o | Structured Outputs — типизированный разбор задач |
| Хранилище | Google Firestore | NoSQL документная БД (без SQL) |
| Конфигурация | pydantic-settings | Валидация переменных окружения |
ai-task-manager/
├── bot/
│ ├── main.py # Точка входа
│ ├── config.py # Конфигурация
│ ├── handlers/ # Обработчики команд бота
│ │ ├── admin.py # Хэндлеры руководителя
│ │ ├── employee.py # Хэндлеры сотрудников
│ │ └── common.py # Общие хэндлеры
│ ├── services/ # Бизнес-логика
│ │ ├── transcription.py # Whisper API
│ │ ├── task_parser.py # GPT-4o
│ │ ├── task_manager.py # Управление задачами
│ │ └── reminder.py # Напоминания
│ ├── firestore/ # Работа с БД
│ │ ├── client.py # Инициализация Firestore
│ │ └── repositories.py # CRUD-операции
│ └── utils/
│ └── formatters.py # Форматирование сообщений
├── .env # Секреты (не коммитить)
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
Firestore хранит данные в виде коллекций (аналог таблиц) и документов (аналог строк). Каждый документ — JSON-объект.
employees| Поле | Тип | Описание |
|---|---|---|
telegram_id |
number | Уникальный Telegram ID |
telegram_username |
string | @username |
full_name |
string | Полное имя |
name_aliases |
array | Варианты имени (для распознавания из голосового) |
is_active |
boolean | Активен ли сотрудник |
created_at |
timestamp | Дата добавления |
tasks| Поле | Тип | Описание |
|---|---|---|
title |
string | Заголовок задачи |
description |
string | Подробное описание |
status |
string | new → sent → acknowledged → in_progress → on_review → completed / cancelled |
priority |
string | low, medium, high, urgent |
assignee_id |
string | ID документа сотрудника |
assignee_name |
string | Имя сотрудника |
assignee_telegram_id |
number | Telegram ID сотрудника |
deadline |
timestamp | Дедлайн (опционально) |
reminder_interval_days |
number | Интервал напоминаний (дни) |
last_reminder_at |
timestamp | Когда последний раз напоминали |
original_voice_text |
string | Оригинальный текст из голосового |
created_at / updated_at |
timestamp | Даты создания/обновления |
task_updates (история)| Поле | Тип | Описание |
|---|---|---|
task_id |
string | ID задачи |
author_type |
string | admin, employee, system |
old_status / new_status |
string | Старый/новый статус |
comment |
string | Комментарий (опционально) |
created_at |
timestamp | Дата изменения |
eur3 (Europe)[!TIP] Все данные можно просматривать и редактировать прямо в Firebase Console → Firestore Database. Это визуальный интерфейс — никакого SQL не нужно.
Процесс:
language="ru" для распознавания русской речиТехнические ограничения:
language="ru" критически важен для качестваprompt задаёт контекст и улучшает распознавание имён и терминовGPT-4o с технологией Structured Outputs гарантирует ответ строго по заданной схеме:
Что извлекается из голосового:
| Поле | Описание |
|---|---|
| Имя исполнителя | Сопоставляется со списком сотрудников в БД |
| Заголовок задачи | Краткая формулировка (до 100 символов) |
| Описание | Подробное описание задачи |
| Дедлайн | Если упомянут (относительные даты преобразуются в абсолютные) |
| Приоритет | urgent при «срочно»/«немедленно», иначе по контексту |
Поведение:
| Команда | Описание |
|---|---|
/start |
Приветствие + регистрация как админ |
/add_employee <имя> <@username> |
Добавить сотрудника |
/remove_employee <@username> |
Удалить сотрудника |
/employees |
Список сотрудников |
/tasks |
Все задачи (фильтрация по статусу/сотруднику) |
/task <id> |
Детали конкретной задачи |
/cancel_task <id> |
Отменить задачу |
/stats |
Статистика по задачам |
| 🎤 Голосовое сообщение | Создание задач из голосового |
| Команда | Описание |
|---|---|
/start |
Регистрация в системе |
/my_tasks |
Мои текущие задачи |
/done <id> |
Отметить задачу выполненной |
/progress <id> <текст> |
Отправить отчёт о прогрессе |
После распознавания голосового руководитель получает карточку каждой задачи с кнопками:
| Кнопка | Действие |
|---|---|
| ✅ Отправить | Сохранить задачу и отправить сотруднику |
| ✏️ Редактировать | Изменить формулировку задачи |
| ❌ Отменить | Не создавать задачу |
| 📅 Дедлайн | Изменить/установить дедлайн |
При получении задачи или напоминания сотрудник видит кнопки:
| Кнопка | Новый статус |
|---|---|
| 👀 Принял | acknowledged |
| 🔄 В работе | in_progress |
| 📝 На проверке | on_review |
| ✅ Готово | completed |
reminder_interval_days дней с последнего напоминания| Механизм | Описание |
|---|---|
| Admin-only | Команды руководителя проверяют Telegram ID отправителя по ADMIN_TELEGRAM_ID |
| Registered employee | Команды сотрудников проверяют наличие записи в коллекции employees |
| Голосовые | Принимаются только от руководителя (фильтр по Telegram ID) |
| Переменная | Описание | Пример |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Токен бота от @BotFather | 123456:ABC-DEF... |
ADMIN_TELEGRAM_ID |
Ваш Telegram ID | 123456789 |
OPENAI_API_KEY |
Ключ OpenAI API | sk-... |
GOOGLE_APPLICATION_CREDENTIALS |
Путь к файлу ключа Firebase | firebase-service-account.json |
DEFAULT_REMINDER_INTERVAL_DAYS |
Интервал напоминаний (дни) | 2 |
REMINDER_CHECK_INTERVAL_HOURS |
Частота проверки напоминаний (часы) | 1 |
.env файл своими ключамиpython -m bot.mainПроект включает Dockerfile и docker-compose.yml для контейнеризации. Единственный внешний volume — файл ключа Firebase.
| Вариант | Стоимость/мес | Рекомендация |
|---|---|---|
| 🏠 Локально | $0 | Для тестирования |
| ☁️ Timeweb Cloud | 300-500 ₽ | ✅ Лучший для начала |
| 🟡 Oracle Cloud Free | $0 | Бесплатный VPS навсегда |
| 🚂 Railway.app | $0-5 | Простой деплой |
| Статья расходов | Оценка | Комментарий |
|---|---|---|
| AI-агент для разработки (см. таблицу ниже) | $0-250 | Подписка на 1 месяц |
| Ваше время | 8-13 дней | Основная «стоимость» |
| Telegram Bot (через @BotFather) | $0 | Бесплатно |
| Firebase проект | $0 | Бесплатный план Spark |
| OpenAI API (регистрация) | $5 | Минимальное пополнение |
| Итого единоразово | $5-255 | В зависимости от выбора AI-агента |
| AI-агент | Бесплатно | Базовый план | Продвинутый план | Рекомендация |
|---|---|---|---|---|
| OpenAI Codex | ❌ | $20/мес (ChatGPT Plus) | $200/мес (Pro) | 🟡 Хорош для генерации кода, лимиты 30-150 сообщ/5ч |
| Claude Code | ❌ | $20/мес (Pro) | $100-200/мес (Max 5x-20x) | ✅ Лучший для сложной архитектуры, терминальный доступ |
| Antigravity | ✅ (Gemini 3 Pro, лимиты) | $20/мес (Pro) | $250/мес (Ultra) | ✅ Есть бесплатный план, мультимодельный доступ |
| OpenClaw | ✅ (open-source) | $0 + API-расходы | $0 + API-расходы | 🟡 Бесплатный, но нужна настройка, расходы на API моделей |
[!TIP] Рекомендация для данного проекта:
- Бюджетный вариант: Antigravity Free + OpenClaw → $0 (только API-расходы ~$5-15 за проект)
- Оптимальный: Claude Code Pro ($20/мес) или Antigravity Pro ($20/мес) → $20
- Максимальный: Claude Code Max ($100-200/мес) → быстрее, но избыточно для данного проекта
| Сервис | Бесплатная квота | Хватает для |
|---|---|---|
| Firestore | 50K чтений + 20K записей / день | Команда до 50 человек |
| Firestore хранилище | 1 ГБ | ~500K документов задач |
| Telegram Bot API | Без ограничений | Любой объём |
Whisper API ($0.006 / минута):
| Сценарий | Голосовых/день | Минут/мес | Стоимость/мес |
|---|---|---|---|
| 🟢 Малая команда (3-5 чел.) | 2-3 | ~75 | $0.45 |
| 🟡 Средняя команда (5-15 чел.) | 5-8 | ~300 | $1.80 |
| 🔴 Большая команда (15-30 чел.) | 10-15 | ~750 | $4.50 |
GPT-4o ($2.50/1M input, $10/1M output):
| Сценарий | Запросов/мес | Стоимость/мес |
|---|---|---|
| 🟢 Малая | ~30 | $0.23 |
| 🟡 Средняя | ~100 | $0.75 |
| 🔴 Большая | ~300 | $2.25 |
| 🟢 Малая | 🟡 Средняя | 🔴 Большая | |
|---|---|---|---|
| Whisper API | $0.45 | $1.80 | $4.50 |
| GPT-4o API | $0.23 | $0.75 | $2.25 |
| Firestore | $0 | $0 | $0 |
| VPS (Timeweb) | $3 | $3 | $5 |
| Итого/мес | ~$3.70 | ~$5.55 | ~$11.75 |
| Итого/год | ~$44 | ~$67 | ~$141 |
[!TIP]
Оптимизация затрат
- Oracle Cloud Free Tier → VPS = $0
- GPT-4o-mini вместо GPT-4o → в 15 раз дешевле
- Минимальный сценарий (Oracle + GPT-4o-mini): < $1/мес
Firestore остаётся бесплатным на плане Spark. Переход на платный Blaze — только вручную.
| Лимит | Бесплатно/день | Когда будет превышен |
|---|---|---|
| 50K чтений | ~2K/час | Маловероятно (~1000 просмотров/час) |
| 20K записей | ~830/час | Маловероятно (~400 задач/час) |
| 1 ГБ хранилище | — | ~500 000 задач, на годы вперёд |
Вывод: для данного use-case Firestore остаётся бесплатным на неопределённое время.
| # | Задача | Оптим. | Реалист. | Пессим. | Зависимости |
|---|---|---|---|---|---|
| 1 | Инициализация проекта, структура, конфигурация | 0.5 дн | 1 дн | 1 дн | — |
| 2 | Настройка Firebase проекта + Firestore клиент | 0.5 дн | 0.5 дн | 1 дн | — |
| 3 | CRUD-операции Firestore (employees, tasks) | 0.5 дн | 1 дн | 1.5 дн | #1, #2 |
| 4 | Интеграция Whisper API (транскрипция) | 0.5 дн | 1 дн | 1.5 дн | #1 |
| 5 | Интеграция GPT-4o (парсинг задач) | 0.5 дн | 1 дн | 2 дн | #1 |
| 6 | Хэндлеры бота: /start, /help, /add_employee | 0.5 дн | 1 дн | 1.5 дн | #3 |
| 7 | Обработка голосового → создание задач | 1 дн | 1.5 дн | 2 дн | #3, #4, #5 |
| 8 | Inline-клавиатуры подтверждения задач | 0.5 дн | 1 дн | 1.5 дн | #7 |
| 9 | Отправка задач сотрудникам | 0.5 дн | 0.5 дн | 1 дн | #8 |
| 10 | Обновление статусов (inline-кнопки сотрудника) | 0.5 дн | 1 дн | 1.5 дн | #9 |
| 11 | История обновлений задач (task_updates) | 0.5 дн | 0.5 дн | 1 дн | #10 |
| 12 | Команды /tasks, /my_tasks, /stats + фильтрация | 0.5 дн | 1 дн | 1.5 дн | #3 |
| 13 | Система напоминаний (JobQueue) | 0.5 дн | 1 дн | 2 дн | #3, #9 |
| 14 | Уведомления о просроченных дедлайнах | 0.5 дн | 0.5 дн | 1 дн | #13 |
| 15 | Docker + docker-compose | 0.5 дн | 0.5 дн | 1 дн | #1-14 |
| 16 | Деплой на VPS + тестирование | 0.5 дн | 1 дн | 2 дн | #15 |
| 17 | README, обработка ошибок, финальная шлифовка | 0.5 дн | 1 дн | 1.5 дн | #16 |
| ИТОГО | 8 дн | 13 дн | 22 дн |
| Фаза | Задачи | Оптим. | Реалист. | Даты (реалист.) |
|---|---|---|---|---|
| 1. MVP | #1-7 | 3 дн | 5 дн | 24.03 – 28.03 |
| 2. Управление | #8-12 | 2 дн | 3 дн | 31.03 – 02.04 |
| 3. Напоминания | #13-14 | 1 дн | 2 дн | 03.04 – 04.04 |
| 4. Шлифовка | #15-17 | 2 дн | 3 дн | 07.04 – 09.04 |
| Итого | 17 задач | 8 дн | 13 дн | 24.03 – 09.04 |
[!CAUTION]
Сотрудник должен первым написать боту
Telegram Bot API запрещает отправку сообщений пользователям, которые не начали диалог с ботом. Каждый сотрудник обязан написать
/start.Решение: При добавлении сотрудника генерируется ссылка-приглашение, которую руководитель пересылает.
[!WARNING]
Нечёткое сопоставление имён
В голосовом руководитель может назвать «Серёга», «Сергей», «Иванов». GPT-4o может ошибиться.
Решение: Хранение вариантов имени (
name_aliases) + передача полного списка имён в контекст GPT.
[!WARNING]
Длинные голосовые (5+ минут)
GPT-4o может «потерять» часть задач из длинной транскрипции.
Решение: Для длинных голосовых — разбивка текста. Всегда — подтверждение руководителем.
[!NOTE]
Firestore: составные индексы
Запросы с несколькими фильтрами требуют создания индекса. Firebase Console предложит ссылку — нужно просто кликнуть.
| Ресурс | URL |
|---|---|
| python-telegram-bot v22.5 | https://docs.python-telegram-bot.org/en/v22.5/ |
| Telegram Bot API | https://core.telegram.org/bots/api |
| OpenAI Whisper API | https://platform.openai.com/docs/api-reference/audio/createTranscription |
| OpenAI Structured Outputs | https://platform.openai.com/docs/guides/structured-outputs |
| Google Firestore | https://cloud.google.com/python/docs/reference/firestore/latest |
| Firebase Console | https://console.firebase.google.com/ |