Alisa V Zadzerkalli
C++

Alisa V Zadzerkalli

Alisa v Zadzerkalli - एक Discord बॉट जो C++ में लिखा गया है

GitHub|
image

Alisa v Zadzerkalli (українською) - Аліса в Задзеркаллі. Світ
по той бік дзеркала, куди йдеш навмисно, і все
відображено, навпаки, і неправильно.

«Ніколи не вгадаєш, ким станеш за хвилину.»
"You can never guess who you'll become in a minute." - Alice, in the
Аліса в Країні Див, trans. Valentyn Korniienko, ed. Ivan Malkovych p. 53.

Бот для Discord, написаний на C++.

Можливості

Слеш-команди

  • /ping - час обходу туди-назад до шлюзу
  • /leaderboard - таблиця лідерів Clube de Programação (UFFS), зібрана з
    групи клубу на vjudge та відсортована за кількістю розв'язаних задач

Розмова

Згадайте її, або скажіть alisa чи obliterator у повідомленні, і вона відповість.
Відповідь не генерується локально. Аліса збирає контекст, а Providence
думає.

Що вона ставить перед моделлю в кожному повідомленні:

  • кожного члена клубу, у порядку таблиці лідерів, з їхнім нікнеймом, кількістю
    розв'язаних задач та часом останньої активності
  • повний список задач, які розв'язав кожен член, за кожною судовою системою
  • десять задач, які найчастіше розв'язують у всьому клубі

Цей контекст дозволяє їй відповідати на питання, для яких ніхто не написав команди.
Хто в топ-трійці, які задачі вони мають спільні, хто замовк.
Модель забезпечує міркування, скрейпінг забезпечує факти.

Дані клубу

Стан учасників отримується з vjudge під час запуску пулом з восьми
робітників, кожен з яких тримає одне з'єднання для своєї частини групи. Кожен
учасник коштує два запити: сторінка профілю для підрахунку та рейтингу, і
кінцева точка деталей розв'язків для списку задач.

Структура

  • main.cpp - точка входу
  • src/commands/ - слеш-команди та диспетчер
  • src/members/ - склад клубу, профіль та скрейпінг списку розв'язків
  • src/parser/ - запити HTML через lexbor
  • src/network/ - HTTP з повторним використанням з'єднань
  • src/speech/ - зв'язок з Providence та збірка підказок
  • src/onmessage/, src/onready/ - обробники подій шлюзу
  • src/embeds/ - домашній ембед
  • src/config/ - налаштування кластера та спільний стан бота

Як відбувається відповідь

Обробник повідомлень прокидається на кожному повідомленні в кожному каналі, який бачить бот.
Він відкидає ботів, відкидає все, що не згадує її через пінг або слова
alisa чи obliterator, і зараз також відкидає всіх авторів, крім одного, ідентифікатор
якого захардкоджений у src/onmessage. Все, що виживає, отримує негайний ембед із текстом
Thinking..., опублікований до того, як модель щось запитають, щоб канал бачив, що вона
приймає питання, навіть коли відповідь повільна.

Сама відповідь - це POST до Providence на http://127.0.0.1:8931 на
/speech/deepthink/, що несе повідомлення, весь контекст клубу та
ім'я користувача Discord як ідентичність викликача. Він чекає до 200 секунд. Відповідь
обрізається до 1990 байтів на межі символу UTF-8, щоб розріз ніколи не потрапив
у середину кодової точки, а потім ембед-заглушка редагується на місці. Тайм-аут,
відмова або нерозбірливе тіло закінчуються текстом у тому ж ембеді, а не мовчанням.

Providence - це окремий сервіс, і його немає в цьому репозиторії. Без нього
на цьому порту бот все одно запускається, все одно відповідає на слеш-команди,
і все одно скрейпить клуб, він просто перестає думати.

Що додає Providence

Аліса надсилає light true, що є дешевим шляхом: один вузол міркування і без
розгалужень. Приберіть цей прапорець, і та сама кінцева точка запускає обмежене дерево думок
замість цього, глибина два, принаймні дві позначені гілки на вузол, кожна оцінюється
за ймовірність успіху та за те, скільки потенціалу вона додає або знищує, і кожен
вузол генерується нативним мислителем, запущеним як підпроцес. Цей механізм
сидить там невикористаним у кожному повідомленні, яке вона надсилає.

Він також сам вирішує, чи потребує питання більше, ніж розмови. Якщо
так, класифікатор зіставляє повідомлення з однією командою та її аргументом, запускає її,
і вбудовує результат у фінальну відповідь. Що зараз у цьому списку:

  • побудова графіків, 2D-крива або 3D-поверхня з функції, яку ви описуєте словами
  • алгебра, спрощення, розширення, факторизація, розв'язання змінної
  • обчислення, похідні, визначені та невизначені інтеграли, границі
  • матриці, визначник, обернена матриця, власні значення
  • рендеринг будь-якого виразу як LaTeX
  • портал UFFS SIGAA, поточні дисципліни, розклад, майбутні завдання
  • ресторан UFFS, які страви відкриті для бронювання і як минулі
    пройшли, керується через справжній безголовий браузер із власними обліковими даними

Кожна з цих відповідей несе структуровані поля поруч із прозою. Графік або
LaTeX-рендер повертається як base64 PNG під image, читання порталу повертається
як JSON під data, а власний коментар моделі розташований поруч під
response. Аліса читає response і викидає решту, тому сьогодні питання,
яке створює графік, досягає Discord як речення про графік, який ніхто не може
побачити. Надсилання зображення як вкладення - це очевидна наступна річ, якої цей бот
має навчитися.

Доступ здійснюється за викликачем, а не за ботом. Вона ідентифікує себе як discord і
ім'я користувача автора, і Providence перевіряє цю пару та відмовляє будь-кому, кого він не знає,
що є відмовою, яку вона друкує дослівно. Додавання члена клубу означає
додавання його там, а не тут.

Збірка

Потрібен компілятор C++20, CMake 3.16 або новіший, і три бібліотеки: DPP для
шлюзу, cpr для HTTP, lexbor для HTML. На Arch Makefile встановлює ті, яких
бракує, через yay або paru. У будь-якому іншому місці встановіть їх самостійно спочатку.

make deps      завантажити DPP, cpr та lexbor, якщо їх немає
make           налаштувати та зібрати в build/
make run       завантажити .env, потім запустити бінарник
make rebuild   стерти build/ і почати заново

Дві речі в збірці навмисні. Тип збірки за замовчуванням -
RelWithDebInfo, а паралельні завдання компіляції обмежені двома. Заголовки DPP
досить шаблонні, що неоптимізована збірка коштує кілька гігабайт на
процес компілятора, і один процес на ядро знищить машину разом із ним.
Дайте більше, коли маєте пам'ять, make JOBS=8.

Джерела збираються за допомогою CONFIGURE_DEPENDS, тому новий файл у src/ підхоплюється
при наступній збірці без зміни CMakeLists.

Конфігурація

Бот читає DISCORD_TOKEN із середовища і нічого більше. Покладіть його в .env
у корені репозиторію, і make run експортує його для вас, або експортуйте
його самостійно і запустіть build/alisa-v-zadzerkalli_core безпосередньо. Вона підключається з
інтентами за замовчуванням плюс вміст повідомлень, що є привілейованим інтентом, тому
увімкніть його в застосунку на порталі розробників Discord, інакше обробник повідомлень
буде бачити лише порожні рядки.

Ключі Providence зберігаються поруч у .env для сервісу на іншому кінці
сокета. Цей бінарник ніколи їх не читає.