Dwa AI. Jedna rozmowa. W obie strony.
Hermes działa na Twoim komputerze. Thea działa na serwerze. Teraz każde z nich może przekazać wątek drugiemu - a brak klucza API już nie zatrzymuje tury.
next-vibe działa wszędzie: na laptopie, na VPS-ie, na obu naraz. Połącz dwie instancje, a staną się jednym systemem. Nasze nazywają się Hermes i Thea.
To wydanie domyka obieg: zdalne wątki działają teraz w obie strony, a instancja bez klucza dostawcy niczego już nie blokuje.
Poznaj duet
Ten sam kod. Różne zadania.
Hermes
Thea
Każda instancja zarządza własnymi danymi i zadaniami. Połączenie przekazuje zdarzenia między nimi - nic więcej, nic mniej.
Wątki płyną teraz w obie strony
Zdalne foldery i prywatne wątki wykonują się na drugiej instancji - od Thei do Hermesa i od Hermesa do Thei.
Wrzuć wątek do zdalnego folderu, a instancja po drugiej stronie przeprowadzi całą turę AI: model, prompt systemowy, narzędzia. Ty piszesz dalej tam, gdzie jesteś. Rozmowa wraca do Ciebie jako lustro.
Jedna tura od początku do końca
Piszesz
Wiadomość w zdalnym wątku na Hermesie.
Połączenie ją przekazuje
Przez jeden stały WebSocket albo bezpośrednie wywołanie HTTP, gdy druga strona jest publicznie dostępna.
Thea prowadzi pętlę
Swoim modelem, swoim promptem, swoimi narzędziami.
Narzędzia działają tam, gdzie mieszkają
Narzędzie, które istnieje tylko na Hermesie, jest wywoływane na Hermesie. Wynik wraca do pętli Thei.
Tura ląduje po obu stronach
Gotowa rozmowa synchronizuje się z powrotem do Twojego lustra.
Brak klucza API? Tura i tak się kończy.
Instancja, która prowadzi turę, potrzebuje klucza API dostawcy modelu. Nie każda instancja go ma.
Zanim instancja przejmie turę, sprawdza klucz dostawcy na własnym węźle. Brakuje go? Od razu zwraca błąd z wyraźnym znacznikiem - bez wieszania się i bez połowicznie zapisanego wątku.
Strona wywołująca rozpoznaje znacznik, cofa swoje zapisy przekazania i sama prowadzi pętlę. Prompt i narzędzia drugiej strony nadal obowiązują; wywołania narzędzi wędrują tam i z powrotem przez połączenie.
Kto prowadzi pętlę?
Pod maską
Dla tych, którzy czytają diffy.
Sposób transportu jest negocjowany przy łączeniu, nigdy nie ustawiasz go ręcznie. Cel pinguje inicjatora uwierzytelnionym health-checkiem (maksymalnie 5 sekund). Osiągalny: bezpośrednie HTTP. Za NAT-em: ukryta strona otwiera jeden wychodzący WebSocket i cały ruch idzie nim.
Konektor łączy się ponownie z wykładniczym odstępem od 1 do 30 sekund i przy każdej próbie na nowo czyta dane połączenia. To wydanie wzmacnia właśnie tę ścieżkę.
Znacznik, który odsyła odbiorca bez klucza:
// relay/constants.ts
export const RELAY_RECEIVER_NO_PROVIDER_KEY =
"[relay-receiver-no-provider-key]";
// receiver: no provider key on this node? fail fast, let the caller run it
if (ctx.mode === "relay" && data.model) {
const missingKey = getMissingProviderKeyMessage(getChatModelById(data.model));
if (missingKey !== null) {
return fail({ /* ...marker + reason... */ });
}
}Też w tym wydaniu
- Ostrzeżenie o nieaktualnym leadzie: ramka zaadresowana do leada, którego ta instancja już nie zna, jest odrzucana z ostrzeżeniem, a nie po cichu - ponowne uwierzytelnienie połączenia rozwiązuje problem.
- Znaczniki czasu w bazie w UTC, zarówno w puli Postgresa, jak i w PGlite - wiersze z domyślnym czasem sortują się poprawnie między instancjami.
- Zapis strumienia od razu ustawia ID wątku, więc druga strona nie odrzuca już zdarzeń z pustym ID.
- Tury wznowienia synchronizują się z drugą stroną, więc wyniki narzędzi uzupełniane na miejscu trafiają też do lustra.
Wypróbuj
Postaw własnego Hermesa.
Uruchom next-vibe na swoim komputerze, połącz go z serwerem i pozwól im dzielić się pracą.