omniroute 3.2.4 → 3.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/build-manifest.json +2 -2
  3. package/app/.next/prerender-manifest.json +3 -3
  4. package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/_global-error.html +2 -2
  41. package/app/.next/server/app/_global-error.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  46. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/chunks/[root-of-the-server]__051203a6._.js +2 -2
  61. package/app/.next/server/chunks/[root-of-the-server]__0891af92._.js +1 -1
  62. package/app/.next/server/chunks/[root-of-the-server]__1f27646b._.js +1 -1
  63. package/app/.next/server/chunks/[root-of-the-server]__1f2b0d89._.js +1 -1
  64. package/app/.next/server/chunks/[root-of-the-server]__46e00e59._.js +1 -1
  65. package/app/.next/server/chunks/[root-of-the-server]__6e52619e._.js +1 -1
  66. package/app/.next/server/chunks/[root-of-the-server]__f6f5609a._.js +1 -1
  67. package/app/.next/server/chunks/_05c48915._.js +1 -1
  68. package/app/.next/server/chunks/_06515a8a._.js +1 -1
  69. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  70. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  71. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  72. package/app/.next/server/chunks/_68683848._.js +1 -1
  73. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  74. package/app/.next/server/chunks/ssr/[root-of-the-server]__9ef96d20._.js +1 -1
  75. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  76. package/app/.next/server/pages/500.html +2 -2
  77. package/app/.next/server/server-reference-manifest.js +1 -1
  78. package/app/.next/server/server-reference-manifest.json +1 -1
  79. package/app/.next/static/chunks/{c8b4e7749ccea265.js → 4bce9ec936c62139.js} +1 -1
  80. package/app/CHANGELOG.md +6 -0
  81. package/app/docs/USER_GUIDE.md +100 -0
  82. package/app/docs/i18n/ar/USER_GUIDE.md +121 -5
  83. package/app/docs/i18n/bg/USER_GUIDE.md +121 -5
  84. package/app/docs/i18n/da/USER_GUIDE.md +121 -5
  85. package/app/docs/i18n/de/USER_GUIDE.md +121 -5
  86. package/app/docs/i18n/es/USER_GUIDE.md +121 -5
  87. package/app/docs/i18n/fi/USER_GUIDE.md +121 -5
  88. package/app/docs/i18n/fr/USER_GUIDE.md +121 -5
  89. package/app/docs/i18n/he/USER_GUIDE.md +121 -5
  90. package/app/docs/i18n/hu/USER_GUIDE.md +121 -5
  91. package/app/docs/i18n/id/USER_GUIDE.md +121 -5
  92. package/app/docs/i18n/in/USER_GUIDE.md +121 -5
  93. package/app/docs/i18n/it/USER_GUIDE.md +121 -5
  94. package/app/docs/i18n/ja/USER_GUIDE.md +121 -5
  95. package/app/docs/i18n/ko/USER_GUIDE.md +121 -5
  96. package/app/docs/i18n/ms/USER_GUIDE.md +121 -5
  97. package/app/docs/i18n/nl/USER_GUIDE.md +121 -5
  98. package/app/docs/i18n/no/USER_GUIDE.md +121 -5
  99. package/app/docs/i18n/phi/USER_GUIDE.md +121 -5
  100. package/app/docs/i18n/pl/USER_GUIDE.md +121 -5
  101. package/app/docs/i18n/pt/USER_GUIDE.md +121 -5
  102. package/app/docs/i18n/pt-BR/USER_GUIDE.md +100 -0
  103. package/app/docs/i18n/ro/USER_GUIDE.md +121 -5
  104. package/app/docs/i18n/ru/USER_GUIDE.md +121 -5
  105. package/app/docs/i18n/sk/USER_GUIDE.md +121 -5
  106. package/app/docs/i18n/sv/USER_GUIDE.md +121 -5
  107. package/app/docs/i18n/th/USER_GUIDE.md +121 -5
  108. package/app/docs/i18n/uk-UA/USER_GUIDE.md +121 -5
  109. package/app/docs/i18n/vi/USER_GUIDE.md +121 -5
  110. package/app/docs/i18n/zh-CN/USER_GUIDE.md +121 -5
  111. package/app/docs/openapi.yaml +1 -1
  112. package/app/package-lock.json +2 -2
  113. package/app/package.json +1 -1
  114. package/package.json +1 -1
  115. /package/app/.next/static/{2IF93mnmfu11I384FtD2v → y_TDM0gR5foAipMsSmkFd}/_buildManifest.js +0 -0
  116. /package/app/.next/static/{2IF93mnmfu11I384FtD2v → y_TDM0gR5foAipMsSmkFd}/_clientMiddlewareManifest.json +0 -0
  117. /package/app/.next/static/{2IF93mnmfu11I384FtD2v → y_TDM0gR5foAipMsSmkFd}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
- 🌐 **Languages:** 🇺🇸 [English](../../README.md) · 🇧🇷 [pt-BR](../pt-BR/USER_GUIDE.md) · 🇪🇸 [es](../es/USER_GUIDE.md) · 🇫🇷 [fr](../fr/USER_GUIDE.md) · 🇩🇪 [de](../de/USER_GUIDE.md) · 🇮🇹 [it](../it/USER_GUIDE.md) · 🇷🇺 [ru](../ru/USER_GUIDE.md) · 🇨🇳 [zh-CN](../zh-CN/USER_GUIDE.md) · 🇯🇵 [ja](../ja/USER_GUIDE.md) · 🇰🇷 [ko](../ko/USER_GUIDE.md) · 🇸🇦 [ar](../ar/USER_GUIDE.md) · 🇮🇳 [in](../in/USER_GUIDE.md) · 🇹🇭 [th](../th/USER_GUIDE.md) · 🇻🇳 [vi](../vi/USER_GUIDE.md) · 🇮🇩 [id](../id/USER_GUIDE.md) · 🇲🇾 [ms](../ms/USER_GUIDE.md) · 🇳🇱 [nl](../nl/USER_GUIDE.md) · 🇵🇱 [pl](../pl/USER_GUIDE.md) · 🇸🇪 [sv](../sv/USER_GUIDE.md) · 🇳🇴 [no](../no/USER_GUIDE.md) · 🇩🇰 [da](../da/USER_GUIDE.md) · 🇫🇮 [fi](../fi/USER_GUIDE.md) · 🇵🇹 [pt](../pt/USER_GUIDE.md) · 🇷🇴 [ro](../ro/USER_GUIDE.md) · 🇭🇺 [hu](../hu/USER_GUIDE.md) · 🇧🇬 [bg](../bg/USER_GUIDE.md) · 🇸🇰 [sk](../sk/USER_GUIDE.md) · 🇺🇦 [uk-UA](../uk-UA/USER_GUIDE.md) · 🇮🇱 [he](../he/USER_GUIDE.md) · 🇵🇭 [phi](../phi/USER_GUIDE.md)
1
+ # User Guide (Tiếng Việt)
2
2
 
3
- ---
3
+ 🌐 **Languages:** 🇺🇸 [English](../../USER_GUIDE.md) · 🇧🇷 [pt-BR](../pt-BR/USER_GUIDE.md) · 🇪🇸 [es](../es/USER_GUIDE.md) · 🇫🇷 [fr](../fr/USER_GUIDE.md) · 🇩🇪 [de](../de/USER_GUIDE.md) · 🇮🇹 [it](../it/USER_GUIDE.md) · 🇷🇺 [ru](../ru/USER_GUIDE.md) · 🇨🇳 [zh-CN](../zh-CN/USER_GUIDE.md) · 🇯🇵 [ja](../ja/USER_GUIDE.md) · 🇰🇷 [ko](../ko/USER_GUIDE.md) · 🇸🇦 [ar](../ar/USER_GUIDE.md) · 🇮🇳 [in](../in/USER_GUIDE.md) · 🇹🇭 [th](../th/USER_GUIDE.md) · 🇻🇳 [vi](../vi/USER_GUIDE.md) · 🇮🇩 [id](../id/USER_GUIDE.md) · 🇲🇾 [ms](../ms/USER_GUIDE.md) · 🇳🇱 [nl](../nl/USER_GUIDE.md) · 🇵🇱 [pl](../pl/USER_GUIDE.md) · 🇸🇪 [sv](../sv/USER_GUIDE.md) · 🇳🇴 [no](../no/USER_GUIDE.md) · 🇩🇰 [da](../da/USER_GUIDE.md) · 🇫🇮 [fi](../fi/USER_GUIDE.md) · 🇵🇹 [pt](../pt/USER_GUIDE.md) · 🇷🇴 [ro](../ro/USER_GUIDE.md) · 🇭🇺 [hu](../hu/USER_GUIDE.md) · 🇧🇬 [bg](../bg/USER_GUIDE.md) · 🇸🇰 [sk](../sk/USER_GUIDE.md) · 🇺🇦 [uk-UA](../uk-UA/USER_GUIDE.md) · 🇮🇱 [he](../he/USER_GUIDE.md) · 🇵🇭 [phi](../phi/USER_GUIDE.md)
4
4
 
5
- # User Guide
5
+ > 🇺🇸 [English](../../USER_GUIDE.md)
6
6
 
7
- 🌐 **Languages:** 🇺🇸 [English](USER_GUIDE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](i18n/es/USER_GUIDE.md) | 🇫🇷 [Français](i18n/fr/USER_GUIDE.md) | 🇮🇹 [Italiano](i18n/it/USER_GUIDE.md) | 🇷🇺 [Русский](i18n/ru/USER_GUIDE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](i18n/de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](i18n/in/USER_GUIDE.md) | 🇹🇭 [ไทย](i18n/th/USER_GUIDE.md) | 🇺🇦 [Українська](i18n/uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](i18n/ar/USER_GUIDE.md) | 🇯🇵 [日本語](i18n/ja/USER_GUIDE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/USER_GUIDE.md) | 🇧🇬 [Български](i18n/bg/USER_GUIDE.md) | 🇩🇰 [Dansk](i18n/da/USER_GUIDE.md) | 🇫🇮 [Suomi](i18n/fi/USER_GUIDE.md) | 🇮🇱 [עברית](i18n/he/USER_GUIDE.md) | 🇭🇺 [Magyar](i18n/hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/USER_GUIDE.md) | 🇰🇷 [한국어](i18n/ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/USER_GUIDE.md) | 🇳🇱 [Nederlands](i18n/nl/USER_GUIDE.md) | 🇳🇴 [Norsk](i18n/no/USER_GUIDE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/USER_GUIDE.md) | 🇷🇴 [Română](i18n/ro/USER_GUIDE.md) | 🇵🇱 [Polski](i18n/pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](i18n/sk/USER_GUIDE.md) | 🇸🇪 [Svenska](i18n/sv/USER_GUIDE.md) | 🇵🇭 [Filipino](i18n/phi/USER_GUIDE.md)
7
+ ---
8
8
 
9
9
  Complete guide for configuring providers, creating combos, integrating CLI tools, and deploying OmniRoute.
10
10
 
@@ -409,6 +409,106 @@ docker run -d --name omniroute -p 20128:20128 --env-file ./.env -v omniroute-dat
409
409
 
410
410
  For host-integrated mode with CLI binaries, see the Docker section in the main docs.
411
411
 
412
+ ### Void Linux (xbps-src)
413
+
414
+ Void Linux users can package and install OmniRoute natively using the `xbps-src` cross-compilation framework. This automates the Node.js standalone build along with the required `better-sqlite3` native bindings.
415
+
416
+ <details>
417
+ <summary><b>View xbps-src template</b></summary>
418
+
419
+ ```bash
420
+ # Template file for 'omniroute'
421
+ pkgname=omniroute
422
+ version=3.2.4
423
+ revision=1
424
+ hostmakedepends="nodejs python3 make"
425
+ depends="openssl"
426
+ short_desc="Universal AI gateway with smart routing for multiple LLM providers"
427
+ maintainer="zenobit <zenobit@disroot.org>"
428
+ license="MIT"
429
+ homepage="https://github.com/diegosouzapw/OmniRoute"
430
+ distfiles="https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz"
431
+ checksum=009400afee90a9f32599d8fe734145cfd84098140b7287990183dde45ae2245b
432
+ system_accounts="_omniroute"
433
+ omniroute_homedir="/var/lib/omniroute"
434
+ export NODE_ENV=production
435
+ export npm_config_engine_strict=false
436
+ export npm_config_loglevel=error
437
+ export npm_config_fund=false
438
+ export npm_config_audit=false
439
+
440
+ do_build() {
441
+ # Determine target CPU arch for node-gyp
442
+ local _gyp_arch
443
+ case "$XBPS_TARGET_MACHINE" in
444
+ aarch64*) _gyp_arch=arm64 ;;
445
+ armv7*|armv6*) _gyp_arch=arm ;;
446
+ i686*) _gyp_arch=ia32 ;;
447
+ *) _gyp_arch=x64 ;;
448
+ esac
449
+
450
+ # 1) Install all deps – skip scripts
451
+ NODE_ENV=development npm ci --ignore-scripts
452
+
453
+ # 2) Build the Next.js standalone bundle
454
+ npm run build
455
+
456
+ # 3) Copy static assets into standalone
457
+ cp -r .next/static .next/standalone/.next/static
458
+ [ -d public ] && cp -r public .next/standalone/public || true
459
+
460
+ # 4) Compile better-sqlite3 native binding
461
+ local _node_gyp=/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js
462
+ (cd node_modules/better-sqlite3 && node "$_node_gyp" rebuild --arch="$_gyp_arch")
463
+
464
+ # 5) Place the compiled binding into the standalone bundle
465
+ local _bs3_release=.next/standalone/node_modules/better-sqlite3/build/Release
466
+ mkdir -p "$_bs3_release"
467
+ cp node_modules/better-sqlite3/build/Release/better_sqlite3.node "$_bs3_release/"
468
+
469
+ # 6) Remove arch-specific sharp bundles
470
+ rm -rf .next/standalone/node_modules/@img
471
+
472
+ # 7) Copy pino runtime deps omitted by Next.js static analysis:
473
+ for _mod in pino-abstract-transport split2 process-warning; do
474
+ cp -r "node_modules/$_mod" .next/standalone/node_modules/
475
+ done
476
+ }
477
+
478
+ do_check() {
479
+ npm run test:unit
480
+ }
481
+
482
+ do_install() {
483
+ vmkdir usr/lib/omniroute/.next
484
+ vcopy .next/standalone/. usr/lib/omniroute/.next/standalone
485
+
486
+ # Prevent removal of empty Next.js app router dirs by the post-install hook
487
+ for _d in \
488
+ .next/standalone/.next/server/app/dashboard \
489
+ .next/standalone/.next/server/app/dashboard/settings \
490
+ .next/standalone/.next/server/app/dashboard/providers; do
491
+ touch "${DESTDIR}/usr/lib/omniroute/${_d}/.keep"
492
+ done
493
+
494
+ cat > "${WRKDIR}/omniroute" <<'EOF'
495
+ #!/bin/sh
496
+ export PORT="${PORT:-20128}"
497
+ export DATA_DIR="${DATA_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/omniroute}"
498
+ export LOG_TO_FILE="${LOG_TO_FILE:-false}"
499
+ mkdir -p "${DATA_DIR}"
500
+ exec node /usr/lib/omniroute/.next/standalone/server.js "$@"
501
+ EOF
502
+ vbin "${WRKDIR}/omniroute"
503
+ }
504
+
505
+ post_install() {
506
+ vlicense LICENSE
507
+ }
508
+ ```
509
+
510
+ </details>
511
+
412
512
  ### Environment Variables
413
513
 
414
514
  | Variable | Default | Description |
@@ -582,6 +682,22 @@ Configure via **Dashboard → Settings → Routing**.
582
682
  | **Least Used** | Routes to the account with the oldest `lastUsedAt` timestamp, distributing traffic evenly |
583
683
  | **Cost Optimized** | Routes to the account with the lowest priority value, optimizing for lowest-cost providers |
584
684
 
685
+ #### External Sticky Session Header
686
+
687
+ For external session affinity (for example, Claude Code/Codex agents behind reverse proxies), send:
688
+
689
+ ```http
690
+ X-Session-Id: your-session-key
691
+ ```
692
+
693
+ OmniRoute also accepts `x_session_id` and returns the effective session key in `X-OmniRoute-Session-Id`.
694
+
695
+ If you use Nginx and send underscore-form headers, enable:
696
+
697
+ ```nginx
698
+ underscores_in_headers on;
699
+ ```
700
+
585
701
  #### Wildcard Model Aliases
586
702
 
587
703
  Create wildcard patterns to remap model names:
@@ -766,7 +882,7 @@ Access via **Dashboard → Health**. Real-time system health overview with 6 car
766
882
 
767
883
  OmniRoute is available as a native desktop application for Windows, macOS, and Linux.
768
884
 
769
- ### Installation
885
+ ### Cài đặt
770
886
 
771
887
  ```bash
772
888
  # From the electron directory:
@@ -1,10 +1,10 @@
1
- 🌐 **Languages:** 🇺🇸 [English](../../README.md) · 🇧🇷 [pt-BR](../pt-BR/USER_GUIDE.md) · 🇪🇸 [es](../es/USER_GUIDE.md) · 🇫🇷 [fr](../fr/USER_GUIDE.md) · 🇩🇪 [de](../de/USER_GUIDE.md) · 🇮🇹 [it](../it/USER_GUIDE.md) · 🇷🇺 [ru](../ru/USER_GUIDE.md) · 🇨🇳 [zh-CN](../zh-CN/USER_GUIDE.md) · 🇯🇵 [ja](../ja/USER_GUIDE.md) · 🇰🇷 [ko](../ko/USER_GUIDE.md) · 🇸🇦 [ar](../ar/USER_GUIDE.md) · 🇮🇳 [in](../in/USER_GUIDE.md) · 🇹🇭 [th](../th/USER_GUIDE.md) · 🇻🇳 [vi](../vi/USER_GUIDE.md) · 🇮🇩 [id](../id/USER_GUIDE.md) · 🇲🇾 [ms](../ms/USER_GUIDE.md) · 🇳🇱 [nl](../nl/USER_GUIDE.md) · 🇵🇱 [pl](../pl/USER_GUIDE.md) · 🇸🇪 [sv](../sv/USER_GUIDE.md) · 🇳🇴 [no](../no/USER_GUIDE.md) · 🇩🇰 [da](../da/USER_GUIDE.md) · 🇫🇮 [fi](../fi/USER_GUIDE.md) · 🇵🇹 [pt](../pt/USER_GUIDE.md) · 🇷🇴 [ro](../ro/USER_GUIDE.md) · 🇭🇺 [hu](../hu/USER_GUIDE.md) · 🇧🇬 [bg](../bg/USER_GUIDE.md) · 🇸🇰 [sk](../sk/USER_GUIDE.md) · 🇺🇦 [uk-UA](../uk-UA/USER_GUIDE.md) · 🇮🇱 [he](../he/USER_GUIDE.md) · 🇵🇭 [phi](../phi/USER_GUIDE.md)
1
+ # User Guide (中文(简体))
2
2
 
3
- ---
3
+ 🌐 **Languages:** 🇺🇸 [English](../../USER_GUIDE.md) · 🇧🇷 [pt-BR](../pt-BR/USER_GUIDE.md) · 🇪🇸 [es](../es/USER_GUIDE.md) · 🇫🇷 [fr](../fr/USER_GUIDE.md) · 🇩🇪 [de](../de/USER_GUIDE.md) · 🇮🇹 [it](../it/USER_GUIDE.md) · 🇷🇺 [ru](../ru/USER_GUIDE.md) · 🇨🇳 [zh-CN](../zh-CN/USER_GUIDE.md) · 🇯🇵 [ja](../ja/USER_GUIDE.md) · 🇰🇷 [ko](../ko/USER_GUIDE.md) · 🇸🇦 [ar](../ar/USER_GUIDE.md) · 🇮🇳 [in](../in/USER_GUIDE.md) · 🇹🇭 [th](../th/USER_GUIDE.md) · 🇻🇳 [vi](../vi/USER_GUIDE.md) · 🇮🇩 [id](../id/USER_GUIDE.md) · 🇲🇾 [ms](../ms/USER_GUIDE.md) · 🇳🇱 [nl](../nl/USER_GUIDE.md) · 🇵🇱 [pl](../pl/USER_GUIDE.md) · 🇸🇪 [sv](../sv/USER_GUIDE.md) · 🇳🇴 [no](../no/USER_GUIDE.md) · 🇩🇰 [da](../da/USER_GUIDE.md) · 🇫🇮 [fi](../fi/USER_GUIDE.md) · 🇵🇹 [pt](../pt/USER_GUIDE.md) · 🇷🇴 [ro](../ro/USER_GUIDE.md) · 🇭🇺 [hu](../hu/USER_GUIDE.md) · 🇧🇬 [bg](../bg/USER_GUIDE.md) · 🇸🇰 [sk](../sk/USER_GUIDE.md) · 🇺🇦 [uk-UA](../uk-UA/USER_GUIDE.md) · 🇮🇱 [he](../he/USER_GUIDE.md) · 🇵🇭 [phi](../phi/USER_GUIDE.md)
4
4
 
5
- # User Guide
5
+ > 🇺🇸 [English](../../USER_GUIDE.md)
6
6
 
7
- 🌐 **Languages:** 🇺🇸 [English](USER_GUIDE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](i18n/es/USER_GUIDE.md) | 🇫🇷 [Français](i18n/fr/USER_GUIDE.md) | 🇮🇹 [Italiano](i18n/it/USER_GUIDE.md) | 🇷🇺 [Русский](i18n/ru/USER_GUIDE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](i18n/de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](i18n/in/USER_GUIDE.md) | 🇹🇭 [ไทย](i18n/th/USER_GUIDE.md) | 🇺🇦 [Українська](i18n/uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](i18n/ar/USER_GUIDE.md) | 🇯🇵 [日本語](i18n/ja/USER_GUIDE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/USER_GUIDE.md) | 🇧🇬 [Български](i18n/bg/USER_GUIDE.md) | 🇩🇰 [Dansk](i18n/da/USER_GUIDE.md) | 🇫🇮 [Suomi](i18n/fi/USER_GUIDE.md) | 🇮🇱 [עברית](i18n/he/USER_GUIDE.md) | 🇭🇺 [Magyar](i18n/hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/USER_GUIDE.md) | 🇰🇷 [한국어](i18n/ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/USER_GUIDE.md) | 🇳🇱 [Nederlands](i18n/nl/USER_GUIDE.md) | 🇳🇴 [Norsk](i18n/no/USER_GUIDE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/USER_GUIDE.md) | 🇷🇴 [Română](i18n/ro/USER_GUIDE.md) | 🇵🇱 [Polski](i18n/pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](i18n/sk/USER_GUIDE.md) | 🇸🇪 [Svenska](i18n/sv/USER_GUIDE.md) | 🇵🇭 [Filipino](i18n/phi/USER_GUIDE.md)
7
+ ---
8
8
 
9
9
  Complete guide for configuring providers, creating combos, integrating CLI tools, and deploying OmniRoute.
10
10
 
@@ -409,6 +409,106 @@ docker run -d --name omniroute -p 20128:20128 --env-file ./.env -v omniroute-dat
409
409
 
410
410
  For host-integrated mode with CLI binaries, see the Docker section in the main docs.
411
411
 
412
+ ### Void Linux (xbps-src)
413
+
414
+ Void Linux users can package and install OmniRoute natively using the `xbps-src` cross-compilation framework. This automates the Node.js standalone build along with the required `better-sqlite3` native bindings.
415
+
416
+ <details>
417
+ <summary><b>View xbps-src template</b></summary>
418
+
419
+ ```bash
420
+ # Template file for 'omniroute'
421
+ pkgname=omniroute
422
+ version=3.2.4
423
+ revision=1
424
+ hostmakedepends="nodejs python3 make"
425
+ depends="openssl"
426
+ short_desc="Universal AI gateway with smart routing for multiple LLM providers"
427
+ maintainer="zenobit <zenobit@disroot.org>"
428
+ license="MIT"
429
+ homepage="https://github.com/diegosouzapw/OmniRoute"
430
+ distfiles="https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz"
431
+ checksum=009400afee90a9f32599d8fe734145cfd84098140b7287990183dde45ae2245b
432
+ system_accounts="_omniroute"
433
+ omniroute_homedir="/var/lib/omniroute"
434
+ export NODE_ENV=production
435
+ export npm_config_engine_strict=false
436
+ export npm_config_loglevel=error
437
+ export npm_config_fund=false
438
+ export npm_config_audit=false
439
+
440
+ do_build() {
441
+ # Determine target CPU arch for node-gyp
442
+ local _gyp_arch
443
+ case "$XBPS_TARGET_MACHINE" in
444
+ aarch64*) _gyp_arch=arm64 ;;
445
+ armv7*|armv6*) _gyp_arch=arm ;;
446
+ i686*) _gyp_arch=ia32 ;;
447
+ *) _gyp_arch=x64 ;;
448
+ esac
449
+
450
+ # 1) Install all deps – skip scripts
451
+ NODE_ENV=development npm ci --ignore-scripts
452
+
453
+ # 2) Build the Next.js standalone bundle
454
+ npm run build
455
+
456
+ # 3) Copy static assets into standalone
457
+ cp -r .next/static .next/standalone/.next/static
458
+ [ -d public ] && cp -r public .next/standalone/public || true
459
+
460
+ # 4) Compile better-sqlite3 native binding
461
+ local _node_gyp=/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js
462
+ (cd node_modules/better-sqlite3 && node "$_node_gyp" rebuild --arch="$_gyp_arch")
463
+
464
+ # 5) Place the compiled binding into the standalone bundle
465
+ local _bs3_release=.next/standalone/node_modules/better-sqlite3/build/Release
466
+ mkdir -p "$_bs3_release"
467
+ cp node_modules/better-sqlite3/build/Release/better_sqlite3.node "$_bs3_release/"
468
+
469
+ # 6) Remove arch-specific sharp bundles
470
+ rm -rf .next/standalone/node_modules/@img
471
+
472
+ # 7) Copy pino runtime deps omitted by Next.js static analysis:
473
+ for _mod in pino-abstract-transport split2 process-warning; do
474
+ cp -r "node_modules/$_mod" .next/standalone/node_modules/
475
+ done
476
+ }
477
+
478
+ do_check() {
479
+ npm run test:unit
480
+ }
481
+
482
+ do_install() {
483
+ vmkdir usr/lib/omniroute/.next
484
+ vcopy .next/standalone/. usr/lib/omniroute/.next/standalone
485
+
486
+ # Prevent removal of empty Next.js app router dirs by the post-install hook
487
+ for _d in \
488
+ .next/standalone/.next/server/app/dashboard \
489
+ .next/standalone/.next/server/app/dashboard/settings \
490
+ .next/standalone/.next/server/app/dashboard/providers; do
491
+ touch "${DESTDIR}/usr/lib/omniroute/${_d}/.keep"
492
+ done
493
+
494
+ cat > "${WRKDIR}/omniroute" <<'EOF'
495
+ #!/bin/sh
496
+ export PORT="${PORT:-20128}"
497
+ export DATA_DIR="${DATA_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/omniroute}"
498
+ export LOG_TO_FILE="${LOG_TO_FILE:-false}"
499
+ mkdir -p "${DATA_DIR}"
500
+ exec node /usr/lib/omniroute/.next/standalone/server.js "$@"
501
+ EOF
502
+ vbin "${WRKDIR}/omniroute"
503
+ }
504
+
505
+ post_install() {
506
+ vlicense LICENSE
507
+ }
508
+ ```
509
+
510
+ </details>
511
+
412
512
  ### Environment Variables
413
513
 
414
514
  | Variable | Default | Description |
@@ -582,6 +682,22 @@ Configure via **Dashboard → Settings → Routing**.
582
682
  | **Least Used** | Routes to the account with the oldest `lastUsedAt` timestamp, distributing traffic evenly |
583
683
  | **Cost Optimized** | Routes to the account with the lowest priority value, optimizing for lowest-cost providers |
584
684
 
685
+ #### External Sticky Session Header
686
+
687
+ For external session affinity (for example, Claude Code/Codex agents behind reverse proxies), send:
688
+
689
+ ```http
690
+ X-Session-Id: your-session-key
691
+ ```
692
+
693
+ OmniRoute also accepts `x_session_id` and returns the effective session key in `X-OmniRoute-Session-Id`.
694
+
695
+ If you use Nginx and send underscore-form headers, enable:
696
+
697
+ ```nginx
698
+ underscores_in_headers on;
699
+ ```
700
+
585
701
  #### Wildcard Model Aliases
586
702
 
587
703
  Create wildcard patterns to remap model names:
@@ -766,7 +882,7 @@ Access via **Dashboard → Health**. Real-time system health overview with 6 car
766
882
 
767
883
  OmniRoute is available as a native desktop application for Windows, macOS, and Linux.
768
884
 
769
- ### Installation
885
+ ### 安装
770
886
 
771
887
  ```bash
772
888
  # From the electron directory:
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OmniRoute API
4
- version: 3.2.4
4
+ version: 3.2.5
5
5
  description: |
6
6
  OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible
7
7
  endpoint that routes requests to multiple AI providers with load balancing,
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.2.4",
3
+ "version": "3.2.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omniroute",
9
- "version": "3.2.4",
9
+ "version": "3.2.5",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.2.4",
3
+ "version": "3.2.5",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.2.4",
3
+ "version": "3.2.5",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {