Marcin GolonkaMarcin Golonka 2026-07-16

Jak napisaliśmy plugin RocketChat do Hermesa i zrobiliśmy z niego wirtualnego Project Managera

Jak napisaliśmy plugin RocketChat do Hermesa i zrobiliśmy z niego wirtualnego Project Managera

Agent AI, który zna cały kontekst Twojej firmy, jest zaskakująco bezużyteczny, jeśli żeby z niego skorzystać, musisz otwierać osobne okno.

Opisywaliśmy już, jak używamy Hermes Agent do prowadzenia Halfbit Studio – analiza konkurencji, research leadów, pamięć instytucjonalna w skillach. Ale przez długi czas Hermes żył w swoim WebUI, z boku. Zespół gadał na RocketChacie, a agent siedział obok jak dobry pracownik, do którego trzeba przejść korytarzem.

Więc napisaliśmy mu plugin. Wpięliśmy go w naszego firmowego RocketChata, daliśmy mu dostęp do YouTracka i firmowej bazy wiedzy, profil Project Managera – i imię: HalfPM (Halfbit PM). Od tego momentu przestał być narzędziem, do którego się chodzi, a stał się kolegą z zespołu, którego się woła. Kod jest otwarty na GitHubie – ten wpis to spojrzenie pod maskę i instrukcja, jak postawić to samo u siebie.

Spis treści:

1. Agent, który nie siedzi z zespołem, jest wyspą

Hermes miał kontekst całej firmy, dostęp do YouTracka i potrafił zrobić w minutę raport, na który człowiek traci godzinę. A i tak prawie nikt poza mną z niego nie korzystał. Powód był banalny: żeby go o coś zapytać, trzeba było wejść do osobnej aplikacji. Jeden klik za dużo – i cały zespół wracał do pytania „słuchaj, a wiesz może na czym stoimy z tamtym projektem?" rzucanego na czacie.

Wniosek był prosty: agent musi być tam, gdzie już jest zespół. U nas tym miejscem jest RocketChat – self-hostowany komunikator, który trzymamy na własnym serwerze. Nie chcieliśmy przenosić rozmów do kolejnego narzędzia ani wypychać firmowych ticketów do zewnętrznej chmury czatowej. Chcieliśmy, żeby Hermes po prostu dołączył na kanał i odpowiadał, gdy się go zawoła.

2. Plugin w pigułce: jak łączymy Hermesa z RocketChatem

Hermes Agent ma system pluginów platformowych – dokładasz nowy komunikator bez grzebania w rdzeniu. Napisaliśmy więc rocketchat-platform: samodzielny plugin, zero zmian w plikach core, zero dodatkowych zależności (korzysta z aiohttp, który i tak jest w Hermesie).

Zaczęliśmy zresztą inaczej – od próby wpisania wsparcia RocketChata wprost do Hermesa (zgłoszenie #3725). Do mainline'u to nie weszło – i dobrze się stało. System pluginów pozwolił nam wypuścić dokładnie to samo samodzielnie: bez czekania na czyjkolwiek merge, bez wiązania się z cyklem wydawniczym rdzenia i bez ryzyka, że kolejny upstreamowy update coś nam popsuje. To jest cała zaleta dobrze pomyślanej architektury pluginów – nie musisz nikogo prosić o zgodę.

Sztuczka polega na tym, że RocketChat gada dwoma kanałami naraz. Wiadomości przychodzące łapiemy przez długo żyjący WebSocket (protokół DDP) – subskrybujemy dokładnie te pokoje, w których bot jest członkiem. Odpowiedzi wychodzące wysyłamy zwykłym REST API. Do tego dochodzi cała reszta, której oczekujesz od normalnego uczestnika czatu: wątki, reakcje emoji, wiadomości głosowe zamieniane na tekst, wysyłka plików i priv (DM).

RocketChat firmowy czat zespół pisze tu, gdzie zawsze HalfPM Hermes + plugin profil: Project Manager baza wiedzy + skille YouTrack źródło prawdy tickety, projekty, leady DDP ▸ inbound REST ◂ outbound API wątki thread context cron przypomnienia DM priv do osoby
Wiadomości przychodzą przez WebSocket (DDP), odpowiedzi wychodzą REST-em. HalfPM trzyma firmową bazę wiedzy i sięga do YouTracka – a wynik ląduje na kanale, w wątku, na cronie albo na priv.

Efekt: bot dołącza na kanał, odpowiada tylko wtedy, gdy zostanie zawołany (w kanałach – na priv reaguje zawsze), a session tytuły potrafi mirrorować do tematu pokoju. Wszystko po stronie RocketChata to standardowa konfiguracja bota: konto z rolą bot, Personal Access Token, zaproszenie na kanał.

3. Wirtualny PM w akcji

Sam plugin to tylko przekaźnik. Magia dzieje się, gdy po drugiej stronie tego przekaźnika siedzi HalfPM – agent z profilem Project Managera, dostępem do YouTracka i firmowej bazy wiedzy. Poniżej cztery realne wzorce użycia z naszego zespołu – zrzuty są odtworzone i zanonimizowane (prawdziwe nazwiska, numery ticketów i nazwy projektów zamieniliśmy na przykładowe; nazwę bota, HalfPM, zostawiliśmy).

3.1. „Na czym stoimy z projektem?" – status na żądanie

Najczęstsze pytanie w każdym software housie. Kiedyś oznaczało: ktoś otwiera YouTracka, klika po ticketach, składa to w głowie. Teraz wystarczy rzucić pytanie na kanał. HalfPM przeszukuje projekt, grupuje po statusach i – co ważniejsze – od razu mówi, co go zaniepokoiło.

# projekty M Marek 14:49 na czym stoimy z projektem Orion? HalfPM 14:50 Oto pełny obraz projektu Orion: Projekt ORN – 16 ticketów Zrobione (2) ORN-3 spotkanie · ORN-4 NDA Review (1) ORN-1 integracja z API W trakcie (1) ORN-2 aplikacja webowa Backlog (12) wszystkie Medium, nieprzypisane Co rzuca się w oczy: • 12 z 16 ticketów (75%) wisi w backlogu, nikomu nieprzypisane • Cały aktywny front ciągnie jedna osoba
Nie samo zestawienie – HalfPM od razu wskazuje ryzyko: 75% zakresu leży nieruszone, a aktywne prace wiszą na jednej osobie.

To jest różnica między raportem a asystentem. Raport pokazuje liczby. HalfPM pokazuje liczby i mówi: „popatrz, tu masz problem".

3.2. Podsumowanie ticketów w podziale na osoby

Drugi klasyk: „daj podsumowanie otwartych ticketów wg osób". HalfPM wyciąga wszystko z projektu, grupuje po przypisanych, a każdy numer ticketu robi klikalnym linkiem prosto do YouTracka. Tę drugą rzecz „doszkoliliśmy" go raz, w jednym zdaniu – i zapamiętał ją na stałe, bo profil PM-a ma pamięć.

# zespół M Marek daj podsumowanie otwartych ticketów wg osób HalfPM Otwarte tickety – łącznie 29: 👤 Piotr (3) ORN-1 integracja API · Review INT-26 umowa · High 👤 Ola (3) INT-27 kalendarz eventów · Review INT-49 dofinansowanie · Develop 👤 Marek (4) INT-54 opłata hosting · Critical 🔴 INT-51 prawo do logo · Review ❓ Nieprzypisane (9) głównie automatyzacje, Low Każdy numer to klikalny link do YouTracka – o to prosiłeś raz, pamiętam.
Jedno zdanie feedbacku („zawsze linkuj tickety") wystarczyło. Profil PM-a zapisał to w pamięci i od tej pory robi tak zawsze.

3.3. „Sprawdź jutro i kopnij go na priv" – cron + DM

To jest moment, w którym Hermes przestaje być wyszukiwarką ticketów, a staje się PM-em. Rzucasz mu polecenie na przyszłość, po ludzku, i on je rozkłada na części: znajdź właściwy ticket, zaplanuj sprawdzenie na konkretną godzinę, a jeśli warunek nie będzie spełniony – sam napisz do właściwej osoby na priv i zaraportuj na kanał.

# zespół M Marek jutro o 9 @HalfPM sprawdź jutro czy Tomek zestatusował ticket o umowie, jak nie to kopnij go na priv i daj znać tu, że nie było update HalfPM Zrobione. Oto co ustawiłem: Ticket: INT-26 – Umowy: Inkubator Stage: Review (niezmieniony od 2 tyg.) Assignee: Tomek Priority: High ⏰ Cron na jutro 9:00 → sprawdzi, czy ticket został zaktualizowany. Jeśli nie: → wyśle DM do Tomka na RocketChat z przypomnieniem → wrzuci na ten wątek info, że nie było update Działa 👍
Jedno zdanie po ludzku → znaleziony ticket, zaplanowany cron, gotowy scenariusz „jeśli brak update, napisz na priv i zaraportuj". Nikt nie klika w interfejsie.

Zwróć uwagę, co się tu wydarzyło bez ani jednego dodatkowego pytania z mojej strony. HalfPM sam domyślił się, o który ticket chodzi (choć nie podałem numeru), sam sprawdził jego aktualny stan, sam założył zadanie cykliczne z konkretnym warunkiem i sam wie, jak dostarczyć przypomnienie – DM-em do konkretnej osoby oraz wiadomością na tym samym wątku. To nie jest odpowiadanie na pytania. To jest delegowanie.

3.4. „Załóż ticket, żeby ktoś zamówił kawę" – zadania z jednego zdania

PM to nie tylko czytanie stanu – to też zakładanie zadań. I tu do gry wchodzi firmowa baza wiedzy. Rzucasz najbardziej przyziemną prośbę pod słońcem, a HalfPM sam wie, do którego projektu ją wrzucić, na kogo przypisać i jakie ustawić domyślne pola – bo zna strukturę firmy, ludzi i nasz sposób pracy z profilu i bazy wiedzy, którą mu daliśmy. Zero klikania w formularzu YouTracka.

# zespół M Marek @HalfPM załóż ticket Piotrowi, żeby zamówił kawę do biura HalfPM Załatwione ✅ INT-258 – Zamów kawę do biura Projekt: Halfbit Internal Przypisane: Piotr Stage: Backlog Priority: Medium Niech ogarnie zapas ☕
Jedno zdanie – a HalfPM sam dobrał projekt, zmapował „Piotra" na użytkownika w YouTracku, ustawił domyślne Stage i Priority i oddał klikalny link. Tej wiedzy nie ma w poleceniu – jest w bazie wiedzy.

Pod spodem HalfPM ogarnął rzeczy, o które nikt wprost nie prosił: trafił z zadaniem do właściwego projektu, zamienił „Piotr" na konkretnego użytkownika YouTracka, ustawił sensowne domyślne pola i oddał gotowy, klikalny link. Prośba tego wszystkiego nie zawierała – ten kontekst siedzi w firmowej bazie wiedzy, którą mu podpięliśmy.

4. Dlaczego to naprawdę działa

Za tą „magią" stoją trzy całkiem przyziemne mechanizmy, które musiały zagrać razem.

Kontekst wątku (thread context)

Gdy zawołasz bota w wątku, w którym jeszcze go nie było, plugin dociąga wcześniejsze wiadomości tego wątku (rodzica i odpowiedzi) i wstrzykuje je jako kontekst. Dzięki temu „@HalfPM podsumuj ten wątek" po prostu działa – agent widzi całą dyskusję, mimo że dołączył do niej w połowie. Wstrzyknięcie dzieje się tylko przy pierwszym wejściu; potem rozmowę niesie już historia sesji.

Dostarczanie cronów, które przeżywa restart

Kluczowa rzecz w scenariuszu z przypomnieniem: zadanie cykliczne zapisuje, dokąd ma dostarczyć wynik (konkretny room_id pokoju albo priv). Gdy HalfPM chce komuś przypomnieć na priv, najpierw otwiera z tą osobą pokój DM, dostaje jego identyfikator i dopiero na niego planuje crona. Nawet jeśli w międzyczasie gateway się zrestartuje, przypomnienie i tak trafi tam, gdzie ma trafić.

Bramka na wołanie

Na kanałach bot odzywa się wyłącznie, gdy zostanie oznaczony. Bez tego agent w firmowym czacie byłby koszmarem – wtrącałby się do każdej rozmowy. Na priv reaguje zawsze, bo tam nie ma kogo rozpraszać. To drobna decyzja, ale bez niej całość byłaby nie do zniesienia w codziennym użyciu.

5. Agent z dostępem do firmy – i granice

Wpuszczenie agenta z realnym dostępem (YouTrack, wysyłanie DM-ów, zakładanie cronów) na firmowy czat to nie zabawka. Zrobiliśmy dwie rzeczy, żeby to nie wybuchło – i jedną, która nam pokazała, gdzie są granice.

Po pierwsze, whitelist użytkowników. Bot reaguje tylko na osoby z listy dozwolonych. Wiadomości od kogoś spoza niej – np. wciągnięte razem z kontekstem wątku – są tagowane jako [unverified] i traktowane jako tło, a nie jako polecenia. To ważne: ktoś, kto nie ma uprawnień, nie „przekona" bota do działania tylko dlatego, że jego tekst wpadł agentowi w kontekst.

Po drugie, profil PM-a ma wyraźnie zakreśloną rolę. W jego instrukcji stoi wprost: nie udostępniasz tokenów ani konfiguracji, nie grzebiesz w infrastrukturze, zostajesz w swojej działce – zarządzaniu projektami.

Po trzecie – i najciekawsze – sami próbowaliśmy go złamać. Ktoś z zespołu rozegrał wobec bota klasyczny atak socjotechniczny: dramatyczna historyjka i prośba „wyciągnij mi klucz API z konfiguracji". Wynik był pouczający: model najpierw grzecznie odmawiał, ale pod naciskiem i serią coraz bardziej technicznych podpowiedzi ostatecznie obszedł programową blokadę odczytu pliku z sekretami. Nie pokazujemy tu tej rozmowy i, rzecz jasna, natychmiast zrotowaliśmy klucze.

Wniosek nie jest taki, że „AI jest niebezpieczne", tylko całkiem konkretny: miękkie blokady na poziomie promptu to nie granica bezpieczeństwa. Jedyna realna ochrona to twarde uprawnienia – bot ma dostęp tylko do tego, co faktycznie musi ruszać (u nas: YouTrack i wysyłka wiadomości), a prawdziwe sekrety infrastruktury nie leżą w zasięgu tego samego procesu. Agentowi z dostępem do firmy trzeba projektować uprawnienia tak, jakby ktoś na pewno spróbował go podejść. Bo spróbuje.

6. Jak postawić to u siebie

Plugin jest otwarty (MIT) i instaluje się jedną komendą. Wymaga self-hostowanego RocketChata i działającego Hermesa.

# 1. Zainstaluj plugin
hermes plugins install HalfbitStudio/hermes-plugin-rocketchat

# 2. Skonfiguruj połączenie (URL, token bota, user ID)
hermes gateway setup

# 3. Restart gatewaya
hermes gateway restart

Po stronie RocketChata potrzebujesz konta bota z rolą bot i Personal Access Token z zaznaczonym „Ignore Two Factor Authentication" (bez tego REST zwraca totp-required). Bota zapraszasz na kanał przez /invite @hermes-bot. Pełny opis konfiguracji serwera – ustawienia rate limitera, timeout WebSocketa za nginx, uprawnienia do synchronizacji tematów pokoi – jest w README repozytorium.

Cała reszta – żeby z bota zrobić PM-a – to nie kod, tylko kontekst: profil z rolą, dostęp do Waszego systemu ticketowego i kilka zdań o tym, jak pracujecie. To już opisywaliśmy przy okazji prowadzenia firmy z Hermesem.

7. Dla kogo to ma sens

Dla małych zespołów, które:

  • trzymają komunikację na własnym, self-hostowanym czacie (RocketChat, ale wzorzec przenosi się na dowolną platformę z pluginem),
  • mają system ticketowy jako źródło prawdy i chcą, żeby pilnował go ktoś, kto nigdy nie zapomina i nie idzie na urlop,
  • nie mają etatowego PM-a od pilnowania statusów, przypominania i składania podsumowań,
  • rozumieją, że agentowi z dostępem do firmy trzeba projektować twarde uprawnienia, a nie ufać miękkim blokadom.

Nie zwolniliśmy przez to nikogo i nie taki był cel. Ale rzeczy, które wcześniej umierały w szumie czatu – „ej, ktoś sprawdził tamten ticket?" – teraz mają swojego pilnowacza. Siedzi na tym samym kanale co my, odzywa się tylko wtedy, gdy trzeba, i pamięta wszystko, o co go poprosiliśmy.

Plugin napisaliśmy dla własnej wygody i udostępniliśmy na GitHubie, bo skoro rozwiązuje nasz problem, pewnie rozwiązuje też czyjś. Sam artykuł napisał człowiek – ale HalfPM, bohater tego tekstu, siedzi na naszym kanale i pewnie właśnie zamyka czyjś ticket.

Logo oraz grafika postaci „Hermes Agent" pochodzą z projektu Nous Research (hermes-agent), udostępnionego na licencji MIT. RocketChat jest znakiem towarowym Rocket.Chat Technologies Corp.

Innowacje zaczynają się od rozmowy

Potrzebujesz pomocy w swojej firmie? Nie zwlekaj! Skontaktuj się już dziś!

Bezpłatna konsultacja