omniroute 2.8.3 → 2.8.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 (167) 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/cli-tools/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/_global-error.html +2 -2
  40. package/app/.next/server/app/_global-error.rsc +1 -1
  41. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  46. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/models/catalog/route.js +1 -1
  48. package/app/.next/server/app/api/models/catalog/route.js.nft.json +1 -1
  49. package/app/.next/server/app/api/providers/[id]/models/route.js +2 -2
  50. package/app/.next/server/app/api/providers/[id]/test/route.js +3 -3
  51. package/app/.next/server/app/api/providers/route.js +1 -1
  52. package/app/.next/server/app/api/providers/test-batch/route.js +6 -6
  53. package/app/.next/server/app/api/v1/models/route.js +3 -3
  54. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  55. package/app/.next/server/app/api/v1/route.js +3 -3
  56. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  57. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  61. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  62. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  63. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  64. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  65. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  66. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  67. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  68. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  69. package/app/.next/server/chunks/[root-of-the-server]__09c944b3._.js +2 -2
  70. package/app/.next/server/chunks/[root-of-the-server]__134baf4c._.js +2 -2
  71. package/app/.next/server/chunks/[root-of-the-server]__179c5303._.js +1 -1
  72. package/app/.next/server/chunks/[root-of-the-server]__237e5042._.js +1 -1
  73. package/app/.next/server/chunks/[root-of-the-server]__2f8f5f38._.js +2 -2
  74. package/app/.next/server/chunks/[root-of-the-server]__31027061._.js +4 -0
  75. package/app/.next/server/chunks/[root-of-the-server]__3e042fbd._.js +2 -2
  76. package/app/.next/server/chunks/[root-of-the-server]__46fad57a._.js +1 -1
  77. package/app/.next/server/chunks/[root-of-the-server]__7a9b72a4._.js +2 -2
  78. package/app/.next/server/chunks/[root-of-the-server]__7d9b23e7._.js +2 -2
  79. package/app/.next/server/chunks/[root-of-the-server]__80e3bfc3._.js +2 -2
  80. package/app/.next/server/chunks/[root-of-the-server]__84e445b2._.js +1 -1
  81. package/app/.next/server/chunks/[root-of-the-server]__92cb0def._.js +1 -1
  82. package/app/.next/server/chunks/[root-of-the-server]__9bbd49c8._.js +1 -1
  83. package/app/.next/server/chunks/[root-of-the-server]__add0a68c._.js +1 -1
  84. package/app/.next/server/chunks/[root-of-the-server]__c393c81f._.js +1 -1
  85. package/app/.next/server/chunks/[root-of-the-server]__cd42b732._.js +1 -1
  86. package/app/.next/server/chunks/[root-of-the-server]__d4563e10._.js +1 -1
  87. package/app/.next/server/chunks/[root-of-the-server]__d7914418._.js +4 -0
  88. package/app/.next/server/chunks/[root-of-the-server]__db2f9fe0._.js +1 -1
  89. package/app/.next/server/chunks/[root-of-the-server]__e27a89bd._.js +1 -1
  90. package/app/.next/server/chunks/[root-of-the-server]__e56edf04._.js +1 -1
  91. package/app/.next/server/chunks/[root-of-the-server]__e6e94646._.js +1 -1
  92. package/app/.next/server/chunks/[root-of-the-server]__eb98039a._.js +1 -1
  93. package/app/.next/server/chunks/[root-of-the-server]__ebf3fe48._.js +2 -2
  94. package/app/.next/server/chunks/[root-of-the-server]__f0131d95._.js +4 -0
  95. package/app/.next/server/chunks/[root-of-the-server]__f31b4656._.js +3 -3
  96. package/app/.next/server/chunks/[root-of-the-server]__fad1679d._.js +2 -2
  97. package/app/.next/server/chunks/_05c48915._.js +1 -1
  98. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  99. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  100. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  101. package/app/.next/server/chunks/_68683848._.js +1 -1
  102. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  103. package/app/.next/server/chunks/open-sse_cf4d5692._.js +1 -1
  104. package/app/.next/server/chunks/open-sse_config_constants_ts_9583de19._.js +1 -1
  105. package/app/.next/server/chunks/open-sse_services_826884e1._.js +2 -1
  106. package/app/.next/server/chunks/ssr/[root-of-the-server]__9affb65e._.js +1 -1
  107. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  108. package/app/.next/server/chunks/ssr/_19b3d5b1._.js +2 -2
  109. package/app/.next/server/chunks/ssr/src_9197fb9b._.js +1 -1
  110. package/app/.next/server/chunks/ssr/src_ec615d6e._.js +2 -2
  111. package/app/.next/server/chunks/ssr/src_lib_initCloudSync_ts_982b9d4d._.js +1 -1
  112. package/app/.next/server/pages/500.html +2 -2
  113. package/app/.next/server/server-reference-manifest.js +1 -1
  114. package/app/.next/server/server-reference-manifest.json +1 -1
  115. package/app/.next/static/chunks/{37e9976d0367faad.js → 3fa6c964786c962d.js} +4 -4
  116. package/app/.next/static/chunks/{19b1432393321fcf.js → d9a70775eb233dc3.js} +1 -1
  117. package/app/.next/static/chunks/{0f71d7fbf89bb737.js → ec1938d17386c6db.js} +1 -1
  118. package/app/CHANGELOG.md +53 -0
  119. package/app/docs/ARCHITECTURE.md +1 -1
  120. package/app/docs/VM_DEPLOYMENT_GUIDE.md +2 -0
  121. package/app/docs/i18n/README.md +9 -17
  122. package/app/docs/i18n/ar/VM_DEPLOYMENT_GUIDE.md +110 -112
  123. package/app/docs/i18n/bg/VM_DEPLOYMENT_GUIDE.md +110 -112
  124. package/app/docs/i18n/da/VM_DEPLOYMENT_GUIDE.md +110 -112
  125. package/app/docs/i18n/de/VM_DEPLOYMENT_GUIDE.md +110 -112
  126. package/app/docs/i18n/es/VM_DEPLOYMENT_GUIDE.md +107 -109
  127. package/app/docs/i18n/fi/VM_DEPLOYMENT_GUIDE.md +110 -112
  128. package/app/docs/i18n/fr/VM_DEPLOYMENT_GUIDE.md +110 -112
  129. package/app/docs/i18n/he/VM_DEPLOYMENT_GUIDE.md +110 -112
  130. package/app/docs/i18n/hu/VM_DEPLOYMENT_GUIDE.md +110 -112
  131. package/app/docs/i18n/id/VM_DEPLOYMENT_GUIDE.md +110 -112
  132. package/app/docs/i18n/in/VM_DEPLOYMENT_GUIDE.md +102 -210
  133. package/app/docs/i18n/it/VM_DEPLOYMENT_GUIDE.md +110 -112
  134. package/app/docs/i18n/ja/VM_DEPLOYMENT_GUIDE.md +110 -112
  135. package/app/docs/i18n/ko/VM_DEPLOYMENT_GUIDE.md +109 -111
  136. package/app/docs/i18n/ms/VM_DEPLOYMENT_GUIDE.md +110 -112
  137. package/app/docs/i18n/nl/VM_DEPLOYMENT_GUIDE.md +110 -112
  138. package/app/docs/i18n/no/VM_DEPLOYMENT_GUIDE.md +110 -112
  139. package/app/docs/i18n/phi/VM_DEPLOYMENT_GUIDE.md +110 -112
  140. package/app/docs/i18n/pl/VM_DEPLOYMENT_GUIDE.md +110 -112
  141. package/app/docs/i18n/pt/VM_DEPLOYMENT_GUIDE.md +96 -98
  142. package/app/docs/i18n/pt-BR/VM_DEPLOYMENT_GUIDE.md +96 -98
  143. package/app/docs/i18n/ro/VM_DEPLOYMENT_GUIDE.md +110 -112
  144. package/app/docs/i18n/ru/VM_DEPLOYMENT_GUIDE.md +110 -112
  145. package/app/docs/i18n/sk/VM_DEPLOYMENT_GUIDE.md +110 -112
  146. package/app/docs/i18n/sv/VM_DEPLOYMENT_GUIDE.md +110 -112
  147. package/app/docs/i18n/th/VM_DEPLOYMENT_GUIDE.md +110 -112
  148. package/app/docs/i18n/uk-UA/VM_DEPLOYMENT_GUIDE.md +110 -112
  149. package/app/docs/i18n/vi/VM_DEPLOYMENT_GUIDE.md +110 -112
  150. package/app/docs/i18n/zh-CN/VM_DEPLOYMENT_GUIDE.md +110 -112
  151. package/app/docs/openapi.yaml +1 -1
  152. package/app/open-sse/config/constants.ts +3 -3
  153. package/app/open-sse/services/comboAgentMiddleware.ts +9 -1
  154. package/app/package-lock.json +5 -5
  155. package/app/package.json +1 -1
  156. package/app/scripts/i18n/generate-multilang.mjs +1 -0
  157. package/app/src/shared/constants/cliTools.ts +2 -2
  158. package/app/src/shared/constants/providers.ts +3 -0
  159. package/app/src/shared/validation/providerSchema.ts +6 -0
  160. package/app/tests/e2e/providers-bailian-coding-plan.spec.ts +14 -0
  161. package/package.json +1 -1
  162. package/app/.next/server/chunks/[root-of-the-server]__61396d77._.js +0 -4
  163. package/app/.next/server/chunks/[root-of-the-server]__d5ecc2ba._.js +0 -4
  164. package/app/.next/server/chunks/[root-of-the-server]__daa26645._.js +0 -4
  165. /package/app/.next/static/{IiXcm5VJcOKrDneQQSdf- → coLESPH6_RrEzzULWq8F5}/_buildManifest.js +0 -0
  166. /package/app/.next/static/{IiXcm5VJcOKrDneQQSdf- → coLESPH6_RrEzzULWq8F5}/_clientMiddlewareManifest.json +0 -0
  167. /package/app/.next/static/{IiXcm5VJcOKrDneQQSdf- → coLESPH6_RrEzzULWq8F5}/_ssgManifest.js +0 -0
@@ -1,73 +1,71 @@
1
- 🌐 **Languages:** 🇺🇸 [English](../../README.md) · 🇧🇷 [pt-BR](../pt-BR/VM_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../es/VM_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../fr/VM_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../de/VM_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../it/VM_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../ru/VM_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../zh-CN/VM_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../ja/VM_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../ko/VM_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../ar/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [in](../in/VM_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../th/VM_DEPLOYMENT_GUIDE.md) · 🇻🇳 [vi](../vi/VM_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../id/VM_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../ms/VM_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../nl/VM_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../pl/VM_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../sv/VM_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../no/VM_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../da/VM_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../fi/VM_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../pt/VM_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../ro/VM_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../hu/VM_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../bg/VM_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../sk/VM_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../uk-UA/VM_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../he/VM_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../phi/VM_DEPLOYMENT_GUIDE.md)
1
+ # OmniRoute 使用 Cloudflare 在虚拟机上部署指南
2
2
 
3
- ---
4
-
5
- # OmniRoute — Guia de Deploy em VM com Cloudflare
3
+ 🌐 **Languages:** 🇺🇸 [English](../../VM_DEPLOYMENT_GUIDE.md) | 🇧🇷 [Português (Brasil)](../pt-BR/VM_DEPLOYMENT_GUIDE.md) | 🇪🇸 [Español](../es/VM_DEPLOYMENT_GUIDE.md) | 🇫🇷 [Français](../fr/VM_DEPLOYMENT_GUIDE.md) | 🇮🇹 [Italiano](../it/VM_DEPLOYMENT_GUIDE.md) | 🇷🇺 [Русский](../ru/VM_DEPLOYMENT_GUIDE.md) | 🇨🇳 [中文 (简体)](../zh-CN/VM_DEPLOYMENT_GUIDE.md) | 🇩🇪 [Deutsch](../de/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [हिन्दी](../in/VM_DEPLOYMENT_GUIDE.md) | 🇹🇭 [ไทย](../th/VM_DEPLOYMENT_GUIDE.md) | 🇺🇦 [Українська](../uk-UA/VM_DEPLOYMENT_GUIDE.md) | 🇸🇦 [العربية](../ar/VM_DEPLOYMENT_GUIDE.md) | 🇯🇵 [日本語](../ja/VM_DEPLOYMENT_GUIDE.md) | 🇻🇳 [Tiếng Việt](../vi/VM_DEPLOYMENT_GUIDE.md) | 🇧🇬 [Български](../bg/VM_DEPLOYMENT_GUIDE.md) | 🇩🇰 [Dansk](../da/VM_DEPLOYMENT_GUIDE.md) | 🇫🇮 [Suomi](../fi/VM_DEPLOYMENT_GUIDE.md) | 🇮🇱 [עברית](../he/VM_DEPLOYMENT_GUIDE.md) | 🇭🇺 [Magyar](../hu/VM_DEPLOYMENT_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](../id/VM_DEPLOYMENT_GUIDE.md) | 🇰🇷 [한국어](../ko/VM_DEPLOYMENT_GUIDE.md) | 🇲🇾 [Bahasa Melayu](../ms/VM_DEPLOYMENT_GUIDE.md) | 🇳🇱 [Nederlands](../nl/VM_DEPLOYMENT_GUIDE.md) | 🇳🇴 [Norsk](../no/VM_DEPLOYMENT_GUIDE.md) | 🇵🇹 [Português (Portugal)](../pt/VM_DEPLOYMENT_GUIDE.md) | 🇷🇴 [Română](../ro/VM_DEPLOYMENT_GUIDE.md) | 🇵🇱 [Polski](../pl/VM_DEPLOYMENT_GUIDE.md) | 🇸🇰 [Slovenčina](../sk/VM_DEPLOYMENT_GUIDE.md) | 🇸🇪 [Svenska](../sv/VM_DEPLOYMENT_GUIDE.md) | 🇵🇭 [Filipino](../phi/VM_DEPLOYMENT_GUIDE.md) | 🇨🇿 [Čeština](../cs/VM_DEPLOYMENT_GUIDE.md)
6
4
 
7
- Guia completo para instalar e configurar o OmniRoute em uma VM (VPS) com domínio gerenciado via Cloudflare.
5
+ 在通过 Cloudflare 管理域的 VM (VPS) 上安装和配置 OmniRoute 的完整指南。
8
6
 
9
7
  ---
10
8
 
11
- ## Pré-Requisitos
9
+ ## 先决条件
12
10
 
13
- | Item | Mínimo | Recomendado |
14
- | ----------- | ------------------------ | ---------------- |
15
- | **CPU** | 1 vCPU | 2 vCPU |
16
- | **RAM** | 1 GB | 2 GB |
17
- | **Disco** | 10 GB SSD | 25 GB SSD |
18
- | **SO** | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
19
- | **Domínio** | Registrado no Cloudflare | — |
20
- | **Docker** | Docker Engine 24+ | Docker 27+ |
11
+ | 项目 | 最低 | 推荐 |
12
+ | ------------ | -------------------- | --------------------------------- | ---------------- |
13
+ | **CPU** | 1 个虚拟CPU | 2 个虚拟CPU |
14
+ | **内存** | 1 GB | 2GB |
15
+ | **磁盘** | 10 GB 固态硬盘 | 25 GB 固态硬盘 |
16
+ | **操作系统** | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
17
+ | **域名** | Cloudflare 上注册 | — |
18
+ | **码头工人** | Docker 引擎 24+ | Docker 27+ |
21
19
 
22
- **Providers testados**: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail.
20
+ **经过测试的提供商**:Akamai (Linode)DigitalOceanVultrHetznerAWS Lightsail
23
21
 
24
22
  ---
25
23
 
26
- ## 1. Configurar a VM
24
+ ## 1.配置虚拟机
27
25
 
28
- ### 1.1 Criar a instância
26
+ ### 1.1 创建实例
29
27
 
30
- No seu provider de VPS preferido:
28
+ 在您首选的 VPS 提供商上:
31
29
 
32
- - Escolha Ubuntu 24.04 LTS
33
- - Selecione o plano mínimo (1 vCPU / 1 GB RAM)
34
- - Defina uma senha forte para root ou configure SSH key
35
- - Anote o **IP público** (ex: `203.0.113.10`)
30
+ - 选择 Ubuntu 24.04 LTS
31
+ - 选择最低计划(1 vCPU / 1 GB RAM
32
+ - 设置强root密码或配置SSH密钥
33
+ - 记下 **公共 IP**(例如 `203.0.113.10`)
36
34
 
37
- ### 1.2 Conectar via SSH
35
+ ### 1.2 通过 SSH 连接
38
36
 
39
37
  ```bash
40
38
  ssh root@203.0.113.10
41
39
  ```
42
40
 
43
- ### 1.3 Atualizar o sistema
41
+ ### 1.3 更新系统
44
42
 
45
43
  ```bash
46
44
  apt update && apt upgrade -y
47
45
  ```
48
46
 
49
- ### 1.4 Instalar Docker
47
+ ### 1.4 安装 Docker
50
48
 
51
49
  ```bash
52
- # Instalar dependências
50
+ # Install dependencies
53
51
  apt install -y ca-certificates curl gnupg
54
52
 
55
- # Adicionar repositório oficial do Docker
53
+ # Add official Docker repository
56
54
  install -m 0755 -d /etc/apt/keyrings
57
55
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
58
56
  chmod a+r /etc/apt/keyrings/docker.gpg
59
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
57
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $ (. /etc/os-release && echo “$VERSION_CODENAME) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
60
58
  apt update
61
59
  apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
62
60
  ```
63
61
 
64
- ### 1.5 Instalar nginx
62
+ ### 1.5 安装nginx
65
63
 
66
64
  ```bash
67
65
  apt install -y nginx
68
66
  ```
69
67
 
70
- ### 1.6 Configurar Firewall (UFW)
68
+ ### 1.6 配置防火墙(UFW
71
69
 
72
70
  ```bash
73
71
  ufw default deny incoming
@@ -78,29 +76,29 @@ ufw allow 443/tcp # HTTPS
78
76
  ufw enable
79
77
  ```
80
78
 
81
- > **Dica**: Para segurança máxima, restrinja as portas 80 e 443 apenas para IPs da Cloudflare. Veja a seção [Segurança Avançada](#segurança-avançada).
79
+ > **提示**:为了获得最大的安全性,请将端口 80 443 仅限制为 Cloudflare IP。请参阅 [Advanced Security](#advanced-security) 部分。
82
80
 
83
81
  ---
84
82
 
85
- ## 2. Instalar o OmniRoute
83
+ ## 2. 安装 OmniRoute
86
84
 
87
- ### 2.1 Criar diretório de configuração
85
+ ### 2.1 创建配置目录
88
86
 
89
87
  ```bash
90
88
  mkdir -p /opt/omniroute
91
89
  ```
92
90
 
93
- ### 2.2 Criar arquivo de variáveis de ambiente
91
+ ### 2.2 创建环境变量文件
94
92
 
95
93
  ```bash
96
- cat > /opt/omniroute/.env << 'EOF'
97
- # === Segurança ===
98
- JWT_SECRET=ALTERE-PARA-CHAVE-SECRETA-UNICA-64-CHARS
99
- INITIAL_PASSWORD=SuaSenhaSegura123!
100
- API_KEY_SECRET=ALTERE-PARA-OUTRA-CHAVE-SECRETA
101
- STORAGE_ENCRYPTION_KEY=ALTERE-PARA-TERCEIRA-CHAVE-SECRETA
94
+ cat > /opt/omniroute/.env << EOF
95
+ # === Security ===
96
+ JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEY
97
+ INITIAL_PASSWORD=YourSecurePassword123!
98
+ API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEY
99
+ STORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEY
102
100
  STORAGE_ENCRYPTION_KEY_VERSION=v1
103
- MACHINE_ID_SALT=ALTERE-PARA-SALT-UNICO
101
+ MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALT
104
102
 
105
103
  # === App ===
106
104
  PORT=20128
@@ -112,19 +110,19 @@ ENABLE_REQUEST_LOGS=true
112
110
  AUTH_COOKIE_SECURE=false
113
111
  REQUIRE_API_KEY=false
114
112
 
115
- # === Domain (altere para seu domínio) ===
113
+ # === Domain (change to your domain) ===
116
114
  BASE_URL=https://llms.seudominio.com
117
115
  NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com
118
116
 
119
- # === Cloud Sync (opcional) ===
117
+ # === Cloud Sync (optional) ===
120
118
  # CLOUD_URL=https://cloud.omniroute.online
121
119
  # NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online
122
120
  EOF
123
121
  ```
124
122
 
125
- > ⚠️ **IMPORTANTE**: Gere chaves secretas únicas! Use `openssl rand -hex 32` para cada chave.
123
+ > ⚠️ **重要**:生成唯一的密钥!对每个密钥使用 `openssl rand -hex 32`。
126
124
 
127
- ### 2.3 Iniciar o container
125
+ ### 2.3 启动容器
128
126
 
129
127
  ```bash
130
128
  docker pull diegosouzapw/omniroute:latest
@@ -138,45 +136,45 @@ docker run -d \
138
136
  diegosouzapw/omniroute:latest
139
137
  ```
140
138
 
141
- ### 2.4 Verificar se está rodando
139
+ ### 2.4 验证其是否正在运行
142
140
 
143
141
  ```bash
144
142
  docker ps | grep omniroute
145
143
  docker logs omniroute --tail 20
146
144
  ```
147
145
 
148
- Deve exibir: `[DB] SQLite database ready` e `listening on port 20128`.
146
+ 它应显示:`[DB] SQLite database ready` `listening on port 20128`。
149
147
 
150
148
  ---
151
149
 
152
- ## 3. Configurar nginx (Reverse Proxy)
150
+ ## 3.配置nginx(反向代理)
153
151
 
154
- ### 3.1 Gerar certificado SSL (Cloudflare Origin)
152
+ ### 3.1 生成 SSL 证书(Cloudflare Origin
155
153
 
156
- No painel da Cloudflare:
154
+ Cloudflare 仪表板中:
157
155
 
158
- 1. em **SSL/TLS → Origin Server**
159
- 2. Clique **Create Certificate**
160
- 3. Deixe os padrões (15 anos, \*.seudominio.com)
161
- 4. Copie o **Origin Certificate** e a **Private Key**
156
+ 1. 转到 **SSL/TLS → 源服务器**
157
+ 2. 单击**创建证书**
158
+ 3. 保留默认值(15 年,\*.yourdomain.com
159
+ 4. 复制**原始证书**和**私钥**
162
160
 
163
161
  ```bash
164
162
  mkdir -p /etc/nginx/ssl
165
163
 
166
- # Colar o certificado
164
+ # Paste the certificate
167
165
  nano /etc/nginx/ssl/origin.crt
168
166
 
169
- # Colar a chave privada
167
+ # Paste the private key
170
168
  nano /etc/nginx/ssl/origin.key
171
169
 
172
170
  chmod 600 /etc/nginx/ssl/origin.key
173
171
  ```
174
172
 
175
- ### 3.2 Configuração do nginx
173
+ ### 3.2 Nginx 配置
176
174
 
177
175
  ```bash
178
- cat > /etc/nginx/sites-available/omniroute << 'NGINX'
179
- # Default server — bloqueia acesso direto por IP
176
+ cat > /etc/nginx/sites-available/omniroute << NGINX
177
+ # Default server — blocks direct access via IP
180
178
  server {
181
179
  listen 80 default_server;
182
180
  listen [::]:80 default_server;
@@ -192,7 +190,7 @@ server {
192
190
  server {
193
191
  listen 443 ssl;
194
192
  listen [::]:443 ssl;
195
- server_name llms.seudominio.com; # Altere para seu domínio
193
+ server_name llms.yourdomain.com; # Change to your domain
196
194
 
197
195
  ssl_certificate /etc/nginx/ssl/origin.crt;
198
196
  ssl_certificate_key /etc/nginx/ssl/origin.key;
@@ -210,7 +208,7 @@ server {
210
208
  # WebSocket support
211
209
  proxy_http_version 1.1;
212
210
  proxy_set_header Upgrade $http_upgrade;
213
- proxy_set_header Connection "upgrade";
211
+ proxy_set_header Connection upgrade”;
214
212
 
215
213
  # SSE (Server-Sent Events) — streaming AI responses
216
214
  proxy_buffering off;
@@ -224,61 +222,61 @@ server {
224
222
  server {
225
223
  listen 80;
226
224
  listen [::]:80;
227
- server_name llms.seudominio.com;
225
+ server_name llms.yourdomain.com;
228
226
  return 301 https://$server_name$request_uri;
229
227
  }
230
228
  NGINX
231
229
  ```
232
230
 
233
- ### 3.3 Ativar e testar
231
+ ### 3.3 启用和测试
234
232
 
235
233
  ```bash
236
- # Remover config padrão
234
+ # Remove default configuration
237
235
  rm -f /etc/nginx/sites-enabled/default
238
236
 
239
- # Ativar OmniRoute
237
+ # Enable OmniRoute
240
238
  ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
241
239
 
242
- # Testar e recarregar
240
+ # Test and reload
243
241
  nginx -t && systemctl reload nginx
244
242
  ```
245
243
 
246
244
  ---
247
245
 
248
- ## 4. Configurar Cloudflare DNS
246
+ ## 4.配置 Cloudflare DNS
249
247
 
250
- ### 4.1 Adicionar registro DNS
248
+ ### 4.1 添加DNS记录
251
249
 
252
- No painel da Cloudflare → DNS:
250
+ Cloudflare 仪表板 → DNS 中:
253
251
 
254
- | Type | Name | Content | Proxy |
255
- | ---- | ------ | ------------------------- | ---------- |
256
- | A | `llms` | `203.0.113.10` (IP da VM) | ✅ Proxied |
252
+ | 类型 | 名称 | 内容 | 代理 |
253
+ | ---- | ------ | --------------------------- | ------- |
254
+ | 一个 | `llms` | `203.0.113.10`(虚拟机 IP | ✅ 代理 |
257
255
 
258
- ### 4.2 Configurar SSL
256
+ ### 4.2 配置SSL
259
257
 
260
- Em **SSL/TLS → Overview**:
258
+ **SSL/TLS → 概述** 下:
261
259
 
262
- - Modo: **Full (Strict)**
260
+ - 模式:**完全(严格)**
263
261
 
264
- Em **SSL/TLS → Edge Certificates**:
262
+ 在**SSL/TLS → 边缘证书**下:
265
263
 
266
- - Always Use HTTPS:On
267
- - Minimum TLS Version: TLS 1.2
268
- - Automatic HTTPS Rewrites:On
264
+ - 始终使用 HTTPS打开
265
+ - 最低 TLS 版本:TLS 1.2
266
+ - 自动 HTTPS 重写:开启
269
267
 
270
- ### 4.3 Testar
268
+ ### 4.3 测试
271
269
 
272
270
  ```bash
273
271
  curl -sI https://llms.seudominio.com/health
274
- # Deve retornar HTTP/2 200
272
+ # Should return HTTP/2 200
275
273
  ```
276
274
 
277
275
  ---
278
276
 
279
- ## 5. Operações e Manutenção
277
+ ## 5. 操作与维护
280
278
 
281
- ### Atualizar para nova versão
279
+ ### 升级到新版本
282
280
 
283
281
  ```bash
284
282
  docker pull diegosouzapw/omniroute:latest
@@ -290,42 +288,42 @@ docker run -d --name omniroute --restart unless-stopped \
290
288
  diegosouzapw/omniroute:latest
291
289
  ```
292
290
 
293
- ### Ver logs
291
+ ### 查看日志
294
292
 
295
293
  ```bash
296
- docker logs -f omniroute # Stream em tempo real
297
- docker logs omniroute --tail 50 # Últimas 50 linhas
294
+ docker logs -f omniroute # Real-time stream
295
+ docker logs omniroute --tail 50 # Last 50 lines
298
296
  ```
299
297
 
300
- ### Backup manual do banco
298
+ ### 手动数据库备份
301
299
 
302
300
  ```bash
303
- # Copiar dados do volume para o host
301
+ # Copy data from the volume to the host
304
302
  docker cp omniroute:/app/data ./backup-$(date +%F)
305
303
 
306
- # Ou comprimir todo o volume
304
+ # Or compress the entire volume
307
305
  docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
308
306
  alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data
309
307
  ```
310
308
 
311
- ### Restaurar de backup
309
+ ### 从备份恢复
312
310
 
313
311
  ```bash
314
312
  docker stop omniroute
315
313
  docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
316
- alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /"
314
+ alpine sh -c rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /”
317
315
  docker start omniroute
318
316
  ```
319
317
 
320
318
  ---
321
319
 
322
- ## 6. Segurança Avançada
320
+ ## 6. 高级安全性
323
321
 
324
- ### Restringir nginx para Cloudflare IPs
322
+ ### nginx 限制为 Cloudflare IP
325
323
 
326
324
  ```bash
327
- cat > /etc/nginx/cloudflare-ips.conf << 'CF'
328
- # Cloudflare IPv4 ranges — atualizar periodicamente
325
+ cat > /etc/nginx/cloudflare-ips.conf << CF
326
+ # Cloudflare IPv4 ranges — update periodically
329
327
  # https://www.cloudflare.com/ips-v4/
330
328
  set_real_ip_from 173.245.48.0/20;
331
329
  set_real_ip_from 103.21.244.0/22;
@@ -346,58 +344,58 @@ real_ip_header CF-Connecting-IP;
346
344
  CF
347
345
  ```
348
346
 
349
- Adicionar no `nginx.conf` dentro do bloco `http {}`:
347
+ 将以下内容添加到 `http {}` 块内的 `nginx.conf` 中:
350
348
 
351
349
  ```nginx
352
350
  include /etc/nginx/cloudflare-ips.conf;
353
351
  ```
354
352
 
355
- ### Install fail2ban
353
+ ### 安装fail2ban
356
354
 
357
355
  ```bash
358
356
  apt install -y fail2ban
359
357
  systemctl enable fail2ban
360
358
  systemctl start fail2ban
361
359
 
362
- # Verificar status
360
+ # Check status
363
361
  fail2ban-client status sshd
364
362
  ```
365
363
 
366
- ### Bloquear acesso direto na porta do Docker
364
+ ### 阻止直接访问 Docker 端口
367
365
 
368
366
  ```bash
369
- # Impedir acesso externo direto à porta 20128
367
+ # Prevent direct external access to port 20128
370
368
  iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP
371
369
  iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
372
370
 
373
- # Persistir as regras
371
+ # Persist the rules
374
372
  apt install -y iptables-persistent
375
373
  netfilter-persistent save
376
374
  ```
377
375
 
378
376
  ---
379
377
 
380
- ## 7. Deploy do Cloud Worker (Opcional)
378
+ ## 7. 部署到 Cloudflare Workers(可选)
381
379
 
382
- Para acesso remoto via Cloudflare Workers (sem expor a VM diretamente):
380
+ 对于通过 Cloudflare Workers 进行远程访问(无需直接公开 VM):
383
381
 
384
382
  ```bash
385
- # No repositório local
383
+ # In the local repository
386
384
  cd omnirouteCloud
387
385
  npm install
388
386
  npx wrangler login
389
387
  npx wrangler deploy
390
388
  ```
391
389
 
392
- Ver documentação completa em [omnirouteCloud/README.md](../omnirouteCloud/README.md).
390
+ 请参阅 [omnirouteCloud/README.md](../omnirouteCloud/README.md) 处的完整文档。
393
391
 
394
392
  ---
395
393
 
396
- ## Resumo de Portas
394
+ ## 端口总结
397
395
 
398
- | Porta | Serviço | Acesso |
399
- | ----- | ----------- | ----------------------------- |
400
- | 22 | SSH | Público (com fail2ban) |
401
- | 80 | nginx HTTP | Redirect → HTTPS |
402
- | 443 | nginx HTTPS | Via Cloudflare Proxy |
403
- | 20128 | OmniRoute | Somente localhost (via nginx) |
396
+ | 港口 | 服务 | 访问 |
397
+ | ----- | --------------- | ------------------------ |
398
+ | 22 | 22 SSH | 公共(带有fail2ban|
399
+ | 80 | nginx HTTP | 重定向 → HTTPS |
400
+ | 443 | 443 nginx HTTPS | 通过 Cloudflare 代理 |
401
+ | 20128 | 20128全方位路线 | 仅本地主机(通过 nginx |
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OmniRoute API
4
- version: 2.8.3
4
+ version: 2.8.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,
@@ -4,9 +4,9 @@ import { loadProviderCredentials } from "./credentialLoader.ts";
4
4
  export const FETCH_TIMEOUT_MS = parseInt(process.env.FETCH_TIMEOUT_MS || "120000", 10);
5
5
 
6
6
  // Idle timeout for SSE streams (ms). Closes stream if no data for this duration.
7
- // Default: 300s to support extended-thinking models (claude-opus-4-6, o3, etc.)
8
- // that may pause for >60s during deep reasoning phases. Override with STREAM_IDLE_TIMEOUT_MS env var.
9
- export const STREAM_IDLE_TIMEOUT_MS = parseInt(process.env.STREAM_IDLE_TIMEOUT_MS || "300000", 10);
7
+ // Default: 120s balances deep-reasoning pauses with fast zombie stream detection (#473).
8
+ // Extended-thinking models rarely pause >90s between chunks. Override with STREAM_IDLE_TIMEOUT_MS env var.
9
+ export const STREAM_IDLE_TIMEOUT_MS = parseInt(process.env.STREAM_IDLE_TIMEOUT_MS || "120000", 10);
10
10
 
11
11
  // Provider configurations
12
12
  // OAuth credentials read from env vars with hardcoded fallbacks for backward compatibility.
@@ -52,7 +52,15 @@ export function injectModelTag(messages: Message[], providerModel: string): Mess
52
52
 
53
53
  // Find last assistant message with string content
54
54
  const lastAssistantIdx = cleaned.map((m) => m.role).lastIndexOf("assistant");
55
- if (lastAssistantIdx === -1) return cleaned;
55
+
56
+ // #474: If no assistant message exists yet (first turn), append a synthetic one
57
+ // so the tag is present when the client sends the next request with the response.
58
+ if (lastAssistantIdx === -1) {
59
+ return [
60
+ ...cleaned,
61
+ { role: "assistant", content: `\n<omniModel>${providerModel}</omniModel>` },
62
+ ];
63
+ }
56
64
 
57
65
  const msg = cleaned[lastAssistantIdx];
58
66
  if (typeof msg.content !== "string") return cleaned;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "2.8.3",
3
+ "version": "2.8.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omniroute",
9
- "version": "2.8.3",
9
+ "version": "2.8.5",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
@@ -6707,9 +6707,9 @@
6707
6707
  }
6708
6708
  },
6709
6709
  "node_modules/flatted": {
6710
- "version": "3.3.3",
6711
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
6712
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
6710
+ "version": "3.4.2",
6711
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
6712
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
6713
6713
  "dev": true,
6714
6714
  "license": "ISC"
6715
6715
  },
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "2.8.3",
3
+ "version": "2.8.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": {
@@ -15,6 +15,7 @@ const DOC_SOURCE_FILES = [
15
15
  "FEATURES.md",
16
16
  "TROUBLESHOOTING.md",
17
17
  "USER_GUIDE.md",
18
+ "VM_DEPLOYMENT_GUIDE.md",
18
19
  ];
19
20
 
20
21
  const LOCALE_SPECS = [
@@ -193,8 +193,8 @@ export const CLI_TOOLS = {
193
193
  image: "/providers/kiro.png",
194
194
  icon: "psychology_alt",
195
195
  color: "#FF6B35",
196
- description: "Amazon Kiro — AI-powered IDE",
197
- configType: "guide",
196
+ description: "Amazon Kiro — AI-powered IDE with MITM",
197
+ configType: "mitm",
198
198
  guideSteps: [
199
199
  { step: 1, title: "Open Kiro Settings", desc: "Go to Settings → AI Provider" },
200
200
  { step: 2, title: "Base URL", value: "{{baseUrl}}", copyable: true },
@@ -10,6 +10,9 @@ export const FREE_PROVIDERS = {
10
10
  name: "Gemini CLI",
11
11
  icon: "terminal",
12
12
  color: "#4285F4",
13
+ deprecated: true,
14
+ deprecationReason:
15
+ "Google restricts third-party OAuth usage for Gemini CLI (Mar 2026). Pro models require paid plans. Use 'gemini' (API key) provider instead.",
13
16
  },
14
17
  kiro: { id: "kiro", alias: "kr", name: "Kiro AI", icon: "psychology_alt", color: "#FF6B35" },
15
18
  };
@@ -19,6 +19,12 @@ export const ProviderSchema = z.object({
19
19
  textIcon: z.string().optional(),
20
20
  website: z.string().url().optional(),
21
21
  passthroughModels: z.boolean().optional(),
22
+ deprecated: z.boolean().optional(),
23
+ deprecationReason: z.string().optional(),
24
+ hasFree: z.boolean().optional(),
25
+ freeNote: z.string().optional(),
26
+ authHint: z.string().optional(),
27
+ apiHint: z.string().optional(),
22
28
  });
23
29
 
24
30
  export const ProvidersMapSchema = z.record(z.string(), ProviderSchema);
@@ -63,6 +63,13 @@ test.describe("Bailian Coding Plan Provider", () => {
63
63
  const redirectedToLogin = page.url().includes("/login");
64
64
  test.skip(redirectedToLogin, "Authentication enabled without a login fixture.");
65
65
 
66
+ // Dismiss any pre-existing dialog/overlay that may appear on page load
67
+ const preExistingDialog = page.getByRole("dialog").first();
68
+ if (await preExistingDialog.isVisible({ timeout: 2000 }).catch(() => false)) {
69
+ await page.keyboard.press("Escape");
70
+ await preExistingDialog.waitFor({ state: "hidden", timeout: 3000 }).catch(() => {});
71
+ }
72
+
66
73
  const addKeyButton = page.getByRole("button", {
67
74
  name: /add.*api.*key|add.*key|add.*connection|connect/i,
68
75
  });
@@ -175,6 +182,13 @@ test.describe("Bailian Coding Plan Provider", () => {
175
182
  const redirectedToLogin = page.url().includes("/login");
176
183
  test.skip(redirectedToLogin, "Authentication enabled without a login fixture.");
177
184
 
185
+ // Dismiss any pre-existing dialog/overlay that may appear on page load
186
+ const preExistingDialog = page.getByRole("dialog").first();
187
+ if (await preExistingDialog.isVisible({ timeout: 2000 }).catch(() => false)) {
188
+ await page.keyboard.press("Escape");
189
+ await preExistingDialog.waitFor({ state: "hidden", timeout: 3000 }).catch(() => {});
190
+ }
191
+
178
192
  const addKeyButton = page.getByRole("button", {
179
193
  name: /add.*api.*key|add.*key|add.*connection|connect/i,
180
194
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "2.8.3",
3
+ "version": "2.8.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": {