Alisa V Zadzerkalli
C++

Alisa V Zadzerkalli

Alisa v Zadzerkalli - бот Discord, написаний на C++

GitHub|
image

Аліса в Задзеркаллі (українською) - Alice Through the Looking-Glass. Світ
по той бік дзеркала, куди потрапляєш навмисно, і де все
відбивається, навпаки, і неправильно.

«Ніколи не вгадаєш, ким станеш за хвилину.»
"You can never guess who you'll become in a minute." - Аліса, у
Аліса в Країні Див, пер. Валентин Корнієнко, ред. Іван Малкович, с. 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/ - налаштування кластера та спільний стан бота

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

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

Сама відповідь - це 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 повертається як PNG у форматі base64 під ключем 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
настільки насичені шаблонами, що неоптимізована збірка коштує кілька гігабайтів на процес компілятора, а один процес на ядро ​​знищить машину.
Дайте йому більше, коли у вас є пам'ять, зробіть JOBS=8.

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

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

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

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