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).
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.
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ęć.
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ł.
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.
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.