1. Czym jest rejestr promptów
Rejestr promptów to biblioteka wielokrotnego użytku wiadomości systemowych w zakresie przestrzeni roboczej. Zapisujesz prompt raz, wiążesz z nim dowolny klucz API (lub wysyłaszprompt_ref na żądanie),
a brama wstrzykuje ten prompt jako wiadomość systemową przed
przesłaniem żądania do modelu nadrzędnego.
Edycja promptu aktualizuje każdy klucz z nim powiązany już przy
następnym wywołaniu. Bez ponownego wdrożenia. Bez zmian w kodzie. Bez
aktualizacji SDK. Powiązanie żyje w bramie, nie w aplikacji.
To ta sama idea, którą zapoczątkowali Langfuse i LangSmith, ale z
jedną różnicą: OrcaRouter jest warstwą dostarczania. Kod aplikacji
woła /v1/chat/completions dokładnie jak wcześniej; brama rozwiązuje
i wstrzykuje prompt. Nie ma nic do zainstalowania w aplikacji.
Prompty są w zakresie przestrzeni roboczej — każdy członek widzi
prompty swojej przestrzeni; nic nie przekracza granic najemcy.
2. Szybki start — powiąż swój pierwszy prompt w 5 krokach
Utwórz prompt
/console/prompts i kliknij New prompt.
Nazwij go support-agent. Wklej wiadomość systemową:“Jesteś zwięzłym agentem wsparcia dla Acme. Odpowiadaj w 2 zdaniach lub mniej.”Zapisz — to tworzy wersję 1.
Powiąż klucz
/console/token, utwórz lub edytuj klucz API, wybierz
support-agent z rozwijanej listy Prompt i production z
listy Label.Wyślij żądanie
X-Orca-Prompt: support-agent@production:v1
potwierdza, który prompt został wstrzyknięty.Edytuj prompt
/console/prompts, edytuj support-agent — zmień
wiadomość systemową. Zapisz — wersja 2 jest tworzona automatycznie;
production wciąż wskazuje na v1.3. Pojęcia: prompty, wersje, etykiety
| Pojęcie | Definicja | Zmienność |
|---|---|---|
| Prompt | Nazwana pozycja w zakresie przestrzeni roboczej. Identyfikator: name (regex ^[a-zA-Z0-9._-]{1,128}$). | Soft-delete (kosz 30 dni + czyszczenie). |
| Wersja | Niezmienna migawka zawartości promptu. Tworzona automatycznie przy każdym zapisie. Identyfikator: monotoniczny int. | Niezmienna — nigdy nie edytowana, nigdy nie ponownie używana. |
| Etykieta | Przesuwalny wskaźnik na wersję (np. production → v7). | Przesuwana atomowo przez Promote; log audytu rejestruje każdy ruch. |
Zarezerwowane etykiety
productionjest automatycznie przypinana do v1 przy pierwszej wersji każdego nowego promptu. Jej przeniesienie to przełączenie ruchu produkcyjnego — tylko Owner w RBAC.latestjest automatycznie utrzymywana przez bramę i zawsze wskazuje na najnowszą wersję. Nie możesz przesunąćlatestręcznie.
staging,
canary, eu-prod) przez dialog Labels i wiązać z nimi klucze.
Dopóki etykieta nie jest przypięta do wersji, klucz powiązany z
name@<ta-etykieta> fail-otwarcie bez wstrzyknięcia.
Dlaczego taka forma
Podział między niezmienne wersje a przesuwalne etykiety to prymityw deploy-bez-kodu. Kod aplikacji odnosi się do etykiety (pośrednio, przez powiązanie klucza, lub jawnie przezprompt_ref). Promowanie
przesuwa etykietę — aplikacja widzi nową zawartość przy następnym
wywołaniu bez żadnej zmiany kodu. Wycofanie to po prostu promowanie
starszej wersji na etykietę.
4. Wzorce produkcyjne: promowanie, wycofanie, etapowe wydanie
Promowanie
Otwórz Labels w wierszu promptu, wybierz docelową wersję, kliknij Promote. Przesunięcie etykiety jest atomowe i audytowane (log audytu pokazuje, kto przeniósł którą etykietę z której wersji do której i kiedy). Każdy klucz powiązany zname@<label> pobiera nową
wersję przy następnym żądaniu.
POST /api/prompt/:id/label). Developerzy i Viewerzy widzą listę
etykiet i historię audytu, ale nie widzą przycisku Promote; dialog
pokazuje wskazówkę inline “ask an Owner”, aby ograniczenie było
widoczne, a nie ciche.Wycofanie
Restore na starszej wersji w panelu History. Restore kopiuje zawartość tej wersji do przodu jako nową wersję (historia nigdy nie jest mutowana) i przesuwa na niąlatest. Aby ruch faktycznie
się wycofał, Promote odpowiednią etykietę na przywróconą wersję.
Wydanie etapowe
Powiąż klucze canary zname@staging, klucze prod z
name@production. Promuj staging na nową wersję, obserwuj w
Insights, następnie promuj production, gdy jesteś zadowolony. Bez
edycji kluczy, bez wdrożenia, bez aktualizacji SDK.
Podział ruchu A/B
Dialog Label ma przełącznik Split traffic. Włącz go, aby skierować pojedynczą etykietę na wiele wersji z dystrybucją ważoną (np. v7: 60%, v8: 40%). Bucketing jest deterministyczny per(workspace, token, request-id), więc pojedyncza konwersacja pozostaje
w tym samym buckecie między ponowieniami.
5. Szablonowanie: podstawienie {{var}}
Zawartość promptu obsługuje placeholdery {{var}} w stylu Mustache.
Wartości od wywołującego pochodzą z prompt_ref.variables (zobacz
§6).
Reguły:
- Podstawienie jednoprzebiegowe. Wartości zmiennych są emitowane
jako tekst literalny. NIE są ponownie ewaluowane jako szablon — to
zapobiega prompt injection, gdy wartość dostarczona przez
wywołującego próbuje wstrzyknąć kolejne dyrektywy
{{...}}. - Nieznane placeholdery pozostają dosłownie. Jeśli placeholder
{{foo}}nie ma pasującej zmiennej, literalne{{foo}}jest emitowane (a ostrzeżenie logowane). Żądania nigdy nie zawodzą z powodu brakującej zmiennej. - Dostęp przez kropkę.
{{user.name}}przechodzi zagnieżdżone obiekty, gdy wywołujący przekazuje zagnieżdżoną mapę. - Sekcje.
{{#flag}}...{{/flag}}pokazuje blok tylko gdyflagjest truthy. Odwrócone sekcje ({{^flag}}...) pokazują blok, gdyflagjest brakujący/falsy. - Limit rozmiaru wyrenderowanego tekstu: 256 KiB. Jeśli końcowy
wyrenderowany tekst przekracza ten próg, cała iniekcja jest pomijana
(odpowiedź nie zawiera nagłówka
X-Orca-Prompt) a żądanie jest przekazywane bez zmian — ochrona przed wzmocnieniem przez eksplozję zmiennych.
- Prompty Langfuse używają tej samej składni Mustache
{{var}}. - Prompty LangSmith deklarują
template_format: f-string | mustachew manifeście. Brama respektuje tę deklarację.
6. Nadpisanie na żądanie: prompt_ref
Nadpisz lub wybierz prompt na żądanie bez zmiany powiązania
klucza. Dodaj pole prompt_ref najwyższego poziomu do ciała żądania:
prompt_ref żądania > powiązanie
klucza (natywne PromptId/PromptLabel lub PromptProviderId) >
kanałowy SystemPrompt > brak.
prompt_ref jest konsumowany przez bramę i usuwany przed
przekazaniem w górę — restrykcyjni dostawcy nigdy nie widzą
nieznanego pola.
Kształt:
7. Prompty w kształcie czatu (system + few-shot)
Większość promptów to pojedynczy łańcuch system. Ale czasami chcesz, aby brama wstrzyknęła bogatszy szablon — wiadomość systemową plus sekwencję few-shot tur user/assistant. Rejestr wspiera to jakokind: 'chat'.
Modal Create prompt w konsoli udostępnia przełącznik Text /
Chat. Gdy wybierzesz Chat, edytor zawartości staje się listą
wierszy {role, content} (system, user, assistant) — dodaj tyle,
ile potrzebujesz. Przy zapisie wiersze są persystowane jako
messages_json. Po utworzeniu kind jest niezmienny.
Zachowanie przy wstrzyknięciu:
- Brak wiadomości systemowej w żądaniu ⇒ brama dokleja wiadomość systemową szablonu, a tury few-shot szablonu pojawiają się przed wiadomościami wywołującego.
- Wiadomość systemowa w żądaniu ⇒ wstrzyknięcie zgodne z domyślnym
zachowaniem adaptera formatu. Dla żądań w kształcie OpenAI wiadomość
systemowa szablonu jest doklejana na początek; dla żądań w kształcie
Claude system szablonu trafia do natywnego parametru
system.
8. Relacja z resztą bramy
| Powierzchnia | Jak komponuje się z Prompts? |
|---|---|
| Models | Prompty są agnostyczne wobec modelu. Ten sam prompt jedzie po GPT-5, Claude, Gemini. Routing wybiera model nadrzędny na podstawie model żądania i grupy klucza — Prompts nigdy tego nie nadpisuje. |
| Routing | Routing biegnie pierwszy; resolver promptów później. Więc rozwiązany prompt jedzie tym kanałem, który wybrał router, w tym przez łańcuch fallback. |
| Guardrails | Guardrails to niezależna bramka inspekcjonująca i redagująca treść. Prompty wstrzykują wiadomość systemową; nie omijają polityki. Żądanie może nieść oba — guardrails zawsze biegną. |
| API Keys | Klucz wiąże się z promptem na etykiecie (np. support-agent@production). Powiązanie żyje na kluczu w bramie, więc promowanie nowej wersji przesuwa wszystkie klucze na tej etykiecie naraz. |
| Insights | Każde żądanie stempluje prompt_id, prompt_version, prompt_label na wierszu logu. Insights tnie po prompcie — użycie, wskaźnik błędów, latencja, koszt. |
config (Langfuse config.model, LangSmith
model_config) — brama ignoruje te pola. Prompty wstrzykują tylko
tekst; wybór modelu to zadanie routera.
9. Źródła zewnętrzne: Langfuse, LangSmith, Generic HTTP
Federacja: podłącz zewnętrzne źródło promptów raz, potem wiąż klucze lub wysyłajprompt_ref przeciwko nazwom tam hostowanym. Natywne i
zewnętrzne prompty wiążą się i serwują identycznie — różni się tylko
backend resolvera.
Wspierane źródła:
- Langfuse —
GET {base}/api/public/v2/prompts/{name}?label=..., Basic auth z parypublic:secret. Prompty tekstowe i chatowe. - LangSmith —
GET {base}/commits/{owner}/{name}/{tag|hash|latest}, nagłówekx-api-key. Brama parsuje zserializowany manifest, aby wyciągnąć messages/text i deklaracjętemplate_format. Osadzone polamodel_config/model_providersą usuwane (defense in depth: rejestr serwuje tylko tekst). - Generic HTTP — konfigurowany przez operatora konektor dla dowolnego rejestru promptów, który wystawia jedno wywołanie HTTP na pobranie. Zobacz poniżej konfigurowalne pola.
Pola konektora Generic HTTP
Źródło Generic HTTP to adapter “opisz jedno wywołanie HTTP i jeden kształt odpowiedzi”. Używany do self-hosted magazynów promptów ORAZ dla platform stron trzecich, które nie potrzebują własnej integracji backendu (PromptLayer, proste niestandardowe API itp.). Pola są celowo małe — przepływy wieloetapowe lub protokoły specyficzne dla dostawcy są poza zakresem.| Pole | Domyślnie | Co robi |
|---|---|---|
| URL template | required | Pełny URL żądania z placeholderami {name} / {label} / {version}. Placeholdery w ścieżce używają PathEscape; placeholdery w query string używają QueryEscape, więc &/= w nazwie promptu nie mogą wstrzyknąć dodatkowych parametrów query. |
| HTTP method | GET | GET lub POST. Wybierz POST, gdy platforma wymaga ciała żądania. |
| Auth header name | Authorization | Nagłówek HTTP, w którym wysyłany jest sekret. Ustaw X-API-KEY (lub podobne) dla dostawców używających niestandardowego nagłówka. |
| Auth scheme prefix | Bearer (ze spacją końcową) | Łańcuch dołączany przed sekretem w wartości nagłówka. Ustaw pusty, jeśli platforma oczekuje surowego klucza API, lub Token / inny niestandardowy prefiks. |
| Body template | empty | Tylko POST. Surowe ciało żądania z dwiema rodzinami placeholderów. Verbatim: {name} / {label} / {version} podstawiają wartość literalną (użyj dla form-encoded, XML lub szablonów — escaping na tobie). JSON-safe: {name_json} / {label_json} / {version_json} podstawiają w pełni zacytowany literał string JSON (np. "hello") — użyj ich WEWNĄTRZ ciał JSON, aby nazwa promptu od żądania zawierająca " / \ / znaki kontrolne nie mogła wstrzyknąć pól siostrzanych w górę. |
| Response JSON path | empty | Opcjonalna kropkowa ścieżka w JSON odpowiedzi, gdzie żyje payload promptu (np. data.0.template.messages). Pusty = auto-detekcja kształtów najwyższego poziomu text / prompt / messages. |
Odporność
- Cache TTL (domyślnie 60s), więc edycje promptów propagują się w ciągu minuty.
- Stale-while-revalidate — wartość zacache’owana jest serwowana, podczas gdy następne odświeżenie biegnie w tle.
- Stale-on-error — jeśli źródło zewnętrzne zwraca 5xx lub upływa timeout, brama serwuje ostatnią znaną dobrą odpowiedź. Ruch użytkownika nigdy nie ginie twardo przez awarię dostawcy.
10. Obserwowalność
Każde żądanie z wstrzykniętym promptem pozostawia cztery okruchy.Nagłówek odpowiedzi
- Natywny:
name@label:vN (native)(lubname@label (native), gdy int wersji jest nieznany). - Zewnętrzny:
name@label:<provider-version-tag> (langfuse)itd. - Pominięta etykieta ⇒ brak segmentu
@label.
Kolumny logu
Log.PromptId, Log.PromptVersion, Log.PromptLabel —
typowane kolumny, indeksowane dla zapytań Insights.
Drilldown w Insights
W/console/insights wiersz filtra ma fasetę Prompt — wybierz
prompt, a każda zakładka (latencja, błędy, koszt) filtruje do tego
prompt_id. To zamknięcie pętli dla “edytowałem prompt — co
zmieniło się w ruchu?”.
Audyt
Każde przesunięcie etykiety i wycofanie są zapisywane w Promote history promptu z user id aktora, znacznikiem czasu, from-version i to-version. Widoczne dla każdego członka; mutacja ograniczona przez rolę Owner.11. Referencja API
Wszystkie trasy są w zakresie przestrzeni roboczej przez nagłówekX-Workspace-Id. RBAC jest egzekwowany konsekwentnie: odczyty
otwarte dla każdego członka; zapisy to Developer+; zmiany ruchu
produkcyjnego (przesunięcia etykiet, wycofania, konfiguracja
dostawcy, webhooki) są tylko-Owner.
Prompty
| Metoda i ścieżka | Rola | Cel |
|---|---|---|
GET /api/prompt/ | Member | Lista promptów (paginowana, wspiera ?tag=). |
GET /api/prompt/?in_trash=true | Owner | Lista miękko usuniętych promptów (tylko-Owner — klasa odzyskiwania). |
GET /api/prompt/search | Member | Wyszukiwanie po słowach kluczowych + tagach (rate-limited). |
GET /api/prompt/tags | Member | Typeahead tagów dla przestrzeni roboczej. |
GET /api/prompt/:id | Member | Szczegóły pojedynczego promptu. |
GET /api/prompt/:id/versions | Member | Historia wersji (najnowsze pierwsze). |
GET /api/prompt/:id/labels | Member | Aktualna mapa etykieta → wersja. |
GET /api/prompt/:id/tags | Member | Zestaw tagów dla jednego promptu. |
GET /api/prompt/:id/label_history | Member | Log audytu promocji. |
GET /api/prompt/:id/analytics | Member | Dane wykresu użycia per prompt. |
GET /api/prompt/analytics/top | Member | Najczęściej używane prompty w całej przestrzeni roboczej. |
POST /api/prompt/ | Developer+ | Utwórz prompt (text lub chat). |
PUT /api/prompt/ | Developer+ | Zaktualizuj prompt (tworzy nową wersję). |
POST /api/prompt/:id/tags | Developer+ | Zastąp zestaw tagów. |
POST /api/prompt/:id/run | Developer+ | Playground “Try it” (rate-limited 30/min/workspace). |
DELETE /api/prompt/:id | Developer+ | Miękkie usunięcie do kosza (domyślnie); ?purge=true to twarde usunięcie tylko-Owner. |
POST /api/prompt/:id/restore | Owner | Przywróć z kosza. |
POST /api/prompt/:id/rollback | Owner | Przywróć starszą wersję jako nową wersję. |
POST /api/prompt/:id/label | Owner | Przesuń etykietę na wersję (atomowo, audytowane; przyjmuje też payload split dla A/B). |
Dostawcy promptów (federacja)
| Metoda i ścieżka | Rola | Cel |
|---|---|---|
GET /api/prompt_provider/ | Member | Lista podłączonych źródeł (maskowane sekrety). |
POST /api/prompt_provider/ | Owner | Podłącz źródło. |
PUT /api/prompt_provider/ | Owner | Zaktualizuj źródło. |
DELETE /api/prompt_provider/:id | Owner | Odłącz. |
POST /api/prompt_provider/test | Owner | Dry-rozwiąż przed zapisem. |
GET /api/prompt_provider/:id/prompts | Member | Lista promptów dostępnych w źródle zewnętrznym. |
POST /api/prompt_provider/:id/prompts/import | Developer+ | Importuje zewnętrzny prompt do lokalnego rejestru. |
Webhooki promptów
| Metoda i ścieżka | Rola | Cel |
|---|---|---|
GET /api/prompt_webhook/ | Member | Lista webhooków. |
POST /api/prompt_webhook/ | Owner | Dodaj webhook (sekret zwracany raz). |
PUT /api/prompt_webhook/:id | Owner | Edytuj. |
DELETE /api/prompt_webhook/:id | Owner | Usuń. |
POST /api/prompt_webhook/:id/test | Owner | Wyślij przykładowe zdarzenie. |
Dostarczanie zdarzeń webhooka
Każde dostarczenie wysyła POST z kopertą JSON na skonfigurowany URL:prompt.created, prompt.updated, prompt.deleted,
label.promoted, version.rolled_back.
Nagłówki dołączane do każdego dostarczenia:
X-Orca-Webhook-Id— id Twojego webhooka (użyj do deduplikacji).X-Orca-Event— identyczny z polemeventkoperty.X-Orca-Signature— w formaciesha256=<hex>, gdzie<hex>to HMAC-SHA256 surowego ciała żądania, z kluczem równym webhook secret. Porównuj w stałym czasie.
Dodatek do payloadu żądania
12. FAQ
Co jeśli żaden prompt nie zostanie rozwiązany na żądaniu?
Co jeśli żaden prompt nie zostanie rozwiązany na żądaniu?
prompt_ref, i nie ustawiono kanałowego defaulta — brama
nie robi żadnych modyfikacji. Odpowiedź nie niesie nagłówka
X-Orca-Prompt. Kolumny logu są NULL.To gwarancja braku regresji: resolver jest zweryfikowanym no-opem,
gdy nic nie jest powiązane.Jak SystemPromptOverride współdziała z rejestrem?
Jak SystemPromptOverride współdziała z rejestrem?
SystemPromptOverride to istniejący kanałowy domyślny
system-prompt. Powiązany prompt z rejestru nadpisuje kanałowy
default — udokumentowane i celowe. Gdy nic nie zostanie
rozwiązane, kanałowy default wciąż działa dokładnie jak
wcześniej.Gdy żądanie wywołującego już zawiera wiadomość systemową,
zachowanie jest decydowane przez adapter formatu: żądania w
kształcie OpenAI otrzymują wiadomość systemową szablonu doklejoną
na początek; żądania w kształcie Claude umieszczają system szablonu
w natywnym parametrze system.Czy mogę ograniczyć, które prompty może używać konkretny klucz?
Czy mogę ograniczyć, które prompty może używać konkretny klucz?
prompt_ref dowolny prompt w swojej
własnej przestrzeni roboczej. Pasuje to do modelu kluczy w
zakresie przestrzeni roboczej z Langfuse i LangSmith. Dostęp
cross-workspace jest odrzucany na poziomie resolvera (sprawdzany
ponownie w ścieżce relay; nigdy nie ufany ze stałego powiązania).Per-key allowlisty promptów to możliwy przyszły dodatek.Czy wstrzyknięte tokeny promptu są naliczane?
Czy wstrzyknięte tokeny promptu są naliczane?
Czy rejestr nadpisuje model?
Czy rejestr nadpisuje model?
config.model / model_config zewnętrznych dostawców
są ignorowane. Wybór modelu pozostaje jedynym autorytetem
routera — Prompts wstrzykują tylko tekst.Co dzieje się z kluczem powiązanym z usuniętym promptem?
Co dzieje się z kluczem powiązanym z usuniętym promptem?
Jak szybko propagują się przesunięcia etykiet?
Jak szybko propagują się przesunięcia etykiet?
Czy mogę edytować chat-prompty w UI?
Czy mogę edytować chat-prompty w UI?
Text /
Chat; tryb chat pokazuje strukturalny edytor {role, content}.
Po utworzeniu promptu jego kind jest niezmienny (stworzysz
nowy prompt, aby zmienić kształt).Gdzie kończą okruchy prompt-stamp?
Gdzie kończą okruchy prompt-stamp?
- Nagłówek odpowiedzi
X-Orca-Promptna odpowiedzi do użytkownika. - Kolumny
Log.PromptId/PromptVersion/PromptLabelna wierszu logu żądania. - Faseta filtra Prompt w Insights — wybierz prompt; każda
zakładka Insights filtruje do tego
prompt_id.
Jak rotować sekret webhooka?
Jak rotować sekret webhooka?
PUT /api/prompt_webhook/:id i podaj nową
wartość secret. Nowy sekret jest pokazywany raz w odpowiedzi —
skopiuj go wtedy; potem sekret jest maskowany. (Nie ma dedykowanego
endpointu rotacji; rotacja to zwykła edycja.)