Compare commits

..

7 Commits

12 changed files with 565 additions and 90 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* text=auto eol=lf

View File

@@ -1,44 +1,58 @@
# Акылдаш — бот-секретарь
# Акылдаш
Версия: `0.2.0`
Акылдаш — проект юридической информационно-аналитической платформы. Цель —
собирать правовые источники на законных основаниях, сохранять их происхождение
и версии, готовить данные для поиска и RAG, а затем предоставлять результаты
через API и пользовательский интерфейс со ссылками на первоисточники.
Бот сохраняет сообщения разрешённых тем Telegram в локальную SQLite-базу и
выгружает обсуждения в Markdown. Внешние Python-зависимости не требуются.
Telegram-бот — только часть рабочего окружения команды, а не основной продукт.
## Запуск
## Текущее состояние
Требуется Python 3.11 или новее.
Сейчас реализован Telegram-бот-секретарь версии `0.2.2`. Он сохраняет сообщения
рабочих тем, формирует Markdown-экспорты и отмечает завершённые обсуждения.
```bash
export TELEGRAM_BOT_TOKEN='...'
export TELEGRAM_CHAT_ID='-1004242041275'
export TELEGRAM_OWNER_ID='87262245'
export TELEGRAM_REPORT_THREAD_ID='37'
export TELEGRAM_ALLOWED_THREAD_IDS='0,2,4,6,8'
python3 bot.py
| Компонент | Версия | Состояние |
|---|---:|---|
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
| Backend | — | ещё не создан |
| Frontend | — | ещё не создан |
| Сбор и обработка правовых данных | — | ещё не созданы |
| RAG и база знаний | — | ещё не созданы |
## Структура репозитория
```text
docs/ структурированная документация проекта
decisions/ принятые архитектурные и продуктовые решения
operations/ состояние проекта и рабочие процессы
product/ назначение, границы и развитие продукта
team/ материалы для команды
tools/
telegram-bot/ бот рабочего Telegram-пространства
```
Доступные команды: `/help`, `/status`, `/export [дней]`, `/export все`.
Экспорт доступен только пользователю с Telegram ID из `TELEGRAM_OWNER_ID`.
Markdown публикуется в теме `TELEGRAM_REPORT_THREAD_ID`, а в исходной теме
остаётся отсечка со ссылкой и общим хэштегом отчёта.
Каталоги для загрузки и обработки источников, RAG, backend и frontend будут
создаваться с первой реальной задачей в соответствующей области. Это позволит
выбрать структуру по фактическим требованиям, а не поддерживать пустой каркас.
База по умолчанию хранится в `data/secretary.sqlite3`. Сообщения из других
групп и тем не сохраняются. Полный ответ Telegram сохраняется в базе, поэтому
метаданные вложений остаются доступными для последующего скачивания.
Начать знакомство с проектом: [документация](docs/README.md) и
[обзор продукта](docs/product/project-overview.md).
## Проверка
## Конфиденциальные материалы
Секреты, персональные данные, договоры и материалы по правовой защите проекта
не должны храниться в этом репозитории. Для них нужен отдельный закрытый
репозиторий или защищённое хранилище с минимально необходимыми правами доступа,
журналированием и резервным копированием. Здесь допустимы только несекретные
правила и ссылки на такие материалы без раскрытия их содержания.
## Проверка Telegram-бота
```bash
python3 -m unittest -v
python3 -m unittest discover -s tools/telegram-bot -v
```
## Synology
Контейнер `akyldash-bot` работает на образе `python:3.11-slim` с политикой
перезапуска `unless-stopped`. Постоянные данные находятся в
`/volume1/docker/akyldash/data`.
---
Акылдаш v0.2.0
Акылдаш · Telegram-бот v0.2.2 · Backend — не создан · Frontend — не создан

27
docs/README.md Normal file
View File

@@ -0,0 +1,27 @@
# Документация Акылдаш
## Продукт
- [Обзор проекта](product/project-overview.md) — назначение, основные области и
правила работы с данными.
## Решения
- [Решение 001](decisions/001-telegram-workspace-mvp.md) — границы MVP
Telegram-инфраструктуры.
## Эксплуатация и рабочий процесс
- [Текущий статус](operations/project-status.md) — выполненные шаги, риски и
ближайшие действия.
- [План Telegram-пространства](operations/telegram-workspace-plan.md) — темы,
роли и этапы развития командного окружения.
## Команда
- [Навыки работы с ИИ](team/ai-skills-for-beginners.md) — короткие практики для
начинающих.
---
Акылдаш · Telegram-бот v0.2.2 · Backend — не создан · Frontend — не создан

View File

@@ -54,9 +54,9 @@ Telegram не является хранилищем проекта, а бот и
## Граница между ботом и ИИ
- Бот без обращения к API языковой модели полностью выполняет сбор сообщений, сортировку, добавление метаданных, подготовку вложений и формирование Markdown-экспорта.
- Бот добавляет к экспорту готовую инструкцию для ручной загрузки в обычный ChatGPT.
- На следующем этапе бот должен добавлять к экспорту готовую инструкцию для ручной загрузки в обычный ChatGPT.
- Выделение решений, задач, рисков, противоречий и открытых вопросов выполняется в ChatGPT вручную через подписку участника.
- Бот может принять возвращённый человеком отчёт, опубликовать его в Telegram и связать с исходным обсуждением.
- На следующем этапе бот должен принимать возвращённый человеком отчёт, публиковать его в Telegram и связывать с исходным обсуждением.
- Бот не выдаёт эвристический или шаблонный результат за выполненный ИИ-анализ. Поиск ключевых слов и ручные метки допустимы только как вспомогательная навигация.
## Техническое замечание о правах тем
@@ -65,13 +65,17 @@ Telegram позволяет запретить пользователям отп
## Инфраструктурные предпосылки
- Доступы для настройки находятся в `credentials.json`; секреты из этого файла нельзя включать в Git, логи CI/CD, экспорт Telegram или сообщения бота.
- Доступы для настройки находятся в локальном `credentials.json`; секреты из этого файла нельзя включать в Git, логи CI/CD, экспорт Telegram или сообщения бота.
- Для проекта можно создать открытый репозиторий в Gitea.
- В Gitea необходимо настроить защиту `main`: прямые push запрещены, изменения проходят через pull request и проверки CI/CD.
- Бот развёрнут в Container Manager на Synology с постоянным SQLite-томом и политикой автоперезапуска.
- Бот развёрнут в Container Manager на Synology с постоянным SQLite-томом и политикой автоперезапуска; конфигурацию развёртывания ещё предстоит зафиксировать в репозитории.
- PostgreSQL будет использоваться как хранилище бота; параметры доступа к базе будут предоставлены отдельно.
- Почта может использоваться как дополнительный канал доставки файлов и отчётов, но не как основное хранилище.
## Критерий завершения Stage 0
Границы MVP, состав тем и правила работы с данными подтверждены. Остаётся реализовать жизненный цикл тем и экспортов, после чего можно проектировать схему хранения и команды бота, не меняя назначение первой версии по ходу реализации.
Критерий выполнен: границы MVP зафиксированы, темы созданы, первая версия бота и экспортов реализована. Полный рабочий цикл будет принят командой после проверки на реальном обсуждении.
---
Акылдаш · Telegram-бот v0.2.2

View File

@@ -1,15 +1,18 @@
# Статус проекта
Последняя проверка: 2026-08-02
Последняя проверка: 2026-08-03
Назначение документа: быстро восстановить контекст проекта для участников команды и будущих агентов.
Версия приложения: `0.2.0`
- Telegram-бот: `0.2.2`
- Telegram-бот на Synology: `0.2.1`
- Backend: не создан
- Frontend: не создан
## Краткий итог
Telegram-инфраструктура и первая версия бота-секретаря подготовлены. Бот сохраняет сообщения разрешённых тем в SQLite, переживает перезапуск и экспортирует обсуждения в Markdown.
Репозиторий переориентирован с отдельного бота на весь проект юридической информационно-аналитической платформы. Telegram-бот выделен в инструмент рабочего окружения: он сохраняет сообщения разрешённых тем в SQLite, экспортирует обсуждения в Markdown и постоянно запущен в Container Manager на Synology. Версия `0.2.2` будет развёрнута после слияния изменений; сейчас на Synology работает `0.2.1`.
Ближайшая цель — проверить экспорт из постоянно работающего контейнера и настроить резервное копирование SQLite.
Ближайшая цель — 2026-08-04 зафиксировать MVP с командой, настроить резервное копирование SQLite и затем проверить полный рабочий цикл на реальном обсуждении.
## Уже сделано
@@ -27,20 +30,23 @@ Telegram-инфраструктура и первая версия бота-се
| Тема | `message_thread_id` | Состояние |
|---|---:|---|
| Общее | отсутствует | стандартная тема |
| Общее | отсутствует | приветствие закреплено, тема закрыта |
| MVP | `2` | подтверждено тестовым сообщением |
| Решения | `4` | подтверждено тестовым сообщением |
| Обсуждение | `6` | подтверждено тестовым сообщением |
| Работа с ИИ | `8` | подтверждено тестовым сообщением |
| Отчеты | `37` | закрытая тема для Markdown-экспортов |
| Работа с ИИ | `8` | материалы опубликованы, тема закрыта |
| Отчеты | `37` | экспорт проверен, тема закрыта |
### Документация и правила
- Подготовлен общий план реализации в `TEAM_AI_TELEGRAM_IMPLEMENTATION_PLAN.md`.
- Зафиксированы границы MVP и правила работы с данными в `docs/decisions/001-mvp-boundaries-and-rules.md`.
- Подготовлен общий план реализации в `docs/operations/telegram-workspace-plan.md`.
- Зафиксированы границы MVP и правила работы с данными в `docs/decisions/001-telegram-workspace-mvp.md`.
- Добавлены обзор всей платформы и единый индекс документации.
- В MVP не входит автоматический вызов API языковой модели.
- Анализ экспортов выполняется вручную в обычном ChatGPT.
- Telegram используется как рабочий штаб, Git/Gitea — как источник утверждённых материалов.
- Подготовлены и опубликованы краткие навыки работы с ИИ для начинающих.
- В `Общее` опубликовано и закреплено приветствие с назначением тем и описанием бота.
### Доступы
@@ -50,23 +56,31 @@ Telegram-инфраструктура и первая версия бота-се
### Репозиторий и приложение
- Реализован бот-секретарь версии `0.2.0` без внешних Python-зависимостей.
- Реализован бот-секретарь версии `0.2.2` без внешних Python-зависимостей.
- Код бота выделен из корня репозитория в `tools/telegram-bot`.
- Сообщения и полные Telegram-метаданные сохраняются в SQLite.
- Добавлены команды `/help`, `/status`, `/export [дней]` и `/export все`.
- Добавлены команды `/help`, `/status` и `/export`.
- Экспорт доступен только владельцу, указанному в `TELEGRAM_OWNER_ID`.
- Первый `/export` охватывает всю сохранённую тему, последующие начинаются после последней успешно созданной отсечки.
- Отчёты публикуются в закрытой теме `Отчеты` (`message_thread_id=37`).
- Исходное обсуждение завершается заметной отсечкой со ссылкой и хэштегом отчёта.
- Локальный Git-репозиторий восстановлен и привязан к Gitea.
- Репозиторий организован как основа всего проекта, а не отдельного бота.
- Бот развёрнут в Container Manager на Synology; автозапуск после перезапуска менеджера проверен.
### Развёртывание
- Бот постоянно запущен на Synology в контейнере `akyldash-bot`.
- Используется официальный образ `python:3.11-slim` и long polling.
- Контейнер работает без root, с read-only root filesystem и политикой `unless-stopped`.
- Доступ к Telegram Bot API идёт через отдельный закрытый прокси-контейнер без опубликованных наружу портов.
- Код, закрытый env-файл и SQLite хранятся в `/volume1/docker/akyldash`.
## Пока не сделано
### Развёртывание и сопровождение
- Docker-конфигурация развёртывания не хранится в репозитории.
- Не настроен CI/CD.
### Хранилище
@@ -84,14 +98,13 @@ Telegram-инфраструктура и первая версия бота-се
### Группа и рабочий процесс
- Не подготовлены закреплённые сообщения с правилами тем.
- Не проверены сценарии закрытия темы `MVP` после фиксации состава первой версии.
- Не настроены уведомления Gitea.
- Не проведён полный пользовательский тест: сообщение → сохранение → экспорт → анализ в ChatGPT → возврат отчёта.
## Важные неизвестные
Для следующего этапа нужно получить или принять решения по следующим вопросам:
По мере реального использования нужно принять решения по следующим вопросам:
1. Адрес и параметры PostgreSQL для разработки и Synology.
2. Правила хранения и удаления сообщений и вложений.
@@ -99,16 +112,31 @@ Telegram-инфраструктура и первая версия бота-се
## Следующий этап
### Проверка постоянного запуска
### Фиксация MVP и проверка полного цикла
Рекомендуемый порядок:
1. Проверить `/status` и `/export 1` из контейнера Synology.
2. Перезапустить контейнер и убедиться, что сообщения не дублируются.
3. Настроить резервное копирование `/volume1/docker/akyldash/data`.
1. Настроить резервное копирование `/volume1/docker/akyldash/data`.
2. Зафиксировать состав MVP с командой и закрыть тему `MVP`.
3. Провести одно реальное обсуждение с ответами, правками и вложением.
4. Экспортировать обсуждение и вручную проанализировать Markdown в ChatGPT.
5. Вернуть подтверждённый итог в тему `Решения` и зафиксировать его в Git/Gitea.
6. Записать обнаруженные неудобства и только после этого выбирать следующую доработку.
## История изменений статуса
### 2026-08-03
- Репозиторий перестроен под весь проект юридической платформы; Telegram-бот перенесён в `tools/telegram-bot`.
- Созданы обзор продукта и структурированный индекс документации; будущие каталоги решено создавать по фактическим задачам.
- Закрытые юридические материалы решено хранить отдельно от основного репозитория.
- Версия Telegram-бота обновлена до `0.2.2` из-за изменения структуры запуска.
- Экспорт без параметров переведён с периода в семь дней на диапазон после предыдущей отсечки.
- Бот развёрнут в Container Manager на Synology; автозапуск проверен перезапуском.
- В теме `Работа с ИИ` опубликована первоначальная библиотека практик и отдельный материал о безопасной работе с Codex.
- В `Общее` опубликовано и закреплено приветствие; тема закрыта для сообщений.
- Локальный файл доступов переведён из `credentials.txt` в `credentials.json`.
### 2026-08-02
- Экспорт ограничен Telegram ID владельца бота.
@@ -131,3 +159,7 @@ Telegram-инфраструктура и первая версия бота-се
- Определены ID тем: `2`, `4`, `6`, `8`.
- Подтверждено отсутствие webhook.
- Зафиксировано, что код бота и хранилище ещё не реализованы.
---
Акылдаш · Telegram-бот v0.2.2 · Backend — не создан · Frontend — не создан

View File

@@ -276,57 +276,59 @@ docs/
## 9. Этапы реализации
Обозначения: `[x]` — выполнено, `[ ]` — ещё не выполнено.
### Этап 0. Границы и правила
- утвердить назначение Telegram, Git, бота и ChatGPT;
- выбрать темы, которые бот слушает;
- определить, что можно собирать автоматически;
- определить правила обработки персональных и конфиденциальных данных;
- определить формат решений, задач и экспортов.
- [x] утвердить назначение Telegram, Git, бота и ChatGPT;
- [x] выбрать темы, которые бот слушает;
- [x] определить, что можно собирать автоматически;
- [x] определить правила обработки персональных и конфиденциальных данных;
- [x] определить формат решений, задач и экспортов.
### Этап 1. Рабочая Telegram-группа
- создать супергруппу и темы;
- подготовить закреплённые сообщения;
- создать первоначальный FAQ;
- согласовать правила обсуждений и фиксации решений.
- [x] создать супергруппу и темы;
- [x] подготовить и закрепить приветствие с навигацией;
- [x] создать первоначальную библиотеку практик работы с ИИ;
- [x] согласовать правила обсуждений и фиксации решений.
### Этап 2. Бот-архиватор
- реализовать приём сообщений;
- сохранить метаданные и вложения;
- добавить ручную отметку для экспорта;
- сформировать Markdown-экспорт;
- проверить работу с темами и ответами.
- [x] реализовать приём сообщений;
- [x] сохранять сообщения и метаданные вложений;
- [ ] добавить ручную отметку отдельных сообщений для экспорта;
- [x] сформировать Markdown-экспорт;
- [x] проверить работу с темами и ответами.
### Этап 3. Уведомления
- подключить события Gitea;
- настроить фильтрацию;
- направлять уведомления в отдельную тему;
- добавить напоминания о задачах и сроках.
- [ ] подключить события Gitea;
- [ ] настроить фильтрацию;
- [ ] направлять уведомления в отдельную тему;
- [ ] добавить напоминания о задачах и сроках.
### Этап 4. ИИ-подготовка без API
- добавить шаблоны запросов для анализа;
- создавать готовые файлы для загрузки в ChatGPT;
- добавить возврат отчёта в Telegram;
- проверить несколько реальных обсуждений.
- [ ] добавить шаблоны запросов для анализа;
- [x] создавать готовые файлы для загрузки в ChatGPT;
- [ ] добавить возврат отчёта в Telegram;
- [ ] проверить несколько реальных обсуждений.
### Этап 5. Связка с Git/Gitea
- подготовить структуру документации;
- настроить ссылки на задачи, PR и документы;
- определить процесс переноса подтверждённых решений в Git;
- добавить сценарии обновления документации через ИИ.
- [x] подготовить структуру документации;
- [ ] настроить ссылки на задачи, PR и документы;
- [x] определить процесс переноса подтверждённых решений в Git;
- [ ] добавить сценарии обновления документации через ИИ.
### Этап 6. Улучшение по фактическому использованию
- удалить невостребованные функции;
- расширить FAQ реальными сценариями команды;
- улучшить формат отчётов;
- добавить новые уведомления только при наличии потребности;
- оценить необходимость API и автоматического ИИ-анализа.
- [ ] удалить невостребованные функции;
- [ ] расширить библиотеку практик реальными сценариями команды;
- [ ] улучшить формат отчётов;
- [ ] добавить новые уведомления только при наличии потребности;
- [ ] оценить необходимость API и автоматического ИИ-анализа.
---
@@ -393,3 +395,7 @@ Git сохраняет актуальную версию
```
Цель инфраструктуры — не заставить специалистов изучать больше технологий, а сделать технологии удобным продолжением их профессиональной работы.
---
Акылдаш · Telegram-бот v0.2.2

View File

@@ -0,0 +1,47 @@
# Обзор проекта
## Назначение
Акылдаш — юридическая информационно-аналитическая платформа. Она должна помочь
пользователю находить применимые нормы и материалы, понимать их актуальность и
получать ответ со ссылками на проверяемые первоисточники. Платформа не заменяет
профессиональное юридическое заключение.
## Основные области
1. Получение открытых или лицензированных законов, актов и иных правовых
источников.
2. Очистка, нормализация, связывание редакций и сохранение происхождения данных.
3. Хранение структурированных документов и поисковых индексов.
4. Формирование базы знаний и RAG с обязательными ссылками на источники.
5. Backend для доступа к данным и функциям платформы.
6. Frontend для поиска, анализа и работы с результатами.
7. Инструменты рабочего окружения команды, включая Telegram-бота.
Физическая структура каждой области появится вместе с её первой задачей. До
этого список служит картой продукта, а не обещанием заранее выбранной
архитектуры.
## Обязательные принципы
- Источник, дата получения, редакция и лицензия документа должны быть
прослеживаемыми.
- Ответ системы должен отделять найденный факт от вывода модели и ссылаться на
конкретный первоисточник.
- Актуальность правовых данных должна проверяться до использования в ответе.
- Существенные юридические выводы проверяет человек.
- Секреты и персональные данные не попадают в Git, логи и тестовые наборы.
- Данные загружаются только при наличии законного основания и с соблюдением
условий источника.
## Правовая защита проекта
Договоры, заявки, материалы об интеллектуальной собственности и другие
закрытые юридические документы следует хранить отдельно от исходного кода: в
закрытом репозитории или защищённом документном хранилище. Доступ выдаётся
поимённо и только тем, кому он нужен. В основном репозитории можно хранить
несекретный реестр документов, правила доступа и ссылки на место хранения.
---
Акылдаш · Telegram-бот v0.2.2 · Backend — не создан · Frontend — не создан

View File

@@ -0,0 +1,183 @@
# Важные навыки работы с ИИ для начинающих
Каждый раздел ниже — отдельное готовое сообщение для темы `Работа с ИИ`.
Текст можно публиковать без заголовков этого файла: название, хэштеги и пояснение уже входят в сообщение.
## 1. Ставьте задачу через результат
#работа_с_ии #промпт #цель
Пишите не тему, а желаемый результат. Вместо «расскажи о договоре» — «составь краткий список рисков договора для руководителя». Чем яснее результат, тем меньше случайных ответов.
## 2. Давайте нужный контекст
#работа_с_ии #контекст #источники
Укажите, для кого готовится результат, что уже известно и какие файлы или сообщения использовать. Не заставляйте ИИ угадывать факты, которые можно дать сразу.
## 3. Называйте ограничения
#работа_с_ии #ограничения #точность
Сразу укажите важные рамки: объём, срок, язык, допустимые источники и что нельзя менять. Пример: «до одной страницы, только по приложенным документам, без вымышленных данных».
## 4. Задавайте формат ответа
#работа_с_ии #формат #результат
Скажите, в каком виде нужен ответ: список, таблица, письмо, план или Markdown. Укажите желаемую длину и аудиторию. Это полезнее просьбы «ответь красиво».
## 5. Определяйте, что значит «готово»
#работа_с_ии #критерии #готовность
Добавьте проверяемый критерий завершения: «все риски связаны с пунктами договора», «у каждой задачи есть ответственный и срок», «тесты проходят». ИИ должен понимать финиш задачи.
## 6. Показывайте пример хорошего результата
#работа_с_ии #пример #качество
Если важны стиль или структура, приложите короткий образец. Один хороший пример обычно работает лучше длинного описания вроде «сделай профессионально».
## 7. Просите уточнить неясное
#работа_с_ии #уточнение #вопросы
Если задача допускает разные трактовки, напишите: «Сначала задай до трёх важных вопросов, затем приступай». Это снижает риск получить уверенный ответ не на тот вопрос.
## 8. Отделяйте факты от предположений
#работа_с_ии #факты #проверка
Просите отдельно отмечать подтверждённые факты, выводы и неизвестные данные. Для актуальной информации требуйте ссылки и дату проверки. Уверенный тон не является доказательством.
## 9. Для сложной задачи сначала просите план
#работа_с_ии #план #сложная_задача
Сначала попросите изучить материалы и предложить короткий план. После вашего подтверждения ИИ выполняет работу. Так ошибки направления обнаруживаются до больших изменений.
## 10. Делите большую работу на этапы
#работа_с_ии #этапы #контроль
Разбивайте задачу на небольшие проверяемые результаты: анализ → проект → проверка → финал. Подтверждайте важные этапы отдельно, особенно перед публикацией или изменением данных.
## 11. Используйте персональные инструкции
#работа_с_ии #персональные_инструкции #настройка
Персональные инструкции — ваши постоянные предпочтения для всех чатов: язык, стиль, желаемая краткость и способ объяснения. Не храните там пароли и правила одного конкретного проекта.
## 12. Настраивайте инструкции проекта
#работа_с_ии #инструкции_проекта #проект
Для каждого проекта отдельно зафиксируйте цель, термины, источники истины, правила работы и критерии готовности. В ChatGPT используйте инструкции проекта, в Codex — репозиторный `AGENTS.md`.
## 13. Делайте инструкции короткими и проверяемыми
#работа_с_ии #инструкции #порядок
Пишите конкретно: «перед изменением создай ветку», а не «работай правильно». Удаляйте устаревшие и противоречивые правила. Добавляйте новое правило после повторяющейся ошибки, а не заранее.
## 14. Один чат — один понятный результат
#работа_с_ии #чат #контекст
В одном чате держите одну связанную цель. Для отдельной задачи начинайте новый чат; для настоящего ответвления создавайте копию или fork. Перегруженный контекст ухудшает качество.
## 15. Храните решения вне переписки
#работа_с_ии #решения #источник_истины
Чат помогает думать, но не должен быть единственным хранилищем решения. Подтверждённый результат переносите в документ, задачу или Git, где видны актуальная версия и история изменений.
## 16. Понимайте назначение агентов
#работа_с_ии #агенты #делегирование
Агенты — отдельные исполнители для ограниченных частей большой задачи. Они полезны, когда несколько независимых исследований или проверок можно выполнить параллельно.
## 17. Давайте агенту одну ограниченную задачу
#работа_с_ии #агенты #постановкаадачи
Каждому агенту задайте одну цель, входные материалы, границы и формат результата. Хорошо: «проверь только риски безопасности и верни пять находок со ссылками».
## 18. Не используйте агентов без необходимости
#работа_с_ии #агенты #простота
Для маленькой или строго последовательной задачи один исполнитель лучше. Несколько агентов тратят больше ресурсов, могут дублировать работу и конфликтовать при одновременном изменении одних файлов.
## 19. Оставляйте итог главному исполнителю
#работа_с_ии #агенты #итог
Агенты возвращают краткие выводы, а главный исполнитель сравнивает их, устраняет противоречия и готовит единый ответ. Не склеивайте сырые результаты без общей проверки.
## 20. Заранее задавайте правило остановки
#работа_с_ии #зацикливание #стоп
Для сложной задачи напишите: «После двух неудачных попыток остановись, перечисли проверенное, назови блокер и предложи другой подход». Это не даёт ИИ бесконечно повторять одно решение.
## 21. После неудачи меняйте метод, а не формулировку
#работа_с_ии #ошибка #диагностика
Если подход не сработал, попросите назвать причину и собрать новые доказательства. Повтор той же команды другими словами редко помогает. Нужна новая гипотеза или дополнительный источник данных.
## 22. Очищайте перегруженный контекст
#работа_с_ии #контекст #перезапуск
Если ИИ путает старые решения, попросите кратко зафиксировать цель, факты, принятые решения и открытый вопрос. Затем продолжите из этой сводки в новом чате.
## 23. Всегда проверяйте результат
#работа_с_ии #проверка #качество
Просите ИИ выполнить самопроверку, но важные утверждения проверяйте сами по первичным источникам. Для кода нужны тесты, для расчётов — пересчёт, для документов — сверка цитат и реквизитов.
## 24. Не передавайте лишние данные
#работа_с_ии #приватность #персональныеанные
Перед загрузкой удалите лишние ФИО, контакты, пароли, ключи и конфиденциальные сведения. Передавайте минимальный объём данных, необходимый для задачи, и учитывайте правила вашей организации.
## 25. Отделяйте анализ от действия
#работа_с_ии #безопасность #подтверждение
Просьба «проанализируй» не должна означать «отправь, удали или опубликуй». Для внешних и необратимых действий требуйте отдельный план, предварительный просмотр и явное подтверждение человека.
## 26. Подключайте только нужные инструменты
#работа_с_ии #инструменты #доступ
Давайте ИИ доступ только к тем файлам, сервисам и правам, которые нужны сейчас. Начните с чтения; разрешение на запись, отправку и удаление выдавайте отдельно.
## 27. Превращайте повторяемую работу в шаблон
#работа_с_ии #шаблон #автоматизация
Если удачный запрос используется регулярно, сохраните его как шаблон. Когда процесс стал стабильным и проверенным, оформите его как навык или автоматизацию. Не автоматизируйте ещё не понятный процесс.
## 28. Завершайте работу короткой приёмкой
#работа_с_ии #приемка #финальная_проверка
В конце спросите: «Что сделано, что проверено, что осталось и какие есть риски?» Сравните ответ с первоначальной целью и критериями готовности, прежде чем принимать результат.
## Справочные материалы
- [Prompting](https://learn.chatgpt.com/docs/prompting)
- [Personalize ChatGPT](https://learn.chatgpt.com/docs/personalize)
- [Subagents](https://learn.chatgpt.com/docs/agent-configuration/subagents)
- [Custom instructions with AGENTS.md](https://learn.chatgpt.com/docs/agent-configuration/agents-md)
---
Акылдаш · Telegram-бот v0.2.2

View File

@@ -0,0 +1,51 @@
# Telegram-бот Акылдаш
Версия: `0.2.2`
Бот сохраняет сообщения разрешённых тем Telegram в локальную SQLite-базу и
выгружает обсуждения в Markdown. Внешние Python-зависимости не требуются.
## Запуск
Требуется Python 3.11 или новее.
```bash
cd tools/telegram-bot
export TELEGRAM_BOT_TOKEN='...'
export TELEGRAM_CHAT_ID='-1004242041275'
export TELEGRAM_OWNER_ID='87262245'
export TELEGRAM_REPORT_THREAD_ID='37'
export TELEGRAM_ALLOWED_THREAD_IDS='0,2,4,6,8'
python3 bot.py
```
Доступные команды: `/help`, `/status`, `/export`. Экспорт доступен только
пользователю с Telegram ID из `TELEGRAM_OWNER_ID`. Первый `/export` выгружает
всю сохранённую тему, последующие — сообщения после предыдущей успешно
созданной отсечки.
Markdown публикуется в теме `TELEGRAM_REPORT_THREAD_ID`, а в исходной теме
остаётся отсечка со ссылкой и общим хэштегом отчёта.
База по умолчанию хранится в `data/secretary.sqlite3`. Сообщения из других
групп и тем не сохраняются. Полный ответ Telegram сохраняется в базе, поэтому
метаданные вложений остаются доступными для последующего скачивания.
## Проверка
```bash
python3 -m unittest -v
```
## Synology
Контейнер `akyldash-bot` работает на образе `python:3.11-slim` через закрытый
прокси-контейнер, с политикой перезапуска `unless-stopped`. Постоянные данные
находятся в `/volume1/docker/akyldash/data`.
При обновлении развёртывания файл `tools/telegram-bot/bot.py` копируется в
каталог контейнера как `bot.py`.
---
Акылдаш · Telegram-бот v0.2.2

View File

@@ -18,7 +18,7 @@ from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
APP_NAME = "Акылдаш"
APP_VERSION = "0.2.0"
APP_VERSION = "0.2.2"
FOOTER = f"{APP_NAME} v{APP_VERSION}"
@@ -146,6 +146,29 @@ def next_update_id(connection: sqlite3.Connection) -> int:
return int(row["value"]) if row else 0
def export_checkpoint(
connection: sqlite3.Connection, chat_id: int, thread_id: int
) -> int:
row = connection.execute(
"SELECT value FROM state WHERE key = ?",
(f"export_checkpoint:{chat_id}:{thread_id}",),
).fetchone()
return int(row["value"]) if row else 0
def save_export_checkpoint(
connection: sqlite3.Connection, chat_id: int, thread_id: int, message_id: int
) -> None:
with connection:
connection.execute(
"""
INSERT INTO state (key, value) VALUES (?, ?)
ON CONFLICT (key) DO UPDATE SET value = excluded.value
""",
(f"export_checkpoint:{chat_id}:{thread_id}", str(message_id)),
)
def telegram_request(
config: Config, method: str, payload: dict, timeout: int = 65
) -> object:
@@ -248,10 +271,14 @@ def export_markdown(
thread_id: int,
days: int | None,
now: int | None = None,
after_message_id: int | None = None,
) -> str:
parameters: list[int] = [config.chat_id, thread_id]
condition = ""
if days is not None:
if after_message_id is not None:
condition = " AND message_id > ?"
parameters.append(after_message_id)
elif days is not None:
condition = " AND sent_at >= ?"
parameters.append((now or int(time.time())) - days * 86400)
rows = connection.execute(
@@ -263,7 +290,14 @@ def export_markdown(
parameters,
).fetchall()
period = "за всё время" if days is None else f"за последние {days} дн."
if after_message_id is not None:
period = (
"с начала архива"
if after_message_id == 0
else "после предыдущей отсечки"
)
else:
period = "за всё время" if days is None else f"за последние {days} дн."
lines = [
"# Обсуждение",
"",
@@ -328,8 +362,7 @@ def handle_command(
message,
"Я сохраняю обсуждения этой группы.\n"
"/status — количество сохранённых сообщений\n"
"/export [дней] — экспорт текущей темы за 7 дней или указанный срок\n"
"/export все — экспорт текущей темы целиком",
"/export — экспорт текущей темы после предыдущей отсечки",
)
elif command == "/status":
topic_count = connection.execute(
@@ -349,11 +382,22 @@ def handle_command(
send_text(config, message, "Экспорт доступен только владельцу бота.")
return
try:
days = parse_export_days(parts)
days = parse_export_days(parts) if len(parts) > 1 else None
except (ValueError, IndexError):
send_text(config, message, "Использование: /export [13650|все]")
return
markdown = export_markdown(connection, config, thread_id, days)
checkpoint = (
None
if len(parts) > 1
else export_checkpoint(connection, config.chat_id, thread_id)
)
markdown = export_markdown(
connection,
config,
thread_id,
days,
after_message_id=checkpoint,
)
stamp = datetime.now(config.timezone).strftime("%Y%m%d-%H%M")
report_tag = f"#report_{message['message_id']}"
report = send_document(
@@ -373,6 +417,9 @@ def handle_command(
f"Отчёт: {message_link(config.chat_id, report['message_id'])}\n"
"━━━━━━━━━━━━━━━━",
)
save_export_checkpoint(
connection, config.chat_id, thread_id, int(message["message_id"])
)
def run() -> None:

View File

@@ -153,7 +153,7 @@ class SecretaryTest(unittest.TestCase):
"date": 1,
"chat": {"id": config.chat_id},
"from": {"id": config.owner_id},
"text": "/export все",
"text": "/export",
}
with patch("bot.send_text") as send_text, patch(
@@ -170,6 +170,69 @@ class SecretaryTest(unittest.TestCase):
self.assertIn("#report_12", marker)
self.assertIn("https://t.me/c/123/99", marker)
def test_next_export_starts_after_previous_cutoff(self):
with tempfile.TemporaryDirectory() as directory:
config = Config(
token="test",
chat_id=-100123,
owner_id=7,
report_thread_id=37,
thread_ids=frozenset({2}),
database=Path(directory) / "bot.sqlite3",
timezone=ZoneInfo("UTC"),
)
connection = connect(config.database)
def archive(message_id, text):
archive_update(
connection,
{
"update_id": message_id,
"message": {
"message_id": message_id,
"message_thread_id": 2,
"date": message_id,
"chat": {"id": config.chat_id},
"from": {"id": config.owner_id},
"text": text,
},
},
config,
)
archive(10, "Первое обсуждение")
with patch("bot.send_text"), patch(
"bot.send_document",
side_effect=[{"message_id": 90}, {"message_id": 91}],
) as send_document:
handle_command(
connection,
config,
{
"message_id": 12,
"message_thread_id": 2,
"from": {"id": config.owner_id},
"text": "/export",
},
)
archive(13, "Второе обсуждение")
handle_command(
connection,
config,
{
"message_id": 14,
"message_thread_id": 2,
"from": {"id": config.owner_id},
"text": "/export",
},
)
first_export = send_document.call_args_list[0].args[3].decode()
second_export = send_document.call_args_list[1].args[3].decode()
self.assertIn("Первое обсуждение", first_export)
self.assertNotIn("Первое обсуждение", second_export)
self.assertIn("Второе обсуждение", second_export)
if __name__ == "__main__":
unittest.main()