# 3. Czat z Orin, Kuźnia, Muzyka i Stream — Rozrywka w Warsztacie

> Źródło: repo afterlife/docs/api/03-czat-kuznia-muzyka-stream-rp.md — edytuj w repo, nie tutaj.

# Czat z Orin, Kuźnia, Muzyka i Stream — Rozrywka w Warsztacie

![Orin ze zwojami Kroniki przy terminalach](https://wiki.ariku.pl/uploads/images/gallery/2026-10/orin-kronika-zwoje.png)

*Trąca łapką mikrofon i podkręca suwaki na mikserze!* Słyszysz mnie dobrze, nyah~? Kiedy nie zjeżdżamy wózkiem do kopalni **Nidarelu**, w naszym Warsztacie i tak cały czas coś gra, świeci albo maluje obrazy! Na tej stronie naszej księgi zebrałam wszystkie trzynaście ścieżek API, którymi rozmawiasz ze mną w okienku czatu, rozpalasz ogień w **Kuźni** (ComfyUI), wrzucasz kawałki na wspólną kolejkę muzyczną i oglądasz strumienie wideo na żywo! *strzyże uszami*

---

## Czat ze mną i Kuźnia obrazów (4 ścieżki)

Moje okienko czatu na stronie (`OrinAIWindow`) oraz komendy na Discordzie korzystają ze wspólnego mózgu i wspólnej kolejki! Ponieważ karta graficzna Majstra obsługuje jednocześnie modele językowe (Ollama), generowanie grafiki (ComfyUI) oraz same gry, nad wszystkim czuwa bramka **Kuźni** (`lib/forge.ts`).

| Endpoint | Metody | Dostęp | Opis działania i parametry |
|---|---|---|---|
| `/api/chat` | `GET`, `POST` | Ciasteczko sesji Discord | Główny punkt rozmowy ze mną! `GET` zwraca historię kontekstu i status; `POST` przyjmuje wiadomość, sprawdza czy pytasz o status serwerów/Vikunji, steruje światłami Home Assistanta (dla uprawnionych), generuje obrazek lub odpowiada przez wybrany model AI. Jeśli GPU jest zajęte, wrzuca zadanie do kolejki `orinQueue`. |
| `/api/chat/queue/[id]` | `GET`, `POST` | Ciasteczko sesji Discord | Obsługa kolejki moich odpowiedzi! `GET` pozwala przeglądarce lub botowi odpytywać o status zadania (`pending`, `resolved`, `error`), tekst odpowiedzi i wygenerowany obrazek. Zwraca `404`, jeśli zadanie nie należy do ciebie! `POST` oznacza odpowiedź jako dostarczoną (`markOrinQueueItemDelivered`), żebym po restarcie nie wysłała jej na Discordzie dwa razy. |
| `/api/generate` | `POST` | Sesja Discord + uprawnienie w grafie AI / rola `Zwłoki w Taczce` | Bezpośrednie wykuwanie mediów w **Kuźni** (wywoływane m.in. przez komendę `/generate`). Przyjmuje `{ preset, prompt }`. Sprawdza wolne miejsce na dysku AI (blokada powyżej 95%), rezerwuje slot w Kuźni (`acquireForgeSlot`) i zwraca surowe bajty wygenerowanego pliku! |
| `/api/forge-request` | `GET`, `POST` | Sesja Discord (`GET`), Uprawnieni do generowania / Majster (`POST`) | Sterowanie bramką **Kuźni** w trybie GAMING! `GET` zwraca stan Kuźni (`state`), liczbę czekających (`waiters`) i oczekującą prośbę (`pending`). `POST` pozwala otworzyć lub zamknąć Kuźnię — a jeśli Majster akurat w coś gra (`isLikelyGaming`), wysyła mu prywatną wiadomość z przyciskami zatwierdzenia lub odrzucenia prośby! |

### Jak działa ochrona Kuźni i dysku?
Zanim pozwolę ci wygenerować obrazek przez `/api/generate` albo `/api/chat`, sprawdzam trzy rzeczy, nyah~:
1. Czy w grafie uprawnień (`canInvokeOrLegacy`) twoja rola ma połączenie `can_invoke` do wybranego presetu `capability:orin.image.<preset>`.
2. Czy dysk roboczy AI nie przekroczył progu **95% zapełnienia** (`AI_DISK_BLOCK_PCT`).
3. Czy **Kuźnia** nie jest wygaszona z powodu gry Majstra! Zamknąć Kuźnię po skończonej pracy może każdy uprawniony, ale zatwierdzić prośbę podczas rozgrywki może wyłącznie sam **Majster** (`isOwner`).

---

## Wspólna Kolejka Muzyczna (6 ścieżek)

Jak już wiesz z poradnika na wiki, mam jedną wspólną kolejkę muzyczną dla strony **ariku.pl/music** i kanałów głosowych na Discordzie! *kiwa głową w rytm muzyki* Najpierw szukam utworu w naszej lokalnej bibliotece, a jeśli go nie ma — pobieram go z YouTube, indeksuję i dopiero puszczam w eter.

| Endpoint | Metody | Dostęp | Opis działania i parametry |
|---|---|---|---|
| `/api/music/search` | `GET` | Ciasteczko sesji Discord | Przeszukuje naszą zaindeksowaną bibliotekę muzyczną po tytule lub artyście i zwraca gotowe do odtworzenia utwory. |
| `/api/music/youtube` | `GET` | Ciasteczko sesji Discord | Wyszukuje filmy lub playlisty na YouTube według wpisanej frazy albo wklejonego linku URL. |
| `/api/music/play` | `POST` | Ciasteczko sesji Discord | Dodaje wybrany utwór do kolejki! Jeśli pochodzi z naszej biblioteki — trafia tam od razu; jeśli z YouTube — uruchamia zadanie pobierania i indeksacji w tle. |
| `/api/music/queue` | `GET`, `DELETE` | Ciasteczko sesji Discord | `GET` zwraca aktualnie grany utwór oraz całą listę zaplanowanych piosenek w kolejce. `DELETE` pozwala wyczyścić kolejkę lub usunąć z niej własne utwory („usuń moje”). |
| `/api/music/control` | `POST` | Ciasteczko sesji Discord | Sterowanie odtwarzaczem na żywo: przyjmuje komendy `pause` (pauza), `resume` (wznów) oraz `skip` / `next` (następny utwór). |
| `/api/music/jobs` | `GET` | Ciasteczko sesji Discord | Zwraca status trwających zadań pobierania z YouTube (`pobieram…` → `indeksuję…` → `w kolejce`), dzięki czemu pasek postępu na stronie wie, kiedy piosenka jest gotowa! |

---

## Strumieniowanie Wideo — Stream i MediaMTX (3 ścieżki)

Kiedy ktoś ze społeczności odpala transmisję dla znajomych w Warsztacie, obraz leci przez nasz serwer MediaMTX prosto do odtwarzacza HLS na stronie!

| Endpoint | Metody | Dostęp | Opis działania i parametry |
|---|---|---|---|
| `/api/stream/key` | `GET`, `POST`, `DELETE` | Ciasteczko sesji Discord | Zarządzanie indywidualnym kluczem transmisji użytkownika do programu OBS (odczyt, wygenerowanie nowego klucza lub jego unieważnienie). |
| `/api/stream/queue` | `GET`, `POST` | Ciasteczko sesji Discord | Obsługuje kolejkę aktywnych streamerów oraz stan pokoju oglądania na żywo. |
| `/api/stream/hls/[...path]` | `GET` | Ciasteczko sesji / Publiczny w trybie GAMING | Proxy dla strumienia wideo HLS (`m3u8` oraz segmenty `.ts` / `.m4s`) z serwera MediaMTX. Przekazuje ścieżkę `[...path]` bez wystawiania wewnętrznych portów serwera na świat! |

---

Na tej trzeciej stronie księgi opisałam dla ciebie dokładnie **13 ścieżek** API (4 dla czatu i Kuźni, 6 dla muzyki oraz 3 dla streamu). *Przeciąga się leniwie na mikserze, chowa pazurki i podkręca basy w słuchawkach!*