Files
OmniRoute/docs/i18n/hr/CONTRIBUTING.md
Diego Rodrigues de Sa e Souza 9debec71ec feat(i18n): 9 new locales — all 24 official EU languages (51 locales) (#13044)
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.
2026-09-10 10:13:09 -03:00

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škom MODULE_NOT_FOUND, pokrenite npm 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žaj dist/ 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.Z granu (ne main). Pogledajte docs/ops/BRANCHING_MODEL.md za 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:coverage mjeri pokrivenost izvornog koda za glavni skup unit testova, isključuje tests/** i uključuje open-sse/**
  • Pull requestovi moraju održavati prag pokrivenosti na 60%+ naredbi/redaka/funkcija/grana
  • Ako PR mijenja produkcijski kod u src/, open-sse/, electron/ ili bin/, mora dodati ili ažurirati automatizirane testove u istom PR-u
  • npm run coverage:report ispisuje detaljno izvješće po datotekama iz zadnjeg pokretanja pokrivenosti
  • npm run test:coverage:legacy čuva stariju metriku za povijesnu usporedbu
  • Pogledajte docs/ops/COVERAGE_PLAN.md za 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 lint prije commitanja
  • Prettier — Automatsko formatiranje putem lint-staged pri 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 provodi no-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/warn kako 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() (pogledajte docs/security/PUBLIC_CREDS.md), nikada kao literali
  • Odgovori na pogreške prolaze kroz buildErrorBody() / sanitizeErrorMessage() — nema sirovih tragova stoga u tijelima odgovora (pogledajte docs/security/ERROR_SANITIZATION.md)
  • Naredbe ljuske (exec / spawn) prosljeđuju vrijednosti za izvođenje putem env, ne putem string interpolacije
  • Svi ulazni podaci validirani Zod shemama
  • Fragment zapisa promjena dodan pod changelog.d/{features|fixes|maintenance}/<PR>-<slug>.md za promjene vidljive korisniku (pogledajte changelog.d/README.md) — nemojte izravno uređivati CHANGELOG.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 kao isLocalOnlyPath() u src/server/authz/routeGuard.ts — pogledajte Strogo Pravilo #15
  • Nema Co-Authored-By oznaka 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