Batch 1 of the locale expansion: Greek, Croatian, Serbian, Lithuanian, Estonian, Latvian, Slovenian, Maltese and Irish across the dashboard catalog, docs mirrors, CLI catalog, README, locale index and the site. 42 → 51 locales. Also fixes the ICU literal escape the translation backend dropped around angle placeholders, four translations that invented or renamed a placeholder, the language bars that linked to mirrors that do not exist, and the migration count drift (171 → 172). ⚠️ base-red inherited: #12732 — the four unit shards and Fast Quality Gates fail identically on unrelated PRs cut from the same base.
24 KiB
Contributing to OmniRoute (Hrvatski)
🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Hvala vam na interesu za doprinos! Ovaj vodič pokriva sve što vam je potrebno za početak.
Za službeni tijek rada po promjeni, počnite s Zlatnom stazom doprinosa. Ona mapira promjene pružatelja, usmjeravanja, UI/UX-a, i18n-a, CLI-ja, baze podataka i izgradnje/postavljanja na njihove ugovore, fokusirane testove, CI pokrivenost i korake usklađivanja.
Postavljanje razvojnog okruženja
Preduvjeti
- Node.js
>=22.22.3 <23, ili>=24.0.0 <27(preporučeno: 24 LTS) - npm 10+
Korisnici npm v11+ (Node 24+): Nakon
npm install, provjerite jesu li izvorni moduli instalirani:node -e "require('better-sqlite3')". Ako ne uspije s greškomMODULE_NOT_FOUND, pokrenitenpm approve-scripts better-sqlite3 && npm install. Pogledajte Rješavanje problema.
- Git
Kloniranje i instalacija
git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute
npm install
Varijable okoline
# Stvorite svoju .env datoteku iz predloška
cp .env.example .env
# Generirajte potrebne tajne ključeve
echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env
echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env
Ključne varijable za razvoj:
| Varijabla | Zadana vrijednost za razvoj | Opis |
|---|---|---|
PORT |
20128 |
Poslužiteljski port |
NEXT_PUBLIC_BASE_URL |
http://localhost:20128 |
Osnovni URL za sučelje |
JWT_SECRET |
(generirajte gore) | Tajni ključ za JWT potpisivanje |
INITIAL_PASSWORD |
CHANGEME |
Lozinka za prvu prijavu |
APP_LOG_LEVEL |
info |
Razina detaljnosti zapisnika |
Postavke nadzorne ploče
Nadzorna ploča pruža UI prekidače za značajke koje se također mogu konfigurirati putem varijabli okoline:
| Lokacija postavke | Prekidač | Opis |
|---|---|---|
| Postavke → Napredno | Način otklanjanja pogrešaka | Omogući zapisnike zahtjeva za otklanjanje pogrešaka (UI) |
| Postavke → Općenito | Vidljivost bočne trake | Prikaži/sakrij sekcije bočne trake |
Ove postavke pohranjuju se u bazu podataka i zadržavaju se nakon ponovnog pokretanja, nadjačavajući zadane vrijednosti varijabli okoline kada su postavljene.
Pokretanje lokalno
# Razvojni način rada (vruće ponovno učitavanje)
npm run dev
# Produkcijska izgradnja
npm run build # next build → .build/next/ zatim assembleStandalone → dist/
npm run start
# Brzo kompajliranje samo pozadinskog dijela/API-ja za promjene suradnika
npm run build:contributor
# Izgradnja za objavu (čista ponovna izgradnja + HEAD sentinel — obavezno za postavljanje)
npm run build:release # rm -rf .build dist && izgradnja + upisuje dist/BUILD_SHA
# Uobičajena konfiguracija porta
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev
Izgradnja za suradnike izvodi samo provjeru kompajliranja: ne sastavlja samostalnu distribuciju niti gradi neobavezne izvorne pakete. Koristite regularnu produkcijsku izgradnju kada trebate provjeriti paket spreman za isporuku.
Raspored izlaznih direktorija izgradnje
| Direktorij | Sadržaj | Praćen |
|---|---|---|
src/ |
Izvorni kod aplikacije (TypeScript / TSX) | Da |
.build/ |
Međuproizvodi — izlaz next build (gitignored, distDir = .build/next) |
Ne |
dist/ |
Paket spreman za isporuku — sastavlja assembleStandalone (gitignored) |
Ne |
Cjevovod izgradnje je jedan prolaz:
npm run build
└─ next build → .build/next/standalone (Next.js izlaz)
└─ assembleStandalone() (kopira standalone + static + public + izvorne resurse)
└─ izlaz: dist/ (server.js, .next/static/, public/, node_modules/)
npm run build:release dodatno čisti oba direktorija prije toga i upisuje
dist/BUILD_SHA (= git rev-parse --short HEAD) kao sentinel za integritet postavljanja.
npm run build:contributor koristi profil izgradnje samo za pozadinski dio. Privremeno zamjenjuje
datoteke UI nadzorne ploče stub datotekama tijekom izgradnje, zadržava upravljače API ruta i vraća izvorne datoteke
nakon izgradnje. Koristite npm run build za promjene koje utječu na UI nadzorne ploče ili za potpunu
provjeru objave; profil za suradnike nije zamjena za izgradnju objave.
Napomena za postavljanje na VPS: udaljeni direktorij slike
/usr/lib/node_modules/omniroute/app/ostaje nepromijenjen. Vještine postavljanja sinkroniziraju sadržajdist/u njega. Samo je putanja izlaza izgradnje u repozitoriju premještena (app/→dist/).
Zadani URL-ovi:
- Nadzorna ploča:
http://localhost:20128/dashboard - API:
http://localhost:20128/v1
Git Radni Tijek
⚠️ NIKAD ne commita direktno na
main. Uvijek koristite feature grane.Baza PR-a: ciljajte na aktivnu
release/vX.Y.Zgranu (nemain). Pogledajtedocs/ops/BRANCHING_MODEL.mdza model jedne release grane po izdanju + označavanja pri isporuci.
# Granaj od aktivnog vrha release grane (primjer: release/v3.8.49)
git fetch origin
git checkout -b feat/your-feature-name origin/release/v3.8.49
# ... unesite izmjene ...
git commit -m "feat: describe your change"
git push -u origin feat/your-feature-name
# Otvorite Pull Request s bazom = release/v3.8.49
Imenovanje Grana
| Prefiks | Svrha |
|---|---|
feat/ |
Nove funkcionalnosti |
fix/ |
Ispravci grešaka |
refactor/ |
Restrukturiranje koda |
docs/ |
Izmjene dokumentacije |
test/ |
Dodavanje/ispravci testova |
chore/ |
Alati, CI, ovisnosti |
Poruke Commita
Slijedite Conventional Commits:
feat: add circuit breaker for provider calls
fix: resolve JWT secret validation edge case
docs: update SECURITY.md with PII protection
test: add observability unit tests
refactor(db): consolidate rate limit tables
Opsezi (v3.8): db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz.
Pokretanje Testova
# Svi testovi (unit + vitest + ecosystem + e2e)
npm run test:all
# Jedna datoteka s testovima (Node.js nativni pokretač testova — većina testova koristi ovo)
node --import tsx/esm --test tests/unit/your-file.test.ts
# Samo unit testovi na koje utječe vaša izmjena (isti TIA selektor kao CI prolaznik, #8084)
npm run test:scoped # izmjene u zadnjem commitu (ili radnom stablu)
npm run test:scoped:staged # samo staged izmjene — dobro se kombinira s pre-commit pokretanjem
npm run test:scoped:full # prvo ponovo izgradi mapu import-grafa (nakon dodavanja/premještanja datoteka)
# Izlaz 1 + "pokrenite cijelu kolekciju" znači da se promijenila hub datoteka (tsconfig, package.json, …) ili
# nemapiran izvor — selektor sigurno ne uspijeva, nikad tiho ne preskače.
# Vitest (MCP server, autoCombo, cache)
npm run test:vitest
# E2E testovi (zahtijeva Playwright)
npm run test:e2e
# E2E testovi protokolarnih klijenata (MCP transporti, A2A)
npm run test:protocols:e2e
# Testovi kompatibilnosti ekosustava
npm run test:ecosystem
# Prag pokrivenosti: 60% naredbi/redaka/funkcija/grana
npm run test:coverage
npm run coverage:report
# Provjera lintanja + formatiranja
npm run lint
npm run check
# Zaštićeni real-upstream combo smoke (zahtijeva VPS pristup + stvarne kredite pružatelja)
# Pogađa STVARNE pružatelje — malo košta. NIKAD se ne pokreće u CI-u. Preskače čisto bez prolaznika.
# Potrebno: ssh root@192.168.0.15 pristup (učitava snimku baze podataka samo za čitanje s VPS-a).
RUN_COMBO_LIVE=1 npm run test:combo:live
# Phase-3 VPS live smoke — jednostavne Node ESM skripte, pogađaju živi .15 poslužitelj direktno.
# Potrebno: ssh root@192.168.0.15 pristup (comboi se stvaraju/brišu putem SSH sqlite).
# Pogađa STVARNE pružatelje (mali trošak). Stvara/briše samo __live_test__* comboe. NIKAD se ne pokreće u CI-u.
# REQUIRE_API_KEY=false na .15 pa nije potreban API ključ, ali poštuje COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEY ako su postavljeni.
npm run test:combo:live:vps # 7 HTTP scenarija (priority/round-robin/weighted/cost/fusion/auto + health)
npm run test:combo:live:vps:failover # dodaje stvarni cross-provider failover scenarij (ukupno 8)
Napomene o pokrivenosti:
npm run test:coveragemjeri pokrivenost izvornog koda za glavni skup unit testova, isključujetests/**i uključujeopen-sse/**- Pull requestovi moraju održavati prag pokrivenosti na 60%+ naredbi/redaka/funkcija/grana
- Ako PR mijenja produkcijski kod u
src/,open-sse/,electron/ilibin/, mora dodati ili ažurirati automatizirane testove u istom PR-u npm run coverage:reportispisuje detaljno izvješće po datotekama iz zadnjeg pokretanja pokrivenostinpm run test:coverage:legacyčuva stariju metriku za povijesnu usporedbu- Pogledajte
docs/ops/COVERAGE_PLAN.mdza plan poboljšanja pokrivenosti u fazama
Zahtjevi za Pull Request
Prije otvaranja PR-a, koristite Contribution Golden Path za pokretanje fokusiranog ciklusa za ono što ste promijenili. Puni skup unit testova (4 CI sharda), Vitest, prag pokrivenosti 60%+ i produkcijski build su odgovornost CI-a — lokalno pokretanje ne dodaje nikakav signal koji provjere PR-a već neće dati, a na manjim strojevima može zasititi host (#8084):
- Pokrenite testne datoteke koje pokrivaju vašu izmjenu:
node --import tsx/esm --test tests/unit/<file>.test.ts - Pokrenite
npm run lint - Uključite ili ažurirajte automatizirane testove u istom PR-u kad god se mijenja produkcijski kod
- Uključite izmijenjene ili dodane testne datoteke u opis PR-a kada se promijenio produkcijski kod
- Provjerite SonarQube rezultat na PR-u kada su tajne projekta konfigurirane u CI-u
Trenutni status testova: 122 unit testne datoteke koje pokrivaju:
- Prevoditelje pružatelja i konverziju formata
- Ograničavanje brzine, circuit breaker i otpornost
- Semantički cache, idempotentnost, praćenje napretka
- Operacije s bazom podataka i shemu (21 DB modul)
- OAuth tokove i autentifikaciju
- Validaciju API krajnjih točaka (Zod v4)
- Alate MCP poslužitelja i provođenje opsega
- Sustave Memorije i Vještina
Stil koda
- ESLint — Pokrenite
npm run lintprije commitanja - Prettier — Automatsko formatiranje putem
lint-stagedpri commitu (2 razmaka, točka-zarez, dvostruki navodnici, širina 100 znakova, es5 trailing zarezi) - TypeScript — Sav kôd u
src/koristi.ts/.tsx;open-sse/koristi.ts/.js; dokumentirajte uz TSDoc (@param,@returns,@throws) - Bez
eval()— ESLint provodino-eval,no-implied-eval,no-new-func - Zod validacija — Koristite Zod v4 sheme za svu validaciju API ulaznih podataka
- Imenovanje: Datoteke = camelCase/kebab-case, komponente = PascalCase, konstante = UPPER_SNAKE
Rukovanje greškama / prazni catch blokovi
Nikada ne ostavljajte catch bez objašnjenja. Svrstajte ga u jednu od dvije kategorije (operacionalizira
strogo pravilo "nikada tiho ne gutajte greške u SSE streamovima"):
-
Namjerno (naše vlastito cleanup/telemetrija prema najboljim mogućnostima) — neuspjeh ovdje je očekivan i bezopasan; dodajte jednolinirani komentar s obrazloženjem, bez logiranja (logiranje na svakom zahtjevu je buka koju ova konvencija izbjegava).
} catch {} // zatvaranje već zatvorenog controllera nakon prekida veze s klijentom je očekivano -
Treba logirati (vanjski/kod koji daje pozivatelj, ili gutanje mijenja kontrolni tok) — zadržite catch (nikada ne dopustite da prekine stream) ali emitirajte kontekstualni
console.debug/warnkako bi neuspjeh bio otkriven.} catch (e) { console.debug("[STREAM] onFailure callback error:", e); }
Pogledajte open-sse/utils/stream.ts i open-sse/utils/streamHandler.ts za primijenjene primjere.
Struktura projekta
src/ # TypeScript (.ts / .tsx)
├── app/ # Next.js 16 App Router
│ ├── (dashboard)/ # Stranice nadzorne ploče (23 sekcije)
│ ├── api/ # API rute (51 direktorij)
│ └── login/ # Stranice autentikacije (.tsx)
├── domain/ # Policy engine (policyEngine, comboResolver, costRules, itd.)
├── lib/ # Osnovna poslovna logika (.ts)
│ ├── a2a/ # Agent-to-Agent v0.3 protokol server
│ ├── acp/ # Agent Communication Protocol registar
│ ├── compliance/ # Engine politike usklađenosti
│ ├── db/ # SQLite domenske module + 130 migracija
│ ├── memory/ # Trajno konverzacijsko pamćenje
│ ├── oauth/ # OAuth pružatelji, servisi i uslužni programi
│ ├── skills/ # Proširivi okvir vještina
│ ├── usage/ # Praćenje korištenja i izračun troškova
│ └── localDb.ts # Samo sloj ponovnog izvoza — nikada ne dodavajte logiku ovdje
├── middleware/ # Međusloj zahtjeva (promptInjectionGuard)
├── mitm/ # MITM proxy (certifikat, DNS, usmjeravanje cilja)
├── shared/
│ ├── components/ # React komponente (.tsx)
│ ├── constants/ # Definicije pružatelja (329), MCP opsezi, 19 strategija usmjeravanja
│ ├── utils/ # Circuit breaker, sanitizer, pomoćni programi za autentikaciju
│ └── validation/ # Zod v4 sheme
└── sse/ # SSE proxy cjevovod
open-sse/ # @omniroute/open-sse radni prostor
├── executors/ # 89 modula implementacije executora
├── handlers/ # 11 rukovatelja zahtjevima (chat, responses, embeddings, images, itd.)
├── mcp-server/ # MCP server (110 jedinstvenih alata, 3 transporta, 33 opsega)
├── services/ # 178 servisa najviše razine (combo, autoCombo, rateLimitManager, itd.)
├── translator/ # Prevoditelji formata (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama)
├── transformer/ # Responses API transformer
└── utils/ # 22 modula uslužnih programa (stream, TLS, proxy, logiranje)
electron/ # Electron desktop aplikacija (višeplatformska)
tests/
├── unit/ # Node.js test runner (1.574 testnih datoteka)
├── integration/ # Integracijski testovi
├── e2e/ # Playwright testovi
├── security/ # Sigurnosni testovi
├── translator/ # Testovi specifični za prevoditelje
└── load/ # Testovi opterećenja
docs/
├── adr/ # Zapisi o arhitektonskim odlukama
├── architecture/ # Arhitektura sustava i otpornost
├── comparison/ # OmniRoute vs alternative
├── compression/ # Vodiči i pravila kompresije
├── dev/ # Vodiči za razvoj
├── diagrams/ # Dijagrami arhitekture
├── frameworks/ # MCP, A2A, OpenCode, Memory, Skills
├── guides/ # Korisnički vodič, Docker, postavljanje, rješavanje problema
├── i18n/ # Internacionalizirani prijevodi README-a
├── marketing/ # Marketinški materijali
├── ops/ # Implementacija, proxy, pokrivenost, izdanja
├── providers/ # Dokumentacija specifična za pružatelje
├── reference/ # API referenca, env varijable, CLI alati, besplatni planovi
├── releases/ # Bilješke o izdanjima
├── routing/ # Auto-combo engine, ponavljanje zaključivanja
├── screenshots/ # Snimke zaslona nadzorne ploče
├── security/ # Zaštitne mjere, usklađenost, stealth, tokeni
└── specs/ # Dizajnerske specifikacije
Dodavanje Novog Pružatelja Usluge
Korak 1: Registracija Konstanti Pružatelja
Dodajte u src/shared/constants/providers.ts — Zod-validacija se izvodi pri učitavanju modula.
Korak 2: Dodavanje Izvršitelja (ako je potrebna prilagođena logika)
Stvorite izvršitelja u open-sse/executors/your-provider.ts nasljeđivanjem baznog izvršitelja.
Korak 3: Dodavanje Prevoditelja (ako format nije OpenAI)
Stvorite prevoditelje zahtjeva/odgovora u open-sse/translator/.
Korak 4: Dodavanje OAuth Konfiguracije (ako se temelji na OAuth-u)
Dodajte OAuth vjerodajnice u src/lib/oauth/constants/oauth.ts i uslugu u src/lib/oauth/services/.
Ako uzvodni pružatelj usluge distribuira javni OAuth client_id/tajnu ili Firebase Web API ključ unutar svog javnog CLI-ja / bundle-a za preglednik, nemojte ga ugraditi kao string literal. Koristite resolvePublicCred() iz open-sse/utils/publicCreds.ts i dodajte maskirani unos bajtova u EMBEDDED_DEFAULTS. Cjelokupni obavezni tijek rada dokumentiran je u docs/security/PUBLIC_CREDS.md.
Unutar handlera/izvršitelja, poruke o pogreškama koje dospijevaju do klijenta moraju proći kroz buildErrorBody() / sanitizeErrorMessage() iz open-sse/utils/error.ts — nikada ne stavljajte sirovi err.stack ili err.message u tijelo odgovora (Response body). Pogledajte docs/security/ERROR_SANITIZATION.md.
Korak 5: Registracija Modela
Dodajte definicije modela u open-sse/config/providerRegistry.ts.
Korak 6: Dodavanje Testova
Napišite jedinične testove u tests/unit/ koji pokrivaju minimalno:
- Registraciju pružatelja usluge
- Prevođenje zahtjeva/odgovora
- Rukovanje pogreškama
Kontrolni Popis za Pull Request
- Testovi prolaze (
npm test) - Lintanje prolazi (
npm run lint) - Izgradnja uspijeva (
npm run build) - TypeScript tipovi dodani za nove javne funkcije i sučelja
- Nema hardkodiranih tajni niti rezervnih vrijednosti
- Javne uzvodne vjerodajnice ugrađene putem
resolvePublicCred()(pogledajtedocs/security/PUBLIC_CREDS.md), nikada kao literali - Odgovori na pogreške prolaze kroz
buildErrorBody()/sanitizeErrorMessage()— nema sirovih tragova stoga u tijelima odgovora (pogledajtedocs/security/ERROR_SANITIZATION.md) - Naredbe ljuske (
exec/spawn) prosljeđuju vrijednosti za izvođenje putemenv, ne putem string interpolacije - Svi ulazni podaci validirani Zod shemama
- Fragment zapisa promjena dodan pod
changelog.d/{features|fixes|maintenance}/<PR>-<slug>.mdza promjene vidljive korisniku (pogledajtechangelog.d/README.md) — nemojte izravno uređivatiCHANGELOG.md; fragmenti se agregiraju pri izdavanju verzije i nikada ne dolaze u konflikt između pull requestova - Dokumentacija ažurirana (ako je primjenjivo)
- Nema novih CodeQL / Secret-Scanning upozorenja, ili je svako odbačeno s tehničkim obrazloženjem koje upućuje na odgovarajući dokument iz
docs/security/ - Rute koje pokreću podprocese (
/api/mcp/,/api/cli-tools/runtime/) klasificirane su kaoisLocalOnlyPath()usrc/server/authz/routeGuard.ts— pogledajte Strogo Pravilo #15 - Nema
Co-Authored-Byoznaka u porukama commita — commiti moraju biti isključivo pod Git identitetom vlasnika repozitorija (Strogo Pravilo #16)
Objavljivanje
Objavama se upravlja putem tijeka rada /generate-release. Kada se stvori novo GitHub izdanje, paket se automatski objavljuje na npm putem GitHub Actions.
Za VPS deploy, koristite npm run build:release (ne npm run build) — izvodi čisto
ponovno izgradnju, sastavlja paket u dist/ i zapisuje sentinel datoteku dist/BUILD_SHA.
Zatim koristite vještine /deploy-vps-*-cc koje rsync-aju dist/ u udaljeni direktorij app/.
Dobivanje pomoći
- Arhitektura: Pogledajte
docs/architecture/ARCHITECTURE.md - API referenca: Pogledajte
docs/reference/API_REFERENCE.md - Sigurnosna dokumentacija:
docs/security/CLI_TOKEN.md,docs/security/ROUTE_GUARD_TIERS.md,docs/security/ERROR_SANITIZATION.md,docs/security/PUBLIC_CREDS.md - Operativna dokumentacija:
docs/ops/SQLITE_RUNTIME.md - Problemi: github.com/diegosouzapw/OmniRoute/issues
- ADR-ovi: Pogledajte
docs/adr/za zapise o arhitektonskim odlukama