* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
66 KiB
Guardrails (Slovenščina)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Vir resnice:
src/lib/guardrails/Nazadnje posodobljeno: 2026-08-29 — v3.8.51 (izvor prepisa Video Bridge določi klicatelj, strežnik pa ga še ne preverja — pojasnjeno skladno z #11661)
Varovala uveljavljajo varnost, pravilnike in preoblikovanje vsebine na meji
med OmniRoute in ponudniki v zaledju. Vsako varovalo lahko pregleda (in
po želji zavrne, preoblikuje ali opremi z opombami) koristne vsebine zahtev (preCall) ter
odzive iz zaledja (postCall).
Sistem je zasnovan tako, da ob napaki dovoli nadaljevanje: če varovalo med izvajanjem sproži izjemo, register
zabeleži napako in nadaljuje z naslednjim varovalom, namesto da bi
zahteva spodletela. Blokiranje je izrecna odločitev (block: true), nikoli naključje.
Vgrajena varovala
Register ob uvozu samodejno naloži šest varoval po prednostnem vrstnem redu
(glejte registry.ts → registerDefaultGuardrails()):
| Prednost | Ime | Faze | Datoteka |
|---|---|---|---|
5 |
vision-bridge |
preCall |
visionBridge.ts |
6 |
audio-bridge |
preCall |
audioBridge.ts |
7 |
video-bridge |
preCall |
videoBridge.ts |
10 |
pii-masker |
pre + post |
piiMasker.ts |
20 |
prompt-injection |
preCall |
promptInjection.ts |
95 |
credential-masker |
pre + post |
credentialMasker.ts |
Nižje številke prednosti se izvedejo prej.
Vision Bridge (visionBridge.ts) — Most modalnosti PR-1
Prestrezanje zahtev, ki vsebujejo slike in so namenjene modelom brez podpore za vid, ter bodisi preusmeritev celotne zahteve na model s podporo za vid bodisi zamenjava slikovnih delov z besedilnimi opisi, ki jih pred klicem zaledja ustvari nastavljiv model za vid. Tako lahko ponudniki, ki podpirajo samo besedilo, pregledno obravnavajo večmodalne koristne vsebine.
Potek:
- Preskoči, če ciljni model že podpira vid (razen če je na
seznamu modelov s prisilno uporabo mostu
isVisionBridgeForcedModel). - Izloči slikovne dele prek
extractImageParts(messages)(visionBridgeHelpers.ts), ki izvedbo preda enotnemu zaznavalniku predstavnostidetectMediaParts()vopen-sse/utils/mediaParts.ts— edinemu viru resnice, ki si ga deli s filtrom združljivosti combo. Izločanje je omejeno na seznam dovoljenih delov na najvišji ravni z oblikami, ki jih lahkoreplaceImagePartsvstavi nazaj (pogodba izločanje↔zamenjava): OpenAIimage_url, Anthropic base64source.type:"base64", Anthropic URLsource.type:"url"in Responses APIinput_image. Ugnezdeni zadetki in oblike, ki vsebujejo samo indikatorje, so namenjeni filtru combo in se nikoli ne izločijo. Preskoči, če ni najden noben. - Razreši nastavitve izvajalnega okolja prek
resolveVisionBridgeRuntimeSettings()(src/shared/constants/modalityBridgeDefaults.ts): novi ključi nastavitevmodalityBridge*imajo prednost; podedovani ključivisionBridge*ostajajo na voljo kot nadomestna možnost za en cikel (obdobje za povrnitev). Ko je most onemogočen, preskoči pred kakršnim koli pregledovanjem predstavnosti. - Izbirnik načina (
modalityBridgeVisionMode, glejte spodnjo tabelo) določi preusmerjanje ali opisovanje. Preusmerjanje vrnemodifiedPayload, v katerem je zamenjan samomodel, skupaj z metapodatki{ rerouted, fromModel, toModel, imagesKept }. - Pot opisovanja: omeji število slik na
maxImages, sestavi poziv, prilagojen opravilu, preveri predpomnilnik opisov, pokliče model za vid vzporedno (Promise.allSettled) in namesto slik vstavi besedilne dele[Image N]: <description>. Neuspelo opisovanje vrnenull, izvirni slikovni del pa se ohrani (#4012) — razen na poti opisovanja combo, ko so spodleteli vsi poskusi opisovanja; v tem primeru se za potrjeno zaledje brez podpore za vid vstavi nadomestno besedilo(ni na voljo — povezan ni noben ponudnik s podporo za vid)(#8430). - Vrne
modifiedPayloadin metapodatke (imagesProcessed,descriptions,processingTimeMs,visionModel).
Izbirnik načina (modalityBridgeVisionMode)
| Način | Privzeto | Vedenje |
|---|---|---|
auto |
✔ | Nespremenjena podedovana hevristika (#6640/#7204): modeli, ki niso combo, in modeli auto/ se preusmerijo na najboljši model za vid, razen če ima izvirni model že uporabne poverilnice (takrat se uporabi opisovanje); cilji combo vedno uporabijo opisovanje. |
describe |
Vedno uporabi opisovanje — blok za preusmerjanje se v celoti preskoči; vedno odgovori model, ki ga je izbral uporabnik. | |
reroute |
Vsili preusmerjanje: varovalo za ohranitev modela s poverilnicami se zaobide. Varovalo poverilnic za cilj preusmerjanja še vedno velja — če ni uporabnega cilja s podporo za vid, zahteva nadaljuje na opisovanje, da neobdelane slike nikoli ne dosežejo zaledja, ki podpira samo besedilo (#8430). |
Prisilni načini prekinejo izvajanje pred samodejno hevristiko; vedenje načina auto
je bajtno enako varovalu pred PR-1.
Poziv za opisovanje, prilagojen opravilu (modalityBridgeVisionTaskAware)
Privzeto true. composeVisionPrompt() (visionBridgeHelpers.ts) osnovnemu
pozivu za opisovanje doda besedilo zadnjega uporabniškega sporočila (skrajšano na 500 znakov),
s čimer opis usmeri k temu, kar je uporabnik dejansko vprašal
(vzorec codex-vision-proxy), model za vid pa pozove tudi k prepisu vidnega
besedila. Ko je zastavica izklopljena — ali uporabniškega besedila ni — se osnovni poziv uporabi nespremenjen.
Samopovratna zahteva za opis, združljiva z OpenAI (callVisionModelSingle()
v visionBridgeHelpers.ts), vedno zahteva image_url.detail: "high" —
brezpogojno, za vsakega klicatelja/ponudnika in neodvisno od kakršnega koli
signala odjemalca. Vzorčenje z nizko stopnjo podrobnosti poslabša natančnost
OCR prav pri nalogi prepisovanja besedila, ki jo zahteva ta poziv, zato sam
klic za opis vedno zahteva visoko stopnjo podrobnosti, ne glede na raven
podrobnosti izvorne dohodne zahteve. To vpliva samo na telo interne zahteve za
opis; ne spremeni načina, kako OmniRoute posreduje klicateljevo lastno
image_url.detail v primarni zahtevi — ta privzeta vrednost se uporabi ločeno
in samo za zaznane odjemalce OpenCode v defaultImageDetail()
(open-sse/handlers/chatCore/upstreamBody.ts). Veja samopovratnega opisa v
žičnem formatu Anthropic nima polja detail in nanjo nobena od teh privzetih
vrednosti ne vpliva.
Omejitev izhoda opisa (modalityBridgeVisionMaxChars)
| Ključ | Privzeto | Razpon |
|---|---|---|
modalityBridgeVisionMaxChars |
0 |
0 ali 100–50000 |
0 (privzeto) pomeni brez omejitve — opis, ki ga vrne
callVisionModel(), se posreduje nespremenjen, s čimer se ohrani obstoječe
vedenje. Vsaka vrednost v razponu 100–50000 skrajša opis in mu doda pripono
…, preden se vstavi nazaj v obliki [Slika N]: <opis>
(VisionBridgeGuardrail.preCall() v src/lib/guardrails/visionBridge.ts).
To vrednost zvišajte pri opravilih OCR z veliko podrobnostmi, pri katerih
nadaljnji model potrebuje celoten prepis; znižajte jo, da omejite porabo
žetonov pri gostobesednih vidnih modelih. Polje na nadzorni plošči je v
razdelku Napredno zavihka Vision (modality-bridge-max-chars v
ModalityBridgeVisionTab.tsx) in vsako vrednost med 1 in 99 omeji navzgor na
najmanjšo vrednost 100, izrecno vrednost 0 pa pusti nespremenjeno — 0 je
samostojna veljavna vrednost Zod
(z.union([z.literal(0), z.number().int().min(100).max(50000)])) in ne zgolj
privzeta vrednost za »nenastavljeno«.
Predpomnilnik opisov (modalityBridge/bridgeCache.ts)
Procesno skupen predpomnilnik LRU + TTL v pomnilniku za izhode opisov.
Ključ = sha256(imageRef + composedPrompt + configuredBridgeModel) z
uokvirjanjem s predpono dolžine (brez trkov na mejah polj). Komponenta modela
je konfigurirani premostitveni model in ne model, ki je dejansko odgovoril
— callVisionModel lahko interno uporabi nadomestni model, oblikovanje ključa
za vsak poskus posebej pa bi razdrobilo predpomnilnik. Neuspešni opisi se
nikoli ne shranijo v predpomnilnik. Nastavitve:
| Ključ | Privzeto | Razpon |
|---|---|---|
modalityBridgeCacheEnabled |
true |
— |
modalityBridgeCacheTtlMinutes |
60 |
1–1440 |
modalityBridgeCacheMaxEntries |
200 |
10–5000 |
Normalizacija oddaljenih slik (samopovratni opis/pridobivanje base64)
Ko most sam pridobi oddaljeno sliko — za samoklic opisa Anthropic in
pretvorbo v base64 za žični format Claude
(ensureBase64ImagesForClaudeWire), oboje prek
fetchRemoteImageAsDataUri() v visionBridgeHelpers.ts — se nastali podatkovni
URI pred vdelavo v zahtevo za vidni model obdela z normalizeDataUri()
(open-sse/utils/imageNormalize.ts). Prevelike slike se pomanjšajo tako, da
ima daljša stranica 2048px (kar ustreza omejitvi spreminjanja velikosti, ki
jo OpenAI/Anthropic že uporabljata na strežniški strani), s čimer se zmanjšajo
količina naloženih bajtov in zakasnitve, ne da bi se spremenilo to, kar vidi
vidni model. Spreminjanje velikosti uporablja sharp, naložen prek dinamičnega
uvoza: na platformi, kjer njegove izvorne binarne datoteke ni mogoče naložiti,
normalizeDataUri() nikoli ne sproži izjeme — namesto tega nespremenjene
izvorne bajte samo posreduje naprej, zato pot opisa/pretvorbe v base64 vedno
ostane delujoča. Tudi bajti, ki niso slika (pridobivanje ni vrnilo slike, ki bi
jo bilo mogoče dekodirati), se posredujejo nespremenjeni. Ta normalizacija je
omejena na slike, ki jih most pridobi za svoj samoklic — nikoli se ne uporabi
za klicateljevo neobdelano posredovano koristno vsebino, skladno z načelom
spreminjanja samo ob izrecni privolitvi (strogo pravilo št. 20).
Shema nastavitev + selitev
Novi ključi modalityBridge* se preverjajo z Zod v updateSettingsSchema
(src/shared/validation/settingsSchemas.ts): modalityBridgeVisionEnabled,
modalityBridgeVisionMode, modalityBridgeVisionModel,
modalityBridgeVisionTaskAware, modalityBridgeVisionPrompt,
modalityBridgeVisionTimeout, modalityBridgeVisionMaxImages,
modalityBridgeVisionMaxChars, trojica modalityBridgeCache* in skupina
modalityBridgeAudio*, ki jo uporablja Audio Bridge. Selitev
141_modality_bridge_settings.sql kopira obstoječe starejše vrednosti
visionBridge* v ustrezne nove ključe (idempotentno in brez prepisovanja
vrednosti modalityBridge*, ki jo je nastavil upravljavec); starejši ključi
ostanejo sprejeti kot rezervna možnost za branje v enem ciklu izdaje.
Glava za preglednost + statistika
Odgovori, pretvorjeni z opisom, vsebujejo
x-omniroute-modality-bridge: image->text;model=<visionModel>;parts=<n>
(sestavi jo buildModalityBridgeHeader() v modalityBridge/bridgeStats.ts,
doda pa jo withModalityBridgeHeader() v src/sse/handlers/chatHelpers.ts).
Preusmerjene zahteve nimajo glave — koristna vsebina ni bila spremenjena,
zamenjava modela pa je že vidna v polju model telesa odgovora.
GET /api/modality-bridge/stats (avtentikacija za upravljanje, ista raven kot
GET /api/settings) vrne števce v pomnilniku za posamezne modalnosti
{ attempts, successes, bridged, cacheHits, failures, totalLatencyMs, latencySamples, averageLatencyMs, lastUsedAt } za vision, audio in
video. averageLatencyMs kot imenovalec uporablja latencySamples, ne vseh
poskusov; operacija brez merjenja časa ne ustvari izmišljenega
ničmilisekundnega vzorca. bridged ostaja vzvratno združljiv vzdevek za
uspešne pretvorbe; neuspešni poskusi ga ne povečajo.
Števci se načrtno ponastavijo ob vnovičnem zagonu procesa
(telemetrija, ne računovodstvo).
Konfiguracija nadzorne plošče
Namenska stran nadzorne plošče je
/dashboard/settings/modality-bridge. Njeni zavihki Vid, Zvok in
Video, dostopni prek URL-ja, pri preklapljanju vrednosti tab ohranijo parametre poizvedbe.
Zavihek Vid omogoča omogočanje funkcije, izbiro načina in modela (vključno s samodejno
privzeto izbiro), pozive glede na opravilo, napredne omejitve časovne omejitve/slike/dolžine opisa/predpomnilnika,
števce izvajalnega okolja
in zaščiten vzorčni zahtevek. Tudi zavihek Zvok je aktiven: omogoča
omogočanje funkcije, izbirnik modela samo za STT z možnostjo Samodejno, omejitve časovne omejitve/največje dolžine posnetka, števce
zvoka in vzorčni preizkus input_audio. Zavihek Video je funkcionalen: prikazuje
stanje izvajalnega okolja FFmpeg/ffprobe — eno od štirih izrecnih stanj uporabniškega vmesnika (unknown, medtem ko
preverjanje poteka ali ga ni bilo mogoče dokončati, restricted pri gostitelju
nadzorne plošče, ki ni povratna zanka, kjer je preverjanje preskočeno na strani odjemalca, unavailable, ko je preverjanje
končano in je potrjeno, da orodje manjka, ali available z različicama FFmpeg/ffprobe) — trajno shrani
omejitve omogočanja/modela/sličic/videa/časovne omejitve, filtrira izbirnik modelov na modele,
ki podpirajo vid, in prikazuje števce videa.
Prejšnja kartica Most za vid v nastavitvah umetne inteligence je združljivostna povezava do nove strani; ne vsebuje več druge kopije obrazca. Ponudniki predstavnosti prav tako povezujejo poteka dela Slika-v-besedilo in Govor-v-besedilo z ustreznima zavihkoma Modality Bridge, ne da bi odstranili obstoječe preizkusno okolje Govor-v-besedilo.
Obhod preverjanja dovoljenja za lastno povratno zanko: ko je klic za opis usmerjen skozi
lastno povratno zanko /v1 sistema OmniRoute (nestandardni model ponudnika), podzahtevek pošlje
x-omniroute-admission-bypass: internal in je overjen z razrešenim
poverilom za lastno povratno zanko — lokalno nadomestno vrednostjo sk_omniroute v lokalnem načinu ali
ključem okolja OMNIROUTE_API_KEY / ROUTER_API_KEY, ki ga je nastavil upravljavec (#1350), tako da
lahko uvedbe z REQUIRE_API_KEY=true še vedno izvedejo klic za opis. Obhod
je upoštevan samo za ta natančna poverila, zato zunanji odjemalci ne morejo uporabiti
glave za preskok preverjanja dovoljenja.
Podedovane privzete vrednosti so v src/shared/constants/visionBridgeDefaults.ts;
nove privzete vrednosti za način/opravila/predpomnilnik in razreševalnik nastavitev pa so v
src/shared/constants/modalityBridgeDefaults.ts. Zaščitni mehanizem ponuja možnost konstruktorja
deps, da lahko preizkusi vstavijo lažne izvedbe getSettings in
callVisionModel.
Zvočni most (audioBridge.ts) — Modality Bridge PR-3
Prestrezanje zahtevkov za klepet, ki vsebujejo zvok, preden dosežejo cilj, za katerega ni znano, da sprejema zvočni vhod. Zahtevek za klepet ni nikoli preusmerjen: zvočni deli se prepišejo prek obstoječe večdelne končne točke, združljive z OpenAI, izbrani model za klepet pa nadaljuje z besedilnimi prepisi.
Potek:
- Razrešite
supportsAudioprekgetResolvedModelCapabilities(). Izrecni metapodatki registra ponudnikov imajo prednost, sledijo statični metapodatki modela in nato sinhroniziranimodalities_input. Deklarirani seznam vhodov brezaudiopomenifalse; če ni dokazov o zmogljivosti, vrednost ostanenull. Takofalsekotnullaktivirata konservativni most, medtem ko gatrueobide. - Razrešite nastavitve
modalityBridgeAudio*in iz vsakega sporočila izvlecite zamenljive zvočne dele na najvišji ravni prek skupnega detektorjadetectMediaParts(). Podprte oblike prenosa so OpenAIinput_audio,audio_urlinsource.media_type: "audio/*". Ugnezdeni zvok je zaznan za usmerjanje, vendar ga pot zamenjave ne odstrani. Delo je omejeno zmodalityBridgeAudioMaxClips; poznejši deli ostanejo nedotaknjeni. - Upoštevajte nastavljen
provider/modelali pa najselectAudioBridgeModel()pregledaAUDIO_TRANSCRIPTION_PROVIDERSv stabilnem vrstnem redu kataloga in izbere prvi model z uporabnim poverilom aktivnega ponudnika. callAudioTranscription()pretvori zvok base64/podatkovnega URI-ja v večdelno datotekofileali prenese oddaljeniaudio_urlprek zaščite za javne izhodne povezave s pripenjanjem DNS in omejitvijo 25 MB. Nato datoteko in izbrani model pošlje z metodo POST v lokalno lastno povratno zanko/v1/audio/transcriptions, overjeno zresolveSelfLoopBearer(). Obstoječa pot za prepis izvede običajno iskanje poveril, obravnavo obdobja mirovanja/omejevanja hitrosti in posredovanje ponudniku.- Uspešni klici nadomestijo svoje dele z
[Zvok N]: <prepis>. Klici se izvajajo zPromise.allSettled: posamezna napaka ohrani izvirni zvočni del (pogodba #4012). Če vsi klici spodletijo in je dokazano, da ima ciljsupportsAudio === false, deli postanejo[Zvok N]: (ni na voljo — povezan ni noben ponudnik STT)(pogodba #8430). Pri neznanem cilju (null) rezultat, pri katerem so spodleteli vsi klici, ostane nedotaknjen. Dokazano besedilni cilj brez uporabnega poverila STT prejme enako izrecno nadomestno besedilo brez izvedbe omrežnega klica.
Uspešni prepisi uporabljajo procesno skupen predpomnilnik LRU/TTL sistema Modality Bridge.
Ključ združuje sklic na zvok, stabilno oznako operacije audio-transcription
in izbrani model STT; napake se nikoli ne shranijo v predpomnilnik. Poskusi obdelave zvoka posodobijo
skupne števce bridged, cacheHits, failures in lastUsedAt.
Pretvorjeni odgovori vsebujejo
x-omniroute-modality-bridge: audio->text;model=<sttModel>;parts=<n>; nedotaknjeni
zahtevki ne prejmejo segmenta Zvočnega mostu.
Nastavitve izvajalnega okolja so shranjene v podatkovni zbirki in preverjene z Zod:
| Ključ | Privzeto | Razpon |
|---|---|---|
modalityBridgeAudioEnabled |
true |
— |
modalityBridgeAudioModel |
"" |
Samodejno ali ID STT |
modalityBridgeAudioTimeout |
60000 |
1000–300000 |
modalityBridgeAudioMaxClips |
3 |
1–10 |
Skupni predpomnilnik še naprej upravljajo modalityBridgeCacheEnabled,
modalityBridgeCacheTtlMinutes in modalityBridgeCacheMaxEntries.
Video most (videoBridge.ts, videoBridgePipeline.ts)
Prestrezanje delov videoposnetkov na najvišji ravni v messages API-ja Chat Completions in input API-ja Responses, preden je poklican ciljni sistem brez znane izvorne podpore za videoposnetke.
Podprte oblike so input_video, video_url, video_source, URL-ji HTTPS
in podatkovni URI-ji data:video/*;base64,.... Navadna imena datotek v besedilu se ne obravnavajo
kot videoposnetki.
VideoBridgeGuardrail.preCall (videoBridge.ts) je odgovoren za prečkanje zahteve,
preverjanje zmožnosti/pravilnika, združevanje na ravni zahteve in koristno vsebino odgovora.
Delo za posamezen videoposnetek — pridobivanje, predpomnilnik celotnega rezultata, opisovanje zaporedja
sličic (ki združi morebitni zvočni prepis, ki ga je navedel klicatelj) ter metrike/prekinitev/čiščenje
za posamezen poskus — je skrito za processVideoPart v
videoBridgePipeline.ts, ki se pokliče enkrat za vsak del videoposnetka znotraj zanke preCall.
Ta modul določa tudi eksplicitne meje vrat VideoMediaBrokerPort
(pridobivanje bajtov in ekstrahiranje vzorčenih sličic), VideoAudioTranscriptionPort
(združevanje zvočnega prepisa, ki ga je navedel klicatelj, z napisi vzorčenih sličic) in
VideoDrilldownPort (meja trajnega shranjevanja za podrobni pregled sličic; še ni povezana
s processVideoPart — zapise podrobnega pregleda trenutno zapisuje samo ločena pot
/api/modality-bridge/video/drilldown).
Javna pot zahtev /v1 nikoli ne uvozi ali prikliče podprocesa. Oddaljeni
videoposnetki se prenesejo z omejitvijo 50 MiB; vdelani videoposnetki base64 imajo
konservativno omejitev dekodirane velikosti 36 MiB na videoposnetek, da lahko ovojnica
modela/sporočil/uokvirjanja ostane znotraj javne omejitve 50 MiB za sprejem zahtev JSON.
Dolžina vdelane vsebine in ocene dekodirane velikosti se preverijo pred dodelitvijo pomnilnika. HTTPS je
zahtevan za začetni oddaljeni URL in vsako preusmeritev, pri čemer se uporablja obstoječa
zaščita za javne izhodne povezave s pripenjanjem DNS. Bajti nato prečkajo natančno interno
mejo posrednika POST /api/modality-bridge/video/extract. Ta pot je hkrati
LOCAL_ONLY in SPAWN_CAPABLE, sprejema samo overjeno zahtevo znotraj procesa
iz zaupanja vredne povratne zanke ter nikoli ne sprejme URL-ja, poti datotečnega sistema, izvršljive datoteke
ali seznama argumentov. Cevovod API-ja za velikost telesa in obdelovalnikov postopni bralnik telesa
neodvisno uveljavljata omejitev 50 MiB za vhod posrednika. Njegova omejena čakalna vrsta izvaja
eno ekstrahiranje naenkrat, dovoljuje štiri čakajoča opravila in omejuje čakajoči vhod na
100 MiB.
Znotraj posrednika ffprobe bere zasebno lokalno datoteko; fiksni seznam
dovoljenih oblik izključuje oblike seznamov predvajanja in manifestov. Za dovoljene vsebnike
družine MOV ostanejo zunanji sklici na podatke MOV privzeto onemogočeni, fiksni
ukaz pa jih ne omogoči. Tako ffprobe kot ffmpeg uporabljata seznam dovoljenih protokolov,
omejen samo na file, eno nit, fiksna polja argumentov, brez lupine,
izvršljive datoteke pa se razrešijo iz PATH. Tokovi naslovnih slik kot prilog niso
kandidati za predvajanje. Vsi tokovi, ki jih je mogoče predvajati, morajo izpolnjevati omejitve, pri čemer
ima eksplicitni privzeti tok prednost pred deterministično nadomestno izbiro z najnižjim indeksom.
Videoposnetki so omejeni na 600 sekund, 8.192 slikovnih pik na dimenzijo in
33.554.432 izvornih slikovnih pik. FFmpeg vzorči 1–16 sredinskih sličic JPEG, zmanjša
daljšo stranico na največ 1.024 slikovnih pik, ne da bi povečal manjše vhode, in
nikoli ne prejme URL-ja. Privzeti način vzorčenja je uniform. Izbirna pravilnika
scene_aware in poskusni segment_aware izvedeta en dodaten
fiksni prehod FFmpeg čez že preverjeni lokalni tok, izbereta omejene časovne žige prizorov
showinfo in se ob napaki detektorja, časovni prekoračitvi, nepravilno oblikovanem izhodu ali praznem
naboru kandidatov deterministično vrneta na iste enakomerno porazdeljene sredinske točke.
Način, ki upošteva segmente, dodeli vzorce sredinskih točk sorazmerno s preverjenimi
intervali prizorov; dokazi načina, ki upošteva segmente, in nadomestno vedenje so
podrobno opisani spodaj. Stroga omejitev 16 sličic se
pri vsakem pravilniku uporabi po izbiri. Ko ima zahteva, ki upošteva prizore, na voljo samo
eno sličico, uporabi enakomerno sredinsko točko aktivnega celotnega videoposnetka ali ciljnega
okna in sporoči policyEffective: uniform: ena sama izbrana sličica prizora
ne more ohraniti obeh časovnih skrajnosti. Klicatelj lahko po želji poda
končno ciljno okno (start/end v sekundah); meje se omejijo na trajanje predstavnostne
vsebine, obrnjena ali nekončna okna se zavrnejo, vsi pravilniki vzorčenja
pa se izvedejo samo znotraj normaliziranega intervala. Nastalo
okno je vključeno v metapodatke vzorčenja in predpono nezaupanja vrednega opisa,
da lahko modeli v nadaljevanju razlikujejo ciljni izsek od celotne
časovnice.
Semantično osredotočanje napisov je ločena, eksplicitna nastavitev. Privzeti način analize
full ohrani obstoječi poziv za sličice in modelu za napise nikoli ne posreduje besedila
zahteve. V načinu focused most prebere samo najnovejši
neprazen text/input_text, ki ga je ustvaril uporabnik, iz istega vsebnika Chat ali Responses,
ga normalizira v NFC, strne kontrolne znake in presledke
ter omeji na 500 kodnih točk Unicode. Prazen rezultat se vrne na
natančen poziv full. Uporaben namig se serializira kot JSON v namenskem
bloku konteksta nezaupanja vrednega uporabnika in sme le prednostno razvrstiti opazne podrobnosti;
ne more preglasiti ločenega opozorila, naj se ne sledi navodilom, ki so vidna
ali slišna v predstavnostni vsebini. Besedilno osredotočanje nikoli ne izpelje start/end in ne spremeni
časovnega vzorčevalnika.
FU-07 strukturni dokazi segmentov
segment_aware uporablja en omejen predhodni analitični prehod čez že preverjeni
lokalni videotok. Fiksna veriga filtrov najprej zmanjša širino na največ 320 slikovnih
pik, zazna spremembe prizorov in zamrznjene intervale, nato vzorči z 1 sličico na
sekundo za določanje zamegljenosti, povprečne svetlosti ter prostorskih/časovnih informacij. Prehod je
omejen na 600 strukturnih vzorcev, eno nit FFmpeg/filtrov, ista
seznama dovoljenih protokolov, omejena samo na file, in vsebnikov, omejitev izhoda procesa 1 MiB
ter največ 30 sekund znotraj skupne prekinitve/roka posrednika. Nikoli
ne sprejme ukaza, filtra, poti ali URL-ja iz zahteve.
Strukturne vrednosti so deterministični dokazi vzorčenja, ne semantično razumevanje videoposnetka. Ne sklepajo o subjektih, dejanjih, podnapisih, govoru ali namenu uporabnika. Meje prizorov in zamrznitev oblikujejo segmente; pokritost zamrznitev, zamegljenost, osvetlitev, prostorske podrobnosti in časovne spremembe vplivajo le na razporeditev obstoječega proračuna 1–16 sličic. Popolnoma zamrznjen segment je omejen na eno sličico, nezamrznjeni segmenti pa tekmujejo za preostali proračun. Ko je mej več kot sličic, se ohrani enakomerna pokritost časovnice, tako da hitri zgodnji rezi ne morejo skriti dolgega končnega segmenta. Meje prizorov, ki so znotraj 1-sekundne ločljivosti analize glede na mejo zamrznitve, se združijo.
Manjkajoči filtri, nepravilno oblikovani/prazni dokazi, napaka detektorja ali
časovna omejitev omejene predhodne analize povzročijo varno nadaljevanje z
natančno pravilnikom enakomernih sredinskih točk. Prekinitev klicatelja ali rok
posrednika ne povzročita varnega nadaljevanja: končata izvajajoči se podproces,
preprečita poznejše pridobivanje sličic, zasebno začasno drevo pa se odstrani v
finally.
scripts/perf/video-bridge-fu07-eval.ts ustvari deterministične dejanske testne
primerke FFmpeg za prihranke pri klicih za podnaslavljanje po odstranjevanju
dvojnikov, razporeditev proračuna pri gostem gibanju, dokaze o
zamegljenosti/osvetlitvi/SI-TI, hitre reze z dolgim zaključkom in lažno pozitivne
rezultate pri postopnem prehodu. Beleži dejanski čas predhodne analize ter, kjer
je na voljo /usr/bin/time, procesorski čas podrejenega procesa in največjo
porabo RSS. Njegova preverjanja kakovosti so zgolj strukturni oraklji. Kakovost
dejanskega modela za podnaslavljanje ostaja HOLD, ker ta preizkusni okvir nima
pooblaščene končne točke ali zamrznjenega ocenjevalnika. Tudi denarni prihranki
ostajajo HOLD, razen če --caption-cost-per-call-usd poda izrecno pozitivno
oceno stroška na klic; skript nikoli ne izmisli nobenega od teh rezultatov.
Vsaka sličica je omejena na 4 MiB, vse neobdelane sličice skupaj na 23 MiB,
serializirani odgovor posrednika pa na 32 MiB. Zasebni začasni imenik se odstrani
v finally. OmniRoute ne vključuje FFmpeg in ne sprejema poti do izvedljive
datoteke po meri. Pred podnaslavljanjem most uporabi konservativno vizualno
odstranjevanje dvojnikov: vsak JPEG se zmanjša na sivinski medpomnilnik velikosti
16×16 in primerja samo z zadnjo ohranjeno sličico. Pri zahtevanem proračunu za
podnaslavljanje, večjem od ene sličice, pridobivanje zagotovi omejeno množico
kandidatov z največ dvakratnikom tega proračuna in nikoli več kot 16 sličicami.
Zahtevana zgornja meja se uporabi šele po odstranjevanju dvojnikov, pri končnem
redčenju pa se ohranita prvi in zadnji izbrani kandidat, kadar proračun znaša
vsaj dve sličici. Različicami opredeljeni pravilnik
grayscale-16x16-mean-cells-v2 uporabi večjo vrednost med povprečno razliko v
svetilnosti in deležem celic sličice, katerih normalizirana razlika znaša vsaj
0.05. Prag za dvojnike je konstanta 0.04, izbrana zaradi predvidljivosti in ne
izpostavljena kot nastavitev med izvajanjem. Ta sekundarni visokokontrastni
signal ohrani majhne premike in spremembe vidnega besedila, ki jih primerjava,
temelječa samo na povprečju, lahko skrije. Napake primerjalnika ali dekodirnika
povzročijo varno nadaljevanje in ohranijo pokritost. Izhodni metapodatki ločujejo
pridobljene kandidate, uspešno uporabljene sličice in odstranjene vizualne
dvojnike.
Izrecno označen del videoposnetka lahko zahteva kontaktni list s časovnimi
oznakami. Most ustvari mrežo JPEG z največ 4 stolpci in 16 sličicami. Vsaka
celica s 512 slikovnimi pikami vtisne časovno oznako izvorne sličice v
visokokontrastni spodnji pas, iste časovne oznake pa ostanejo tudi v besedilnih
metapodatkih za nadaljnje povezovanje in revizijo. Celoten JPEG ostane omejen na
32 MiB. Če sharp ne more dekodirati ali sestaviti mreže, most uporabi
posamezne sličice JPEG; prekinitev odjemalca se še vedno prenese skozi operacijo
ustvarjanja lista.
Dokazi za uveljavitev so namenoma ločeni od sintetičnega mikroprimerjalnega
preizkusa sestavljanja. scripts/perf/video-bridge-contact-sheet-eval.ts
opredeljuje A/B-preizkusni okvir z različicami sheme za dejanske modele vida,
združljive z OpenAI. Meri žetone, ki jih sporoči ponudnik, skupno dejansko
zakasnitev (vključno s sestavljanjem lista), število klicev modela in ohranitev
dejstev, opredeljenih v manifestu. Neobdelani odgovori modela se ne zapišejo v
poročilo; ohranijo se samo izvlečki SHA-256 in ID-ji ujemajočih se dejstev.
Preizkusni okvir ne izvede nobenega omrežnega ali plačljivega klica modela, razen
če je podan --execute-real ter so nastavljeni --model,
OMNIROUTE_BASE_URL in OMNIROUTE_API_KEY. Brez takšnega izrecnega dejanskega
izvajanja njegov strojno berljiv rezultat ostane HOLD; sintetične meritve
koristnega tovora/števila klicev same po sebi niso dokaz za uveljavitev.
Klicatelji lahko podprtemu delu videoposnetka priložijo neobvezno polje
transcript.cues, kadar že imajo časovno usklajeno besedilo. Vsak element mora
vsebovati text, končni interval start/end znotraj ugotovljenega trajanja in
source z dovoljenega seznama (client, embedded ali audio-bridge);
confidence ima privzeto vrednost 1 in mora ostati med 0 in 1. Popolnoma
enaki elementi se združijo. OmniRoute iz teh metapodatkov nikoli ne začne
prepisovanja: preverjeni elementi se skupaj z virom, zaupanjem in intervalom
kopirajo v opisani rezultat ter se prikažejo kot nezaupanja vredna opažanja
poleg podnapisov sličic. Neveljavno besedilo, besedilo zunaj razpona ali brez
navedbe izvora se zavrne, namesto da bi se pomešalo v tok podnapisov. Polje
source trenutno navede klicatelj in ga strežnik ne preveri: OmniRoute zagotovi,
da je vrednost eden od treh dovoljenih nizov, vendar še ne potrdi kriptografsko,
da oznaka embedded ali audio-bridge dejansko izvira iz pridobivanja, ki ga
upravlja strežnik. Dokler takšno preverjanje ni uvedeno, obravnavajte source
kot nezaupanja vreden namig; na njem ne utemeljujte odločitev o avtorizaciji.
Napredni klicatelj lahko za isti videoposnetek zagotovi že avtorizirano sled
audioTranscript. Spoj združevanja izvaja vizualna in zvočna opazovanja znotraj
istega roka in signala za prekinitev, jih razvrsti na skupni časovni osi, združi
popolnoma enake dvojnike ter sporoči delni rezultat, kadar uspe le ena stran.
Neveljaven audioTranscript se pretvori v tak delni rezultat — vizualni opis
se ohrani, zvočna veja pa zabeleži sanitizirano kodo napake — namesto da bi
spodletela obdelava celotnega videoposnetka. Razpoložljivost posameznih vej,
zastavica delnega rezultata in sanitizirane kode napak se ohranijo v opisanem
rezultatu, v metapodatkih varnostnih omejitev (audioFusionRuns/audioFusionPartials/
audioFusionFailureCodes), v metapodatkih predpomnilnika rezultatov in v števcih
združevanja mostu. Privzeta pot Video Bridge ne prikliče pretvorbe govora v
besedilo in ne prenese druge kopije predstavnostne datoteke; brez te izrecno
podane sledi ostane omejena samo na videoposnetek.
Hramba prepisa (#12150 P1). To se uporabi samodejno, kadar koli Video Bridge
(ki ga je treba posebej omogočiti) izriše oznako prepisa — ločena zastavica za
hrambo ne obstaja. Ko zahteva izriše katero koli oznako prepisa (s strani
klicatelja deklariran transcript ali združen audioTranscript), jo varnostna
omejitev označi kot videoBridgeObserved in ustvari redigirano senčno različico
opisa videoposnetka — enako upodobitev, v kateri je telo poljubnega besedila
vsake oznake zamenjano z [redacted-video-transcript]. Ta različica je izdelana
z zamenjavo strukturiranega polja oznake, preden se sestavi niz (nikoli z
razčlenjevanjem sploščenega besedila, zato ne more preživeti nobena vsebina
oznake — niti zlonamerna niti običajna, vključno s telesi, ki vsebujejo ], kot
sta [inaudible]/[music]). V telesu zahteve, shranjenem v dnevniku klicev, se
vsak besedilni del, izpeljan iz videoposnetka, zamenja s to redigirano senčno
različico, ujemanje pa se opravi na podlagi enakosti vsebine; sidro fullText se
znova prebere iz dokončane vsebine varnostne omejitve pred klicem, zato ujemanje
še vedno uspe, potem ko poznejše verižne varnostne omejitve (prikrivalniki PII
in poverilnic s prioritetama 10/95) sproti prepišejo besedilo opisa, ter potem,
ko vstavljanje sistemskega poziva, predaje in pomnilnika preoblikuje polje
sporočil. Telo, poslano modelu navzgor, ostane nespremenjeno. Opazovana zahteva
prav tako ne zapolni trajnega pomnilnika Memory (preskoči se tako pridobivanje
iz zahteve kot pridobivanje iz odgovora), zato lastni odgovor modela ne more
prenesti besedila prepisa v Memory.
Površine hrambe, ki ostajajo odprte in se spremljajo za nadaljnjo obravnavo
(P2, #12430): neobdelani posnetek zahteve odjemalca pred varnostno omejitvijo
v artefaktu podrobnega dnevnika; nadaljevanje previous_response_id, ki se ob
napaki varno zapre; notranje posredovanje izpeljanih pozivov, ki prepis vgradi v
sintetiziran niz poziva (stopnje cevovoda, predaja konteksta); ter telo odgovora
oziroma kopija odgovora modela v semantičnem predpomnilniku, ki citira prepis.
To so neobdelane površine oziroma površine razreda odgovorov ali površine, ki
jih je treba posebej omogočiti, zato ne spadajo v obseg shranjenega telesa
zahteve in pomnilnika Memory v P1.
Notranji življenjski cikel /api/modality-bridge/video/drilldown je ločena,
z povratno zanko in žetonom overjena predpomnilniška podlaga. Vsaka operacija
zahteva tudi kanonični neprosojni ID glavnega subjekta. Preden se omogoči
produkcijski klicatelj, mora ta ID izpeljati iz overjenega najemnika in nikoli
ne sme posredovati vrednosti, ki jo izbere odjemalec. Ključi predpomnilnika
vežejo ta glavni subjekt na kanonične ID-je seje in reference videoposnetka,
shranjujejo samo njihove ključe, izpeljane s SHA-256, ter omejijo tako branje
kot brisanje na isti glavni subjekt. Predpomnilnik shrani največ 16 izpeljanih
okvirjev JPEG na vnos, jih po desetih minutah označi kot potekle ter podpira
omejena branja start/end ali izrecen izbris seje.
Vsak glavni subjekt je omejen na 16 vnosov in 64 MiB kanoničnih podatkov JPEG. Te omejitve so neodvisne od globalne zgornje meje 64 vnosov/256 MiB: pritisk kvote glavnega subjekta pred upoštevanjem globalnega odstranjevanja LRU odstrani samo najmanj nedavno uporabljene vnose tega glavnega subjekta. Potekli vnosi se ob dejavnosti predpomnilnika odstranijo tako iz obračuna glavnega subjekta kot iz globalnega obračuna, medtem ko prekinitev in neuspešno preverjanje veljavnosti ne potrdita delne zamenjave.
Predpomnilnik zavrne nekanonični Base64, odvečno dopolnjevanje, predstavnostne
podatke, ki niso JPEG, nepravilno oblikovane ali okrnjene datoteke JPEG ter
datoteke JPEG, ki med omejenim dekodiranjem celotne slike s sharp povzročijo
opozorilo. Vsako sprejeto sliko ponovno kodira kot kanonični JPEG, širino in
višino izpelje iz dekodiranih bajtov, namesto da bi zaupal poljem klicatelja, ter
zavrže vse zaključne poliglotske bajte, namesto da bi jih ohranil. V obe kvoti
se všteva samo omejeni kanonični stisnjeni medpomnilnik. Omejitev prenosa JSON
vključuje režijske podatke Base64 za zgornjo mejo 32 MiB dekodiranega vhoda. Vsaka
shranjena izpeljava beleži preverjeno obliko/ločljivost JPEG, pravilnik vzorčenja,
različico izpeljave, čas nastanka, strežniško izračunano zgoščeno vrednost vsebine
ter zgoščeno nadrejeno referenco skupaj z zgoščeno vrednostjo nadrejene vsebine,
ki jo zagotovi zaupanja vredni klicatelj. Prekinitev se preveri med asinhronimi
fazami dekodiranja in izračunavanja zgoščene vrednosti, preden se predpomnilnik
atomsko potrdi.
Ta sklop še ne povezuje produkcijskega proizvajalca s potjo in ne zagotavlja izbire različic z več ločljivostmi. Pregledna pot zahteve Video Bridge zato ne povzroči dodatnega dela, izpeljava glavnega subjekta, vezana na najemnika, ter celoten življenjski cikel FU-08 z več ločljivostmi pa ostajata izrecno nadaljnje delo in nista dokumentirana kot dokončano vedenje.
Sličice so zaporedno opremljene z opisi z uporabo konfiguriranega modela Video. Prazna
preglasitev Video podeduje nastavitev Vision; če sta obe prazni, samodejni
usmerjevalnik Vision izbere dejanski model, ki podpira vid. Uspešni opisi
zamenjajo izvirni del s stalno predpono [Video description:, ki besedilo tudi
označi kot nezaupanja vredno opazovanje, izpeljano iz predstavnosti, in nadaljnjim
modelom naroči, naj ne upoštevajo navodil, najdenih v predstavnosti. Ključi
predpomnilnika opisov sličic vključujejo bajte JPEG, poziv, časovni žig in dejanski
model; predpomnijo se samo uspešni opisi. Vnosi v predpomnilniku ohranijo dejanski
model, ki je uspešno ustvaril rezultat, vključno z nadomestnim modelom; most sporoči
mixed, kadar so različne sličice ustvarili različni modeli. Zadetek v predpomnilniku
znova uporabi identiteto tega modela, namesto da bi jo preimenoval v zahtevani načrt
usmerjanja. Predpomnilnik rezultatov celotnega videoposnetka je določen z vsakim
vhodom, ki spremeni izhod — pozivom, dejanskim modelom, pravilnikom vzorčenja,
številom sličic, načinom semantične analize, prstnim odtisom SHA-256 normaliziranega
namiga za osredotočenje, oknom osredotočenja, transcript, audioTranscript in
zastavico kontaktnega lista — zato sprememba katere koli od teh razsežnosti povzroči
zgrešitev predpomnilnika in nikoli ponovne uporabe zastarelega rezultata. Različica
pravilnika vizualnega odstranjevanja dvojnikov, prag in omejeno število kandidatnih
sličic so prav tako izrecno vključeni v ključ in metapodatke predpomnilnika rezultatov;
sprememba pravilnika zato ne more ponovno uporabiti zastarelega opisa celotnega
videoposnetka. Metapodatki predpomnilnika rezultatov v4 hranijo način in prstni
odtis, nikoli pa neobdelane uporabnikove naloge. Metapodatki varovalnega mehanizma
navajajo tako zahtevani kot dejanski način analize; zahtevani način focused brez
uporabnega uporabniškega besedila je naveden kot dejansko full.
Varovalni mehanizem izvleče vsak podprt del videoposnetka, vendar jih opiše največ
modalityBridgeVideoMaxVideos. Za cilj, za katerega je dokazano, da ima
supportsVideo === false, neuspešni videoposnetki in videoposnetki nad omejitvijo
postanejo izrecne varne besedilne oznake, tako da ne preživi noben neobdelan
videoposnetek. Kadar zmožnost ni znana, ti deli ostanejo nedotaknjeni. Cilji z
supportsVideo === true obidejo most.
Signal za prekinitev zahteve odjemalca se razširi skozi prenos, čakalno vrsto
posrednika, podprocese in klice za ustvarjanje opisov; prekinitve ustavijo izvajanje
med videoposnetki in nikoli ne dovolijo nadaljevanja z neobdelano predstavnostjo.
Nastavitve izvajalnega okolja so shranjene v zbirki podatkov in preverjene z Zod:
| Ključ | Privzeto | Razpon / vedenje |
|---|---|---|
modalityBridgeVideoEnabled |
false |
Izbirno izvajalno okolje, omogočeno po izbiri |
modalityBridgeVideoAnalysisMode |
"full" |
full ohrani splošne opise; focused uporablja omejen, nezaupanja vreden kontekst zadnjega uporabnika |
modalityBridgeVideoModel |
"" |
Podeduje model mostu Vision |
modalityBridgeVideoFrameCount |
8 |
1–16 |
modalityBridgeVideoSamplingPolicy |
"uniform" |
uniform, scene_aware ali sorazmerni segment_aware; napaka detektorja povzroči preklop na uniform |
modalityBridgeVideoMaxVideos |
1 |
1–4 |
modalityBridgeVideoTimeout |
120000 |
1000–120000 ms |
Starejše trajno shranjene vrednosti časovne omejitve Video nad 120 sekundami se
omejijo na rok posrednika; novi zapisi nastavitev nad to omejitvijo so zavrnjeni.
GET /api/modality-bridge/video/runtime pred preverjanjem pristnosti ali
poizvedovanjem o izvajalnem okolju zahteva zaupanja vredno, žigosano lokalnost
povratne zanke, nato pa zahteva skrbniško preverjanje pristnosti. Vrne samo
available, prečiščeni različici FFmpeg/ffprobe in nespremenljiv razlog, kadar
izvajalno okolje ni na voljo. Notranja končna točka za izvlečenje ni javni API za
nalaganje: nasičenost čakalne vrste vrne 503 skupaj z Retry-After, prekinitev
povezave klicatelja vrne 499, nespremenljivi rok posrednika pa vrne 504.
Pretvorjeni odgovori osrednji glavi x-omniroute-modality-bridge dodajo
video->text;model=<visionModel>;parts=<videos>, ne da bi odstranili segmente
Vision ali Audio.
Maskirnik osebno določljivih podatkov (piiMasker.ts)
Izvaja se v obeh fazah.
preCallklonira koristno vsebino, pregledasystem,messages,inputinprompt(vključno z elementi v obliki navadnega niza) ter uporabiprocessPII()(iz@/shared/utils/inputSanitizer) za polja nizovcontent/text. Kadar jePII_REDACTION_ENABLED=true, so zaznani osebno določljivi podatki v odhodni koristni vsebini redigirani. To je neodvisno odINPUT_SANITIZER_MODE(ki nadzira samo pravilnik za vrivanje pozivov). Kadar je redigiranje izklopljeno, klic zabeleži število zaznav, ne da bi prepisal vsebino.postCallgloboko klonira odgovor ter izvedesanitizePIIResponse()in maskirnik oblike API-ja Responses (maskResponsesOutput— zajemaoutput_textinoutput[].content[].text). Če pride do kakršnega koli redigiranja, spremenjeni odgovor nadomesti izvirnega.
Varovalni mehanizem nikoli ne blokira; samo doda opombe (meta.detections,
meta.redacted) ali prepiše vsebino.
Vrivanje pozivov (promptInjection.ts)
Zazna nasprotovalne strukture v vsebini, ki jo posreduje uporabnik, in uveljavi konfigurirani pravilnik. Vedenje določajo spremenljivke okolja in možnosti konstruktorja:
| Nastavitev | Spremenljivka okolja | Privzeto | Učinek |
|---|---|---|---|
| Omogočeno | INPUT_SANITIZER_ENABLED |
true |
Ko je nastavljeno na false, se varovalni mehanizem predčasno zaključi. |
| Način | INJECTION_GUARD_MODE / INPUT_SANITIZER_MODE |
warn |
Pravilnik za napade z vrivanjem: block, warn ali log. (redact je sprejet zaradi združljivosti za nazaj, vendar ne odstrani vrinjenega besedila; prepisovanje osebnih podatkov v zahtevi upravlja PII_REDACTION_ENABLED.) |
| Prag blokiranja | Možnost blockThreshold / INPUT_SANITIZER_BLOCK_THRESHOLD (vzdevek INJECTION_GUARD_BLOCK_THRESHOLD) |
high |
Najnižja stopnja resnosti, potrebna za blokiranje. Pri privzeti nastavitvi je srednja stopnja namenjena samo opazovanju. |
Prednostni vrstni red načinov (getMode): klicateljev options.mode →
preglasitev funkcijske zastavice v zbirki podatkov INJECTION_GUARD_MODE (Nadzorna plošča → Nastavitve →
Funkcijske zastavice) → spremenljivka okolja INJECTION_GUARD_MODE → spremenljivka okolja INPUT_SANITIZER_MODE →
warn. Preglasitev na nadzorni plošči ima zato prednost pred spremenljivkami okolja, tako da uporabniški vmesnik
Funkcijske zastavice sproti upravlja delujoči varovalni mehanizem (brez ponovnega zagona). Branje iz zbirke podatkov je varno ob napaki:
če pride do napake, varovalni mehanizem uporabi vedenje na podlagi spremenljivk okolja, kadar pa
preglasitev ni nastavljena, je vedenje enako razreševanju samo na podlagi spremenljivk okolja.
Viri zaznavanja:
sanitizeRequest()iz@/shared/utils/inputSanitizer(skupni nabor detektorjev, uporabljen tudi drugod v cevovodu).- Vgrajeni
DEFAULT_GUARD_PATTERNS(trenutnosystem_override_inlineinmarkdown_system_block, oba z resnostjohigh). - Izbirni
customPatterns, posredovani prek možnosti konstruktorja (nizi, regularni izrazi ali zapisi{ name, pattern, severity }).
Ko je mode === "block" in vsaj ena zaznava doseže prag
resnosti, preCall vrne { block: true, message: "Zahteva zavrnjena: zaznana je bila sumljiva vsebina" }. V načinih warn/log varovalni mehanizem dogodek zabeleži, vendar
dovoli klic. Skupna pomožna funkcija evaluatePromptInjection() je prav tako izvožena
za klicatelje, ki morajo oceniti pozive brez uporabe registra.
Omejitev pregledovanja (v3.8.20): detektor pregleda samo prvih 16 KB
združenega besedila poziva — MAX_INJECTION_SCAN_BYTES = 16 * 1024 (16 384 bajtov) v
src/shared/utils/inputSanitizer.ts. Tako detectInjection() kot
evaluatePromptInjection() pred izvajanjem zanke vzorcev uporabita slice(0, MAX_INJECTION_SCAN_BYTES).
Direktive za vrivanje so blizu začetka vhoda, zato to omeji porabo procesorja in zbiralnika smeti zaradi regularnih izrazov
pri koristnih vsebinah z več sto KB, ne da bi oslabilo zaznavanje (prim.
#3932, #4041).
Maskiranje poverilnic (credentialMasker.ts)
Izvaja se v obeh fazah, zadnje v privzeti verigi (prednost 95). Prekrije
dobro znane vzorce ključev API / skrivnih žetonov v odhodni koristni vsebini (vsebina
sporočila, argumenti klicev orodij, rezultati orodij) in v odgovoru ponudnika, tako da
poverilnica, prilepljena v poziv (ali vrnjena v rezultatu orodja), ne uide
zunanjemu ponudniku ali nazaj odjemalcu.
- Samo z izrecno vključitvijo, po enakem dogovoru kot prekrivanje osebnih podatkov (sorodno Trdemu pravilu št. 20):
onemogočeno, razen če je
settings.credentialRedactionEnabled === truealiCREDENTIAL_REDACTION_ENABLED=true. Ko je izklopljeno, varovalni mehanizem ne izvede ničesar — nikoli ne blokira in nikoli ne prepisuje. redactCredentials()prehodi celotno drevo koristne vsebine/odgovora (walkValue(), varno pred onesnaženjem prototipa, varno pred cikli z uporaboWeakSet) in zadetke nadomesti z označbo[REDACTED:<type>], pri čemer klonira samo veje, ki so se dejansko spremenile.CREDENTIAL_PATTERNSzajema ključe ponudnikov LLM (OpenAI, OpenAI-proj, Anthropic, Google, Hugging Face, Replicate), žetone VCS/SaaS (GitHub, Slack, Linear, Notion, npm, Postman, Discord), plačilne ključe (Stripe, Square), ključe oblačnih storitev (dostopni ključ AWS, Twilio, SendGrid, Mailgun), zasebne ključe / JWT-je, povezovalne nize s poverilnicami (mongodb://user:pass@...itd.) in splošni vzorec vrednosti glaveAuthorization/x-api-key/api-key/apikey. Ključi v obliki glav (authorization,x-api-key,api-key,apikey) se prekrijejo strukturno (samo vrednost, predpona sheme, kot jeBearer/Basic, pa se ohrani), namesto prek splošnega regularnega izraza za besedilo.- Varovalni mehanizem nikoli ne blokira; samo prepisuje (
modifiedPayload/modifiedResponse) in dodaja opombe (meta.credentialsRedacted,meta.count).
Zaščita pred regresijami: tests/unit/credential-masker-guardrail.test.ts.
Osnovna pogodba (base.ts)
class BaseGuardrail {
enabled: boolean;
name: string;
priority: number;
constructor(name: string, options?: { enabled?: boolean; priority?: number });
async preCall(payload: unknown, context: GuardrailContext): Promise<GuardrailResult | void>;
async postCall(response: unknown, context: GuardrailContext): Promise<GuardrailResult | void>;
}
interface GuardrailResult<TValue = unknown> {
block?: boolean; // vrednost true prekine verigo
message?: string; // prikazano ob blokiranju
meta?: Record<string, unknown> | null;
modifiedPayload?: TValue; // vrne preCall za preoblikovanje zahteve
modifiedResponse?: TValue; // vrne postCall za preoblikovanje odgovora
}
interface GuardrailContext {
apiKeyInfo?: Record<string, unknown> | null;
disabledGuardrails?: string[] | null;
endpoint?: string | null;
headers?: Headers | Record<string, unknown> | null;
log?: GuardrailLog | Console | null;
method?: string | null;
model?: string | null;
provider?: string | null;
signal?: AbortSignal;
sourceFormat?: string | null;
stream?: boolean;
targetFormat?: string | null;
}
Varovalo sporoči »brez spremembe« tako, da vrne void, {} ali
{ block: false }. Vrnitev modifiedPayload/modifiedResponse zamenja
vrednost, ki teče skozi verigo do naslednjih varoval.
signal?: AbortSignal posreduje življenjski cikel klicatelja varovalom. Prekinitev zahteve je namerna izjema s pristopom »fail-open«: predstavnostni mostovi ustavijo delo in počistijo vire, ne da bi obnovili neobdelano predstavnost za cilj, za katerega je znano, da je ne podpira.
Register (registry.ts)
Edinec guardrailRegistry izpostavlja:
register(guardrail)— doda varovalo (ali ga zamenja glede na normalizirano ime) in znova razvrsti varovala po naraščajoči vrednostipriority.clear()/list()— skrbniški pomožni funkciji.runPreCallHooks(payload, context)— gre skozi aktivna varovala, posreduje koristno vsebino prekmodifiedPayloadin se ustavi pri prvemblock: true.runPostCallHooks(response, context)— enak potek na strani odgovora.resetGuardrailsForTests({ registerDefaults })— počisti stanje in po želji znova registrira privzete nastavitve za čisto izolacijo preizkusov.
Oba izvajalnika vrneta { blocked, payload|response, results, guardrail?, message? },
pri čemer je results polje zapisov GuardrailExecutionResult, ki vključujejo
polja blocked, skipped, modified, error in meta za vsako varovalo,
kar je uporabno za sledenje.
Onemogočanje varoval za posamezno zahtevo
resolveDisabledGuardrails({ apiKeyInfo, body, headers }) zbere
podvojenih vrednosti očiščen seznam imen varoval, ki jih je treba preskočiti za trenutno
zahtevo. Viri (vsi izbirni, vsi združeni):
apiKeyInfo.disabledGuardrailsdisabledGuardrailsv telesu zahteve (na najvišji ravni)metadata.disabledGuardrailsv telesu zahteve- Glava
x-omniroute-disabled-guardrails(ali starejšax-disabled-guardrails)
Vrednosti so lahko polja nizov ali niz, ločen z vejicami; imena so
normalizirana v male črke in zapis kebab-case (pii_masker → pii-masker). Rezultat
se prek context.disabledGuardrails posreduje registru, ki preskoči
ujemajoča se varovala (skipped: true v results).
Vrstni red izvajanja
Za vsako zahtevo, ki teče skozi src/sse/handlers/chat.ts in
open-sse/handlers/chatCore.ts:
resolveDisabledGuardrails(...)sestavi seznam za preskok na podlagi ključa API, telesa in glav.guardrailRegistry.runPreCallHooks(body, ctx)izvede varovalne mehanizme po naraščajočem vrstnem redu prioritete:- Onemogočeni varovalni mehanizmi so zabeleženi kot
skipped. preCallvsakega varovalnega mehanizma lahko prepiše koristno vsebino prekmodifiedPayload.- Prvi
block: trueprekine verigo, obravnavalnik pa vrne odgovor o zavrnitvi s strani varovalnega mehanizma.
- Onemogočeni varovalni mehanizmi so zabeleženi kot
- (Morebiti prepisana) koristna vsebina se posreduje kombiniranemu usmerjanju in pošiljanju nadrejenemu ponudniku.
- Ko je odgovor sestavljen,
guardrailRegistry.runPostCallHooks(...)izvede isto verigo nad odgovorom.block: truena tej točki zavrže odgovor nadrejenega ponudnika.
Varovalni mehanizmi, ki sprožijo izjemo, so zabeleženi z error: <message> in zapisani v dnevnik prek
logger.warn, vendar se veriga nadaljuje — zasnovano po načelu odprtega odpovedovanja.
Konfiguracija
Spremenljivke okolja, ki jih berejo vgrajeni varovalni mehanizmi:
| Spremenljivka | Uporablja jo | Učinek |
|---|---|---|
INPUT_SANITIZER_ENABLED |
prompt-injection |
Nastavite na false, da zaznavanje v celoti onemogočite. |
INPUT_SANITIZER_MODE |
prompt-injection |
Pravilnik za vrivanje: warn, block ali log. Podedovana vrednost redact ne prepisuje vrinjenega besedila. |
INJECTION_GUARD_MODE |
prompt-injection |
Način za zaščito pred vrivanjem; tudi zastavica funkcije v zbirki podatkov, ki preglasi spremenljivke okolja (DB > ENV). |
INPUT_SANITIZER_BLOCK_THRESHOLD |
prompt-injection |
Najnižja stopnja resnosti, ki jo MODE=block zavrne: high (privzeto), medium ali low. |
INJECTION_GUARD_BLOCK_THRESHOLD |
prompt-injection |
Podedovan vzdevek za INPUT_SANITIZER_BLOCK_THRESHOLD. |
PII_REDACTION_ENABLED |
pii-masker |
Ko je nastavljeno na true, se podatki PII v zahtevi zakrijejo (neodvisno od načina vrivanja). |
PII_RESPONSE_SANITIZATION / _MODE |
pii-masker (nadaljnji tok) |
Nadzira vedenje prikrivanja na strani odgovora. |
Varovalni mehanizmi Modality Bridge berejo izvajalno konfiguracijo iz shrambe
nastavitev, podprte z zbirko podatkov (getSettings()), in ne iz spremenljivk okolja. Primarni ključi za slikovni način so
modalityBridgeVisionEnabled, modalityBridgeVisionMode,
modalityBridgeVisionModel, modalityBridgeVisionTaskAware,
modalityBridgeVisionPrompt, modalityBridgeVisionTimeout,
modalityBridgeVisionMaxImages, modalityBridgeVisionMaxChars,
modalityBridgeCacheEnabled, modalityBridgeCacheTtlMinutes in
modalityBridgeCacheMaxEntries. Podedovani ključi
visionBridge* so sprejeti samo kot dokumentiran nadomestni način branja za en cikel;
zapisi nadzorne plošče uporabljajo primarne ključe. Privzete vrednosti in razreševalnik nadomestnih vrednosti
so v src/shared/constants/modalityBridgeDefaults.ts, podedovane
konstante pa so ohranjene v src/shared/constants/visionBridgeDefaults.ts.
Zvok uporablja modalityBridgeAudioEnabled, modalityBridgeAudioModel,
modalityBridgeAudioTimeout in modalityBridgeAudioMaxClips ter skupne
nastavitve modalityBridgeCache*. Zvok nima nadomestnega branja podedovanih ključev, ker so bili ti
ključi uvedeni s shemo Modality Bridge.
Video uporablja modalityBridgeVideoEnabled, modalityBridgeVideoAnalysisMode,
modalityBridgeVideoModel,
modalityBridgeVideoFrameCount, modalityBridgeVideoSamplingPolicy,
modalityBridgeVideoMaxVideos in
modalityBridgeVideoTimeout ter skupne nastavitve modalityBridgeCache*.
Privzeto je onemogočen, ker sta FFmpeg/ffprobe izbirni operativni
odvisnosti, opisovanje sličic pa poveča zakasnitev in stroške modela.
Zaščitni mehanizmi po meri
import { BaseGuardrail, guardrailRegistry } from "@/lib/guardrails";
class BudgetGuardrail extends BaseGuardrail {
constructor() {
super("budget", { priority: 50 });
}
async preCall(payload, ctx) {
if (ctx.apiKeyInfo?.budgetExceeded) {
return { block: true, message: "Daily budget exceeded" };
}
return { block: false };
}
}
guardrailRegistry.register(new BudgetGuardrail());
Koraki:
- Ustvarite
src/lib/guardrails/myGuardrail.ts, ki razširjaBaseGuardrail. - Implementirajte
preCallin/alipostCall. - Registrirajte ga bodisi ob uvozu (dodajte ga iz
registerDefaultGuardrails) bodisi med izvajanjem pokličiteguardrailRegistry.register(...)— register zamenja vsak predhodni zaščitni mehanizem z enakim normaliziranim imenom. - Dodajte teste v
tests/unit/(obstoječi primeri:tests/unit/guardrails-registry.test.ts,tests/unit/prompt-injection-guard.test.ts,tests/unit/guardrails/visionBridge.test.ts).
Testiranje
Med testi uporabite resetGuardrailsForTests(), da začnete iz znanega stanja.
Posredujte { registerDefaults: false }, da začnete s praznim registrom in
registrirate samo zaščitne mehanizme, ki jih testirate. Vision Bridge podpira vstavljanje
odvisnosti (deps.getSettings, deps.callVisionModel); Audio Bridge ponuja
enakovredne priključne točke za nastavitve, zmogljivosti, izbiro modela STT, preverjanje
poverilnic in prepisovanje. Testi lahko zato preverjajo oba poteka brez dostopa do
podatkovne zbirke ali omrežja.
Glejte tudi
src/lib/guardrails/— implementacijasrc/shared/utils/inputSanitizer.ts— skupni detektor, ki omogoča zaznavanje vbrizgavanja pozivov in maskiranje osebno določljivih podatkovsrc/shared/constants/visionBridgeDefaults.ts— privzete nastavitve Vision Bridge in seznam modelov s prisilno uporabo mostusrc/shared/constants/modalityBridgeDefaults.ts— skupne privzete nastavitve izvajalnega okolja Vision/Audiodocs/architecture/RESILIENCE_GUIDE.md— neodvisna plast (varovalka, obdobja mirovanja)docs/reference/ENVIRONMENT.md— celoten pregled spremenljivk okolja
Pokritost poti z zaščito pred vbrizgavanjem in red-team testiranje (8. faza · sklop D)
Zaščita pred vbrizgavanjem (createInjectionGuard / withInjectionGuard) pokriva vse poti,
ki sprejemajo uporabniške pozive. Upošteva INJECTION_GUARD_MODE (privzeto warn = samo beleženje;
block = vrne HTTP 400 SECURITY_001).
| Vrsta | Poti | Privzeti način |
|---|---|---|
| Besedilo (obstoječe) | /v1/chat/completions, /v1/completions, /v1/relay/chat/completions |
warn |
| Generativno | /v1/messages, /v1/responses, /v1/images/generations, /v1/images/edits, /v1/videos/generations, /v1/music/generations, /v1/audio/speech |
warn |
| Podatki | /v1/embeddings, /v1/rerank, /v1/search, /v1/moderations |
warn |
Izločanje besedila (extractMessageContents) pokriva messages/input/prompt/query+documents/instructions/system.
Red-team testiranje (vsako noč, nightly-llm-security.yml): promptfoo preverja, ali vsaka pot blokira
korpus OWASP-LLM v načinu INJECTION_GUARD_MODE=block; garak izvaja sonde (brez skrivnosti se preskoči).
Pot moderations je vključena zaradi doslednosti — upravljavci jo lahko v načinu blokiranja izvzamejo prek
resolveDisabledGuardrails.
Nočni delovni tok (.github/workflows/nightly-llm-security.yml, cron + ročni
zagon) ima dve opravili:
promptfoo-guard(blokirajoče) — izvedepromptfoo eval -c promptfooconfig.yamlzINJECTION_GUARD_MODE=block. Vsak nasprotniški primer (npr. »prezri vsa prejšnja navodila …«, poskusi pobega iz omejitev v slogu DAN) preveri, ali odgovor vsebujeerror.code === "SECURITY_001", tj. ali je zaščita dejansko zavrnila zahtevo.garak(svetovalno) — izvede garak--probes promptinject,dan,leakreplayproti lokalnemu primerku OmniRoute (http://localhost:20128/v1). Pogojeno je s skrivnostjo ponudnika (PROMPTFOO_PROVIDER_KEY); brez nje se elegantno preskoči, ukaz pa ima pripono|| true, zato poroča, ne da bi povzročil neuspeh CI.
Pokritost pomožne funkcije zaščite (createInjectionGuard / withInjectionGuard)
obsega vse poti /v1, ki sprejemajo pozive; besedilo poziva se pridobi iz
messages/input/prompt/query+documents/instructions/system s funkcijo
extractMessageContents() v src/shared/utils/inputSanitizer.ts.