Волшебный мир OpenCode

Примерно 3 недели назад меня познакомили с OpenCode. В итоге все эти 3 недели я практически нон-стоп переделывал все те jabber-проекты, что вел раньше, а также взялся за некоторые новые.

Основная проблема везде — проекты в основном старые, зачастую еще со времен активного использования джаббера массами. Основная масса написана на Python2 под какие-то старые библиотеки, которые либо python2-only, либо сильно поменялись и прямую замену py2->py3 сделать не выйдет. Разве что JabRSS мог похвастаться хоть какой-то работой с Python3. Незадолго до знакомства с OpenCode я даже подготовил docker-образ на базе Debian 11, где еще можно было поставить Python2 и сделать окружение для запуска старого софта.

Теперь все поменялось.

OpenCode — приложение, заточенное для использования ИИ для программирования, со всеми сопутствующими инструментами: тестированием, запуском команд, git и так далее. В комплекте есть несколько бесплатных «облачных» моделей, плюс можно оплатить подписку  или вообще подключить свою Ollama со своими модельками (опять же, можно использовать локальные или оплачивать внешние).

Поначалу активно использовал DeepSeek Flash, но потом его и еще некоторые убрали; так или иначе, но огромный объем работы получилось сделать на бесплатных моделях. Хорошо себя показала Big Pickle, а вот Hy3 — не особо. Пробовал использовать локальные модели или доступный бесплатно у ollama gpt-oss, но результат был весьма так себе. Однако OpenCode весьма гибок и можно пристроить к работе на какие-то нетребовательные задачи через субагентов и небольшие локальные модели.

В первые моменты использовал десктопное приложение, потом вынес все на веб-интерфейс, завернув в docker:

# https://github.com/nimbleflux/opencode-docker
docker run -p 4000:4000 --name opencode \
-v /service/opencode-config:/home/opencode/.config/opencode \
-v /service/opencode-data:/home/opencode/.local/share/opencode \
-v /service/opencode-workspace:/home/opencode/workspace \
ghcr.io/nimbleflux/opencode-docker:latest

/service/opencode-workspace и является у меня точкой «обмена», куда я могу подсунуть старый код и откуда я могу забрать результаты.

При грамотных запросах, при внятно реализованной или понимаемой архитектуре приложения на современных LLM стало возможным буквально в одну фразу сделать портирование проекта не то, что на Python3, а и с использованием совершенно другой библиотеки. Именно так вышло у меня с RSS-транспортом — функционально он был уже вылизан (не считая мелкого бага с «Обзором сервисов» — у меня не было достаточно примеров с pyxmpp под рукой, чтобы понять, как надо правильно выстроить код). Работа с opencode свелась примерно к «вот тебе старый проект, сделай мне точно такое же, но на Python3 и slixmpp».

Я решил везде использовать теперь slixmpp — это активно развиваемая библиотека, с множеством примеров самого разного кода. Теперь этих примеров будет еще больше.

А еще из нового — я проникся и начал активно использовать ad-hoc-команды. Так что теперь на ряде транспортов доступны такие методы взаимодействия:

  • Регистрация
  • Браузер сервисов
  • Ad-hoc-команды
  • Диалоговый режим
  • Прямое добавление бота по JID

Над чем я в итоге работал за эти 3 недели?

  • Google Translate Transport
    • Исправлено переименование «веток» дерева в «браузере сервисов»
    • Реализовано добавление ботов через ad-hoc
    • Сделан скрипт, обновляющий список языков
    • Сделана разбивка на модули
  • Jabber Weather Transport
    • Был баг в некоторых клиентах (вроде Dino или Gajim) — шла реакция в том числе на какие-то сервисные сообщения, в итоге в этих клиентах получался постоянный флуд сообщением с погодой.
    • Разбивка на модули
    • Провайдеры погоды вынесены в отдельный каталог и разделены — задел под создание новых источников данных.
  • RSS-транспорт
    • Наконец-то сделано исправление переименования «веток» дерева в «браузере сервисов»
    • ad-hoc для транспорта — сделал микс «регистрации» и «браузера сервисов».
    • Индексы для базы! Наконец-то.
  • XMPP Server Scanner
    • Раньше — «как-то работало — и ладно». Были периодические вылеты в процессе работы; код правил минимально — лишь убрал мертвые транспорты, добавил новые. За работу с URL’ами даже не брался. Сейчас работает стабильно.
    • Убрал ненужный код для работы с MySQL
    • Мигрировал все с cPickle в сжатый sqlite3
    • Добавил детекцию MAM на сервере и сделал колонку в итоговой HTML-странице (актуально в основном для ejabberd, Prosody об этом не сигналит).
    • Вынес IPv6 с всплывающей подсказки к серверу в отдельную колонку, так что теперь можно сделать сортировку по серверам с IPv6.
  • JabRSS
    • Первые правки делал «чтоб работало» — бот часто переподключался; я им особо не пользовался, как-то работало — и ладно.
    • Потом уже по фану мигрировал его с xmpplify + какой-то своей обвязки для RSS на slixmpp + feedparser. Общая и поддерживаемая либа для всех проектов; современная работа с RSS. Добавилась работа с Atom’ами всякими.
    • Сделал разбивку на модули. После всех правок RSS-бот весит больше, чем RSS-транспорт.
    • Убрал вспомогательный скрипт для запуска, сейчас у бота есть выделенный конфиг.
  • J2J: Jabber-to-Jabber Transport
    • Сделано по большей части с оглядкой на j2j-транспорт от Binary — сначала хотелось сделать аналог на Python3, потом пошли доработки. Как и другие проекты, в качестве либы использовал slixmpp (был на Python Twisted)
    • Дальше старался впитать все, что видел в других подобных транспортах. Например, начал активно использовать многоязычность — пользователь может выбирать удобный для себя язык интерфейса и сообщений.
    • Добавил фильтр для chat states и уведомлений о доставке.
    • Расширил функции синхронизации ростеров.
    • Из Spectrum позаимствовал фичу «Roster Item Exchange» — теперь транспорт может добавлять пользователей двумя механизмами.
    • Диалоговый режим работы с транспортом
    • Message Carbons
    • Шифрование паролей мастер-паролем.
  • Jabber Toolbox
    • Глядя на куцый список «JID полезных jabber-ботов» — решил возродить некоторые полезные проекты-инструменты, сделав такой себе «мультитул» — транспорт, где в виде плагинов реализован тот или иной бот, выполняющий одну заданную функцию. Итого на сейчас реализовано 9 ботов, в том числе заметки и напоминалка с функцией поиска.
  • Jabber Mail Transport
    • Еще один возрожденный некогда существовавший проект JMC — согласно таблице на JW на сейчас практически не осталось mail-шлюзов. А проект полезный — позволяет получать уведомления о почте в джаббере, делая сопоставление «отправитель — отдельный JID в ростере», а также отправлять письма прямо из jabber’а. JMC пощупал буквально немного на JabberCity, хотя бы посмотрел, какие там есть опции и диалоги. Основная проблема у JMC была с работой с юникодом — получались трейсы на любое русское слово и так далее. Сейчас это все в прошлом.
    • По функциям — отладил то, что было, добавил шифрование пользовательских паролей.
  • Jabber Mail Interface
    • А это уже вариация на тему почтового транспорта, сделанная на базе JMT. Подобные проекты в каком-то виде были и раньше, но на более примитивном уровне. Сейчас, фактически, реализовал полноценный почтовый клиент с управлением в текстовом режиме в jabber-клиенте. Т.е., тут, как и в JMT, тоже прописываешь POP3/IMAP/SMTP-аккаунты, но вместо email-jid’ов и отправки почты сообщением транспорту через выбранный аккаунт — тут уже интерфейс почтового клиента.
  • Astra (конференц-бот)
    • Астра — некий микс плагинов для различных конференц-ботов, по большей части развлекательной направленности. Саму Астру сначала попросили захостить, в итоге на волне массовой миграции на Python3 — смигрировал и ее с xmpppy на slixmpp, плюс потихоньку вычищаю баги, делаю фикс нерабочих плагинов и дорабатываю функции.

Большая часть проектов уже запущена в работу на сервере, JMT/JMI понемногу допиливаю; новый JabRSS (который на slixmpp) пока гоняю только локально. Из старых проектов, которые пока работают на Python2, осталась только Изида — ей занимается другой человек.

В последние дни поделал описания спецификаций для каждого из проектов, фиксил мелкие баги. В дальнейшем — из того, что напрашивается — можно будет сделать новых провайдеров погоды или переводчиков / словарей. По погоде — gismeteo на сейчас уже не работает, осталась одна Метеонова. По переводу — в Issue на github’e давно уже спрашивали насчет libretranslate.

А еще сейчас участвую в обсуждении и тестировании форка Android-клиента Monocles — Monocles mod, который тоже делают в OpenCode. С такими инструментами можно в скором времени получить идеальный Jabber-клиент на Андроид 🙂

Добавить комментарий