`(单个)或 `?provider=` 或不传参数(全部) |
+| 方法 | 路径 | 说明 |
+| ------ | ---------------------- | ---------------------------------------------------------------------------------------- |
+| GET | `/api/cache` | 缓存概览:条目总数、命中率、磁盘占用 |
+| GET | `/api/cache/entries` | 列出缓存条目(支持分页) |
+| DELETE | `/api/cache/entries` | 删除缓存条目(按查询参数过滤) |
+| GET | `/api/cache/stats` | 详细缓存统计(按服务商、按模型) |
+| GET | `/api/cache/reasoning` | 推理缓存状态(用于推理回放) |
+| DELETE | `/api/cache/reasoning` | 清除推理缓存 — 查询参数:`?toolCallId=`(单个)或 `?provider=` 或不传参数(全部) |
**认证:** 需要管理会话。
@@ -1229,16 +1229,16 @@ ACP 代理作为子进程运行。以下端点管理 ACP 代理检测和自定
管理持久化记忆(FTS5 + 向量嵌入)。
-| 方法 | 路径 | 说明 |
-| ------ | ---------------------- | ------------------------------------------------------------------ |
-| GET | `/api/memory` | 列出记忆条目(按作用域、类型、搜索查询过滤) |
-| POST | `/api/memory` | 创建新记忆条目 — 请求体:`{scope, type, content, metadata?}` |
-| GET | `/api/memory/[id]` | 获取特定记忆条目 |
-| PUT | `/api/memory/[id]` | 更新记忆条目 |
-| DELETE | `/api/memory/[id]` | 删除记忆条目 |
-| GET | `/api/memory/search` | 搜索记忆(FTS5 + 向量) |
-| POST | `/api/memory/clear` | 清除记忆条目(支持过滤器) |
-| GET | `/api/memory/stats` | 记忆统计(总条目数、嵌入覆盖率等) |
+| 方法 | 路径 | 说明 |
+| ------ | -------------------- | ------------------------------------------------------------ |
+| GET | `/api/memory` | 列出记忆条目(按作用域、类型、搜索查询过滤) |
+| POST | `/api/memory` | 创建新记忆条目 — 请求体:`{scope, type, content, metadata?}` |
+| GET | `/api/memory/[id]` | 获取特定记忆条目 |
+| PUT | `/api/memory/[id]` | 更新记忆条目 |
+| DELETE | `/api/memory/[id]` | 删除记忆条目 |
+| GET | `/api/memory/search` | 搜索记忆(FTS5 + 向量) |
+| POST | `/api/memory/clear` | 清除记忆条目(支持过滤器) |
+| GET | `/api/memory/stats` | 记忆统计(总条目数、嵌入覆盖率等) |
**认证:** 需要管理会话或管理权限域的 API Key。
@@ -1248,16 +1248,16 @@ ACP 代理作为子进程运行。以下端点管理 ACP 代理检测和自定
管理事件 Webhook 订阅。
-| 方法 | 路径 | 说明 |
-| ------ | --------------------------------- | ------------------------------------------------------------------ |
-| GET | `/api/webhooks` | 列出所有 Webhook 订阅 |
-| POST | `/api/webhooks` | 创建 Webhook 订阅 — 请求体:`{url, events[], secret?, active?}` |
-| GET | `/api/webhooks/[id]` | 获取特定 Webhook 订阅 |
-| PUT | `/api/webhooks/[id]` | 更新 Webhook 订阅 |
-| DELETE | `/api/webhooks/[id]` | 删除 Webhook 订阅 |
-| GET | `/api/webhooks/events` | 列出所有可用的 Webhook 事件类型 |
-| GET | `/api/webhooks/[id]/deliveries` | 列出 Webhook 投递历史(成功/失败日志) |
-| POST | `/api/webhooks/[id]/test` | 向 Webhook 发送测试事件 |
+| 方法 | 路径 | 说明 |
+| ------ | ------------------------------- | --------------------------------------------------------------- |
+| GET | `/api/webhooks` | 列出所有 Webhook 订阅 |
+| POST | `/api/webhooks` | 创建 Webhook 订阅 — 请求体:`{url, events[], secret?, active?}` |
+| GET | `/api/webhooks/[id]` | 获取特定 Webhook 订阅 |
+| PUT | `/api/webhooks/[id]` | 更新 Webhook 订阅 |
+| DELETE | `/api/webhooks/[id]` | 删除 Webhook 订阅 |
+| GET | `/api/webhooks/events` | 列出所有可用的 Webhook 事件类型 |
+| GET | `/api/webhooks/[id]/deliveries` | 列出 Webhook 投递历史(成功/失败日志) |
+| POST | `/api/webhooks/[id]/test` | 向 Webhook 发送测试事件 |
**认证:** 需要管理会话。
@@ -1269,14 +1269,14 @@ ACP 代理作为子进程运行。以下端点管理 ACP 代理检测和自定
管理 Skills(代理扩展框架)。
-| 方法 | 路径 | 说明 |
-| ------ | -------------------------- | --------------------------------------------------------------------------------- |
-| GET | `/api/skills` | 列出所有已安装的技能(内置 + 自定义) |
-| POST | `/api/skills/install` | 从本地路径或 URL 安装技能 |
-| DELETE | `/api/skills/[id]` | 卸载技能 |
-| PUT | `/api/skills/[id]` | 启用或禁用技能 — 请求体:`{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` |
-| POST | `/api/skills/executions` | 执行技能 — 请求体:`{skillName, apiKeyId, input?, sessionId?}` |
-| GET | `/api/skills/executions` | 列出所有技能的执行历史(可按 `?apiKeyId=` 过滤) |
+| 方法 | 路径 | 说明 |
+| ------ | ------------------------ | ------------------------------------------------------------------------------ |
+| GET | `/api/skills` | 列出所有已安装的技能(内置 + 自定义) |
+| POST | `/api/skills/install` | 从本地路径或 URL 安装技能 |
+| DELETE | `/api/skills/[id]` | 卸载技能 |
+| PUT | `/api/skills/[id]` | 启用或禁用技能 — 请求体:`{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` |
+| POST | `/api/skills/executions` | 执行技能 — 请求体:`{skillName, apiKeyId, input?, sessionId?}` |
+| GET | `/api/skills/executions` | 列出所有技能的执行历史(可按 `?apiKeyId=` 过滤) |
**认证:** 需要管理会话或管理权限域的 API Key。
@@ -1288,15 +1288,15 @@ ACP 代理作为子进程运行。以下端点管理 ACP 代理检测和自定
管理 OmniRoute 插件(第三方扩展)。
-| 方法 | 路径 | 说明 |
-| ------ | ---------------------------------- | ------------------------------------ |
-| GET | `/api/plugins` | 列出已安装的插件 |
-| POST | `/api/plugins/install` | 从本地路径或 URL 安装插件 |
-| DELETE | `/api/plugins/[name]` | 卸载插件 |
-| POST | `/api/plugins/[name]/activate` | 激活插件 |
-| POST | `/api/plugins/[name]/deactivate` | 停用插件 |
-| GET | `/api/plugins/[name]/config` | 获取插件配置 |
-| PUT | `/api/plugins/[name]/config` | 更新插件配置 |
+| 方法 | 路径 | 说明 |
+| ------ | -------------------------------- | ------------------------- |
+| GET | `/api/plugins` | 列出已安装的插件 |
+| POST | `/api/plugins/install` | 从本地路径或 URL 安装插件 |
+| DELETE | `/api/plugins/[name]` | 卸载插件 |
+| POST | `/api/plugins/[name]/activate` | 激活插件 |
+| POST | `/api/plugins/[name]/deactivate` | 停用插件 |
+| GET | `/api/plugins/[name]/config` | 获取插件配置 |
+| PUT | `/api/plugins/[name]/config` | 更新插件配置 |
**认证:** 需要管理会话。
@@ -1314,10 +1314,10 @@ ACP 代理作为子进程运行。以下端点管理 ACP 代理检测和自定
检查运行时安全护栏(PII 检测、提示注入检测、视觉桥接)。安全护栏在每次请求中运行;按调用退出通过 `x-omniroute-disabled-guardrails` 请求头实现 — 没有持久化的启用/禁用地表。
-| 方法 | 路径 | 说明 |
-| ---- | ------------------------ | -------------------------------------------------------------------------------------- |
-| GET | `/api/guardrails` | 列出已注册的安全护栏及其状态(名称 / 启用 / 优先级) |
-| POST | `/api/guardrails/test` | 对示例输入干运行调用前管线 — 请求体:`{input, disabledGuardrails?}` |
+| 方法 | 路径 | 说明 |
+| ---- | ---------------------- | ------------------------------------------------------------------- |
+| GET | `/api/guardrails` | 列出已注册的安全护栏及其状态(名称 / 启用 / 优先级) |
+| POST | `/api/guardrails/test` | 对示例输入干运行调用前管线 — 请求体:`{input, disabledGuardrails?}` |
**认证:** 需要管理会话。
diff --git a/docs/i18n/zh-CN/docs/reference/CLI-TOOLS.md b/docs/i18n/zh-CN/docs/reference/CLI-TOOLS.md
index c3926b715b..79f2bb5a1a 100644
--- a/docs/i18n/zh-CN/docs/reference/CLI-TOOLS.md
+++ b/docs/i18n/zh-CN/docs/reference/CLI-TOOLS.md
@@ -1,6 +1,6 @@
# CLI-TOOLS (中文 (简体))
-🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇸🇦 [ar](../../../ar/docs/reference/CLI-TOOLS.md) · 🇦🇿 [az](../../../az/docs/reference/CLI-TOOLS.md) · 🇧🇬 [bg](../../../bg/docs/reference/CLI-TOOLS.md) · 🇧🇩 [bn](../../../bn/docs/reference/CLI-TOOLS.md) · 🇨🇿 [cs](../../../cs/docs/reference/CLI-TOOLS.md) · 🇩🇰 [da](../../../da/docs/reference/CLI-TOOLS.md) · 🇩🇪 [de](../../../de/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇮🇷 [fa](../../../fa/docs/reference/CLI-TOOLS.md) · 🇫🇮 [fi](../../../fi/docs/reference/CLI-TOOLS.md) · 🇫🇷 [fr](../../../fr/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇮🇩 [in](../../../in/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇵🇭 [phi](../../../phi/docs/reference/CLI-TOOLS.md) · 🇵🇱 [pl](../../../pl/docs/reference/CLI-TOOLS.md) · 🇵🇹 [pt](../../../pt/docs/reference/CLI-TOOLS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/CLI-TOOLS.md) · 🇷🇴 [ro](../../../ro/docs/reference/CLI-TOOLS.md) · 🇷🇺 [ru](../../../ru/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇪 [sv](../../../sv/docs/reference/CLI-TOOLS.md) · 🇰🇪 [sw](../../../sw/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ta](../../../ta/docs/reference/CLI-TOOLS.md) · 🇮🇳 [te](../../../te/docs/reference/CLI-TOOLS.md) · 🇹🇭 [th](../../../th/docs/reference/CLI-TOOLS.md) · 🇹🇷 [tr](../../../tr/docs/reference/CLI-TOOLS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/CLI-TOOLS.md) · 🇵🇰 [ur](../../../ur/docs/reference/CLI-TOOLS.md) · 🇻🇳 [vi](../../../vi/docs/reference/CLI-TOOLS.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/CLI-TOOLS.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇸🇦 [ar](../../../ar/docs/reference/CLI-TOOLS.md) · 🇦🇿 [az](../../../az/docs/reference/CLI-TOOLS.md) · 🇧🇬 [bg](../../../bg/docs/reference/CLI-TOOLS.md) · 🇧🇩 [bn](../../../bn/docs/reference/CLI-TOOLS.md) · 🇨🇿 [cs](../../../cs/docs/reference/CLI-TOOLS.md) · 🇩🇰 [da](../../../da/docs/reference/CLI-TOOLS.md) · 🇩🇪 [de](../../../de/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇮🇷 [fa](../../../fa/docs/reference/CLI-TOOLS.md) · 🇫🇮 [fi](../../../fi/docs/reference/CLI-TOOLS.md) · 🇫🇷 [fr](../../../fr/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇵🇭 [phi](../../../phi/docs/reference/CLI-TOOLS.md) · 🇵🇱 [pl](../../../pl/docs/reference/CLI-TOOLS.md) · 🇵🇹 [pt](../../../pt/docs/reference/CLI-TOOLS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/CLI-TOOLS.md) · 🇷🇴 [ro](../../../ro/docs/reference/CLI-TOOLS.md) · 🇷🇺 [ru](../../../ru/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇪 [sv](../../../sv/docs/reference/CLI-TOOLS.md) · 🇰🇪 [sw](../../../sw/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ta](../../../ta/docs/reference/CLI-TOOLS.md) · 🇮🇳 [te](../../../te/docs/reference/CLI-TOOLS.md) · 🇹🇭 [th](../../../th/docs/reference/CLI-TOOLS.md) · 🇹🇷 [tr](../../../tr/docs/reference/CLI-TOOLS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/CLI-TOOLS.md) · 🇵🇰 [ur](../../../ur/docs/reference/CLI-TOOLS.md) · 🇻🇳 [vi](../../../vi/docs/reference/CLI-TOOLS.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/CLI-TOOLS.md)
---
diff --git a/docs/i18n/zh-CN/docs/reference/ENVIRONMENT.md b/docs/i18n/zh-CN/docs/reference/ENVIRONMENT.md
index cb40139435..cb3239b1d7 100644
--- a/docs/i18n/zh-CN/docs/reference/ENVIRONMENT.md
+++ b/docs/i18n/zh-CN/docs/reference/ENVIRONMENT.md
@@ -7,7 +7,7 @@ version: 3.8.40
lastUpdated: 2026-06-28
---
-🌐 **语言:** 🇺🇸 [English](../../../../docs/reference/ENVIRONMENT.md) · 🇸🇦 [العربية](../../ar/docs/reference/ENVIRONMENT.md) · 🇧🇬 [Български](../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [বাংলা](../../bn/docs/reference/ENVIRONMENT.md) · 🇨🇿 [Čeština](../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [Dansk](../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [Deutsch](../../de/docs/reference/ENVIRONMENT.md) · 🇪🇸 [Español](../../es/docs/reference/ENVIRONMENT.md) · 🇮🇷 [فارسی](../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [Suomi](../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [Français](../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ગુજરાતી](../../gu/docs/reference/ENVIRONMENT.md) · 🇮🇱 [עברית](../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [हिन्दी](../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇺 [Magyar](../../hu/docs/reference/ENVIRONMENT.md) · 🇮🇩 [Indonesia](../../id/docs/reference/ENVIRONMENT.md) · 🇮🇹 [Italiano](../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [日本語](../../ja/docs/reference/ENVIRONMENT.md) · 🇰🇷 [한국어](../../ko/docs/reference/ENVIRONMENT.md) · 🇮🇳 [मराठी](../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [Bahasa Melayu](../../ms/docs/reference/ENVIRONMENT.md) · 🇳🇱 [Nederlands](../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [Norsk](../../no/docs/reference/ENVIRONMENT.md) · 🇵🇭 [Filipino](../../phi/docs/reference/ENVIRONMENT.md) · 🇵🇱 [Polski](../../pl/docs/reference/ENVIRONMENT.md) · 🇵🇹 [Português](../../pt/docs/reference/ENVIRONMENT.md) · 🇧🇷 [Português Brasileiro](../../pt-BR/docs/reference/ENVIRONMENT.md) · 🇷🇴 [Română](../../ro/docs/reference/ENVIRONMENT.md) · 🇷🇺 [Русский](../../ru/docs/reference/ENVIRONMENT.md) · 🇸🇰 [Slovenčina](../../sk/docs/reference/ENVIRONMENT.md) · 🇸🇪 [Svenska](../../sv/docs/reference/ENVIRONMENT.md) · 🇰🇪 [Kiswahili](../../sw/docs/reference/ENVIRONMENT.md) · 🇮🇳 [தமிழ்](../../ta/docs/reference/ENVIRONMENT.md) · 🇮🇳 [తెలుగు](../../te/docs/reference/ENVIRONMENT.md) · 🇹🇭 [ไทย](../../th/docs/reference/ENVIRONMENT.md) · 🇹🇷 [Türkçe](../../tr/docs/reference/ENVIRONMENT.md) · 🇺🇦 [Українська](../../uk-UA/docs/reference/ENVIRONMENT.md) · 🇵🇰 [اردو](../../ur/docs/reference/ENVIRONMENT.md) · 🇻🇳 [Tiếng Việt](../../vi/docs/reference/ENVIRONMENT.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇰🇷 [ko](../../../ko/docs/reference/ENVIRONMENT.md) · 🇮🇳 [mr](../../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [ms](../../../ms/docs/reference/ENVIRONMENT.md) · 🇳🇱 [nl](../../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [no](../../../no/docs/reference/ENVIRONMENT.md) · 🇵🇭 [phi](../../../phi/docs/reference/ENVIRONMENT.md) · 🇵🇱 [pl](../../../pl/docs/reference/ENVIRONMENT.md) · 🇵🇹 [pt](../../../pt/docs/reference/ENVIRONMENT.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/ENVIRONMENT.md) · 🇷🇴 [ro](../../../ro/docs/reference/ENVIRONMENT.md) · 🇷🇺 [ru](../../../ru/docs/reference/ENVIRONMENT.md) · 🇸🇰 [sk](../../../sk/docs/reference/ENVIRONMENT.md) · 🇸🇪 [sv](../../../sv/docs/reference/ENVIRONMENT.md) · 🇰🇪 [sw](../../../sw/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ta](../../../ta/docs/reference/ENVIRONMENT.md) · 🇮🇳 [te](../../../te/docs/reference/ENVIRONMENT.md) · 🇹🇭 [th](../../../th/docs/reference/ENVIRONMENT.md) · 🇹🇷 [tr](../../../tr/docs/reference/ENVIRONMENT.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/ENVIRONMENT.md) · 🇵🇰 [ur](../../../ur/docs/reference/ENVIRONMENT.md) · 🇻🇳 [vi](../../../vi/docs/reference/ENVIRONMENT.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/ENVIRONMENT.md)
---
diff --git a/docs/i18n/zh-CN/llm.txt b/docs/i18n/zh-CN/llm.txt
index 4669681522..2a9812d5f2 100644
--- a/docs/i18n/zh-CN/llm.txt
+++ b/docs/i18n/zh-CN/llm.txt
@@ -1,6 +1,6 @@
# OmniRoute (中文(简体))
-🌐 **Languages:** 🇺🇸 [English](../../../llm.txt) · 🇸🇦 [ar](../ar/llm.txt) · 🇧🇬 [bg](../bg/llm.txt) · 🇧🇩 [bn](../bn/llm.txt) · 🇨🇿 [cs](../cs/llm.txt) · 🇩🇰 [da](../da/llm.txt) · 🇩🇪 [de](../de/llm.txt) · 🇪🇸 [es](../es/llm.txt) · 🇮🇷 [fa](../fa/llm.txt) · 🇫🇮 [fi](../fi/llm.txt) · 🇫🇷 [fr](../fr/llm.txt) · 🇮🇳 [gu](../gu/llm.txt) · 🇮🇱 [he](../he/llm.txt) · 🇮🇳 [hi](../hi/llm.txt) · 🇭🇺 [hu](../hu/llm.txt) · 🇮🇩 [id](../id/llm.txt) · 🇮🇳 [in](../in/llm.txt) · 🇮🇹 [it](../it/llm.txt) · 🇯🇵 [ja](../ja/llm.txt) · 🇰🇷 [ko](../ko/llm.txt) · 🇮🇳 [mr](../mr/llm.txt) · 🇲🇾 [ms](../ms/llm.txt) · 🇳🇱 [nl](../nl/llm.txt) · 🇳🇴 [no](../no/llm.txt) · 🇵🇭 [phi](../phi/llm.txt) · 🇵🇱 [pl](../pl/llm.txt) · 🇵🇹 [pt](../pt/llm.txt) · 🇧🇷 [pt-BR](../pt-BR/llm.txt) · 🇷🇴 [ro](../ro/llm.txt) · 🇷🇺 [ru](../ru/llm.txt) · 🇸🇰 [sk](../sk/llm.txt) · 🇸🇪 [sv](../sv/llm.txt) · 🇰🇪 [sw](../sw/llm.txt) · 🇮🇳 [ta](../ta/llm.txt) · 🇮🇳 [te](../te/llm.txt) · 🇹🇭 [th](../th/llm.txt) · 🇹🇷 [tr](../tr/llm.txt) · 🇺🇦 [uk-UA](../uk-UA/llm.txt) · 🇵🇰 [ur](../ur/llm.txt) · 🇻🇳 [vi](../vi/llm.txt) · 🇨🇳 [zh-CN](../zh-CN/llm.txt)
+🌐 **Languages:** 🇺🇸 [English](../../../llm.txt) · 🇸🇦 [ar](../ar/llm.txt) · 🇦🇿 [az](../az/llm.txt) · 🇧🇬 [bg](../bg/llm.txt) · 🇧🇩 [bn](../bn/llm.txt) · 🇨🇿 [cs](../cs/llm.txt) · 🇩🇰 [da](../da/llm.txt) · 🇩🇪 [de](../de/llm.txt) · 🇪🇸 [es](../es/llm.txt) · 🇮🇷 [fa](../fa/llm.txt) · 🇫🇮 [fi](../fi/llm.txt) · 🇫🇷 [fr](../fr/llm.txt) · 🇮🇳 [gu](../gu/llm.txt) · 🇮🇱 [he](../he/llm.txt) · 🇮🇳 [hi](../hi/llm.txt) · 🇭🇺 [hu](../hu/llm.txt) · 🇮🇩 [id](../id/llm.txt) · 🇮🇹 [it](../it/llm.txt) · 🇯🇵 [ja](../ja/llm.txt) · 🇰🇷 [ko](../ko/llm.txt) · 🇮🇳 [mr](../mr/llm.txt) · 🇲🇾 [ms](../ms/llm.txt) · 🇳🇱 [nl](../nl/llm.txt) · 🇳🇴 [no](../no/llm.txt) · 🇵🇭 [phi](../phi/llm.txt) · 🇵🇱 [pl](../pl/llm.txt) · 🇵🇹 [pt](../pt/llm.txt) · 🇧🇷 [pt-BR](../pt-BR/llm.txt) · 🇷🇴 [ro](../ro/llm.txt) · 🇷🇺 [ru](../ru/llm.txt) · 🇸🇰 [sk](../sk/llm.txt) · 🇸🇪 [sv](../sv/llm.txt) · 🇰🇪 [sw](../sw/llm.txt) · 🇮🇳 [ta](../ta/llm.txt) · 🇮🇳 [te](../te/llm.txt) · 🇹🇭 [th](../th/llm.txt) · 🇹🇷 [tr](../tr/llm.txt) · 🇺🇦 [uk-UA](../uk-UA/llm.txt) · 🇵🇰 [ur](../ur/llm.txt) · 🇻🇳 [vi](../vi/llm.txt) · 🇹🇼 [zh-TW](../zh-TW/llm.txt)
---
@@ -26,7 +26,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
- **Background jobs:** Custom token health check scheduler, 24h model auto-sync
- **Streaming:** Server-Sent Events (SSE) for real-time proxy responses
- **Proxy engine:** Custom pipeline with format translation, circuit breaker, rate limiting, auto-combo engine
-- **i18n:** next-intl with 43 languages
+- **i18n:** next-intl with 42 languages
- **Desktop:** Electron (cross-platform: Windows, macOS, Linux)
- **Package:** Published on npm (`omniroute`) and Docker Hub (`diegosouzapw/omniroute`)
@@ -98,7 +98,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ │ ├── configAudit.ts # Configuration auditing
│ │ └── responses.ts # Domain response types
│ ├── i18n/ # Internationalization
-│ │ └── messages/ # 43 language JSON files
+│ │ └── messages/ # 42 language JSON files
│ ├── lib/ # Core libraries
│ │ ├── a2a/ # Agent-to-Agent v0.3 protocol server
│ │ │ ├── skills/ # A2A skills (quotaManagement, smartRouting)
@@ -263,7 +263,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ ├── translator/ # Translator-specific tests
│ └── load/ # Load tests
├── docs/ # Documentation
-│ ├── i18n/ # 43-language translated docs
+│ ├── i18n/ # 41-language translated docs
│ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md
│ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md
│ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md
@@ -371,8 +371,8 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
**Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs
### Internationalization
-- 43 languages for UI (all dashboard pages)
-- 42 translated documentation sets in docs/i18n/
+- 42 languages for UI (all dashboard pages)
+- 41 translated documentation sets in docs/i18n/
- Language switcher in documentation
## Key Architectural Decisions
diff --git a/docs/i18n/zh-TW/CHANGELOG.md b/docs/i18n/zh-TW/CHANGELOG.md
index 008fdcd2bb..21a7ef6ac0 100644
--- a/docs/i18n/zh-TW/CHANGELOG.md
+++ b/docs/i18n/zh-TW/CHANGELOG.md
@@ -1,6 +1,6 @@
# Changelog (中文 (繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../CHANGELOG.md) · 🇸🇦 [ar](../ar/CHANGELOG.md) · 🇧🇬 [bg](../bg/CHANGELOG.md) · 🇧🇩 [bn](../bn/CHANGELOG.md) · 🇨🇿 [cs](../cs/CHANGELOG.md) · 🇩🇰 [da](../da/CHANGELOG.md) · 🇩🇪 [de](../de/CHANGELOG.md) · 🇪🇸 [es](../es/CHANGELOG.md) · 🇮🇷 [fa](../fa/CHANGELOG.md) · 🇫🇮 [fi](../fi/CHANGELOG.md) · 🇫🇷 [fr](../fr/CHANGELOG.md) · 🇮🇳 [gu](../gu/CHANGELOG.md) · 🇮🇱 [he](../he/CHANGELOG.md) · 🇮🇳 [hi](../hi/CHANGELOG.md) · 🇭🇺 [hu](../hu/CHANGELOG.md) · 🇮🇩 [id](../id/CHANGELOG.md) · 🇮🇹 [it](../it/CHANGELOG.md) · 🇯🇵 [ja](../ja/CHANGELOG.md) · 🇰🇷 [ko](../ko/CHANGELOG.md) · 🇮🇳 [mr](../mr/CHANGELOG.md) · 🇲🇾 [ms](../ms/CHANGELOG.md) · 🇳🇱 [nl](../nl/CHANGELOG.md) · 🇳🇴 [no](../no/CHANGELOG.md) · 🇵🇭 [phi](../phi/CHANGELOG.md) · 🇵🇱 [pl](../pl/CHANGELOG.md) · 🇵🇹 [pt](../pt/CHANGELOG.md) · 🇧🇷 [pt-BR](../pt-BR/CHANGELOG.md) · 🇷🇴 [ro](../ro/CHANGELOG.md) · 🇷🇺 [ru](../ru/CHANGELOG.md) · 🇸🇰 [sk](../sk/CHANGELOG.md) · 🇸🇪 [sv](../sv/CHANGELOG.md) · 🇰🇪 [sw](../sw/CHANGELOG.md) · 🇮🇳 [ta](../ta/CHANGELOG.md) · 🇮🇳 [te](../te/CHANGELOG.md) · 🇹🇭 [th](../th/CHANGELOG.md) · 🇹🇷 [tr](../tr/CHANGELOG.md) · 🇺🇦 [uk-UA](../uk-UA/CHANGELOG.md) · 🇵🇰 [ur](../ur/CHANGELOG.md) · 🇻🇳 [vi](../vi/CHANGELOG.md) · 🇨🇳 [zh-CN](../zh-CN/CHANGELOG.md)
+🌐 **Languages:** 🇺🇸 [English](../../../CHANGELOG.md) · 🇸🇦 [ar](../ar/CHANGELOG.md) · 🇦🇿 [az](../az/CHANGELOG.md) · 🇧🇬 [bg](../bg/CHANGELOG.md) · 🇧🇩 [bn](../bn/CHANGELOG.md) · 🇨🇿 [cs](../cs/CHANGELOG.md) · 🇩🇰 [da](../da/CHANGELOG.md) · 🇩🇪 [de](../de/CHANGELOG.md) · 🇪🇸 [es](../es/CHANGELOG.md) · 🇮🇷 [fa](../fa/CHANGELOG.md) · 🇫🇮 [fi](../fi/CHANGELOG.md) · 🇫🇷 [fr](../fr/CHANGELOG.md) · 🇮🇳 [gu](../gu/CHANGELOG.md) · 🇮🇱 [he](../he/CHANGELOG.md) · 🇮🇳 [hi](../hi/CHANGELOG.md) · 🇭🇺 [hu](../hu/CHANGELOG.md) · 🇮🇩 [id](../id/CHANGELOG.md) · 🇮🇹 [it](../it/CHANGELOG.md) · 🇯🇵 [ja](../ja/CHANGELOG.md) · 🇰🇷 [ko](../ko/CHANGELOG.md) · 🇮🇳 [mr](../mr/CHANGELOG.md) · 🇲🇾 [ms](../ms/CHANGELOG.md) · 🇳🇱 [nl](../nl/CHANGELOG.md) · 🇳🇴 [no](../no/CHANGELOG.md) · 🇵🇭 [phi](../phi/CHANGELOG.md) · 🇵🇱 [pl](../pl/CHANGELOG.md) · 🇵🇹 [pt](../pt/CHANGELOG.md) · 🇧🇷 [pt-BR](../pt-BR/CHANGELOG.md) · 🇷🇴 [ro](../ro/CHANGELOG.md) · 🇷🇺 [ru](../ru/CHANGELOG.md) · 🇸🇰 [sk](../sk/CHANGELOG.md) · 🇸🇪 [sv](../sv/CHANGELOG.md) · 🇰🇪 [sw](../sw/CHANGELOG.md) · 🇮🇳 [ta](../ta/CHANGELOG.md) · 🇮🇳 [te](../te/CHANGELOG.md) · 🇹🇭 [th](../th/CHANGELOG.md) · 🇹🇷 [tr](../tr/CHANGELOG.md) · 🇺🇦 [uk-UA](../uk-UA/CHANGELOG.md) · 🇵🇰 [ur](../ur/CHANGELOG.md) · 🇻🇳 [vi](../vi/CHANGELOG.md) · 🇨🇳 [zh-CN](../zh-CN/CHANGELOG.md)
---
diff --git a/docs/i18n/zh-TW/CLAUDE.md b/docs/i18n/zh-TW/CLAUDE.md
index 5be6c69eec..b699ba1c28 100644
--- a/docs/i18n/zh-TW/CLAUDE.md
+++ b/docs/i18n/zh-TW/CLAUDE.md
@@ -1,6 +1,6 @@
# CLAUDE.md (中文 (繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../CLAUDE.md) · 🇸🇦 [ar](../ar/CLAUDE.md) · 🇦🇿 [az](../az/CLAUDE.md) · 🇧🇬 [bg](../bg/CLAUDE.md) · 🇧🇩 [bn](../bn/CLAUDE.md) · 🇨🇿 [cs](../cs/CLAUDE.md) · 🇩🇰 [da](../da/CLAUDE.md) · 🇩🇪 [de](../de/CLAUDE.md) · 🇪🇸 [es](../es/CLAUDE.md) · 🇮🇷 [fa](../fa/CLAUDE.md) · 🇫🇮 [fi](../fi/CLAUDE.md) · 🇫🇷 [fr](../fr/CLAUDE.md) · 🇮🇳 [gu](../gu/CLAUDE.md) · 🇮🇱 [he](../he/CLAUDE.md) · 🇮🇳 [hi](../hi/CLAUDE.md) · 🇭🇺 [hu](../hu/CLAUDE.md) · 🇮🇩 [id](../id/CLAUDE.md) · 🇮🇩 [in](../in/CLAUDE.md) · 🇮🇹 [it](../it/CLAUDE.md) · 🇯🇵 [ja](../ja/CLAUDE.md) · 🇰🇷 [ko](../ko/CLAUDE.md) · 🇮🇳 [mr](../mr/CLAUDE.md) · 🇲🇾 [ms](../ms/CLAUDE.md) · 🇳🇱 [nl](../nl/CLAUDE.md) · 🇳🇴 [no](../no/CLAUDE.md) · 🇵🇭 [phi](../phi/CLAUDE.md) · 🇵🇱 [pl](../pl/CLAUDE.md) · 🇵🇹 [pt](../pt/CLAUDE.md) · 🇧🇷 [pt-BR](../pt-BR/CLAUDE.md) · 🇷🇴 [ro](../ro/CLAUDE.md) · 🇷🇺 [ru](../ru/CLAUDE.md) · 🇸🇰 [sk](../sk/CLAUDE.md) · 🇸🇪 [sv](../sv/CLAUDE.md) · 🇰🇪 [sw](../sw/CLAUDE.md) · 🇮🇳 [ta](../ta/CLAUDE.md) · 🇮🇳 [te](../te/CLAUDE.md) · 🇹🇭 [th](../th/CLAUDE.md) · 🇹🇷 [tr](../tr/CLAUDE.md) · 🇺🇦 [uk-UA](../uk-UA/CLAUDE.md) · 🇵🇰 [ur](../ur/CLAUDE.md) · 🇻🇳 [vi](../vi/CLAUDE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../CLAUDE.md) · 🇸🇦 [ar](../ar/CLAUDE.md) · 🇦🇿 [az](../az/CLAUDE.md) · 🇧🇬 [bg](../bg/CLAUDE.md) · 🇧🇩 [bn](../bn/CLAUDE.md) · 🇨🇿 [cs](../cs/CLAUDE.md) · 🇩🇰 [da](../da/CLAUDE.md) · 🇩🇪 [de](../de/CLAUDE.md) · 🇪🇸 [es](../es/CLAUDE.md) · 🇮🇷 [fa](../fa/CLAUDE.md) · 🇫🇮 [fi](../fi/CLAUDE.md) · 🇫🇷 [fr](../fr/CLAUDE.md) · 🇮🇳 [gu](../gu/CLAUDE.md) · 🇮🇱 [he](../he/CLAUDE.md) · 🇮🇳 [hi](../hi/CLAUDE.md) · 🇭🇺 [hu](../hu/CLAUDE.md) · 🇮🇩 [id](../id/CLAUDE.md) · 🇮🇹 [it](../it/CLAUDE.md) · 🇯🇵 [ja](../ja/CLAUDE.md) · 🇰🇷 [ko](../ko/CLAUDE.md) · 🇮🇳 [mr](../mr/CLAUDE.md) · 🇲🇾 [ms](../ms/CLAUDE.md) · 🇳🇱 [nl](../nl/CLAUDE.md) · 🇳🇴 [no](../no/CLAUDE.md) · 🇵🇭 [phi](../phi/CLAUDE.md) · 🇵🇱 [pl](../pl/CLAUDE.md) · 🇵🇹 [pt](../pt/CLAUDE.md) · 🇧🇷 [pt-BR](../pt-BR/CLAUDE.md) · 🇷🇴 [ro](../ro/CLAUDE.md) · 🇷🇺 [ru](../ru/CLAUDE.md) · 🇸🇰 [sk](../sk/CLAUDE.md) · 🇸🇪 [sv](../sv/CLAUDE.md) · 🇰🇪 [sw](../sw/CLAUDE.md) · 🇮🇳 [ta](../ta/CLAUDE.md) · 🇮🇳 [te](../te/CLAUDE.md) · 🇹🇭 [th](../th/CLAUDE.md) · 🇹🇷 [tr](../tr/CLAUDE.md) · 🇺🇦 [uk-UA](../uk-UA/CLAUDE.md) · 🇵🇰 [ur](../ur/CLAUDE.md) · 🇻🇳 [vi](../vi/CLAUDE.md) · 🇨🇳 [zh-CN](../zh-CN/CLAUDE.md)
---
diff --git a/docs/i18n/zh-TW/CODE_OF_CONDUCT.md b/docs/i18n/zh-TW/CODE_OF_CONDUCT.md
index 49d5b30f48..b112bd3f56 100644
--- a/docs/i18n/zh-TW/CODE_OF_CONDUCT.md
+++ b/docs/i18n/zh-TW/CODE_OF_CONDUCT.md
@@ -1,6 +1,6 @@
# Contributor Covenant 行為準則 (中文 (繁體))
-🌐 **語言:** 🇺🇸 [English](../../../CODE_OF_CONDUCT.md) · 🇸🇦 [ar](../ar/CODE_OF_CONDUCT.md) · 🇧🇬 [bg](../bg/CODE_OF_CONDUCT.md) · 🇧🇩 [bn](../bn/CODE_OF_CONDUCT.md) · 🇨🇿 [cs](../cs/CODE_OF_CONDUCT.md) · 🇩🇰 [da](../da/CODE_OF_CONDUCT.md) · 🇩🇪 [de](../de/CODE_OF_CONDUCT.md) · 🇪🇸 [es](../es/CODE_OF_CONDUCT.md) · 🇮🇷 [fa](../fa/CODE_OF_CONDUCT.md) · 🇫🇮 [fi](../fi/CODE_OF_CONDUCT.md) · 🇫🇷 [fr](../fr/CODE_OF_CONDUCT.md) · 🇮🇳 [gu](../gu/CODE_OF_CONDUCT.md) · 🇮🇱 [he](../he/CODE_OF_CONDUCT.md) · 🇮🇳 [hi](../hi/CODE_OF_CONDUCT.md) · 🇭🇺 [hu](../hu/CODE_OF_CONDUCT.md) · 🇮🇩 [id](../id/CODE_OF_CONDUCT.md) · 🇮🇹 [it](../it/CODE_OF_CONDUCT.md) · 🇯🇵 [ja](../ja/CODE_OF_CONDUCT.md) · 🇰🇷 [ko](../ko/CODE_OF_CONDUCT.md) · 🇮🇳 [mr](../mr/CODE_OF_CONDUCT.md) · 🇲🇾 [ms](../ms/CODE_OF_CONDUCT.md) · 🇳🇱 [nl](../nl/CODE_OF_CONDUCT.md) · 🇳🇴 [no](../no/CODE_OF_CONDUCT.md) · 🇵🇭 [phi](../phi/CODE_OF_CONDUCT.md) · 🇵🇱 [pl](../pl/CODE_OF_CONDUCT.md) · 🇵🇹 [pt](../pt/CODE_OF_CONDUCT.md) · 🇧🇷 [pt-BR](../pt-BR/CODE_OF_CONDUCT.md) · 🇷🇴 [ro](../ro/CODE_OF_CONDUCT.md) · 🇷🇺 [ru](../ru/CODE_OF_CONDUCT.md) · 🇸🇰 [sk](../sk/CODE_OF_CONDUCT.md) · 🇸🇪 [sv](../sv/CODE_OF_CONDUCT.md) · 🇰🇪 [sw](../sw/CODE_OF_CONDUCT.md) · 🇮🇳 [ta](../ta/CODE_OF_CONDUCT.md) · 🇮🇳 [te](../te/CODE_OF_CONDUCT.md) · 🇹🇭 [th](../th/CODE_OF_CONDUCT.md) · 🇹🇷 [tr](../tr/CODE_OF_CONDUCT.md) · 🇺🇦 [uk-UA](../uk-UA/CODE_OF_CONDUCT.md) · 🇵🇰 [ur](../ur/CODE_OF_CONDUCT.md) · 🇻🇳 [vi](../vi/CODE_OF_CONDUCT.md) · 🇨🇳 [zh-CN](../zh-CN/CODE_OF_CONDUCT.md)
+🌐 **Languages:** 🇺🇸 [English](../../../CODE_OF_CONDUCT.md) · 🇸🇦 [ar](../ar/CODE_OF_CONDUCT.md) · 🇦🇿 [az](../az/CODE_OF_CONDUCT.md) · 🇧🇬 [bg](../bg/CODE_OF_CONDUCT.md) · 🇧🇩 [bn](../bn/CODE_OF_CONDUCT.md) · 🇨🇿 [cs](../cs/CODE_OF_CONDUCT.md) · 🇩🇰 [da](../da/CODE_OF_CONDUCT.md) · 🇩🇪 [de](../de/CODE_OF_CONDUCT.md) · 🇪🇸 [es](../es/CODE_OF_CONDUCT.md) · 🇮🇷 [fa](../fa/CODE_OF_CONDUCT.md) · 🇫🇮 [fi](../fi/CODE_OF_CONDUCT.md) · 🇫🇷 [fr](../fr/CODE_OF_CONDUCT.md) · 🇮🇳 [gu](../gu/CODE_OF_CONDUCT.md) · 🇮🇱 [he](../he/CODE_OF_CONDUCT.md) · 🇮🇳 [hi](../hi/CODE_OF_CONDUCT.md) · 🇭🇺 [hu](../hu/CODE_OF_CONDUCT.md) · 🇮🇩 [id](../id/CODE_OF_CONDUCT.md) · 🇮🇹 [it](../it/CODE_OF_CONDUCT.md) · 🇯🇵 [ja](../ja/CODE_OF_CONDUCT.md) · 🇰🇷 [ko](../ko/CODE_OF_CONDUCT.md) · 🇮🇳 [mr](../mr/CODE_OF_CONDUCT.md) · 🇲🇾 [ms](../ms/CODE_OF_CONDUCT.md) · 🇳🇱 [nl](../nl/CODE_OF_CONDUCT.md) · 🇳🇴 [no](../no/CODE_OF_CONDUCT.md) · 🇵🇭 [phi](../phi/CODE_OF_CONDUCT.md) · 🇵🇱 [pl](../pl/CODE_OF_CONDUCT.md) · 🇵🇹 [pt](../pt/CODE_OF_CONDUCT.md) · 🇧🇷 [pt-BR](../pt-BR/CODE_OF_CONDUCT.md) · 🇷🇴 [ro](../ro/CODE_OF_CONDUCT.md) · 🇷🇺 [ru](../ru/CODE_OF_CONDUCT.md) · 🇸🇰 [sk](../sk/CODE_OF_CONDUCT.md) · 🇸🇪 [sv](../sv/CODE_OF_CONDUCT.md) · 🇰🇪 [sw](../sw/CODE_OF_CONDUCT.md) · 🇮🇳 [ta](../ta/CODE_OF_CONDUCT.md) · 🇮🇳 [te](../te/CODE_OF_CONDUCT.md) · 🇹🇭 [th](../th/CODE_OF_CONDUCT.md) · 🇹🇷 [tr](../tr/CODE_OF_CONDUCT.md) · 🇺🇦 [uk-UA](../uk-UA/CODE_OF_CONDUCT.md) · 🇵🇰 [ur](../ur/CODE_OF_CONDUCT.md) · 🇻🇳 [vi](../vi/CODE_OF_CONDUCT.md) · 🇨🇳 [zh-CN](../zh-CN/CODE_OF_CONDUCT.md)
---
@@ -41,6 +41,7 @@
## 執行
可向負責執行的社群領導者舉報濫用、騷擾或其他不可接受的行為,請透過以下方式聯絡:
+
- 開啟私人安全性公告:
- 或發送郵件給維護者:diegosouza.pw@outlook.com
- 針對安全敏感性事件,請參閱 [`SECURITY.md`](SECURITY.md)
diff --git a/docs/i18n/zh-TW/CONTRIBUTING.md b/docs/i18n/zh-TW/CONTRIBUTING.md
index c1df6f08fe..23856fd8ab 100644
--- a/docs/i18n/zh-TW/CONTRIBUTING.md
+++ b/docs/i18n/zh-TW/CONTRIBUTING.md
@@ -1,6 +1,6 @@
# 貢獻 OmniRoute (中文 (繁體))
-🌐 **語言:** 🇺🇸 [English](../../../CONTRIBUTING.md) · 🇸🇦 [ar](../ar/CONTRIBUTING.md) · 🇧🇬 [bg](../bg/CONTRIBUTING.md) · 🇧🇩 [bn](../bn/CONTRIBUTING.md) · 🇨🇿 [cs](../cs/CONTRIBUTING.md) · 🇩🇰 [da](../da/CONTRIBUTING.md) · 🇩🇪 [de](../de/CONTRIBUTING.md) · 🇪🇸 [es](../es/CONTRIBUTING.md) · 🇮🇷 [fa](../fa/CONTRIBUTING.md) · 🇫🇮 [fi](../fi/CONTRIBUTING.md) · 🇫🇷 [fr](../fr/CONTRIBUTING.md) · 🇮🇳 [gu](../gu/CONTRIBUTING.md) · 🇮🇱 [he](../he/CONTRIBUTING.md) · 🇮🇳 [hi](../hi/CONTRIBUTING.md) · 🇭🇺 [hu](../hu/CONTRIBUTING.md) · 🇮🇩 [id](../id/CONTRIBUTING.md) · 🇮🇹 [it](../it/CONTRIBUTING.md) · 🇯🇵 [ja](../ja/CONTRIBUTING.md) · 🇰🇷 [ko](../ko/CONTRIBUTING.md) · 🇮🇳 [mr](../mr/CONTRIBUTING.md) · 🇲🇾 [ms](../ms/CONTRIBUTING.md) · 🇳🇱 [nl](../nl/CONTRIBUTING.md) · 🇳🇴 [no](../no/CONTRIBUTING.md) · 🇵🇭 [phi](../phi/CONTRIBUTING.md) · 🇵🇱 [pl](../pl/CONTRIBUTING.md) · 🇵🇹 [pt](../pt/CONTRIBUTING.md) · 🇧🇷 [pt-BR](../pt-BR/CONTRIBUTING.md) · 🇷🇴 [ro](../ro/CONTRIBUTING.md) · 🇷🇺 [ru](../ru/CONTRIBUTING.md) · 🇸🇰 [sk](../sk/CONTRIBUTING.md) · 🇸🇪 [sv](../sv/CONTRIBUTING.md) · 🇰🇪 [sw](../sw/CONTRIBUTING.md) · 🇮🇳 [ta](../ta/CONTRIBUTING.md) · 🇮🇳 [te](../te/CONTRIBUTING.md) · 🇹🇭 [th](../th/CONTRIBUTING.md) · 🇹🇷 [tr](../tr/CONTRIBUTING.md) · 🇺🇦 [uk-UA](../uk-UA/CONTRIBUTING.md) · 🇵🇰 [ur](../ur/CONTRIBUTING.md) · 🇻🇳 [vi](../vi/CONTRIBUTING.md) · 🇨🇳 [zh-CN](../zh-CN/CONTRIBUTING.md)
+🌐 **Languages:** 🇺🇸 [English](../../../CONTRIBUTING.md) · 🇸🇦 [ar](../ar/CONTRIBUTING.md) · 🇦🇿 [az](../az/CONTRIBUTING.md) · 🇧🇬 [bg](../bg/CONTRIBUTING.md) · 🇧🇩 [bn](../bn/CONTRIBUTING.md) · 🇨🇿 [cs](../cs/CONTRIBUTING.md) · 🇩🇰 [da](../da/CONTRIBUTING.md) · 🇩🇪 [de](../de/CONTRIBUTING.md) · 🇪🇸 [es](../es/CONTRIBUTING.md) · 🇮🇷 [fa](../fa/CONTRIBUTING.md) · 🇫🇮 [fi](../fi/CONTRIBUTING.md) · 🇫🇷 [fr](../fr/CONTRIBUTING.md) · 🇮🇳 [gu](../gu/CONTRIBUTING.md) · 🇮🇱 [he](../he/CONTRIBUTING.md) · 🇮🇳 [hi](../hi/CONTRIBUTING.md) · 🇭🇺 [hu](../hu/CONTRIBUTING.md) · 🇮🇩 [id](../id/CONTRIBUTING.md) · 🇮🇹 [it](../it/CONTRIBUTING.md) · 🇯🇵 [ja](../ja/CONTRIBUTING.md) · 🇰🇷 [ko](../ko/CONTRIBUTING.md) · 🇮🇳 [mr](../mr/CONTRIBUTING.md) · 🇲🇾 [ms](../ms/CONTRIBUTING.md) · 🇳🇱 [nl](../nl/CONTRIBUTING.md) · 🇳🇴 [no](../no/CONTRIBUTING.md) · 🇵🇭 [phi](../phi/CONTRIBUTING.md) · 🇵🇱 [pl](../pl/CONTRIBUTING.md) · 🇵🇹 [pt](../pt/CONTRIBUTING.md) · 🇧🇷 [pt-BR](../pt-BR/CONTRIBUTING.md) · 🇷🇴 [ro](../ro/CONTRIBUTING.md) · 🇷🇺 [ru](../ru/CONTRIBUTING.md) · 🇸🇰 [sk](../sk/CONTRIBUTING.md) · 🇸🇪 [sv](../sv/CONTRIBUTING.md) · 🇰🇪 [sw](../sw/CONTRIBUTING.md) · 🇮🇳 [ta](../ta/CONTRIBUTING.md) · 🇮🇳 [te](../te/CONTRIBUTING.md) · 🇹🇭 [th](../th/CONTRIBUTING.md) · 🇹🇷 [tr](../tr/CONTRIBUTING.md) · 🇺🇦 [uk-UA](../uk-UA/CONTRIBUTING.md) · 🇵🇰 [ur](../ur/CONTRIBUTING.md) · 🇻🇳 [vi](../vi/CONTRIBUTING.md) · 🇨🇳 [zh-CN](../zh-CN/CONTRIBUTING.md)
感謝您有興趣貢獻!本指南包含您入門所需的一切。
diff --git a/docs/i18n/zh-TW/README.md b/docs/i18n/zh-TW/README.md
index 4365cd8e40..e0b6dac5d1 100644
--- a/docs/i18n/zh-TW/README.md
+++ b/docs/i18n/zh-TW/README.md
@@ -1,6 +1,6 @@
# 🚀 OmniRoute — 免費 AI 閘道器
-🌐 **語言:** 🇺🇸 [English](../../../README.md) · 🇸🇦 [ar](../ar/README.md) · 🇧🇬 [bg](../bg/README.md) · 🇧🇩 [bn](../bn/README.md) · 🇨🇿 [cs](../cs/README.md) · 🇩🇰 [da](../da/README.md) · 🇩🇪 [de](../de/README.md) · 🇪🇸 [es](../es/README.md) · 🇮🇷 [fa](../fa/README.md) · 🇫🇮 [fi](../fi/README.md) · 🇫🇷 [fr](../fr/README.md) · 🇮🇳 [gu](../gu/README.md) · 🇮🇱 [he](../he/README.md) · 🇮🇳 [hi](../hi/README.md) · 🇭🇺 [hu](../hu/README.md) · 🇮🇩 [id](../id/README.md) · 🇮🇹 [it](../it/README.md) · 🇯🇵 [ja](../ja/README.md) · 🇰🇷 [ko](../ko/README.md) · 🇮🇳 [mr](../mr/README.md) · 🇲🇾 [ms](../ms/README.md) · 🇳🇱 [nl](../nl/README.md) · 🇳🇴 [no](../no/README.md) · 🇵🇭 [phi](../phi/README.md) · 🇵🇱 [pl](../pl/README.md) · 🇵🇹 [pt](../pt/README.md) · 🇧🇷 [pt-BR](../pt-BR/README.md) · 🇷🇴 [ro](../ro/README.md) · 🇷🇺 [ru](../ru/README.md) · 🇸🇰 [sk](../sk/README.md) · 🇸🇪 [sv](../sv/README.md) · 🇰🇪 [sw](../sw/README.md) · 🇮🇳 [ta](../ta/README.md) · 🇮🇳 [te](../te/README.md) · 🇹🇭 [th](../th/README.md) · 🇹🇷 [tr](../tr/README.md) · 🇺🇦 [uk-UA](../uk-UA/README.md) · 🇵🇰 [ur](../ur/README.md) · 🇻🇳 [vi](../vi/README.md) · 🇨🇳 [zh-CN](../zh-CN/README.md) · 🇹🇼 [zh-TW](../zh-TW/README.md)
+🌐 **Languages:** 🇺🇸 [English](../../../README.md) · 🇸🇦 [ar](../ar/README.md) · 🇦🇿 [az](../az/README.md) · 🇧🇬 [bg](../bg/README.md) · 🇧🇩 [bn](../bn/README.md) · 🇨🇿 [cs](../cs/README.md) · 🇩🇰 [da](../da/README.md) · 🇩🇪 [de](../de/README.md) · 🇪🇸 [es](../es/README.md) · 🇮🇷 [fa](../fa/README.md) · 🇫🇮 [fi](../fi/README.md) · 🇫🇷 [fr](../fr/README.md) · 🇮🇳 [gu](../gu/README.md) · 🇮🇱 [he](../he/README.md) · 🇮🇳 [hi](../hi/README.md) · 🇭🇺 [hu](../hu/README.md) · 🇮🇩 [id](../id/README.md) · 🇮🇹 [it](../it/README.md) · 🇯🇵 [ja](../ja/README.md) · 🇰🇷 [ko](../ko/README.md) · 🇮🇳 [mr](../mr/README.md) · 🇲🇾 [ms](../ms/README.md) · 🇳🇱 [nl](../nl/README.md) · 🇳🇴 [no](../no/README.md) · 🇵🇭 [phi](../phi/README.md) · 🇵🇱 [pl](../pl/README.md) · 🇵🇹 [pt](../pt/README.md) · 🇧🇷 [pt-BR](../pt-BR/README.md) · 🇷🇴 [ro](../ro/README.md) · 🇷🇺 [ru](../ru/README.md) · 🇸🇰 [sk](../sk/README.md) · 🇸🇪 [sv](../sv/README.md) · 🇰🇪 [sw](../sw/README.md) · 🇮🇳 [ta](../ta/README.md) · 🇮🇳 [te](../te/README.md) · 🇹🇭 [th](../th/README.md) · 🇹🇷 [tr](../tr/README.md) · 🇺🇦 [uk-UA](../uk-UA/README.md) · 🇵🇰 [ur](../ur/README.md) · 🇻🇳 [vi](../vi/README.md) · 🇨🇳 [zh-CN](../zh-CN/README.md)
---
@@ -73,7 +73,7 @@
-
🌐 支援 43 種語言環境
+
🌐 支援 42 種語言環境
| 🇺🇸 |
@@ -280,7 +280,7 @@ Result: 4 fallback layers reduce downtime; upstream availability is not guarante
| ☁️ 雲端代理 | **Codex、Cursor、Devin、Jules** | 無 |
| 🥷 TLS 指紋隱身 | **JA3/JA4 透過 wreq-js** | 無 |
| 🖥️ 多平台 | **Web · 桌面 · Termux · PWA** | 僅 Web |
-| 🌍 國際化 | **43 種語言環境** | 0–4 |
+| 🌍 國際化 | **42 種語言環境** | 0–4 |
📊 與 LiteLLM、OpenRouter 和 Portkey 的詳細比較 → [`docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md`](../../comparison/OMNIROUTE_VS_ALTERNATIVES.md)
@@ -714,12 +714,12 @@ podman compose --profile base up -d --build
-| 層級 | 範例 | 成本 |
-| ------------------------- | ---------------------------------------- | ----------- |
-| 💳 **訂閱** | Claude Code Pro / Codex / Copilot | $10–200/月 |
-| 🔑 **API 金鑰(免費層)** | NVIDIA NIM、Cerebras、Groq | **免費** |
-| 💰 **廉價** | GLM-5 $0.5/1M · MiniMax M2.5 $0.3/1M | 幾分錢 |
-| 🆓 **有記錄的免費存取** | Kiro、Qoder、Pollinations、LongCat | **列為 $0** |
+| 層級 | 範例 | 成本 |
+| ------------------------- | ------------------------------------ | ----------- |
+| 💳 **訂閱** | Claude Code Pro / Codex / Copilot | $10–200/月 |
+| 🔑 **API 金鑰(免費層)** | NVIDIA NIM、Cerebras、Groq | **免費** |
+| 💰 **廉價** | GLM-5 $0.5/1M · MiniMax M2.5 $0.3/1M | 幾分錢 |
+| 🆓 **有記錄的免費存取** | Kiro、Qoder、Pollinations、LongCat | **列為 $0** |
**$0 免費堆疊 — 組合成一個不可中斷的 Combo:**
@@ -949,7 +949,7 @@ podman compose --profile base up -d --build
| [Contributing](../../CONTRIBUTING.md) | 開發設定和指南 |
| [Changelog](../../CHANGELOG.md) | 完整每個版本的發布歷史 |
| [Security Policy](../../SECURITY.md) | 漏洞回報和安全實踐 |
-| [i18n Guide](../../guides/I18N.md) | 43 種語言環境、翻譯工作流程、RTL |
+| [i18n Guide](../../guides/I18N.md) | 42 種語言環境、翻譯工作流程、RTL |
| [Release Checklist](../../ops/RELEASE_CHECKLIST.md) | 發布前驗證步驟 |
| [Coverage Plan](../../ops/COVERAGE_PLAN.md) | 測試覆蓋率策略和 14,965 測試套件 |
diff --git a/docs/i18n/zh-TW/docs/architecture/ARCHITECTURE.md b/docs/i18n/zh-TW/docs/architecture/ARCHITECTURE.md
index 38fb1bfe5d..ac29d168c4 100644
--- a/docs/i18n/zh-TW/docs/architecture/ARCHITECTURE.md
+++ b/docs/i18n/zh-TW/docs/architecture/ARCHITECTURE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute 架構
-🌐 **語言:** 🇺🇸 [English](./ARCHITECTURE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/architecture/ARCHITECTURE.md) | 🇪🇸 [Español](../i18n/es/docs/architecture/ARCHITECTURE.md) | 🇫🇷 [Français](../i18n/fr/docs/architecture/ARCHITECTURE.md) | 🇮🇹 [Italiano](../i18n/it/docs/architecture/ARCHITECTURE.md) | 🇷🇺 [Русский](../i18n/ru/docs/architecture/ARCHITECTURE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/architecture/ARCHITECTURE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/architecture/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/architecture/ARCHITECTURE.md) | 🇹🇭 [ไทย](../i18n/th/docs/architecture/ARCHITECTURE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/architecture/ARCHITECTURE.md) | 🇸🇦 [العربية](../i18n/ar/docs/architecture/ARCHITECTURE.md) | 🇯🇵 [日本語](../i18n/ja/docs/architecture/ARCHITECTURE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/architecture/ARCHITECTURE.md) | 🇧🇬 [Български](../i18n/bg/docs/architecture/ARCHITECTURE.md) | 🇩🇰 [Dansk](../i18n/da/docs/architecture/ARCHITECTURE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/architecture/ARCHITECTURE.md) | 🇮🇱 [עברית](../i18n/he/docs/architecture/ARCHITECTURE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/architecture/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/architecture/ARCHITECTURE.md) | 🇰🇷 [한국어](../i18n/ko/docs/architecture/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/architecture/ARCHITECTURE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/architecture/ARCHITECTURE.md) | 🇳🇴 [Norsk](../i18n/no/docs/architecture/ARCHITECTURE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/architecture/ARCHITECTURE.md) | 🇷🇴 [Română](../i18n/ro/docs/architecture/ARCHITECTURE.md) | 🇵🇱 [Polski](../i18n/pl/docs/architecture/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/architecture/ARCHITECTURE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/architecture/ARCHITECTURE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/architecture/ARCHITECTURE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/architecture/ARCHITECTURE.md) | 🇭🇰 [中文 (繁體)](../i18n/zh-TW/docs/architecture/ARCHITECTURE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../architecture/ARCHITECTURE.md) · 🇸🇦 [ar](../../../ar/docs/architecture/ARCHITECTURE.md) · 🇦🇿 [az](../../../az/docs/architecture/ARCHITECTURE.md) · 🇧🇬 [bg](../../../bg/docs/architecture/ARCHITECTURE.md) · 🇧🇩 [bn](../../../bn/docs/architecture/ARCHITECTURE.md) · 🇨🇿 [cs](../../../cs/docs/architecture/ARCHITECTURE.md) · 🇩🇰 [da](../../../da/docs/architecture/ARCHITECTURE.md) · 🇩🇪 [de](../../../de/docs/architecture/ARCHITECTURE.md) · 🇪🇸 [es](../../../es/docs/architecture/ARCHITECTURE.md) · 🇮🇷 [fa](../../../fa/docs/architecture/ARCHITECTURE.md) · 🇫🇮 [fi](../../../fi/docs/architecture/ARCHITECTURE.md) · 🇫🇷 [fr](../../../fr/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [gu](../../../gu/docs/architecture/ARCHITECTURE.md) · 🇮🇱 [he](../../../he/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [hi](../../../hi/docs/architecture/ARCHITECTURE.md) · 🇭🇺 [hu](../../../hu/docs/architecture/ARCHITECTURE.md) · 🇮🇩 [id](../../../id/docs/architecture/ARCHITECTURE.md) · 🇮🇹 [it](../../../it/docs/architecture/ARCHITECTURE.md) · 🇯🇵 [ja](../../../ja/docs/architecture/ARCHITECTURE.md) · 🇰🇷 [ko](../../../ko/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [mr](../../../mr/docs/architecture/ARCHITECTURE.md) · 🇲🇾 [ms](../../../ms/docs/architecture/ARCHITECTURE.md) · 🇳🇱 [nl](../../../nl/docs/architecture/ARCHITECTURE.md) · 🇳🇴 [no](../../../no/docs/architecture/ARCHITECTURE.md) · 🇵🇭 [phi](../../../phi/docs/architecture/ARCHITECTURE.md) · 🇵🇱 [pl](../../../pl/docs/architecture/ARCHITECTURE.md) · 🇵🇹 [pt](../../../pt/docs/architecture/ARCHITECTURE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/architecture/ARCHITECTURE.md) · 🇷🇴 [ro](../../../ro/docs/architecture/ARCHITECTURE.md) · 🇷🇺 [ru](../../../ru/docs/architecture/ARCHITECTURE.md) · 🇸🇰 [sk](../../../sk/docs/architecture/ARCHITECTURE.md) · 🇸🇪 [sv](../../../sv/docs/architecture/ARCHITECTURE.md) · 🇰🇪 [sw](../../../sw/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [ta](../../../ta/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [te](../../../te/docs/architecture/ARCHITECTURE.md) · 🇹🇭 [th](../../../th/docs/architecture/ARCHITECTURE.md) · 🇹🇷 [tr](../../../tr/docs/architecture/ARCHITECTURE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/architecture/ARCHITECTURE.md) · 🇵🇰 [ur](../../../ur/docs/architecture/ARCHITECTURE.md) · 🇻🇳 [vi](../../../vi/docs/architecture/ARCHITECTURE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/architecture/ARCHITECTURE.md)
_最後更新:2026-06-28_
diff --git a/docs/i18n/zh-TW/docs/cloudflare-zero-trust-guide.md b/docs/i18n/zh-TW/docs/cloudflare-zero-trust-guide.md
index bcbdb78364..2b4a294e9f 100644
--- a/docs/i18n/zh-TW/docs/cloudflare-zero-trust-guide.md
+++ b/docs/i18n/zh-TW/docs/cloudflare-zero-trust-guide.md
@@ -1,6 +1,6 @@
# 完整指南:Cloudflare Tunnel 與 Zero Trust (Split-Port) (中文(繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../../docs/cloudflare-zero-trust-guide.md) · 🇪🇸 [es](../../es/docs/cloudflare-zero-trust-guide.md) · 🇫🇷 [fr](../../fr/docs/cloudflare-zero-trust-guide.md) · 🇩🇪 [de](../../de/docs/cloudflare-zero-trust-guide.md) · 🇮🇹 [it](../../it/docs/cloudflare-zero-trust-guide.md) · 🇷🇺 [ru](../../ru/docs/cloudflare-zero-trust-guide.md) · 🇨🇳 [zh-CN](../../zh-CN/docs/cloudflare-zero-trust-guide.md) · 🇹🇼 [zh-TW](../../zh-TW/docs/cloudflare-zero-trust-guide.md) · 🇯🇵 [ja](../../ja/docs/cloudflare-zero-trust-guide.md) · 🇰🇷 [ko](../../ko/docs/cloudflare-zero-trust-guide.md) · 🇸🇦 [ar](../../ar/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [hi](../../hi/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [in](../../in/docs/cloudflare-zero-trust-guide.md) · 🇹🇭 [th](../../th/docs/cloudflare-zero-trust-guide.md) · 🇻🇳 [vi](../../vi/docs/cloudflare-zero-trust-guide.md) · 🇮🇩 [id](../../id/docs/cloudflare-zero-trust-guide.md) · 🇲🇾 [ms](../../ms/docs/cloudflare-zero-trust-guide.md) · 🇳🇱 [nl](../../nl/docs/cloudflare-zero-trust-guide.md) · 🇵🇱 [pl](../../pl/docs/cloudflare-zero-trust-guide.md) · 🇸🇪 [sv](../../sv/docs/cloudflare-zero-trust-guide.md) · 🇳🇴 [no](../../no/docs/cloudflare-zero-trust-guide.md) · 🇩🇰 [da](../../da/docs/cloudflare-zero-trust-guide.md) · 🇫🇮 [fi](../../fi/docs/cloudflare-zero-trust-guide.md) · 🇵🇹 [pt](../../pt/docs/cloudflare-zero-trust-guide.md) · 🇷🇴 [ro](../../ro/docs/cloudflare-zero-trust-guide.md) · 🇭🇺 [hu](../../hu/docs/cloudflare-zero-trust-guide.md) · 🇧🇬 [bg](../../bg/docs/cloudflare-zero-trust-guide.md) · 🇸🇰 [sk](../../sk/docs/cloudflare-zero-trust-guide.md) · 🇺🇦 [uk-UA](../../uk-UA/docs/cloudflare-zero-trust-guide.md) · 🇮🇱 [he](../../he/docs/cloudflare-zero-trust-guide.md) · 🇵🇭 [phi](../../phi/docs/cloudflare-zero-trust-guide.md) · 🇧🇷 [pt-BR](../../pt-BR/docs/cloudflare-zero-trust-guide.md) · 🇨🇿 [cs](../../cs/docs/cloudflare-zero-trust-guide.md) · 🇹🇷 [tr](../../tr/docs/cloudflare-zero-trust-guide.md)
+🌐 **Languages:** 🇺🇸 [English](../../../cloudflare-zero-trust-guide.md) · 🇸🇦 [ar](../../ar/docs/cloudflare-zero-trust-guide.md) · 🇦🇿 [az](../../az/docs/cloudflare-zero-trust-guide.md) · 🇧🇬 [bg](../../bg/docs/cloudflare-zero-trust-guide.md) · 🇧🇩 [bn](../../bn/docs/cloudflare-zero-trust-guide.md) · 🇨🇿 [cs](../../cs/docs/cloudflare-zero-trust-guide.md) · 🇩🇰 [da](../../da/docs/cloudflare-zero-trust-guide.md) · 🇩🇪 [de](../../de/docs/cloudflare-zero-trust-guide.md) · 🇪🇸 [es](../../es/docs/cloudflare-zero-trust-guide.md) · 🇮🇷 [fa](../../fa/docs/cloudflare-zero-trust-guide.md) · 🇫🇮 [fi](../../fi/docs/cloudflare-zero-trust-guide.md) · 🇫🇷 [fr](../../fr/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [gu](../../gu/docs/cloudflare-zero-trust-guide.md) · 🇮🇱 [he](../../he/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [hi](../../hi/docs/cloudflare-zero-trust-guide.md) · 🇭🇺 [hu](../../hu/docs/cloudflare-zero-trust-guide.md) · 🇮🇩 [id](../../id/docs/cloudflare-zero-trust-guide.md) · 🇮🇹 [it](../../it/docs/cloudflare-zero-trust-guide.md) · 🇯🇵 [ja](../../ja/docs/cloudflare-zero-trust-guide.md) · 🇰🇷 [ko](../../ko/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [mr](../../mr/docs/cloudflare-zero-trust-guide.md) · 🇲🇾 [ms](../../ms/docs/cloudflare-zero-trust-guide.md) · 🇳🇱 [nl](../../nl/docs/cloudflare-zero-trust-guide.md) · 🇳🇴 [no](../../no/docs/cloudflare-zero-trust-guide.md) · 🇵🇭 [phi](../../phi/docs/cloudflare-zero-trust-guide.md) · 🇵🇱 [pl](../../pl/docs/cloudflare-zero-trust-guide.md) · 🇵🇹 [pt](../../pt/docs/cloudflare-zero-trust-guide.md) · 🇧🇷 [pt-BR](../../pt-BR/docs/cloudflare-zero-trust-guide.md) · 🇷🇴 [ro](../../ro/docs/cloudflare-zero-trust-guide.md) · 🇷🇺 [ru](../../ru/docs/cloudflare-zero-trust-guide.md) · 🇸🇰 [sk](../../sk/docs/cloudflare-zero-trust-guide.md) · 🇸🇪 [sv](../../sv/docs/cloudflare-zero-trust-guide.md) · 🇰🇪 [sw](../../sw/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [ta](../../ta/docs/cloudflare-zero-trust-guide.md) · 🇮🇳 [te](../../te/docs/cloudflare-zero-trust-guide.md) · 🇹🇭 [th](../../th/docs/cloudflare-zero-trust-guide.md) · 🇹🇷 [tr](../../tr/docs/cloudflare-zero-trust-guide.md) · 🇺🇦 [uk-UA](../../uk-UA/docs/cloudflare-zero-trust-guide.md) · 🇵🇰 [ur](../../ur/docs/cloudflare-zero-trust-guide.md) · 🇻🇳 [vi](../../vi/docs/cloudflare-zero-trust-guide.md) · 🇨🇳 [zh-CN](../../zh-CN/docs/cloudflare-zero-trust-guide.md)
---
diff --git a/docs/i18n/zh-TW/docs/features/context-relay.md b/docs/i18n/zh-TW/docs/features/context-relay.md
index ef8809d28b..e61ccdc973 100644
--- a/docs/i18n/zh-TW/docs/features/context-relay.md
+++ b/docs/i18n/zh-TW/docs/features/context-relay.md
@@ -1,6 +1,6 @@
# Context Relay(繁體中文)
-🌐 **語言:** 🇺🇸 [English](../../../../../docs/features/context-relay.md) · 🇪🇸 [es](../../../es/docs/features/context-relay.md) · 🇫🇷 [fr](../../../fr/docs/features/context-relay.md) · 🇩🇪 [de](../../../de/docs/features/context-relay.md) · 🇮🇹 [it](../../../it/docs/features/context-relay.md) · 🇷🇺 [ru](../../../ru/docs/features/context-relay.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/features/context-relay.md) · 🇯🇵 [ja](../../../ja/docs/features/context-relay.md) · 🇰🇷 [ko](../../../ko/docs/features/context-relay.md) · 🇸🇦 [ar](../../../ar/docs/features/context-relay.md) · 🇮🇳 [hi](../../../hi/docs/features/context-relay.md) · 🇮🇳 [in](../../../in/docs/features/context-relay.md) · 🇹🇭 [th](../../../th/docs/features/context-relay.md) · 🇻🇳 [vi](../../../vi/docs/features/context-relay.md) · 🇮🇩 [id](../../../id/docs/features/context-relay.md) · 🇲🇾 [ms](../../../ms/docs/features/context-relay.md) · 🇳🇱 [nl](../../../nl/docs/features/context-relay.md) · 🇵🇱 [pl](../../../pl/docs/features/context-relay.md) · 🇸🇪 [sv](../../../sv/docs/features/context-relay.md) · 🇳🇴 [no](../../../no/docs/features/context-relay.md) · 🇩🇰 [da](../../../da/docs/features/context-relay.md) · 🇫🇮 [fi](../../../fi/docs/features/context-relay.md) · 🇵🇹 [pt](../../../pt/docs/features/context-relay.md) · 🇷🇴 [ro](../../../ro/docs/features/context-relay.md) · 🇭🇺 [hu](../../../hu/docs/features/context-relay.md) · 🇧🇬 [bg](../../../bg/docs/features/context-relay.md) · 🇸🇰 [sk](../../../sk/docs/features/context-relay.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/features/context-relay.md) · 🇮🇱 [he](../../../he/docs/features/context-relay.md) · 🇵🇭 [phi](../../../phi/docs/features/context-relay.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/features/context-relay.md) · 🇨🇿 [cs](../../../cs/docs/features/context-relay.md) · 🇹🇷 [tr](../../../tr/docs/features/context-relay.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../features/context-relay.md) · 🇸🇦 [ar](../../../ar/docs/features/context-relay.md) · 🇦🇿 [az](../../../az/docs/features/context-relay.md) · 🇧🇬 [bg](../../../bg/docs/features/context-relay.md) · 🇧🇩 [bn](../../../bn/docs/features/context-relay.md) · 🇨🇿 [cs](../../../cs/docs/features/context-relay.md) · 🇩🇰 [da](../../../da/docs/features/context-relay.md) · 🇩🇪 [de](../../../de/docs/features/context-relay.md) · 🇪🇸 [es](../../../es/docs/features/context-relay.md) · 🇮🇷 [fa](../../../fa/docs/features/context-relay.md) · 🇫🇮 [fi](../../../fi/docs/features/context-relay.md) · 🇫🇷 [fr](../../../fr/docs/features/context-relay.md) · 🇮🇳 [gu](../../../gu/docs/features/context-relay.md) · 🇮🇱 [he](../../../he/docs/features/context-relay.md) · 🇮🇳 [hi](../../../hi/docs/features/context-relay.md) · 🇭🇺 [hu](../../../hu/docs/features/context-relay.md) · 🇮🇩 [id](../../../id/docs/features/context-relay.md) · 🇮🇹 [it](../../../it/docs/features/context-relay.md) · 🇯🇵 [ja](../../../ja/docs/features/context-relay.md) · 🇰🇷 [ko](../../../ko/docs/features/context-relay.md) · 🇮🇳 [mr](../../../mr/docs/features/context-relay.md) · 🇲🇾 [ms](../../../ms/docs/features/context-relay.md) · 🇳🇱 [nl](../../../nl/docs/features/context-relay.md) · 🇳🇴 [no](../../../no/docs/features/context-relay.md) · 🇵🇭 [phi](../../../phi/docs/features/context-relay.md) · 🇵🇱 [pl](../../../pl/docs/features/context-relay.md) · 🇵🇹 [pt](../../../pt/docs/features/context-relay.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/features/context-relay.md) · 🇷🇴 [ro](../../../ro/docs/features/context-relay.md) · 🇷🇺 [ru](../../../ru/docs/features/context-relay.md) · 🇸🇰 [sk](../../../sk/docs/features/context-relay.md) · 🇸🇪 [sv](../../../sv/docs/features/context-relay.md) · 🇰🇪 [sw](../../../sw/docs/features/context-relay.md) · 🇮🇳 [ta](../../../ta/docs/features/context-relay.md) · 🇮🇳 [te](../../../te/docs/features/context-relay.md) · 🇹🇭 [th](../../../th/docs/features/context-relay.md) · 🇹🇷 [tr](../../../tr/docs/features/context-relay.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/features/context-relay.md) · 🇵🇰 [ur](../../../ur/docs/features/context-relay.md) · 🇻🇳 [vi](../../../vi/docs/features/context-relay.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/features/context-relay.md)
---
diff --git a/docs/i18n/zh-TW/docs/guides/CLI-INTEGRATIONS.md b/docs/i18n/zh-TW/docs/guides/CLI-INTEGRATIONS.md
index 1b19219987..926b56f8dd 100644
--- a/docs/i18n/zh-TW/docs/guides/CLI-INTEGRATIONS.md
+++ b/docs/i18n/zh-TW/docs/guides/CLI-INTEGRATIONS.md
@@ -1,6 +1,6 @@
# CLI-INTEGRATIONS (中文 (繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../../guides/CLI-INTEGRATIONS.md) · 🇸🇦 [ar](../../../ar/docs/guides/CLI-INTEGRATIONS.md) · 🇦🇿 [az](../../../az/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇬 [bg](../../../bg/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇩 [bn](../../../bn/docs/guides/CLI-INTEGRATIONS.md) · 🇨🇿 [cs](../../../cs/docs/guides/CLI-INTEGRATIONS.md) · 🇩🇰 [da](../../../da/docs/guides/CLI-INTEGRATIONS.md) · 🇩🇪 [de](../../../de/docs/guides/CLI-INTEGRATIONS.md) · 🇪🇸 [es](../../../es/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇷 [fa](../../../fa/docs/guides/CLI-INTEGRATIONS.md) · 🇫🇮 [fi](../../../fi/docs/guides/CLI-INTEGRATIONS.md) · 🇫🇷 [fr](../../../fr/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [gu](../../../gu/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇱 [he](../../../he/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [hi](../../../hi/docs/guides/CLI-INTEGRATIONS.md) · 🇭🇺 [hu](../../../hu/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇩 [id](../../../id/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇩 [in](../../../in/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇹 [it](../../../it/docs/guides/CLI-INTEGRATIONS.md) · 🇯🇵 [ja](../../../ja/docs/guides/CLI-INTEGRATIONS.md) · 🇰🇷 [ko](../../../ko/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [mr](../../../mr/docs/guides/CLI-INTEGRATIONS.md) · 🇲🇾 [ms](../../../ms/docs/guides/CLI-INTEGRATIONS.md) · 🇳🇱 [nl](../../../nl/docs/guides/CLI-INTEGRATIONS.md) · 🇳🇴 [no](../../../no/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇭 [phi](../../../phi/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇱 [pl](../../../pl/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇹 [pt](../../../pt/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/CLI-INTEGRATIONS.md) · 🇷🇴 [ro](../../../ro/docs/guides/CLI-INTEGRATIONS.md) · 🇷🇺 [ru](../../../ru/docs/guides/CLI-INTEGRATIONS.md) · 🇸🇰 [sk](../../../sk/docs/guides/CLI-INTEGRATIONS.md) · 🇸🇪 [sv](../../../sv/docs/guides/CLI-INTEGRATIONS.md) · 🇰🇪 [sw](../../../sw/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [ta](../../../ta/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [te](../../../te/docs/guides/CLI-INTEGRATIONS.md) · 🇹🇭 [th](../../../th/docs/guides/CLI-INTEGRATIONS.md) · 🇹🇷 [tr](../../../tr/docs/guides/CLI-INTEGRATIONS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇰 [ur](../../../ur/docs/guides/CLI-INTEGRATIONS.md) · 🇻🇳 [vi](../../../vi/docs/guides/CLI-INTEGRATIONS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/CLI-INTEGRATIONS.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/CLI-INTEGRATIONS.md) · 🇸🇦 [ar](../../../ar/docs/guides/CLI-INTEGRATIONS.md) · 🇦🇿 [az](../../../az/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇬 [bg](../../../bg/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇩 [bn](../../../bn/docs/guides/CLI-INTEGRATIONS.md) · 🇨🇿 [cs](../../../cs/docs/guides/CLI-INTEGRATIONS.md) · 🇩🇰 [da](../../../da/docs/guides/CLI-INTEGRATIONS.md) · 🇩🇪 [de](../../../de/docs/guides/CLI-INTEGRATIONS.md) · 🇪🇸 [es](../../../es/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇷 [fa](../../../fa/docs/guides/CLI-INTEGRATIONS.md) · 🇫🇮 [fi](../../../fi/docs/guides/CLI-INTEGRATIONS.md) · 🇫🇷 [fr](../../../fr/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [gu](../../../gu/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇱 [he](../../../he/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [hi](../../../hi/docs/guides/CLI-INTEGRATIONS.md) · 🇭🇺 [hu](../../../hu/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇩 [id](../../../id/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇹 [it](../../../it/docs/guides/CLI-INTEGRATIONS.md) · 🇯🇵 [ja](../../../ja/docs/guides/CLI-INTEGRATIONS.md) · 🇰🇷 [ko](../../../ko/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [mr](../../../mr/docs/guides/CLI-INTEGRATIONS.md) · 🇲🇾 [ms](../../../ms/docs/guides/CLI-INTEGRATIONS.md) · 🇳🇱 [nl](../../../nl/docs/guides/CLI-INTEGRATIONS.md) · 🇳🇴 [no](../../../no/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇭 [phi](../../../phi/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇱 [pl](../../../pl/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇹 [pt](../../../pt/docs/guides/CLI-INTEGRATIONS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/CLI-INTEGRATIONS.md) · 🇷🇴 [ro](../../../ro/docs/guides/CLI-INTEGRATIONS.md) · 🇷🇺 [ru](../../../ru/docs/guides/CLI-INTEGRATIONS.md) · 🇸🇰 [sk](../../../sk/docs/guides/CLI-INTEGRATIONS.md) · 🇸🇪 [sv](../../../sv/docs/guides/CLI-INTEGRATIONS.md) · 🇰🇪 [sw](../../../sw/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [ta](../../../ta/docs/guides/CLI-INTEGRATIONS.md) · 🇮🇳 [te](../../../te/docs/guides/CLI-INTEGRATIONS.md) · 🇹🇭 [th](../../../th/docs/guides/CLI-INTEGRATIONS.md) · 🇹🇷 [tr](../../../tr/docs/guides/CLI-INTEGRATIONS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/CLI-INTEGRATIONS.md) · 🇵🇰 [ur](../../../ur/docs/guides/CLI-INTEGRATIONS.md) · 🇻🇳 [vi](../../../vi/docs/guides/CLI-INTEGRATIONS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/CLI-INTEGRATIONS.md)
---
diff --git a/docs/i18n/zh-TW/docs/guides/FEATURES.md b/docs/i18n/zh-TW/docs/guides/FEATURES.md
index 27a556d073..88834e1de3 100644
--- a/docs/i18n/zh-TW/docs/guides/FEATURES.md
+++ b/docs/i18n/zh-TW/docs/guides/FEATURES.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute — 儀表板功能總覽
-🌐 **主要 README 翻譯:** 🇺🇸 [English](../README.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/README.md) | 🇪🇸 [Español](../i18n/es/README.md) | 🇫🇷 [Français](../i18n/fr/README.md) | 🇮🇹 [Italiano](../i18n/it/README.md) | 🇷🇺 [Русский](../i18n/ru/README.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/README.md) | 🇩🇪 [Deutsch](../i18n/de/README.md) | 🇮🇳 [हिन्दी](../i18n/in/README.md) | 🇹🇭 [ไทย](../i18n/th/README.md) | 🇺🇦 [Українська](../i18n/uk-UA/README.md) | 🇸🇦 [العربية](../i18n/ar/README.md) | 🇯🇵 [日本語](../i18n/ja/README.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/README.md) | 🇧🇬 [Български](../i18n/bg/README.md) | 🇩🇰 [Dansk](../i18n/da/README.md) | 🇫🇮 [Suomi](../i18n/fi/README.md) | 🇮🇱 [עברית](../i18n/he/README.md) | 🇭🇺 [Magyar](../i18n/hu/README.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/README.md) | 🇰🇷 [한국어](../i18n/ko/README.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/README.md) | 🇳🇱 [Nederlands](../i18n/nl/README.md) | 🇳🇴 [Norsk](../i18n/no/README.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/README.md) | 🇷🇴 [Română](../i18n/ro/README.md) | 🇵🇱 [Polski](../i18n/pl/README.md) | 🇸🇰 [Slovenčina](../i18n/sk/README.md) | 🇸🇪 [Svenska](../i18n/sv/README.md) | 🇵🇭 [Filipino](../i18n/phi/README.md) | 🇨🇿 [Čeština](../i18n/cs/README.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/FEATURES.md) · 🇸🇦 [ar](../../../ar/docs/guides/FEATURES.md) · 🇦🇿 [az](../../../az/docs/guides/FEATURES.md) · 🇧🇬 [bg](../../../bg/docs/guides/FEATURES.md) · 🇧🇩 [bn](../../../bn/docs/guides/FEATURES.md) · 🇨🇿 [cs](../../../cs/docs/guides/FEATURES.md) · 🇩🇰 [da](../../../da/docs/guides/FEATURES.md) · 🇩🇪 [de](../../../de/docs/guides/FEATURES.md) · 🇪🇸 [es](../../../es/docs/guides/FEATURES.md) · 🇮🇷 [fa](../../../fa/docs/guides/FEATURES.md) · 🇫🇮 [fi](../../../fi/docs/guides/FEATURES.md) · 🇫🇷 [fr](../../../fr/docs/guides/FEATURES.md) · 🇮🇳 [gu](../../../gu/docs/guides/FEATURES.md) · 🇮🇱 [he](../../../he/docs/guides/FEATURES.md) · 🇮🇳 [hi](../../../hi/docs/guides/FEATURES.md) · 🇭🇺 [hu](../../../hu/docs/guides/FEATURES.md) · 🇮🇩 [id](../../../id/docs/guides/FEATURES.md) · 🇮🇹 [it](../../../it/docs/guides/FEATURES.md) · 🇯🇵 [ja](../../../ja/docs/guides/FEATURES.md) · 🇰🇷 [ko](../../../ko/docs/guides/FEATURES.md) · 🇮🇳 [mr](../../../mr/docs/guides/FEATURES.md) · 🇲🇾 [ms](../../../ms/docs/guides/FEATURES.md) · 🇳🇱 [nl](../../../nl/docs/guides/FEATURES.md) · 🇳🇴 [no](../../../no/docs/guides/FEATURES.md) · 🇵🇭 [phi](../../../phi/docs/guides/FEATURES.md) · 🇵🇱 [pl](../../../pl/docs/guides/FEATURES.md) · 🇵🇹 [pt](../../../pt/docs/guides/FEATURES.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/FEATURES.md) · 🇷🇴 [ro](../../../ro/docs/guides/FEATURES.md) · 🇷🇺 [ru](../../../ru/docs/guides/FEATURES.md) · 🇸🇰 [sk](../../../sk/docs/guides/FEATURES.md) · 🇸🇪 [sv](../../../sv/docs/guides/FEATURES.md) · 🇰🇪 [sw](../../../sw/docs/guides/FEATURES.md) · 🇮🇳 [ta](../../../ta/docs/guides/FEATURES.md) · 🇮🇳 [te](../../../te/docs/guides/FEATURES.md) · 🇹🇭 [th](../../../th/docs/guides/FEATURES.md) · 🇹🇷 [tr](../../../tr/docs/guides/FEATURES.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/FEATURES.md) · 🇵🇰 [ur](../../../ur/docs/guides/FEATURES.md) · 🇻🇳 [vi](../../../vi/docs/guides/FEATURES.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/FEATURES.md)
OmniRoute 儀表板各區塊的視覺化導覽。
diff --git a/docs/i18n/zh-TW/docs/guides/I18N.md b/docs/i18n/zh-TW/docs/guides/I18N.md
index 29bd29be3b..b44034f38a 100644
--- a/docs/i18n/zh-TW/docs/guides/I18N.md
+++ b/docs/i18n/zh-TW/docs/guides/I18N.md
@@ -6,9 +6,9 @@ lastUpdated: 2026-06-28
# i18n — 國際化指南
-OmniRoute 支援 **43 種語言**,包含完整的儀表板 UI 翻譯、翻譯文件,以及阿拉伯語和希伯來語的 RTL(從右至左)支援。
+OmniRoute 支援 **42 種語言**,包含完整的儀表板 UI 翻譯、翻譯文件,以及阿拉伯語和希伯來語的 RTL(從右至左)支援。
-🌐 **語言:** 🇺🇸 [English](./I18N.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/guides/I18N.md) | 🇪🇸 [Español](../i18n/es/docs/guides/I18N.md) | 🇫🇷 [Français](../i18n/fr/docs/guides/I18N.md) | 🇩🇪 [Deutsch](../i18n/de/docs/guides/I18N.md) | 🇮🇹 [Italiano](../i18n/it/docs/guides/I18N.md) | 🇷🇺 [Русский](../i18n/ru/docs/guides/I18N.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/guides/I18N.md) | 🇯🇵 [日本語](../i18n/ja/docs/guides/I18N.md) | 🇰🇷 [한국어](../i18n/ko/docs/guides/I18N.md) | 🇸🇦 [العربية](../i18n/ar/docs/guides/I18N.md) | 🇮🇳 [हिन्दी](../i18n/hi/docs/guides/I18N.md) | 🇹🇭 [ไทย](../i18n/th/docs/guides/I18N.md) | 🇹🇷 [Türkçe](../i18n/tr/docs/guides/I18N.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/guides/I18N.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/guides/I18N.md) | 🇧🇬 [Български](../i18n/bg/docs/guides/I18N.md) | 🇩🇰 [Dansk](../i18n/da/docs/guides/I18N.md) | 🇫🇮 [Suomi](../i18n/fi/docs/guides/I18N.md) | 🇮🇱 [עברית](../i18n/he/docs/guides/I18N.md) | 🇭🇺 [Magyar](../i18n/hu/docs/guides/I18N.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/guides/I18N.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/guides/I18N.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/guides/I18N.md) | 🇳🇴 [Norsk](../i18n/no/docs/guides/I18N.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/guides/I18N.md) | 🇷🇴 [Română](../i18n/ro/docs/guides/I18N.md) | 🇵🇱 [Polski](../i18n/pl/docs/guides/I18N.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/guides/I18N.md) | 🇸🇪 [Svenska](../i18n/sv/docs/guides/I18N.md) | 🇵🇭 [Filipino](../i18n/phi/docs/guides/I18N.md) | 🇨🇿 [Čeština](../i18n/cs/docs/guides/I18N.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/I18N.md) · 🇸🇦 [ar](../../../ar/docs/guides/I18N.md) · 🇦🇿 [az](../../../az/docs/guides/I18N.md) · 🇧🇬 [bg](../../../bg/docs/guides/I18N.md) · 🇧🇩 [bn](../../../bn/docs/guides/I18N.md) · 🇨🇿 [cs](../../../cs/docs/guides/I18N.md) · 🇩🇰 [da](../../../da/docs/guides/I18N.md) · 🇩🇪 [de](../../../de/docs/guides/I18N.md) · 🇪🇸 [es](../../../es/docs/guides/I18N.md) · 🇮🇷 [fa](../../../fa/docs/guides/I18N.md) · 🇫🇮 [fi](../../../fi/docs/guides/I18N.md) · 🇫🇷 [fr](../../../fr/docs/guides/I18N.md) · 🇮🇳 [gu](../../../gu/docs/guides/I18N.md) · 🇮🇱 [he](../../../he/docs/guides/I18N.md) · 🇮🇳 [hi](../../../hi/docs/guides/I18N.md) · 🇭🇺 [hu](../../../hu/docs/guides/I18N.md) · 🇮🇩 [id](../../../id/docs/guides/I18N.md) · 🇮🇹 [it](../../../it/docs/guides/I18N.md) · 🇯🇵 [ja](../../../ja/docs/guides/I18N.md) · 🇰🇷 [ko](../../../ko/docs/guides/I18N.md) · 🇮🇳 [mr](../../../mr/docs/guides/I18N.md) · 🇲🇾 [ms](../../../ms/docs/guides/I18N.md) · 🇳🇱 [nl](../../../nl/docs/guides/I18N.md) · 🇳🇴 [no](../../../no/docs/guides/I18N.md) · 🇵🇭 [phi](../../../phi/docs/guides/I18N.md) · 🇵🇱 [pl](../../../pl/docs/guides/I18N.md) · 🇵🇹 [pt](../../../pt/docs/guides/I18N.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/I18N.md) · 🇷🇴 [ro](../../../ro/docs/guides/I18N.md) · 🇷🇺 [ru](../../../ru/docs/guides/I18N.md) · 🇸🇰 [sk](../../../sk/docs/guides/I18N.md) · 🇸🇪 [sv](../../../sv/docs/guides/I18N.md) · 🇰🇪 [sw](../../../sw/docs/guides/I18N.md) · 🇮🇳 [ta](../../../ta/docs/guides/I18N.md) · 🇮🇳 [te](../../../te/docs/guides/I18N.md) · 🇹🇭 [th](../../../th/docs/guides/I18N.md) · 🇹🇷 [tr](../../../tr/docs/guides/I18N.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/I18N.md) · 🇵🇰 [ur](../../../ur/docs/guides/I18N.md) · 🇻🇳 [vi](../../../vi/docs/guides/I18N.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/I18N.md)
## 翻譯管線(建議使用 — v3.8.0)
@@ -38,13 +38,13 @@ npm run i18n:check
**後端。** 透過環境變數設定(在 `.env` 中設定,切勿提交):
-| 變數 | 用途 |
-| ---------------------------------- | ------------------------------------- |
-| `OMNIROUTE_TRANSLATION_API_URL` | 與 OpenAI 相容的基礎 URL,例如 `…/v1` |
-| `OMNIROUTE_TRANSLATION_API_KEY` | Bearer 令牌(不會記錄在日誌中) |
-| `OMNIROUTE_TRANSLATION_MODEL` | 模型 ID,例如 `cx/gpt-5.4-mini` |
-| `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | 選用,預設 `60000` |
-| `OMNIROUTE_TRANSLATION_CONCURRENCY`| 選用,預設 `4` |
+| 變數 | 用途 |
+| ----------------------------------- | ------------------------------------- |
+| `OMNIROUTE_TRANSLATION_API_URL` | 與 OpenAI 相容的基礎 URL,例如 `…/v1` |
+| `OMNIROUTE_TRANSLATION_API_KEY` | Bearer 令牌(不會記錄在日誌中) |
+| `OMNIROUTE_TRANSLATION_MODEL` | 模型 ID,例如 `cx/gpt-5.4-mini` |
+| `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | 選用,預設 `60000` |
+| `OMNIROUTE_TRANSLATION_CONCURRENCY` | 選用,預設 `4` |
**狀態追蹤。** `.i18n-state.json`(已提交)會為每個來源 + 每個語系保留 SHA-256 雜湊值。漂移偵測是自動且確定性的 — `i18n:check` 不需要 API 呼叫。
@@ -56,15 +56,15 @@ npm run i18n:check
## 快速參考
-| 任務 | 指令 |
-| ------------------------ | ------------------------------------------------------------- |
-| 翻譯文件(LLM) | `npm run i18n:run`(建議使用 — 增量、基於雜湊) |
-| 翻譯 UI 字串 | `node scripts/i18n/generate-multilang.mjs messages` |
-| 檢查翻譯漂移 | `npm run i18n:check` |
-| 驗證語系 | `python3 scripts/i18n/validate_translation.py quick -l cs` |
-| 檢查程式碼按鍵 | `python3 scripts/i18n/check_translations.py` |
-| 產生 QA 報告 | `node scripts/i18n/generate-qa-checklist.mjs` |
-| 視覺 QA(Playwright) | `node scripts/i18n/run-visual-qa.mjs` |
+| 任務 | 指令 |
+| --------------------- | ---------------------------------------------------------- |
+| 翻譯文件(LLM) | `npm run i18n:run`(建議使用 — 增量、基於雜湊) |
+| 翻譯 UI 字串 | `node scripts/i18n/generate-multilang.mjs messages` |
+| 檢查翻譯漂移 | `npm run i18n:check` |
+| 驗證語系 | `python3 scripts/i18n/validate_translation.py quick -l cs` |
+| 檢查程式碼按鍵 | `python3 scripts/i18n/check_translations.py` |
+| 產生 QA 報告 | `node scripts/i18n/generate-qa-checklist.mjs` |
+| 視覺 QA(Playwright) | `node scripts/i18n/run-visual-qa.mjs` |
## 架構
@@ -88,40 +88,40 @@ npm run i18n:check
### 支援的語系
-| 代碼 | 語言 | RTL | Google 翻譯代碼 |
-| -------- | ---------------------- | --- | --------------- |
-| `ar` | العربية | 是 | `ar` |
-| `bg` | Български | 否 | `bg` |
-| `cs` | Čeština | 否 | `cs` |
-| `da` | Dansk | 否 | `da` |
-| `de` | Deutsch | 否 | `de` |
-| `es` | Español | 否 | `es` |
-| `fi` | Suomi | 否 | `fi` |
-| `fr` | Français | 否 | `fr` |
-| `he` | עברית | 是 | `iw` |
-| `hi` | हिन्दी | 否 | `hi` |
-| `hu` | Magyar | 否 | `hu` |
-| `id` | Bahasa Indonesia | 否 | `id` |
-| `it` | Italiano | 否 | `it` |
-| `ja` | 日本語 | 否 | `ja` |
-| `ko` | 한국어 | 否 | `ko` |
-| `ms` | Bahasa Melayu | 否 | `ms` |
-| `nl` | Nederlands | 否 | `nl` |
-| `no` | Norsk | 否 | `no` |
-| `phi` | Filipino | 否 | `tl` |
-| `pl` | Polski | 否 | `pl` |
-| `pt` | Português (Portugal) | 否 | `pt` |
-| `pt-BR` | Português (Brasil) | 否 | `pt` |
-| `ro` | Română | 否 | `ro` |
-| `ru` | Русский | 否 | `ru` |
-| `sk` | Slovenčina | 否 | `sk` |
-| `sv` | Svenska | 否 | `sv` |
-| `th` | ไทย | 否 | `th` |
-| `tr` | Türkçe | 否 | `tr` |
-| `uk-UA` | Українська | 否 | `uk` |
-| `vi` | Tiếng Việt | 否 | `vi` |
-| `zh-CN` | 中文 (简体) | 否 | `zh-CN` |
-| `zh-TW` | 中文 (繁體) | 否 | `zh-TW` |
+| 代碼 | 語言 | RTL | Google 翻譯代碼 |
+| ------- | -------------------- | --- | --------------- |
+| `ar` | العربية | 是 | `ar` |
+| `bg` | Български | 否 | `bg` |
+| `cs` | Čeština | 否 | `cs` |
+| `da` | Dansk | 否 | `da` |
+| `de` | Deutsch | 否 | `de` |
+| `es` | Español | 否 | `es` |
+| `fi` | Suomi | 否 | `fi` |
+| `fr` | Français | 否 | `fr` |
+| `he` | עברית | 是 | `iw` |
+| `hi` | हिन्दी | 否 | `hi` |
+| `hu` | Magyar | 否 | `hu` |
+| `id` | Bahasa Indonesia | 否 | `id` |
+| `it` | Italiano | 否 | `it` |
+| `ja` | 日本語 | 否 | `ja` |
+| `ko` | 한국어 | 否 | `ko` |
+| `ms` | Bahasa Melayu | 否 | `ms` |
+| `nl` | Nederlands | 否 | `nl` |
+| `no` | Norsk | 否 | `no` |
+| `phi` | Filipino | 否 | `tl` |
+| `pl` | Polski | 否 | `pl` |
+| `pt` | Português (Portugal) | 否 | `pt` |
+| `pt-BR` | Português (Brasil) | 否 | `pt` |
+| `ro` | Română | 否 | `ro` |
+| `ru` | Русский | 否 | `ru` |
+| `sk` | Slovenčina | 否 | `sk` |
+| `sv` | Svenska | 否 | `sv` |
+| `th` | ไทย | 否 | `th` |
+| `tr` | Türkçe | 否 | `tr` |
+| `uk-UA` | Українська | 否 | `uk` |
+| `vi` | Tiếng Việt | 否 | `vi` |
+| `zh-CN` | 中文 (简体) | 否 | `zh-CN` |
+| `zh-TW` | 中文 (繁體) | 否 | `zh-TW` |
## 新增語言
@@ -191,12 +191,12 @@ node scripts/i18n/generate-multilang.mjs docs
node scripts/i18n/generate-multilang.mjs [messages|readme|docs|all]
```
-| 模式 | 功能說明 |
-| ---------- | ------------------------------------------------------------------------------- |
-| `messages` | 從 `en.json` 翻譯 `src/i18n/messages/{locale}.json` 中遺漏的按鍵 |
-| `readme` | 將 `README.md` 翻譯為專案根目錄下的 `README.{code}.md` 所有語系版本 |
-| `docs` | 將 `DOC_SOURCE_FILES` 翻譯為 `docs/i18n/{locale}/{docName}` |
-| `all` | 執行上述三種模式 |
+| 模式 | 功能說明 |
+| ---------- | ------------------------------------------------------------------- |
+| `messages` | 從 `en.json` 翻譯 `src/i18n/messages/{locale}.json` 中遺漏的按鍵 |
+| `readme` | 將 `README.md` 翻譯為專案根目錄下的 `README.{code}.md` 所有語系版本 |
+| `docs` | 將 `DOC_SOURCE_FILES` 翻譯為 `docs/i18n/{locale}/{docName}` |
+| `all` | 執行上述三種模式 |
**功能特色:**
@@ -229,7 +229,7 @@ python3 scripts/i18n/i18n_autotranslate.py \
- 掃描 `docs/i18n/` 中的 Markdown 檔案以取得英文段落
- 略過程式碼區塊、表格和已翻譯的內容
- 將段落發送給 LLM,並附帶技術翻譯系統提示
-- 支援全部 43 種語言
+- 支援全部 42 種語言
## CLI i18n
@@ -238,7 +238,7 @@ python3 scripts/i18n/i18n_autotranslate.py \
### 運作方式
- CLI 指令中所有使用者可見的字串均透過 `t("module.key", vars)`(來自 `bin/cli/i18n.mjs`)處理
-- 語系目錄是 `bin/cli/locales/` 中的 JSON 檔案 — 內建 43 種語言
+- 語系目錄是 `bin/cli/locales/` 中的 JSON 檔案 — 內建 42 種語言
- 任何遺漏的按鍵都會自動回退到 `en`,因此部分翻譯仍然有效
- 可用語系的唯一真相來源是 `config/i18n.json`(與儀表板共用)
@@ -246,14 +246,14 @@ python3 scripts/i18n/i18n_autotranslate.py \
偵測順序(第一個符合者優先):
-| 優先順序 | 來源 | 範例 |
-| -------- | ------------------------ | ------------------------------------------ |
-| 1 | `--lang` 旗標 | `omniroute --lang de status` |
-| 2 | `OMNIROUTE_LANG` 環境變數| `OMNIROUTE_LANG=ja omniroute providers` |
-| 3 | `LC_ALL` 系統環境變數 | 自動從終端機語系偵測 |
-| 4 | `LC_MESSAGES` 系統環境變數| 自動從終端機語系偵測 |
-| 5 | `LANG` 系統環境變數 | 自動從終端機語系偵測 |
-| 6 | 備用 | `en` |
+| 優先順序 | 來源 | 範例 |
+| -------- | -------------------------- | --------------------------------------- |
+| 1 | `--lang` 旗標 | `omniroute --lang de status` |
+| 2 | `OMNIROUTE_LANG` 環境變數 | `OMNIROUTE_LANG=ja omniroute providers` |
+| 3 | `LC_ALL` 系統環境變數 | 自動從終端機語系偵測 |
+| 4 | `LC_MESSAGES` 系統環境變數 | 自動從終端機語系偵測 |
+| 5 | `LANG` 系統環境變數 | 自動從終端機語系偵測 |
+| 6 | 備用 | `en` |
底線形式的語系代碼(`pt_BR`)會標準化為連字號形式(`pt-BR`)。
語系代碼會經由 `/^[a-zA-Z0-9-]+$/` 驗證 — 拒絕路徑遍歷攻擊。
@@ -287,7 +287,7 @@ omniroute --lang de providers list
### 可用語系
-`bin/cli/locales/` 中內建 43 個語系檔案。完整翻譯:`en`、`pt-BR`。
+`bin/cli/locales/` 中內建 42 個語系檔案。完整翻譯:`en`、`pt-BR`。
僅有骨架(所有按鍵回退至 `en`):`bn`、`gu`、`he`、`in`、`mr`、`ms`、`phi`、`sw`、`ta`、`te`、`ur`。
其他 29 個語系均包含 `common` + `program` 按鍵的翻譯。
@@ -335,12 +335,12 @@ python3 scripts/i18n/validate_translation.py -l cs
**結束代碼:**
-| 代碼 | 含義 |
-| ---- | ----------------------------- |
-| 0 | 正常 |
-| 1 | 一般錯誤 |
-| 2 | 遺漏字串(嚴重錯誤) |
-| 3 | 未翻譯警告(軟性錯誤) |
+| 代碼 | 含義 |
+| ---- | ---------------------- |
+| 0 | 正常 |
+| 1 | 一般錯誤 |
+| 2 | 遺漏字串(嚴重錯誤) |
+| 3 | 未翻譯警告(軟性錯誤) |
**環境:** 設定 `TRANSLATION_LANG=cs` 或使用 `-l cs` 旗標。
diff --git a/docs/i18n/zh-TW/docs/guides/TROUBLESHOOTING.md b/docs/i18n/zh-TW/docs/guides/TROUBLESHOOTING.md
index 39a1e38812..e8ff1bbf11 100644
--- a/docs/i18n/zh-TW/docs/guides/TROUBLESHOOTING.md
+++ b/docs/i18n/zh-TW/docs/guides/TROUBLESHOOTING.md
@@ -8,7 +8,7 @@ lastUpdated: 2026-07-15
> **給使用者**:想要快速解決問題?請參考下方的[快速參考](#快速參考)。
-🌐 **語言:** 🇺🇸 [English](../../../../guides/TROUBLESHOOTING.md) | 🇧🇷 [Português (Brasil)](../../pt-BR/docs/guides/TROUBLESHOOTING.md) | 🇪🇸 [Español](../../es/docs/guides/TROUBLESHOOTING.md) | 🇫🇷 [Français](../../fr/docs/guides/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](../../it/docs/guides/TROUBLESHOOTING.md) | 🇷🇺 [Русский](../../ru/docs/guides/TROUBLESHOOTING.md) | 🇨🇳 [中文 (简体)](../../zh-CN/docs/guides/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](../../de/docs/guides/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](../../in/docs/guides/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](../../th/docs/guides/TROUBLESHOOTING.md) | 🇺🇦 [Українська](../../uk-UA/docs/guides/TROUBLESHOOTING.md) | 🇸🇦 [العربية](../../ar/docs/guides/TROUBLESHOOTING.md) | 🇯🇵 [日本語](../../ja/docs/guides/TROUBLESHOOTING.md) | 🇻🇳 [Tiếng Việt](../../vi/docs/guides/TROUBLESHOOTING.md) | 🇧🇬 [Български](../../bg/docs/guides/TROUBLESHOOTING.md) | 🇩🇰 [Dansk](../../da/docs/guides/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](../../fi/docs/guides/TROUBLESHOOTING.md) | 🇮🇱 [עברית](../../he/docs/guides/TROUBLESHOOTING.md) | 🇭🇺 [Magyar](../../hu/docs/guides/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonesia](../../id/docs/guides/TROUBLESHOOTING.md) | 🇰🇷 [한국어](../../ko/docs/guides/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](../../ms/docs/guides/TROUBLESHOOTING.md) | 🇳🇱 [Nederlands](../../nl/docs/guides/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](../../no/docs/guides/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugal)](../../pt/docs/guides/TROUBLESHOOTING.md) | 🇷🇴 [Română](../../ro/docs/guides/TROUBLESHOOTING.md) | 🇵🇱 [Polski](../../pl/docs/guides/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](../../sk/docs/guides/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](../../sv/docs/guides/TROUBLESHOOTING.md) | 🇵🇭 [Filipino](../../phi/docs/guides/TROUBLESHOOTING.md) | 🇨🇿 [Čeština](../../cs/docs/guides/TROUBLESHOOTING.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/TROUBLESHOOTING.md) · 🇸🇦 [ar](../../../ar/docs/guides/TROUBLESHOOTING.md) · 🇦🇿 [az](../../../az/docs/guides/TROUBLESHOOTING.md) · 🇧🇬 [bg](../../../bg/docs/guides/TROUBLESHOOTING.md) · 🇧🇩 [bn](../../../bn/docs/guides/TROUBLESHOOTING.md) · 🇨🇿 [cs](../../../cs/docs/guides/TROUBLESHOOTING.md) · 🇩🇰 [da](../../../da/docs/guides/TROUBLESHOOTING.md) · 🇩🇪 [de](../../../de/docs/guides/TROUBLESHOOTING.md) · 🇪🇸 [es](../../../es/docs/guides/TROUBLESHOOTING.md) · 🇮🇷 [fa](../../../fa/docs/guides/TROUBLESHOOTING.md) · 🇫🇮 [fi](../../../fi/docs/guides/TROUBLESHOOTING.md) · 🇫🇷 [fr](../../../fr/docs/guides/TROUBLESHOOTING.md) · 🇮🇳 [gu](../../../gu/docs/guides/TROUBLESHOOTING.md) · 🇮🇱 [he](../../../he/docs/guides/TROUBLESHOOTING.md) · 🇮🇳 [hi](../../../hi/docs/guides/TROUBLESHOOTING.md) · 🇭🇺 [hu](../../../hu/docs/guides/TROUBLESHOOTING.md) · 🇮🇩 [id](../../../id/docs/guides/TROUBLESHOOTING.md) · 🇮🇹 [it](../../../it/docs/guides/TROUBLESHOOTING.md) · 🇯🇵 [ja](../../../ja/docs/guides/TROUBLESHOOTING.md) · 🇰🇷 [ko](../../../ko/docs/guides/TROUBLESHOOTING.md) · 🇮🇳 [mr](../../../mr/docs/guides/TROUBLESHOOTING.md) · 🇲🇾 [ms](../../../ms/docs/guides/TROUBLESHOOTING.md) · 🇳🇱 [nl](../../../nl/docs/guides/TROUBLESHOOTING.md) · 🇳🇴 [no](../../../no/docs/guides/TROUBLESHOOTING.md) · 🇵🇭 [phi](../../../phi/docs/guides/TROUBLESHOOTING.md) · 🇵🇱 [pl](../../../pl/docs/guides/TROUBLESHOOTING.md) · 🇵🇹 [pt](../../../pt/docs/guides/TROUBLESHOOTING.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/TROUBLESHOOTING.md) · 🇷🇴 [ro](../../../ro/docs/guides/TROUBLESHOOTING.md) · 🇷🇺 [ru](../../../ru/docs/guides/TROUBLESHOOTING.md) · 🇸🇰 [sk](../../../sk/docs/guides/TROUBLESHOOTING.md) · 🇸🇪 [sv](../../../sv/docs/guides/TROUBLESHOOTING.md) · 🇰🇪 [sw](../../../sw/docs/guides/TROUBLESHOOTING.md) · 🇮🇳 [ta](../../../ta/docs/guides/TROUBLESHOOTING.md) · 🇮🇳 [te](../../../te/docs/guides/TROUBLESHOOTING.md) · 🇹🇭 [th](../../../th/docs/guides/TROUBLESHOOTING.md) · 🇹🇷 [tr](../../../tr/docs/guides/TROUBLESHOOTING.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/TROUBLESHOOTING.md) · 🇵🇰 [ur](../../../ur/docs/guides/TROUBLESHOOTING.md) · 🇻🇳 [vi](../../../vi/docs/guides/TROUBLESHOOTING.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/TROUBLESHOOTING.md)
OmniRoute 的常見問題與解決方案。
diff --git a/docs/i18n/zh-TW/docs/guides/UNINSTALL.md b/docs/i18n/zh-TW/docs/guides/UNINSTALL.md
index a1f93f9571..452d78d652 100644
--- a/docs/i18n/zh-TW/docs/guides/UNINSTALL.md
+++ b/docs/i18n/zh-TW/docs/guides/UNINSTALL.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute — 解除安裝指南
-🌐 **語言:** 🇺🇸 [English](./UNINSTALL.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/guides/UNINSTALL.md) | 🇪🇸 [Español](../i18n/es/docs/guides/UNINSTALL.md) | 🇫🇷 [Français](../i18n/fr/docs/guides/UNINSTALL.md) | 🇮🇹 [Italiano](../i18n/it/docs/guides/UNINSTALL.md) | 🇷🇺 [Русский](../i18n/ru/docs/guides/UNINSTALL.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/guides/UNINSTALL.md) | 🇩🇪 [Deutsch](../i18n/de/docs/guides/UNINSTALL.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/guides/UNINSTALL.md) | 🇹🇭 [ไทย](../i18n/th/docs/guides/UNINSTALL.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/guides/UNINSTALL.md) | 🇸🇦 [العربية](../i18n/ar/docs/guides/UNINSTALL.md) | 🇯🇵 [日本語](../i18n/ja/docs/guides/UNINSTALL.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/guides/UNINSTALL.md) | 🇧🇬 [Български](../i18n/bg/docs/guides/UNINSTALL.md) | 🇩🇰 [Dansk](../i18n/da/docs/guides/UNINSTALL.md) | 🇫🇮 [Suomi](../i18n/fi/docs/guides/UNINSTALL.md) | 🇮🇱 [עברית](../i18n/he/docs/guides/UNINSTALL.md) | 🇭🇺 [Magyar](../i18n/hu/docs/guides/UNINSTALL.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/guides/UNINSTALL.md) | 🇰🇷 [한국어](../i18n/ko/docs/guides/UNINSTALL.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/guides/UNINSTALL.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/guides/UNINSTALL.md) | 🇳🇴 [Norsk](../i18n/no/docs/guides/UNINSTALL.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/guides/UNINSTALL.md) | 🇷🇴 [Română](../i18n/ro/docs/guides/UNINSTALL.md) | 🇵🇱 [Polski](../i18n/pl/docs/guides/UNINSTALL.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/guides/UNINSTALL.md) | 🇸🇪 [Svenska](../i18n/sv/docs/guides/UNINSTALL.md) | 🇵🇭 [Filipino](../i18n/phi/docs/guides/UNINSTALL.md) | 🇨🇿 [Čeština](../i18n/cs/docs/guides/UNINSTALL.md) | 🇹🇼 [繁體中文 (臺灣)](../i18n/zh-TW/docs/guides/UNINSTALL.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/UNINSTALL.md) · 🇸🇦 [ar](../../../ar/docs/guides/UNINSTALL.md) · 🇦🇿 [az](../../../az/docs/guides/UNINSTALL.md) · 🇧🇬 [bg](../../../bg/docs/guides/UNINSTALL.md) · 🇧🇩 [bn](../../../bn/docs/guides/UNINSTALL.md) · 🇨🇿 [cs](../../../cs/docs/guides/UNINSTALL.md) · 🇩🇰 [da](../../../da/docs/guides/UNINSTALL.md) · 🇩🇪 [de](../../../de/docs/guides/UNINSTALL.md) · 🇪🇸 [es](../../../es/docs/guides/UNINSTALL.md) · 🇮🇷 [fa](../../../fa/docs/guides/UNINSTALL.md) · 🇫🇮 [fi](../../../fi/docs/guides/UNINSTALL.md) · 🇫🇷 [fr](../../../fr/docs/guides/UNINSTALL.md) · 🇮🇳 [gu](../../../gu/docs/guides/UNINSTALL.md) · 🇮🇱 [he](../../../he/docs/guides/UNINSTALL.md) · 🇮🇳 [hi](../../../hi/docs/guides/UNINSTALL.md) · 🇭🇺 [hu](../../../hu/docs/guides/UNINSTALL.md) · 🇮🇩 [id](../../../id/docs/guides/UNINSTALL.md) · 🇮🇹 [it](../../../it/docs/guides/UNINSTALL.md) · 🇯🇵 [ja](../../../ja/docs/guides/UNINSTALL.md) · 🇰🇷 [ko](../../../ko/docs/guides/UNINSTALL.md) · 🇮🇳 [mr](../../../mr/docs/guides/UNINSTALL.md) · 🇲🇾 [ms](../../../ms/docs/guides/UNINSTALL.md) · 🇳🇱 [nl](../../../nl/docs/guides/UNINSTALL.md) · 🇳🇴 [no](../../../no/docs/guides/UNINSTALL.md) · 🇵🇭 [phi](../../../phi/docs/guides/UNINSTALL.md) · 🇵🇱 [pl](../../../pl/docs/guides/UNINSTALL.md) · 🇵🇹 [pt](../../../pt/docs/guides/UNINSTALL.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/UNINSTALL.md) · 🇷🇴 [ro](../../../ro/docs/guides/UNINSTALL.md) · 🇷🇺 [ru](../../../ru/docs/guides/UNINSTALL.md) · 🇸🇰 [sk](../../../sk/docs/guides/UNINSTALL.md) · 🇸🇪 [sv](../../../sv/docs/guides/UNINSTALL.md) · 🇰🇪 [sw](../../../sw/docs/guides/UNINSTALL.md) · 🇮🇳 [ta](../../../ta/docs/guides/UNINSTALL.md) · 🇮🇳 [te](../../../te/docs/guides/UNINSTALL.md) · 🇹🇭 [th](../../../th/docs/guides/UNINSTALL.md) · 🇹🇷 [tr](../../../tr/docs/guides/UNINSTALL.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/UNINSTALL.md) · 🇵🇰 [ur](../../../ur/docs/guides/UNINSTALL.md) · 🇻🇳 [vi](../../../vi/docs/guides/UNINSTALL.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/UNINSTALL.md)
本指南說明如何從系統中徹底移除 OmniRoute。
diff --git a/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md b/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md
index 64639e329d..2e8f9759f6 100644
--- a/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md
+++ b/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# 使用者指南
-🌐 **語言:** 🇺🇸 [English](./USER_GUIDE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/guides/USER_GUIDE.md) | 🇪🇸 [Español](../i18n/es/docs/guides/USER_GUIDE.md) | 🇫🇷 [Français](../i18n/fr/docs/guides/USER_GUIDE.md) | 🇮🇹 [Italiano](../i18n/it/docs/guides/USER_GUIDE.md) | 🇷🇺 [Русский](../i18n/ru/docs/guides/USER_GUIDE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/guides/USER_GUIDE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/guides/USER_GUIDE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/guides/USER_GUIDE.md) | 🇹🇭 [ไทย](../i18n/th/docs/guides/USER_GUIDE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/guides/USER_GUIDE.md) | 🇸🇦 [العربية](../i18n/ar/docs/guides/USER_GUIDE.md) | 🇯🇵 [日本語](../i18n/ja/docs/guides/USER_GUIDE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/guides/USER_GUIDE.md) | 🇧🇬 [Български](../i18n/bg/docs/guides/USER_GUIDE.md) | 🇩🇰 [Dansk](../i18n/da/docs/guides/USER_GUIDE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/guides/USER_GUIDE.md) | 🇮🇱 [עברית](../i18n/he/docs/guides/USER_GUIDE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/guides/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/guides/USER_GUIDE.md) | 🇰🇷 [한국어](../i18n/ko/docs/guides/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/guides/USER_GUIDE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/guides/USER_GUIDE.md) | 🇳🇴 [Norsk](../i18n/no/docs/guides/USER_GUIDE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/guides/USER_GUIDE.md) | 🇷🇴 [Română](../i18n/ro/docs/guides/USER_GUIDE.md) | 🇵🇱 [Polski](../i18n/pl/docs/guides/USER_GUIDE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/guides/USER_GUIDE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/guides/USER_GUIDE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/guides/USER_GUIDE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/guides/USER_GUIDE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../guides/USER_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/guides/USER_GUIDE.md) · 🇦🇿 [az](../../../az/docs/guides/USER_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/guides/USER_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/guides/USER_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/guides/USER_GUIDE.md) · 🇩🇰 [da](../../../da/docs/guides/USER_GUIDE.md) · 🇩🇪 [de](../../../de/docs/guides/USER_GUIDE.md) · 🇪🇸 [es](../../../es/docs/guides/USER_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/guides/USER_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/guides/USER_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/guides/USER_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/guides/USER_GUIDE.md) · 🇮🇱 [he](../../../he/docs/guides/USER_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/guides/USER_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/guides/USER_GUIDE.md) · 🇮🇩 [id](../../../id/docs/guides/USER_GUIDE.md) · 🇮🇹 [it](../../../it/docs/guides/USER_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/guides/USER_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/guides/USER_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/guides/USER_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/guides/USER_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/guides/USER_GUIDE.md) · 🇳🇴 [no](../../../no/docs/guides/USER_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/guides/USER_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/guides/USER_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/guides/USER_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/USER_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/guides/USER_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/guides/USER_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/guides/USER_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/guides/USER_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/guides/USER_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/guides/USER_GUIDE.md) · 🇮🇳 [te](../../../te/docs/guides/USER_GUIDE.md) · 🇹🇭 [th](../../../th/docs/guides/USER_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/guides/USER_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/USER_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/guides/USER_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/guides/USER_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/USER_GUIDE.md)
設定提供者、建立組合、整合 CLI 工具及部署 OmniRoute 的完整指南。
@@ -35,27 +35,27 @@ lastUpdated: 2026-06-28
## 💰 價錢一覽
-| 方案 | 提供者 | 費用 | 額度重置 | 最適合 |
-| --------------- | ----------------- | ---------- | -------------- | ------------------ |
-| **💳 訂閱制** | Claude Code (Pro) | $20/月 | 5 小時 + 每週 | 已訂閱使用者 |
-| | Codex (Plus/Pro) | $20-200/月 | 5 小時 + 每週 | OpenAI 使用者 |
-| | GitHub Copilot | $10-19/月 | 每月 | GitHub 使用者 |
-| **🔑 API 金鑰** | DeepSeek | 按用量計費 | 無 | 便宜的推理模型 |
-| | Groq | 按用量計費 | 無 | 超快速推論 |
-| | xAI (Grok) | 按用量計費 | 無 | Grok 4 推理 |
-| | Mistral | 按用量計費 | 無 | 歐盟託管模型 |
-| | Perplexity | 按用量計費 | 無 | 結合搜尋功能 |
-| | Together AI | 按用量計費 | 無 | 開源模型 |
-| | Fireworks AI | 按用量計費 | 無 | 快速 FLUX 圖片生成 |
-| | Cerebras | 按用量計費 | 無 | 晶圓級速度 |
-| | Cohere | 按用量計費 | 無 | Command R+ RAG |
-| | NVIDIA NIM | 按用量計費 | 無 | 企業級模型 |
-| | Baidu Qianfan | 按用量計費 | 無 | ERNIE 模型 |
-| **💰 便宜方案** | GLM-4.7 | $0.6/百萬 | 每日上午 10 點 | 預算備用 |
-| | MiniMax M2.1 | $0.2/百萬 | 5 小時滾動 | 最便宜的選擇 |
-| | Kimi K2 | $9/月固定 | 每月 1,000 萬 | 可預測成本 |
-| **🆓 免費方案** | Qoder | $0 | 未公布 Token 上限;仍有提供者限制 | 8 個模型免費 |
-| | Kiro | $0 | 約 50 點/月 | Claude 免費使用 |
+| 方案 | 提供者 | 費用 | 額度重置 | 最適合 |
+| --------------- | ----------------- | ---------- | --------------------------------- | ------------------ |
+| **💳 訂閱制** | Claude Code (Pro) | $20/月 | 5 小時 + 每週 | 已訂閱使用者 |
+| | Codex (Plus/Pro) | $20-200/月 | 5 小時 + 每週 | OpenAI 使用者 |
+| | GitHub Copilot | $10-19/月 | 每月 | GitHub 使用者 |
+| **🔑 API 金鑰** | DeepSeek | 按用量計費 | 無 | 便宜的推理模型 |
+| | Groq | 按用量計費 | 無 | 超快速推論 |
+| | xAI (Grok) | 按用量計費 | 無 | Grok 4 推理 |
+| | Mistral | 按用量計費 | 無 | 歐盟託管模型 |
+| | Perplexity | 按用量計費 | 無 | 結合搜尋功能 |
+| | Together AI | 按用量計費 | 無 | 開源模型 |
+| | Fireworks AI | 按用量計費 | 無 | 快速 FLUX 圖片生成 |
+| | Cerebras | 按用量計費 | 無 | 晶圓級速度 |
+| | Cohere | 按用量計費 | 無 | Command R+ RAG |
+| | NVIDIA NIM | 按用量計費 | 無 | 企業級模型 |
+| | Baidu Qianfan | 按用量計費 | 無 | ERNIE 模型 |
+| **💰 便宜方案** | GLM-4.7 | $0.6/百萬 | 每日上午 10 點 | 預算備用 |
+| | MiniMax M2.1 | $0.2/百萬 | 5 小時滾動 | 最便宜的選擇 |
+| | Kimi K2 | $9/月固定 | 每月 1,000 萬 | 可預測成本 |
+| **🆓 免費方案** | Qoder | $0 | 未公布 Token 上限;仍有提供者限制 | 8 個模型免費 |
+| | Kiro | $0 | 約 50 點/月 | Claude 免費使用 |
---
diff --git a/docs/i18n/zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md b/docs/i18n/zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md
index 9ffa135615..c5d4f04892 100644
--- a/docs/i18n/zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md
+++ b/docs/i18n/zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute Fly.io 部署指南(繁體中文)
-🌐 **語言:** 🇺🇸 [English](../../../../docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../ar/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../bg/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../bn/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../cs/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../da/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../de/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../es/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../fa/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../fi/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../fr/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../gu/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../he/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../hi/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../hu/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../id/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../it/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../ja/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../ko/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../mr/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../ms/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../nl/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../no/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../phi/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../pl/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../pt/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../pt-BR/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../ro/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../ru/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../sk/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../sv/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../sw/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../ta/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../te/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../th/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../tr/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../uk-UA/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../ur/docs/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../zh-CN/docs/FLY_IO_DEPLOYMENT_GUIDE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md)
本文件說明 OmniRoute 在 Fly.io 上的實際部署流程,涵蓋兩種情境:
diff --git a/docs/i18n/zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md b/docs/i18n/zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md
index 3ddd132bab..aec32717d7 100644
--- a/docs/i18n/zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md
+++ b/docs/i18n/zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute — VM 部署指南(搭配 Cloudflare)
-🌐 **語言:** 🇺🇸 [English](./VM_DEPLOYMENT_GUIDE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇪🇸 [Español](../i18n/es/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇷 [Français](../i18n/fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇹 [Italiano](../i18n/it/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇺 [Русский](../i18n/ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇭 [ไทย](../i18n/th/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇦 [العربية](../i18n/ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇯🇵 [日本語](../i18n/ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇧🇬 [Български](../i18n/bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇰 [Dansk](../i18n/da/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇱 [עברית](../i18n/he/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇰🇷 [한국어](../i18n/ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇴 [Norsk](../i18n/no/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇴 [Română](../i18n/ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇱 [Polski](../i18n/pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇼 [繁體中文](./VM_DEPLOYMENT_GUIDE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md)
在 VM(VPS)上安裝並設定 OmniRoute 的完整指南,搭配經由 Cloudflare 管理的網域。
diff --git a/docs/i18n/zh-TW/docs/reference/API_REFERENCE.md b/docs/i18n/zh-TW/docs/reference/API_REFERENCE.md
index 0fc570e1d8..7cb94a693b 100644
--- a/docs/i18n/zh-TW/docs/reference/API_REFERENCE.md
+++ b/docs/i18n/zh-TW/docs/reference/API_REFERENCE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# API 參考
-🌐 **語言:** 🇺🇸 [English](./API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/reference/API_REFERENCE.md) | 🇪🇸 [Español](../i18n/es/docs/reference/API_REFERENCE.md) | 🇫🇷 [Français](../i18n/fr/docs/reference/API_REFERENCE.md) | 🇮🇹 [Italiano](../i18n/it/docs/reference/API_REFERENCE.md) | 🇷🇺 [Русский](../i18n/ru/docs/reference/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/reference/API_REFERENCE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/reference/API_REFERENCE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/reference/API_REFERENCE.md) | 🇹🇭 [ไทย](../i18n/th/docs/reference/API_REFERENCE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/reference/API_REFERENCE.md) | 🇸🇦 [العربية](../i18n/ar/docs/reference/API_REFERENCE.md) | 🇯🇵 [日本語](../i18n/ja/docs/reference/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/reference/API_REFERENCE.md) | 🇧🇬 [Български](../i18n/bg/docs/reference/API_REFERENCE.md) | 🇩🇰 [Dansk](../i18n/da/docs/reference/API_REFERENCE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/reference/API_REFERENCE.md) | 🇮🇱 [עברית](../i18n/he/docs/reference/API_REFERENCE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/reference/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/reference/API_REFERENCE.md) | 🇰🇷 [한국어](../i18n/ko/docs/reference/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/reference/API_REFERENCE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/reference/API_REFERENCE.md) | 🇳🇴 [Norsk](../i18n/no/docs/reference/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/reference/API_REFERENCE.md) | 🇷🇴 [Română](../i18n/ro/docs/reference/API_REFERENCE.md) | 🇵🇱 [Polski](../i18n/pl/docs/reference/API_REFERENCE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/reference/API_REFERENCE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/reference/API_REFERENCE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/reference/API_REFERENCE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/reference/API_REFERENCE.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../reference/API_REFERENCE.md) · 🇸🇦 [ar](../../../ar/docs/reference/API_REFERENCE.md) · 🇦🇿 [az](../../../az/docs/reference/API_REFERENCE.md) · 🇧🇬 [bg](../../../bg/docs/reference/API_REFERENCE.md) · 🇧🇩 [bn](../../../bn/docs/reference/API_REFERENCE.md) · 🇨🇿 [cs](../../../cs/docs/reference/API_REFERENCE.md) · 🇩🇰 [da](../../../da/docs/reference/API_REFERENCE.md) · 🇩🇪 [de](../../../de/docs/reference/API_REFERENCE.md) · 🇪🇸 [es](../../../es/docs/reference/API_REFERENCE.md) · 🇮🇷 [fa](../../../fa/docs/reference/API_REFERENCE.md) · 🇫🇮 [fi](../../../fi/docs/reference/API_REFERENCE.md) · 🇫🇷 [fr](../../../fr/docs/reference/API_REFERENCE.md) · 🇮🇳 [gu](../../../gu/docs/reference/API_REFERENCE.md) · 🇮🇱 [he](../../../he/docs/reference/API_REFERENCE.md) · 🇮🇳 [hi](../../../hi/docs/reference/API_REFERENCE.md) · 🇭🇺 [hu](../../../hu/docs/reference/API_REFERENCE.md) · 🇮🇩 [id](../../../id/docs/reference/API_REFERENCE.md) · 🇮🇹 [it](../../../it/docs/reference/API_REFERENCE.md) · 🇯🇵 [ja](../../../ja/docs/reference/API_REFERENCE.md) · 🇰🇷 [ko](../../../ko/docs/reference/API_REFERENCE.md) · 🇮🇳 [mr](../../../mr/docs/reference/API_REFERENCE.md) · 🇲🇾 [ms](../../../ms/docs/reference/API_REFERENCE.md) · 🇳🇱 [nl](../../../nl/docs/reference/API_REFERENCE.md) · 🇳🇴 [no](../../../no/docs/reference/API_REFERENCE.md) · 🇵🇭 [phi](../../../phi/docs/reference/API_REFERENCE.md) · 🇵🇱 [pl](../../../pl/docs/reference/API_REFERENCE.md) · 🇵🇹 [pt](../../../pt/docs/reference/API_REFERENCE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/API_REFERENCE.md) · 🇷🇴 [ro](../../../ro/docs/reference/API_REFERENCE.md) · 🇷🇺 [ru](../../../ru/docs/reference/API_REFERENCE.md) · 🇸🇰 [sk](../../../sk/docs/reference/API_REFERENCE.md) · 🇸🇪 [sv](../../../sv/docs/reference/API_REFERENCE.md) · 🇰🇪 [sw](../../../sw/docs/reference/API_REFERENCE.md) · 🇮🇳 [ta](../../../ta/docs/reference/API_REFERENCE.md) · 🇮🇳 [te](../../../te/docs/reference/API_REFERENCE.md) · 🇹🇭 [th](../../../th/docs/reference/API_REFERENCE.md) · 🇹🇷 [tr](../../../tr/docs/reference/API_REFERENCE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/API_REFERENCE.md) · 🇵🇰 [ur](../../../ur/docs/reference/API_REFERENCE.md) · 🇻🇳 [vi](../../../vi/docs/reference/API_REFERENCE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/API_REFERENCE.md)
所有 OmniRoute API 端點的完整參考資料。
@@ -61,23 +61,23 @@ Content-Type: application/json
### 自訂標頭
-| 標頭 | 方向 | 說明 |
-| ------------------------------ | -------- | --------------------------------------------------------------------------------------------- |
-| `X-OmniRoute-No-Cache` | 請求 | 設為 `true` 以略過快取 |
-| `x-omniroute-no-memory` | 請求 | 設為 `true` 以跳過此請求的記憶與技能注入(等同於 no-cache;避免每次呼叫的權杖/成本開銷) |
-| `X-OmniRoute-Progress` | 請求 | 設為 `true` 以取得進度事件 |
-| `X-Session-Id` | 請求 | 用於外部工作階段親和性的黏性工作階段金鑰 |
-| `x_session_id` | 請求 | 也接受底線變體(直接 HTTP) |
-| `Idempotency-Key` | 請求 | 去重金鑰(5 秒窗口) |
-| `X-Request-Id` | 請求 | 替代去重金鑰 |
-| `X-OmniRoute-Cache` | 回應 | `HIT` 或 `MISS`(非串流) |
-| `X-OmniRoute-Idempotent` | 回應 | `true` 表示已去重 |
-| `X-OmniRoute-Progress` | 回應 | `enabled` 表示進度追蹤已啟用 |
-| `X-OmniRoute-Session-Id` | 回應 | OmniRoute 使用的有效工作階段 ID |
-| `X-OmniRoute-Request-Id` | 回應 | 請求關聯 ID(已知時) |
-| `X-OmniRoute-Version` | 回應 | OmniRoute 建置版本(始終存在) |
-| `X-OmniRoute-Cost-Saved` | 回應 | 快取命中避免的美金成本(僅限快取命中) |
-| `X-OmniRoute-Decision` | 回應 | 路由追蹤:`strategy=<名稱>; provider=<別名>; latency_ms=`(`<名稱>` 為組合策略,非組合請求則為 `single`)—— 完成回應時始終存在 |
+| 標頭 | 方向 | 說明 |
+| ------------------------ | ---- | --------------------------------------------------------------------------------------------------------------------------------- |
+| `X-OmniRoute-No-Cache` | 請求 | 設為 `true` 以略過快取 |
+| `x-omniroute-no-memory` | 請求 | 設為 `true` 以跳過此請求的記憶與技能注入(等同於 no-cache;避免每次呼叫的權杖/成本開銷) |
+| `X-OmniRoute-Progress` | 請求 | 設為 `true` 以取得進度事件 |
+| `X-Session-Id` | 請求 | 用於外部工作階段親和性的黏性工作階段金鑰 |
+| `x_session_id` | 請求 | 也接受底線變體(直接 HTTP) |
+| `Idempotency-Key` | 請求 | 去重金鑰(5 秒窗口) |
+| `X-Request-Id` | 請求 | 替代去重金鑰 |
+| `X-OmniRoute-Cache` | 回應 | `HIT` 或 `MISS`(非串流) |
+| `X-OmniRoute-Idempotent` | 回應 | `true` 表示已去重 |
+| `X-OmniRoute-Progress` | 回應 | `enabled` 表示進度追蹤已啟用 |
+| `X-OmniRoute-Session-Id` | 回應 | OmniRoute 使用的有效工作階段 ID |
+| `X-OmniRoute-Request-Id` | 回應 | 請求關聯 ID(已知時) |
+| `X-OmniRoute-Version` | 回應 | OmniRoute 建置版本(始終存在) |
+| `X-OmniRoute-Cost-Saved` | 回應 | 快取命中避免的美金成本(僅限快取命中) |
+| `X-OmniRoute-Decision` | 回應 | 路由追蹤:`strategy=<名稱>; provider=<別名>; latency_ms=`(`<名稱>` 為組合策略,非組合請求則為 `single`)—— 完成回應時始終存在 |
> Nginx 注意:如果您依賴底線標頭(例如 `x_session_id`),請啟用 `underscores_in_headers on;`。
@@ -89,12 +89,12 @@ Content-Type: application/json
按請求覆寫壓縮方案。最高優先順序 — 勝過路由組合覆寫、作用中設定檔、自動觸發和面板預設。值:
-| 值 | 效果 |
-| --------------- | -------------------------------------------------------- |
-| `off` | 此請求不進行壓縮。 |
-| `default` | 面板衍生的 Default 設定檔(忽略作用中設定檔)。 |
-| `engine:` | 啟用時的單一引擎,例如 `engine:rtk`。 |
-| `` | 具名組合,先按名稱(不區分大小寫)比對,再按 ID 比對。 |
+| 值 | 效果 |
+| ------------- | ------------------------------------------------------ |
+| `off` | 此請求不進行壓縮。 |
+| `default` | 面板衍生的 Default 設定檔(忽略作用中設定檔)。 |
+| `engine:` | 啟用時的單一引擎,例如 `engine:rtk`。 |
+| `` | 具名組合,先按名稱(不區分大小寫)比對,再按 ID 比對。 |
備註:
@@ -193,31 +193,31 @@ GET /api/v1/provider-plugin-manifest
## 相容性端點
-| 方法 | 路徑 | 格式 |
-| ------ | ---------------------------------------- | -------------------------------- |
-| POST | `/v1/chat/completions` | OpenAI |
-| POST | `/v1/messages` | Anthropic |
-| POST | `/v1/responses` | OpenAI Responses |
-| POST | `/v1/embeddings` | OpenAI |
-| POST | `/v1/images/generations` | OpenAI Images |
-| POST | `/v1/images/edits` | OpenAI Images(編輯/修補) |
-| POST | `/v1/videos/generations` | OpenAI 樣式影片生成 |
-| POST | `/v1/music/generations` | OpenAI 樣式音樂生成 |
-| POST | `/v1/audio/transcriptions` | OpenAI Audio(STT) |
-| POST | `/v1/audio/speech` | OpenAI TTS(回傳音訊主體) |
-| POST | `/v1/rerank` | Cohere/Voyage 樣式重新排序 |
-| POST | `/v1/moderations` | OpenAI 審核 |
-| GET | `/v1/models` | OpenAI |
-| POST | `/v1/messages/count_tokens` | Anthropic |
-| GET | `/v1beta/models` | Gemini |
-| POST | `/v1beta/models/{...path}` | Gemini generateContent |
-| POST | `/v1/api/chat` | Ollama |
-| GET | `/api/v1/vscode/{token}/` | OpenAI 目錄別名 |
-| GET | `/api/v1/vscode/{token}/models` | OpenAI 模型別名 |
-| POST | `/api/v1/vscode/{token}/chat/completions`| OpenAI 權杖化別名 |
-| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses 權杖化別名 |
-| POST | `/api/v1/vscode/{token}/api/chat` | Ollama 權杖化別名 |
-| GET | `/api/v1/vscode/{token}/api/tags` | Ollama 標籤權杖化別名 |
+| 方法 | 路徑 | 格式 |
+| ---- | ----------------------------------------- | --------------------------- |
+| POST | `/v1/chat/completions` | OpenAI |
+| POST | `/v1/messages` | Anthropic |
+| POST | `/v1/responses` | OpenAI Responses |
+| POST | `/v1/embeddings` | OpenAI |
+| POST | `/v1/images/generations` | OpenAI Images |
+| POST | `/v1/images/edits` | OpenAI Images(編輯/修補) |
+| POST | `/v1/videos/generations` | OpenAI 樣式影片生成 |
+| POST | `/v1/music/generations` | OpenAI 樣式音樂生成 |
+| POST | `/v1/audio/transcriptions` | OpenAI Audio(STT) |
+| POST | `/v1/audio/speech` | OpenAI TTS(回傳音訊主體) |
+| POST | `/v1/rerank` | Cohere/Voyage 樣式重新排序 |
+| POST | `/v1/moderations` | OpenAI 審核 |
+| GET | `/v1/models` | OpenAI |
+| POST | `/v1/messages/count_tokens` | Anthropic |
+| GET | `/v1beta/models` | Gemini |
+| POST | `/v1beta/models/{...path}` | Gemini generateContent |
+| POST | `/v1/api/chat` | Ollama |
+| GET | `/api/v1/vscode/{token}/` | OpenAI 目錄別名 |
+| GET | `/api/v1/vscode/{token}/models` | OpenAI 模型別名 |
+| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI 權杖化別名 |
+| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses 權杖化別名 |
+| POST | `/api/v1/vscode/{token}/api/chat` | Ollama 權杖化別名 |
+| GET | `/api/v1/vscode/{token}/api/tags` | Ollama 標籤權杖化別名 |
所有 POST 路由遵循相同格式:`Bearer your-api-key` + Zod 驗證的 JSON 主體(`v1RerankSchema`、`v1ModerationSchema`、`v1AudioSpeechSchema` 等,請參閱 `src/shared/validation/schemas.ts`)。結構描述失敗時會回傳 4xx。
@@ -257,13 +257,13 @@ POST /v1/providers/{provider}/images/generations
OpenAI 相容的檔案端點,用於批次輸入/輸出和檔案用途上傳。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------ | --------------------------------------------------------------------------------------------- |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------ | --------------------------------------------------------------------------------------------------------- |
| POST | `/v1/files` | 上傳檔案(multipart:`file`、`purpose`、`expires_after[anchor]`、`expires_after[seconds]`)— 最大 512 MiB |
-| GET | `/v1/files` | 列出已驗證 API 金鑰的檔案 |
-| GET | `/v1/files/[id]` | 取得檔案的中繼資料 |
-| DELETE | `/v1/files/[id]` | 刪除檔案 |
-| GET | `/v1/files/[id]/content` | 串流回傳原始檔案內容 |
+| GET | `/v1/files` | 列出已驗證 API 金鑰的檔案 |
+| GET | `/v1/files/[id]` | 取得檔案的中繼資料 |
+| DELETE | `/v1/files/[id]` | 刪除檔案 |
+| GET | `/v1/files/[id]/content` | 串流回傳原始檔案內容 |
**驗證:** Bearer API 金鑰 — 檔案透過 `getApiKeyRequestScope` 按 API 金鑰範圍隔離。
@@ -273,13 +273,13 @@ OpenAI 相容的檔案端點,用於批次輸入/輸出和檔案用途上傳。
OpenAI 相容的批次處理。
-| 方法 | 路徑 | 說明 |
-| ------ | -------------------------- | ------------------------------------------------------------------------------------------------ |
-| POST | `/v1/batches` | 建立批次 — 主體由 `v1BatchCreateSchema` 驗證(`input_file_id`、`endpoint`、`completion_window`) |
-| GET | `/v1/batches` | 列出批次 |
-| GET | `/v1/batches/[id]` | 取得批次狀態 + `request_counts` |
-| DELETE | `/v1/batches/[id]` | 刪除已完成/失敗的批次 |
-| POST | `/v1/batches/[id]/cancel` | 取消進行中的批次 |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------- | ------------------------------------------------------------------------------------------------ |
+| POST | `/v1/batches` | 建立批次 — 主體由 `v1BatchCreateSchema` 驗證(`input_file_id`、`endpoint`、`completion_window`) |
+| GET | `/v1/batches` | 列出批次 |
+| GET | `/v1/batches/[id]` | 取得批次狀態 + `request_counts` |
+| DELETE | `/v1/batches/[id]` | 刪除已完成/失敗的批次 |
+| POST | `/v1/batches/[id]/cancel` | 取消進行中的批次 |
**驗證:** Bearer API 金鑰。批次按 API 金鑰範圍隔離。
@@ -289,11 +289,11 @@ OpenAI 相容的批次處理。
Web/搜尋提供者抽象層(Tavily、Brave、Exa、Serper 等)。
-| 方法 | 路徑 | 說明 |
-| ------ | ----------------------- | ----------------------------------------------------------------- |
-| GET | `/v1/search` | 列出已配置的搜尋提供者 + 功能 |
-| POST | `/v1/search` | 執行搜尋查詢 — 主體由 `v1SearchSchema` 驗證,支援快取/合併 |
-| GET | `/v1/search/analytics` | 各提供者的命中/延遲/快取統計 |
+| 方法 | 路徑 | 說明 |
+| ---- | ---------------------- | ---------------------------------------------------------- |
+| GET | `/v1/search` | 列出已配置的搜尋提供者 + 功能 |
+| POST | `/v1/search` | 執行搜尋查詢 — 主體由 `v1SearchSchema` 驗證,支援快取/合併 |
+| GET | `/v1/search/analytics` | 各提供者的命中/延遲/快取統計 |
**驗證:** Bearer API 金鑰(`extractApiKey` + `isValidApiKey`)。搜尋政策透過 `enforceApiKeyPolicy` 強制執行。
@@ -355,10 +355,10 @@ CLI 將 `base_url + /responses` 升級為 WebSocket,而 OmniRoute 將其隧道
## 配額與問題回報
-| 方法 | 路徑 | 說明 |
-| ------ | -------------------- | ------------------------------------------------------------------- |
-| GET | `/v1/quotas/check` | 在發行註冊金鑰前預先驗證 `provider` + `accountId` 的配額 |
-| POST | `/v1/issues/report` | 將配額/金鑰發行失敗回報至 GitHub(需要 `GITHUB_ISSUES_REPO` + 權杖) |
+| 方法 | 路徑 | 說明 |
+| ---- | ------------------- | -------------------------------------------------------------------- |
+| GET | `/v1/quotas/check` | 在發行註冊金鑰前預先驗證 `provider` + `accountId` 的配額 |
+| POST | `/v1/issues/report` | 將配額/金鑰發行失敗回報至 GitHub(需要 `GITHUB_ISSUES_REPO` + 權杖) |
**驗證:** Bearer API 金鑰(`isAuthenticated`)。
@@ -397,190 +397,190 @@ DELETE /api/cache/stats
### 身分驗證
-| 端點 | 方法 | 說明 |
-| -------------------------------- | -------- | ----------------- |
-| `/api/auth/login` | POST | 登入 |
-| `/api/auth/logout` | POST | 登出 |
-| `/api/settings/require-login` | GET/PUT | 切換需要登入 |
+| 端點 | 方法 | 說明 |
+| ----------------------------- | ------- | ------------ |
+| `/api/auth/login` | POST | 登入 |
+| `/api/auth/logout` | POST | 登出 |
+| `/api/settings/require-login` | GET/PUT | 切換需要登入 |
### 提供者管理
-| 端點 | 方法 | 說明 |
-| --------------------------------- | ----------------------- | ----------------------------------- |
-| `/api/providers` | GET/POST | 列出/建立提供者 |
-| `/api/providers/[id]` | GET/PUT/DELETE | 管理提供者 |
-| `/api/providers/[id]/test` | POST | 測試提供者連線 |
-| `/api/providers/[id]/models` | GET | 列出提供者模型 |
-| `/api/providers/validate` | POST | 驗證提供者配置 |
-| `/api/providers/bulk` | POST | 為一個提供者大量新增 API 金鑰 |
-| `/api/providers/import` | POST | 從解析的 CSV/JSON 檔案匯入異質提供者清單(#6836);每列部分失敗結果 |
-| `/api/provider-nodes*` | 各種 | 提供者節點管理 |
-| `/api/provider-models` | GET/POST/PATCH/DELETE | 自訂模型(新增、更新、隱藏/顯示、刪除) |
+| 端點 | 方法 | 說明 |
+| ---------------------------- | --------------------- | ------------------------------------------------------------------- |
+| `/api/providers` | GET/POST | 列出/建立提供者 |
+| `/api/providers/[id]` | GET/PUT/DELETE | 管理提供者 |
+| `/api/providers/[id]/test` | POST | 測試提供者連線 |
+| `/api/providers/[id]/models` | GET | 列出提供者模型 |
+| `/api/providers/validate` | POST | 驗證提供者配置 |
+| `/api/providers/bulk` | POST | 為一個提供者大量新增 API 金鑰 |
+| `/api/providers/import` | POST | 從解析的 CSV/JSON 檔案匯入異質提供者清單(#6836);每列部分失敗結果 |
+| `/api/provider-nodes*` | 各種 | 提供者節點管理 |
+| `/api/provider-models` | GET/POST/PATCH/DELETE | 自訂模型(新增、更新、隱藏/顯示、刪除) |
### OAuth 流程
-| 端點 | 方法 | 說明 |
-| --------------------------------- | -------- | ------------------- |
-| `/api/oauth/[provider]/[action]` | 各種 | 提供者特定 OAuth |
+| 端點 | 方法 | 說明 |
+| -------------------------------- | ---- | ---------------- |
+| `/api/oauth/[provider]/[action]` | 各種 | 提供者特定 OAuth |
### 路由與配置
-| 端點 | 方法 | 說明 |
-| ---------------------- | --------- | ----------------------------- |
-| `/api/models/alias` | GET/POST | 模型別名 |
-| `/api/models/catalog` | GET | 按提供者 + 類型分類的所有模型 |
-| `/api/combos*` | 各種 | 組合管理 |
-| `/api/keys*` | 各種 | API 金鑰管理 |
-| `/api/pricing` | GET | 模型定價 |
+| 端點 | 方法 | 說明 |
+| --------------------- | -------- | ----------------------------- |
+| `/api/models/alias` | GET/POST | 模型別名 |
+| `/api/models/catalog` | GET | 按提供者 + 類型分類的所有模型 |
+| `/api/combos*` | 各種 | 組合管理 |
+| `/api/keys*` | 各種 | API 金鑰管理 |
+| `/api/pricing` | GET | 模型定價 |
### 用量與分析
-| 端點 | 方法 | 說明 |
-| -------------------------------- | ---------------- | ------------------------- |
-| `/api/usage/history` | GET | 用量歷史 |
-| `/api/usage/logs` | GET | 用量日誌 |
-| `/api/usage/request-logs` | GET | 請求層級日誌 |
-| `/api/usage/[connectionId]` | GET | 各連線用量 |
-| `/api/usage/token-limits` | GET/POST/DELETE | 各 API 金鑰的權杖限制預算 |
+| 端點 | 方法 | 說明 |
+| --------------------------- | --------------- | ------------------------- |
+| `/api/usage/history` | GET | 用量歷史 |
+| `/api/usage/logs` | GET | 用量日誌 |
+| `/api/usage/request-logs` | GET | 請求層級日誌 |
+| `/api/usage/[connectionId]` | GET | 各連線用量 |
+| `/api/usage/token-limits` | GET/POST/DELETE | 各 API 金鑰的權杖限制預算 |
### 設定
-| 端點 | 方法 | 說明 |
-| ---------------------------------------- | -------------- | ----------------------------------- |
-| `/api/settings` | GET/PUT/PATCH | 一般設定 |
-| `/api/settings/proxy` | GET/PUT | 網路代理設定 |
-| `/api/settings/proxy/test` | POST | 測試代理連線 |
-| `/api/settings/ip-filter` | GET/PUT | IP 允許清單/封鎖清單 |
-| `/api/settings/thinking-budget` | GET/PUT | 推理權杖預算 |
-| `/api/settings/system-prompt` | GET/PUT | 全域系統提示詞 |
-| `/api/settings/compression` | GET/PUT | 全域壓縮設定 |
-| `/api/settings/purge-request-history` | POST | 清除請求日誌列與本機呼叫記錄檔案 |
+| 端點 | 方法 | 說明 |
+| ------------------------------------- | ------------- | -------------------------------- |
+| `/api/settings` | GET/PUT/PATCH | 一般設定 |
+| `/api/settings/proxy` | GET/PUT | 網路代理設定 |
+| `/api/settings/proxy/test` | POST | 測試代理連線 |
+| `/api/settings/ip-filter` | GET/PUT | IP 允許清單/封鎖清單 |
+| `/api/settings/thinking-budget` | GET/PUT | 推理權杖預算 |
+| `/api/settings/system-prompt` | GET/PUT | 全域系統提示詞 |
+| `/api/settings/compression` | GET/PUT | 全域壓縮設定 |
+| `/api/settings/purge-request-history` | POST | 清除請求日誌列與本機呼叫記錄檔案 |
### 上下文與壓縮
-| 端點 | 方法 | 說明 |
-| --------------------------------------- | --------------- | --------------------------------------------------------- |
-| `/api/compression/preview` | POST | 預覽 off/lite/standard/aggressive/ultra/RTK/stacked 壓縮 |
-| `/api/compression/language-packs` | GET | 列出可用的 Caveman 語言包 |
-| `/api/compression/rules` | GET | 列出 Caveman 規則中繼資料 |
-| `/api/context/caveman/config` | GET/PUT | Caveman 特定設定別名 |
-| `/api/context/rtk/config` | GET/PUT | RTK 特定設定,包含自訂過濾器和原始輸出保留 |
-| `/api/context/rtk/filters` | GET | RTK 過濾器目錄和自訂過濾器診斷 |
-| `/api/context/rtk/test` | POST | 對文字負載執行 RTK 預覽/測試 |
-| `/api/context/rtk/raw-output/[id]` | GET | 透過指標 ID 讀取保留的編輯後原始輸出 |
-| `/api/context/combos` | GET/POST | 壓縮組合清單/建立 |
-| `/api/context/combos/[id]` | GET/PUT/DELETE | 壓縮組合詳細/更新/刪除 |
-| `/api/context/combos/[id]/assignments` | GET/PUT | 將壓縮組合指派給路由組合 |
-| `/api/context/analytics` | GET | 壓縮分析別名 |
+| 端點 | 方法 | 說明 |
+| -------------------------------------- | -------------- | -------------------------------------------------------- |
+| `/api/compression/preview` | POST | 預覽 off/lite/standard/aggressive/ultra/RTK/stacked 壓縮 |
+| `/api/compression/language-packs` | GET | 列出可用的 Caveman 語言包 |
+| `/api/compression/rules` | GET | 列出 Caveman 規則中繼資料 |
+| `/api/context/caveman/config` | GET/PUT | Caveman 特定設定別名 |
+| `/api/context/rtk/config` | GET/PUT | RTK 特定設定,包含自訂過濾器和原始輸出保留 |
+| `/api/context/rtk/filters` | GET | RTK 過濾器目錄和自訂過濾器診斷 |
+| `/api/context/rtk/test` | POST | 對文字負載執行 RTK 預覽/測試 |
+| `/api/context/rtk/raw-output/[id]` | GET | 透過指標 ID 讀取保留的編輯後原始輸出 |
+| `/api/context/combos` | GET/POST | 壓縮組合清單/建立 |
+| `/api/context/combos/[id]` | GET/PUT/DELETE | 壓縮組合詳細/更新/刪除 |
+| `/api/context/combos/[id]/assignments` | GET/PUT | 將壓縮組合指派給路由組合 |
+| `/api/context/analytics` | GET | 壓縮分析別名 |
### 監控
-| 端點 | 方法 | 說明 |
-| ------------------------- | ---------- | ----------------------------------------------------------------------------- |
-| `/api/sessions` | GET | 作用中工作階段追蹤 |
-| `/api/rate-limits` | GET | 各帳戶速率限制 |
-| `/api/monitoring/health` | GET | 健康檢查 + 提供者摘要(`catalogCount`、`configuredCount`、`activeCount`、`monitoredCount`) |
-| `/api/cache/stats` | GET/DELETE | 快取統計/清除 |
+| 端點 | 方法 | 說明 |
+| ------------------------ | ---------- | ------------------------------------------------------------------------------------------- |
+| `/api/sessions` | GET | 作用中工作階段追蹤 |
+| `/api/rate-limits` | GET | 各帳戶速率限制 |
+| `/api/monitoring/health` | GET | 健康檢查 + 提供者摘要(`catalogCount`、`configuredCount`、`activeCount`、`monitoredCount`) |
+| `/api/cache/stats` | GET/DELETE | 快取統計/清除 |
### 備份與匯出/匯入
-| 端點 | 方法 | 說明 |
-| ---------------------------- | ------ | --------------------------------------- |
-| `/api/db-backups` | GET | 列出可用備份 |
-| `/api/db-backups` | PUT | 建立手動備份 |
-| `/api/db-backups` | POST | 從特定備份還原 |
-| `/api/db-backups/export` | GET | 以 .sqlite 檔案下載資料庫 |
-| `/api/db-backups/import` | POST | 上傳 .sqlite 檔案以取代資料庫 |
-| `/api/db-backups/exportAll` | GET | 以 .tar.gz 壓縮檔下載完整備份 |
+| 端點 | 方法 | 說明 |
+| --------------------------- | ---- | ----------------------------- |
+| `/api/db-backups` | GET | 列出可用備份 |
+| `/api/db-backups` | PUT | 建立手動備份 |
+| `/api/db-backups` | POST | 從特定備份還原 |
+| `/api/db-backups/export` | GET | 以 .sqlite 檔案下載資料庫 |
+| `/api/db-backups/import` | POST | 上傳 .sqlite 檔案以取代資料庫 |
+| `/api/db-backups/exportAll` | GET | 以 .tar.gz 壓縮檔下載完整備份 |
### 雲端同步
-| 端點 | 方法 | 說明 |
-| ----------------------- | ------ | ----------------- |
-| `/api/sync/cloud` | 各種 | 雲端同步操作 |
-| `/api/sync/initialize` | POST | 初始化同步 |
-| `/api/cloud/*` | 各種 | 雲端管理 |
+| 端點 | 方法 | 說明 |
+| ---------------------- | ---- | ------------ |
+| `/api/sync/cloud` | 各種 | 雲端同步操作 |
+| `/api/sync/initialize` | POST | 初始化同步 |
+| `/api/cloud/*` | 各種 | 雲端管理 |
### 隧道
-| 端點 | 方法 | 說明 |
-| --------------------------- | ------ | ----------------------------------------------------------- |
-| `/api/tunnels/cloudflared` | GET | 讀取儀表板的 Cloudflare Quick Tunnel 安裝/執行時期狀態 |
-| `/api/tunnels/cloudflared` | POST | 啟用或停用 Cloudflare Quick Tunnel(`action=enable/disable`)|
-| `/api/tunnels/ngrok` | GET | 讀取儀表板的 ngrok Tunnel 執行時期狀態 |
-| `/api/tunnels/ngrok` | POST | 啟用或停用 ngrok Tunnel(`action=enable/disable`) |
+| 端點 | 方法 | 說明 |
+| -------------------------- | ---- | ------------------------------------------------------------- |
+| `/api/tunnels/cloudflared` | GET | 讀取儀表板的 Cloudflare Quick Tunnel 安裝/執行時期狀態 |
+| `/api/tunnels/cloudflared` | POST | 啟用或停用 Cloudflare Quick Tunnel(`action=enable/disable`) |
+| `/api/tunnels/ngrok` | GET | 讀取儀表板的 ngrok Tunnel 執行時期狀態 |
+| `/api/tunnels/ngrok` | POST | 啟用或停用 ngrok Tunnel(`action=enable/disable`) |
### CLI 工具
-| 端點 | 方法 | 說明 |
-| ----------------------------------- | ------ | --------------- |
-| `/api/cli-tools/claude-settings` | GET | Claude CLI 狀態 |
-| `/api/cli-tools/codex-settings` | GET | Codex CLI 狀態 |
-| `/api/cli-tools/droid-settings` | GET | Droid CLI 狀態 |
-| `/api/cli-tools/openclaw-settings` | GET | OpenClaw CLI 狀態 |
-| `/api/cli-tools/runtime/[toolId]` | GET | 通用 CLI 執行時期 |
+| 端點 | 方法 | 說明 |
+| ---------------------------------- | ---- | ----------------- |
+| `/api/cli-tools/claude-settings` | GET | Claude CLI 狀態 |
+| `/api/cli-tools/codex-settings` | GET | Codex CLI 狀態 |
+| `/api/cli-tools/droid-settings` | GET | Droid CLI 狀態 |
+| `/api/cli-tools/openclaw-settings` | GET | OpenClaw CLI 狀態 |
+| `/api/cli-tools/runtime/[toolId]` | GET | 通用 CLI 執行時期 |
CLI 回應包含:`installed`、`runnable`、`command`、`commandPath`、`runtimeMode`、`reason`。
### ACP 代理程式
-| 端點 | 方法 | 說明 |
-| ---------------- | ------ | ------------------------------------------------- |
-| `/api/acp/agents`| GET | 列出所有檢測到的代理程式(內建 + 自訂)及其狀態 |
-| `/api/acp/agents`| POST | 新增自訂代理程式或重新整理偵測快取 |
-| `/api/acp/agents`| DELETE | 透過 `id` 查詢參數移除自訂代理程式 |
+| 端點 | 方法 | 說明 |
+| ----------------- | ------ | ----------------------------------------------- |
+| `/api/acp/agents` | GET | 列出所有檢測到的代理程式(內建 + 自訂)及其狀態 |
+| `/api/acp/agents` | POST | 新增自訂代理程式或重新整理偵測快取 |
+| `/api/acp/agents` | DELETE | 透過 `id` 查詢參數移除自訂代理程式 |
GET 回應包含 `agents[]`(id、name、binary、version、installed、protocol、isCustom)和 `summary`(total、installed、notFound、builtIn、custom)。
### 彈性與速率限制
-| 端點 | 方法 | 說明 |
-| ---------------------------------- | ---------- | ----------------------------------------------------------------------------- |
-| `/api/resilience` | GET/PATCH | 取得/更新請求佇列、連線冷卻、提供者斷路器和等待設定 |
-| `/api/resilience/reset` | POST | 重設提供者斷路器 |
-| `/api/resilience/model-cooldowns` | GET | 列出作用中的各(提供者、連線、模型)鎖定,按剩餘時間排序 |
-| `/api/resilience/model-cooldowns` | DELETE | 清除模型鎖定 — 主體 `{provider, model}` 或 `{all: true}` 以清除全部 |
-| `/api/rate-limits` | GET | 各帳戶速率限制狀態 |
-| `/api/rate-limit` | GET | 全域速率限制配置 |
+| 端點 | 方法 | 說明 |
+| --------------------------------- | --------- | ------------------------------------------------------------------- |
+| `/api/resilience` | GET/PATCH | 取得/更新請求佇列、連線冷卻、提供者斷路器和等待設定 |
+| `/api/resilience/reset` | POST | 重設提供者斷路器 |
+| `/api/resilience/model-cooldowns` | GET | 列出作用中的各(提供者、連線、模型)鎖定,按剩餘時間排序 |
+| `/api/resilience/model-cooldowns` | DELETE | 清除模型鎖定 — 主體 `{provider, model}` 或 `{all: true}` 以清除全部 |
+| `/api/rate-limits` | GET | 各帳戶速率限制狀態 |
+| `/api/rate-limit` | GET | 全域速率限制配置 |
> 所有四個 `/api/resilience/*` 路由都需要**管理驗證**(`requireManagementAuth`)。請參閱[彈性(進階)](#彈性進階)以取得提供者斷路器 vs 連線冷卻 vs 模型鎖定的完整說明。
### 評測
-| 端點 | 方法 | 說明 |
-| ------------- | --------- | ------------------------- |
-| `/api/evals` | GET/POST | 列出評測套件 / 執行評測 |
+| 端點 | 方法 | 說明 |
+| ------------ | -------- | ----------------------- |
+| `/api/evals` | GET/POST | 列出評測套件 / 執行評測 |
### 政策
-| 端點 | 方法 | 說明 |
-| ---------------- | ---------------- | ----------------- |
-| `/api/policies` | GET/POST/DELETE | 管理路由政策 |
+| 端點 | 方法 | 說明 |
+| --------------- | --------------- | ------------ |
+| `/api/policies` | GET/POST/DELETE | 管理路由政策 |
### 合規
-| 端點 | 方法 | 說明 |
-| ---------------------------- | ---- | ----------------------- |
-| `/api/compliance/audit-log` | GET | 合規稽核日誌(最近 N 筆)|
+| 端點 | 方法 | 說明 |
+| --------------------------- | ---- | ------------------------- |
+| `/api/compliance/audit-log` | GET | 合規稽核日誌(最近 N 筆) |
### v1beta(Gemini 相容)
-| 端點 | 方法 | 說明 |
-| ------------------------- | ------ | ------------------------------- |
-| `/v1beta/models` | GET | 以 Gemini 格式列出模型 |
-| `/v1beta/models/{...path}`| POST | Gemini `generateContent` 端點 |
+| 端點 | 方法 | 說明 |
+| -------------------------- | ---- | ----------------------------- |
+| `/v1beta/models` | GET | 以 Gemini 格式列出模型 |
+| `/v1beta/models/{...path}` | POST | Gemini `generateContent` 端點 |
這些端點鏡像 Gemini 的 API 格式,供預期原生 Gemini SDK 相容性的用戶端使用。
### 內部 / 系統 API
-| 端點 | 方法 | 說明 |
-| ----------------------- | ------ | ------------------------------------------------- |
-| `/api/init` | GET | 應用程式初始化檢查(首次執行時使用) |
-| `/api/tags` | GET | Ollama 相容模型標籤(供 Ollama 用戶端使用) |
-| `/api/restart` | POST | 觸發優雅伺服器重新啟動 |
-| `/api/shutdown` | POST | 觸發優雅伺服器關閉 |
-| `/api/system/env/repair`| POST | 修復 OAuth 提供者環境變數 |
+| 端點 | 方法 | 說明 |
+| ------------------------ | ---- | ------------------------------------------- |
+| `/api/init` | GET | 應用程式初始化檢查(首次執行時使用) |
+| `/api/tags` | GET | Ollama 相容模型標籤(供 Ollama 用戶端使用) |
+| `/api/restart` | POST | 觸發優雅伺服器重新啟動 |
+| `/api/shutdown` | POST | 觸發優雅伺服器關閉 |
+| `/api/system/env/repair` | POST | 修復 OAuth 提供者環境變數 |
> **注意:** 這些端點供系統內部使用或為 Ollama 用戶端相容性而提供。通常不應由一般使用者呼叫。
@@ -782,13 +782,13 @@ DELETE /api/usage/token-limits?id=tl-abc
更高層級的路由組合(已在 `/api/combos*` 下摘要)也可以從模型 ID 模式進行 1:1 映射,允許將 OpenAI 樣式模型 ID 透明重新導向至組合。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------------- | ----------------------------------------------------------------- |
-| GET | `/api/model-combo-mappings` | 列出所有模型→組合映射 |
-| POST | `/api/model-combo-mappings` | 建立映射 — 主體:`{pattern, comboId, priority?, enabled?, description?}` |
-| GET | `/api/model-combo-mappings/[id]` | 取得單一映射 |
-| PUT | `/api/model-combo-mappings/[id]` | 更新現有映射的欄位 |
-| DELETE | `/api/model-combo-mappings/[id]` | 移除映射 |
+| 方法 | 路徑 | 說明 |
+| ------ | -------------------------------- | ------------------------------------------------------------------------ |
+| GET | `/api/model-combo-mappings` | 列出所有模型→組合映射 |
+| POST | `/api/model-combo-mappings` | 建立映射 — 主體:`{pattern, comboId, priority?, enabled?, description?}` |
+| GET | `/api/model-combo-mappings/[id]` | 取得單一映射 |
+| PUT | `/api/model-combo-mappings/[id]` | 更新現有映射的欄位 |
+| DELETE | `/api/model-combo-mappings/[id]` | 移除映射 |
**驗證:** 管理工作階段/API 金鑰(`requireManagementAuth`)。
@@ -798,14 +798,14 @@ DELETE /api/usage/token-limits?id=tl-abc
OmniRoute 事件(請求完成、配額耗盡、金鑰輪換等)的外送 Webhook 訂閱。
-| 方法 | 路徑 | 說明 |
-| ------ | --------------------------- | ----------------------------------------------------------------- |
-| GET | `/api/webhooks` | 列出 webhook(密碼以 `...` 遮罩) |
-| POST | `/api/webhooks` | 建立 webhook — 主體:`{url, events?: ["*"], secret?, description?}` |
-| GET | `/api/webhooks/[id]` | 取得 webhook |
-| PUT | `/api/webhooks/[id]` | 更新 url/events/secret/description |
-| DELETE | `/api/webhooks/[id]` | 移除 webhook |
-| POST | `/api/webhooks/[id]/test` | 傳送測試負載至 webhook URL 並回傳傳遞狀態 |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------- | ------------------------------------------------------------------- |
+| GET | `/api/webhooks` | 列出 webhook(密碼以 `...` 遮罩) |
+| POST | `/api/webhooks` | 建立 webhook — 主體:`{url, events?: ["*"], secret?, description?}` |
+| GET | `/api/webhooks/[id]` | 取得 webhook |
+| PUT | `/api/webhooks/[id]` | 更新 url/events/secret/description |
+| DELETE | `/api/webhooks/[id]` | 移除 webhook |
+| POST | `/api/webhooks/[id]/test` | 傳送測試負載至 webhook URL 並回傳傳遞狀態 |
**驗證:** 管理工作階段/API 金鑰(`requireManagementAuth`)。
@@ -815,13 +815,13 @@ OmniRoute 事件(請求完成、配額耗盡、金鑰輪換等)的外送 Web
由自動金鑰管理子系統使用,針對後端提供者/帳戶發行和輪換 API 金鑰,並設有每日/每小時配額。
-| 方法 | 路徑 | 說明 |
-| ------ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
-| GET | `/api/v1/registered-keys` | 列出註冊金鑰(僅顯示遮罩前綴) |
-| POST | `/api/v1/registered-keys` | 發行新的註冊金鑰 — 主體:`{name, provider?, accountId?, idempotencyKey?, expiresAt?, dailyBudget?, hourlyBudget?}`。回傳原始金鑰**一次**。配額不足時回傳 `429`。 |
-| GET | `/api/v1/registered-keys/[id]` | 取得註冊金鑰的中繼資料(不含原始材料) |
-| DELETE | `/api/v1/registered-keys/[id]` | 撤銷註冊金鑰 |
-| POST | `/api/v1/registered-keys/[id]/revoke` | 明確撤銷端點(與 DELETE 效果相同) |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/v1/registered-keys` | 列出註冊金鑰(僅顯示遮罩前綴) |
+| POST | `/api/v1/registered-keys` | 發行新的註冊金鑰 — 主體:`{name, provider?, accountId?, idempotencyKey?, expiresAt?, dailyBudget?, hourlyBudget?}`。回傳原始金鑰**一次**。配額不足時回傳 `429`。 |
+| GET | `/api/v1/registered-keys/[id]` | 取得註冊金鑰的中繼資料(不含原始材料) |
+| DELETE | `/api/v1/registered-keys/[id]` | 撤銷註冊金鑰 |
+| POST | `/api/v1/registered-keys/[id]/revoke` | 明確撤銷端點(與 DELETE 效果相同) |
**驗證:** Bearer API 金鑰(`isAuthenticated`)。另請參閱 `/v1/quotas/check` 和 `/v1/issues/report`。
@@ -831,14 +831,14 @@ OmniRoute 事件(請求完成、配額耗盡、金鑰輪換等)的外送 Web
雲端代理程式任務(Claude Code、Codex Cloud、OpenHands 等),代表 OmniRoute 使用者遠端執行。
-| 方法 | 路徑 | 說明 |
-| ------ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| GET | `/api/v1/agents/tasks` | 列出任務 — 選用 `?provider=`、`?status=`、`?limit=`(1–500,預設 50) |
-| POST | `/api/v1/agents/tasks` | 建立任務 — 主體由 `CreateCloudAgentTaskSchema` 驗證(`providerId`、`prompt`、`source`、`options?`)。回傳 `201` 及任務封裝 |
-| DELETE | `/api/v1/agents/tasks?id=...` | 刪除任務 |
-| GET | `/api/v1/agents/tasks/[id]` | 讀取任務 — 當設定 `external_id` 時,會同步從上游雲端代理程式重新整理狀態 |
-| POST | `/api/v1/agents/tasks/[id]` | 區分動作:`{action: "approve"}`、`{action: "message", message}` 或 `{action: "cancel"}` |
-| DELETE | `/api/v1/agents/tasks/[id]` | 依 ID 刪除特定任務 |
+| 方法 | 路徑 | 說明 |
+| ------ | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/v1/agents/tasks` | 列出任務 — 選用 `?provider=`、`?status=`、`?limit=`(1–500,預設 50) |
+| POST | `/api/v1/agents/tasks` | 建立任務 — 主體由 `CreateCloudAgentTaskSchema` 驗證(`providerId`、`prompt`、`source`、`options?`)。回傳 `201` 及任務封裝 |
+| DELETE | `/api/v1/agents/tasks?id=...` | 刪除任務 |
+| GET | `/api/v1/agents/tasks/[id]` | 讀取任務 — 當設定 `external_id` 時,會同步從上游雲端代理程式重新整理狀態 |
+| POST | `/api/v1/agents/tasks/[id]` | 區分動作:`{action: "approve"}`、`{action: "message", message}` 或 `{action: "cancel"}` |
+| DELETE | `/api/v1/agents/tasks/[id]` | 依 ID 刪除特定任務 |
> **驗證:** 每個方法都需要管理驗證(`requireCloudAgentManagementAuth`)。在 v3.8.0 之前,這些端點未經驗證 — 請參閱提交 `588a0333` 以了解重大變更。
@@ -856,16 +856,16 @@ curl -X POST http://localhost:20128/api/v1/agents/tasks \
可指派給提供者、帳戶或全域的外送 HTTP(S)/SOCKS 代理。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| GET | `/api/v1/management/proxies` | 列出代理(使用 `?id=` 回傳單一代理;使用 `?id=&where_used=1` 回傳指派圖) |
-| POST | `/api/v1/management/proxies` | 建立代理 — 主體由 `createProxyRegistrySchema` 驗證 |
-| PATCH | `/api/v1/management/proxies` | 更新代理 — 主體由 `updateProxyRegistrySchema` 驗證(需要 `id`) |
-| DELETE | `/api/v1/management/proxies?id=...&force=1` | 刪除代理(使用 `force=1` 來分離指派) |
-| GET | `/api/v1/management/proxies/assignments` | 列出指派 — 可依 `proxy_id`、`scope`、`scope_id` 過濾;傳入 `resolve_connection_id=` 以解析連線的作用中代理 |
-| PUT | `/api/v1/management/proxies/assignments` | 指派 — 主體由 `proxyAssignmentSchema` 驗證(`{scope, scopeId?, proxyId?}`)。清除調度器快取 |
-| PUT | `/api/v1/management/proxies/bulk-assign` | 大量指派 — 主體由 `bulkProxyAssignmentSchema` 驗證(`{scope, scopeIds[], proxyId?}`) |
-| GET | `/api/v1/management/proxies/health?hours=24` | 匯總窗口內的代理健康狀態(成功/失敗計數、延遲) |
+| 方法 | 路徑 | 說明 |
+| ------ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/v1/management/proxies` | 列出代理(使用 `?id=` 回傳單一代理;使用 `?id=&where_used=1` 回傳指派圖) |
+| POST | `/api/v1/management/proxies` | 建立代理 — 主體由 `createProxyRegistrySchema` 驗證 |
+| PATCH | `/api/v1/management/proxies` | 更新代理 — 主體由 `updateProxyRegistrySchema` 驗證(需要 `id`) |
+| DELETE | `/api/v1/management/proxies?id=...&force=1` | 刪除代理(使用 `force=1` 來分離指派) |
+| GET | `/api/v1/management/proxies/assignments` | 列出指派 — 可依 `proxy_id`、`scope`、`scope_id` 過濾;傳入 `resolve_connection_id=` 以解析連線的作用中代理 |
+| PUT | `/api/v1/management/proxies/assignments` | 指派 — 主體由 `proxyAssignmentSchema` 驗證(`{scope, scopeId?, proxyId?}`)。清除調度器快取 |
+| PUT | `/api/v1/management/proxies/bulk-assign` | 大量指派 — 主體由 `bulkProxyAssignmentSchema` 驗證(`{scope, scopeIds[], proxyId?}`) |
+| GET | `/api/v1/management/proxies/health?hours=24` | 匯總窗口內的代理健康狀態(成功/失敗計數、延遲) |
**驗證:** 每個路由都需要管理工作階段/API 金鑰(`requireManagementAuth`)。
@@ -877,11 +877,11 @@ curl -X POST http://localhost:20128/api/v1/agents/tasks \
OmniRoute 公開三種獨立的暫時性故障機制;下面的管理端點讓運算子可以讀取和覆寫它們:
-| 範圍 | 狀態儲存 | 讀取 | 重設/清除 |
-| ------------------- | ----------------------------------------- | ----------------------------------------- | --------------------------------------------- |
-| 提供者斷路器 | `domain_circuit_breakers` + 記憶體內 | `/api/monitoring/health` | `POST /api/resilience/reset` |
-| 連線冷卻 | 提供者連線上的 `rateLimitedUntil` | `/api/rate-limits`、`/api/providers/[id]` | (惰性重新啟用;透過提供者 PUT 清除) |
-| 模型鎖定 | 記憶體內模型可用性註冊表 | `GET /api/resilience/model-cooldowns` | `DELETE /api/resilience/model-cooldowns` |
+| 範圍 | 狀態儲存 | 讀取 | 重設/清除 |
+| ------------ | ------------------------------------ | ----------------------------------------- | ---------------------------------------- |
+| 提供者斷路器 | `domain_circuit_breakers` + 記憶體內 | `/api/monitoring/health` | `POST /api/resilience/reset` |
+| 連線冷卻 | 提供者連線上的 `rateLimitedUntil` | `/api/rate-limits`、`/api/providers/[id]` | (惰性重新啟用;透過提供者 PUT 清除) |
+| 模型鎖定 | 記憶體內模型可用性註冊表 | `GET /api/resilience/model-cooldowns` | `DELETE /api/resilience/model-cooldowns` |
`PATCH /api/resilience` 接受 `providerBreaker.oauth` 和 `providerBreaker.apikey` 下的提供者斷路器覆寫。每個設定檔支援 `degradationThreshold`、`failureThreshold` 和 `resetTimeoutMs`;相同的欄位也顯示在儀表板 → 設定 → 彈性中。
@@ -906,18 +906,18 @@ curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
用於以自訂可執行處理常式擴充 OmniRoute 的技能框架,以及市集整合。
-| 方法 | 路徑 | 說明 |
-| ------ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| GET | `/api/skills` | 列出已安裝技能 — 可依 `?q=`、`?mode=on\|off\|auto`、`?source=skillsmp\|skillssh\|local` 過濾,支援分頁 |
-| GET | `/api/skills/[id]` | 取得單一技能 |
-| PUT | `/api/skills/[id]` | 更新技能(名稱、說明、模式、結構描述、處理常式、標籤) |
-| DELETE | `/api/skills/[id]` | 解除安裝技能 |
-| POST | `/api/skills/install` | 從原始資訊清單安裝技能 — 主體:`{name, version, description, schema:{input, output}, handlerCode, apiKeyId?}` |
-| GET | `/api/skills/executions` | 列出最近的技能執行記錄(稽核軌跡,含輸入/輸出/持續時間) |
-| GET | `/api/skills/marketplace?q=...` | 從 SkillsMP 市集搜尋/熱門清單(需要 `skillsmpApiKey` 設定) |
-| POST | `/api/skills/marketplace/install` | 從 SkillsMP 依 ID 安裝技能 |
-| GET | `/api/skills/skillssh?q=&limit=` | 搜尋 skills.sh 註冊表 |
-| POST | `/api/skills/skillssh/install` | 從 skills.sh 依 ID 安裝技能 |
+| 方法 | 路徑 | 說明 |
+| ------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/skills` | 列出已安裝技能 — 可依 `?q=`、`?mode=on\|off\|auto`、`?source=skillsmp\|skillssh\|local` 過濾,支援分頁 |
+| GET | `/api/skills/[id]` | 取得單一技能 |
+| PUT | `/api/skills/[id]` | 更新技能(名稱、說明、模式、結構描述、處理常式、標籤) |
+| DELETE | `/api/skills/[id]` | 解除安裝技能 |
+| POST | `/api/skills/install` | 從原始資訊清單安裝技能 — 主體:`{name, version, description, schema:{input, output}, handlerCode, apiKeyId?}` |
+| GET | `/api/skills/executions` | 列出最近的技能執行記錄(稽核軌跡,含輸入/輸出/持續時間) |
+| GET | `/api/skills/marketplace?q=...` | 從 SkillsMP 市集搜尋/熱門清單(需要 `skillsmpApiKey` 設定) |
+| POST | `/api/skills/marketplace/install` | 從 SkillsMP 依 ID 安裝技能 |
+| GET | `/api/skills/skillssh?q=&limit=` | 搜尋 skills.sh 註冊表 |
+| POST | `/api/skills/skillssh/install` | 從 skills.sh 依 ID 安裝技能 |
**驗證:** 管理工作階段/API 金鑰。市集搜尋路由接受管理驗證或 Bearer API 金鑰(`isAuthenticated`)。
@@ -927,13 +927,13 @@ curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
持久性的對話/事實記憶儲存,按 API 金鑰/工作階段範圍隔離。
-| 方法 | 路徑 | 說明 |
-| ------ | --------------------- | ----------------------------------------------------------------------------------------------------- |
-| GET | `/api/memory` | 列出記憶 — `?apiKeyId=`、`?type=`、`?sessionId=`、`?q=`,支援 `offset/limit` 或 `page/limit` 分頁 |
-| POST | `/api/memory` | 建立記憶 — 主體由 Zod 驗證:`{content, key, type?, sessionId?, apiKeyId?, metadata?, expiresAt?}` |
-| GET | `/api/memory/[id]` | 取得單一記憶 |
-| DELETE | `/api/memory/[id]` | 刪除記憶 |
-| GET | `/api/memory/health` | 記憶子系統健康狀態(資料庫連線、嵌入後端、向量索引狀態) |
+| 方法 | 路徑 | 說明 |
+| ------ | -------------------- | ------------------------------------------------------------------------------------------------- |
+| GET | `/api/memory` | 列出記憶 — `?apiKeyId=`、`?type=`、`?sessionId=`、`?q=`,支援 `offset/limit` 或 `page/limit` 分頁 |
+| POST | `/api/memory` | 建立記憶 — 主體由 Zod 驗證:`{content, key, type?, sessionId?, apiKeyId?, metadata?, expiresAt?}` |
+| GET | `/api/memory/[id]` | 取得單一記憶 |
+| DELETE | `/api/memory/[id]` | 刪除記憶 |
+| GET | `/api/memory/health` | 記憶子系統健康狀態(資料庫連線、嵌入後端、向量索引狀態) |
**驗證:** 管理工作階段/API 金鑰(`requireManagementAuth`)。`type` 列舉:`FACTUAL`、`EPISODIC`、`SEMANTIC`、`PROCEDURAL`(請參閱 `src/lib/memory/types.ts` 中的 `MemoryType`)。
@@ -943,17 +943,17 @@ curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
OmniRoute 內嵌了一個模型上下文協定伺服器,具有 3 種傳輸方式(stdio、SSE、streamable-http)和範圍限定的工具。下方的儀表板端點可讀取狀態/稽核資料並代理 HTTP 傳輸。
-| 方法 | 路徑 | 說明 |
+| 方法 | 路徑 | 說明 |
| ------ | ------------------------ | ----------------------------------------------------------------------------------------------- | -------------------- |
-| GET | `/api/mcp/status` | 心跳、傳輸、線上狀態、最後呼叫、熱門工具、24 小時成功率 |
-| GET | `/api/mcp/tools` | MCP 工具清單,包含 `name`、`description`、`scopes`、`phase`、`auditLevel`、`sourceEndpoints` |
-| GET | `/api/mcp/sse` | 開啟 SSE 傳輸的 SSE 串流(若 MCP 停用或傳輸不符則回傳 `503`) |
-| POST | `/api/mcp/sse` | 在 SSE 傳輸上傳送 JSON-RPC 框架 |
-| GET | `/api/mcp/stream` | 開啟 Streamable HTTP 傳輸的 SSE 端(伺服器發起訊息) |
-| POST | `/api/mcp/stream` | 在 Streamable HTTP 傳輸上傳送 JSON-RPC 框架 |
-| DELETE | `/api/mcp/stream` | 結束 Streamable HTTP 工作階段 |
-| GET | `/api/mcp/audit` | 查詢稽核日誌 — `?limit=`、`?offset=`、`?tool=`、`?success=true | false`、`?apiKeyId=` |
-| GET | `/api/mcp/audit/stats` | 匯總稽核統計(總數、成功率、平均持續時間、熱門工具) |
+| GET | `/api/mcp/status` | 心跳、傳輸、線上狀態、最後呼叫、熱門工具、24 小時成功率 |
+| GET | `/api/mcp/tools` | MCP 工具清單,包含 `name`、`description`、`scopes`、`phase`、`auditLevel`、`sourceEndpoints` |
+| GET | `/api/mcp/sse` | 開啟 SSE 傳輸的 SSE 串流(若 MCP 停用或傳輸不符則回傳 `503`) |
+| POST | `/api/mcp/sse` | 在 SSE 傳輸上傳送 JSON-RPC 框架 |
+| GET | `/api/mcp/stream` | 開啟 Streamable HTTP 傳輸的 SSE 端(伺服器發起訊息) |
+| POST | `/api/mcp/stream` | 在 Streamable HTTP 傳輸上傳送 JSON-RPC 框架 |
+| DELETE | `/api/mcp/stream` | 結束 Streamable HTTP 工作階段 |
+| GET | `/api/mcp/audit` | 查詢稽核日誌 — `?limit=`、`?offset=`、`?tool=`、`?success=true | false`、`?apiKeyId=` |
+| GET | `/api/mcp/audit/stats` | 匯總稽核統計(總數、成功率、平均持續時間、熱門工具) |
**驗證:** `sse`/`stream` 傳輸遵循 MCP 特定的驗證表面(具有 `mcp` 範圍的 Bearer API 金鑰);`status`/`tools`/`audit*` 路由可從儀表板讀取(除了到達儀表板主機外,不需要額外驗證)。
@@ -985,12 +985,12 @@ Content-Type: application/json
支援的方法(全部由 `settings.a2aEnabled` 控制):
-| 方法 | 說明 |
-| ---------------- | --------------------------------------------------------- |
-| `message/send` | 同步技能執行;回傳 `{task, artifacts, metadata}` |
-| `message/stream` | 相同技能集的串流 SSE 執行 |
-| `tasks/get` | 依 `taskId` 取得任務 |
-| `tasks/cancel` | 依 `taskId` 取消任務 |
+| 方法 | 說明 |
+| ---------------- | ------------------------------------------------ |
+| `message/send` | 同步技能執行;回傳 `{task, artifacts, metadata}` |
+| `message/stream` | 相同技能集的串流 SSE 執行 |
+| `tasks/get` | 依 `taskId` 取得任務 |
+| `tasks/cancel` | 依 `taskId` 取消任務 |
內建技能:`smart-routing`、`quota-management`、`provider-discovery`、`cost-analysis`、`health-report`。
@@ -1004,13 +1004,13 @@ GET /.well-known/agent.json
### REST 輔助工具
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------ | --------------------------------------------------------------------------------------------- |
-| GET | `/api/a2a/status` | A2A 啟用狀態 + 任務統計 + 快取的 agent card 摘要 |
-| GET | `/api/a2a/tasks` | 列出任務 — `?state=submitted\|working\|completed\|failed\|cancelled`、`?skill=`、`?limit=`(≤200)、`?offset=` |
-| POST | `/api/a2a/tasks` | (未實作為 REST 輔助工具 — 請透過 JSON-RPC `message/send` 建立) |
-| GET | `/api/a2a/tasks/[id]` | 取得單一任務 |
-| POST | `/api/a2a/tasks/[id]/cancel` | 取消任務 |
+| 方法 | 路徑 | 說明 |
+| ---- | ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/a2a/status` | A2A 啟用狀態 + 任務統計 + 快取的 agent card 摘要 |
+| GET | `/api/a2a/tasks` | 列出任務 — `?state=submitted\|working\|completed\|failed\|cancelled`、`?skill=`、`?limit=`(≤200)、`?offset=` |
+| POST | `/api/a2a/tasks` | (未實作為 REST 輔助工具 — 請透過 JSON-RPC `message/send` 建立) |
+| GET | `/api/a2a/tasks/[id]` | 取得單一任務 |
+| POST | `/api/a2a/tasks/[id]/cancel` | 取消任務 |
**驗證:** REST 輔助工具在無管理驗證下執行(可從儀表板讀取);JSON-RPC `/a2a` 路由在配置時使用 Bearer `OMNIROUTE_API_KEY`。
@@ -1018,18 +1018,18 @@ GET /.well-known/agent.json
## 雲端、評測與評估
-| 方法 | 路徑 | 說明 |
+| 方法 | 路徑 | 說明 |
| ------ | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------- | ----------------------------------- |
-| POST | `/api/cloud/auth` | 驗證 Bearer 金鑰並為雲端同步用戶端回傳遮罩的提供者連線 + 模型別名 |
-| POST | `/api/cloud/credentials/update` | 更新雲端同步提供者的加密憑證 |
-| POST | `/api/cloud/model/resolve` | 使用本機路由表將邏輯模型 ID 解析為具體的提供者/模型 |
-| GET | `/api/cloud/models/alias` | 列出向雲端同步公開的模型別名 |
-| GET | `/api/assess` | 讀取最新評估分類(各提供者/模型) |
-| POST | `/api/assess` | 執行評估 — 主體:`{scope: {type:"all"} | {type:"provider", providerId} | {type:"model", modelId}, trigger?}` |
-| GET | `/api/evals` | 列出內建評測套件 + 最近執行 |
-| POST | `/api/evals` | 觸發評測執行 |
-| POST | `/api/evals/suites` | 建立自訂評測套件 — 主體由 `evalSuiteSaveSchema` 驗證 |
-| GET | `/api/evals/suites/[id]` | 取得自訂評測套件 |
+| POST | `/api/cloud/auth` | 驗證 Bearer 金鑰並為雲端同步用戶端回傳遮罩的提供者連線 + 模型別名 |
+| POST | `/api/cloud/credentials/update` | 更新雲端同步提供者的加密憑證 |
+| POST | `/api/cloud/model/resolve` | 使用本機路由表將邏輯模型 ID 解析為具體的提供者/模型 |
+| GET | `/api/cloud/models/alias` | 列出向雲端同步公開的模型別名 |
+| GET | `/api/assess` | 讀取最新評估分類(各提供者/模型) |
+| POST | `/api/assess` | 執行評估 — 主體:`{scope: {type:"all"} | {type:"provider", providerId} | {type:"model", modelId}, trigger?}` |
+| GET | `/api/evals` | 列出內建評測套件 + 最近執行 |
+| POST | `/api/evals` | 觸發評測執行 |
+| POST | `/api/evals/suites` | 建立自訂評測套件 — 主體由 `evalSuiteSaveSchema` 驗證 |
+| GET | `/api/evals/suites/[id]` | 取得自訂評測套件 |
**驗證:** `/api/cloud/auth` 直接驗證 Bearer 金鑰;其他 `/api/cloud/*`、`/api/evals/*` 和 `/api/assess` 路由需要管理工作階段/API 金鑰。`/api/assess` POST 使用 `validateBody` 搭配區分聯集範圍結構描述。
@@ -1039,11 +1039,11 @@ GET /.well-known/agent.json
ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測和自訂代理程式註冊。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| GET | `/api/acp/agents` | 列出所有已知的 CLI 代理程式(內建 + 自訂),含安裝狀態、版本、二進位檔 |
-| POST | `/api/acp/agents` | 註冊自訂 ACP 代理程式或重新整理快取 — 主體:`{id, name, binary, versionCommand, providerAlias, spawnArgs, protocol}` 或 `{action: "refresh"}` |
-| DELETE | `/api/acp/agents` | 移除自訂 ACP 代理程式 — 查詢參數:`?id=` |
+| 方法 | 路徑 | 說明 |
+| ------ | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| GET | `/api/acp/agents` | 列出所有已知的 CLI 代理程式(內建 + 自訂),含安裝狀態、版本、二進位檔 |
+| POST | `/api/acp/agents` | 註冊自訂 ACP 代理程式或重新整理快取 — 主體:`{id, name, binary, versionCommand, providerAlias, spawnArgs, protocol}` 或 `{action: "refresh"}` |
+| DELETE | `/api/acp/agents` | 移除自訂 ACP 代理程式 — 查詢參數:`?id=` |
**回應範例**(`GET /api/acp/agents`):
@@ -1086,10 +1086,10 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
### 自動路由分析
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------------- | --------------------------------------------------------------------------------------------- |
-| GET | `/api/analytics/auto-routing` | 匯總自動路由統計:總呼叫數、策略分佈、層級分佈、熱門提供者 |
-| GET | `/api/analytics/auto-routing?days=7` | 時間窗口統計(預設 24 小時) |
+| 方法 | 路徑 | 說明 |
+| ---- | ------------------------------------ | ---------------------------------------------------------- |
+| GET | `/api/analytics/auto-routing` | 匯總自動路由統計:總呼叫數、策略分佈、層級分佈、熱門提供者 |
+| GET | `/api/analytics/auto-routing?days=7` | 時間窗口統計(預設 24 小時) |
**回應範例:**
@@ -1119,9 +1119,9 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
### 壓縮分析
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------- | --------------------------------------------------------------------- |
-| GET | `/api/analytics/compression` | 匯總壓縮統計:節省的權杖、節省百分比、模式分佈、引擎使用量 |
+| 方法 | 路徑 | 說明 |
+| ---- | ---------------------------- | ---------------------------------------------------------- |
+| GET | `/api/analytics/compression` | 匯總壓縮統計:節省的權杖、節省百分比、模式分佈、引擎使用量 |
**回應範例:**
@@ -1148,9 +1148,9 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
### 提供者多樣性追蹤
-| 方法 | 路徑 | 說明 |
-| ------ | ----------------------------- | ------------------------------------------------------------------------------------------- |
-| GET | `/api/analytics/diversity` | 基於 Shannon 熵的多樣性追蹤:透過衡量提供者分佈來防止單點故障 |
+| 方法 | 路徑 | 說明 |
+| ---- | -------------------------- | ------------------------------------------------------------- |
+| GET | `/api/analytics/diversity` | 基於 Shannon 熵的多樣性追蹤:透過衡量提供者分佈來防止單點故障 |
**回應範例:**
@@ -1178,10 +1178,10 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
僅限管理員的營運管理端點。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------- | ---------------------------------------------------------------------------------------------- |
-| GET | `/api/admin/concurrency` | 讀取當前並行限制(全域 + 各提供者) |
-| POST | `/api/admin/concurrency` | 更新並行限制 — 主體:`{global?: number, perProvider?: Record}` |
+| 方法 | 路徑 | 說明 |
+| ---- | ------------------------ | ------------------------------------------------------------------------------ |
+| GET | `/api/admin/concurrency` | 讀取當前並行限制(全域 + 各提供者) |
+| POST | `/api/admin/concurrency` | 更新並行限制 — 主體:`{global?: number, perProvider?: Record}` |
**驗證:** 需要具有管理員範圍的管理工作階段。
@@ -1191,16 +1191,16 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理與 OmniRoute 整合的 CLI 工具(antigravity、chipotle、commandCode、devin-cli 等)。請參閱[提供者參考](./PROVIDER_REFERENCE.md)以取得完整清單。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------------------ | ----------------------------------------------------------------------------------------------- |
-| GET | `/api/cli-tools/all-statuses` | 所有 CLI 工具的狀態(已安裝、版本、最後上線時間) |
-| GET | `/api/cli-tools/[id]/status` | 特定 CLI 工具的狀態(ID 可為:antigravity、chipotle、commandCode、devin-cli 等) |
-| POST | `/api/cli-tools/apply` | 將 CLI 工具配置套用至提供者連線 |
-| GET | `/api/cli-tools/backups` | 列出 CLI 工具配置備份 |
-| POST | `/api/cli-tools/backups` | 建立所有 CLI 工具配置的備份 |
-| POST | `/api/cli-tools/[id]/restore` | 從備份還原 CLI 工具 |
-| GET | `/api/cli-tools/antigravity-mitm` | Antigravity MITM 代理狀態(「antigravity-mitm」CLI 工具) |
-| POST | `/api/cli-tools/antigravity-mitm/alias` | 配置 antigravity-mitm 別名 |
+| 方法 | 路徑 | 說明 |
+| ---- | --------------------------------------- | -------------------------------------------------------------------------------- |
+| GET | `/api/cli-tools/all-statuses` | 所有 CLI 工具的狀態(已安裝、版本、最後上線時間) |
+| GET | `/api/cli-tools/[id]/status` | 特定 CLI 工具的狀態(ID 可為:antigravity、chipotle、commandCode、devin-cli 等) |
+| POST | `/api/cli-tools/apply` | 將 CLI 工具配置套用至提供者連線 |
+| GET | `/api/cli-tools/backups` | 列出 CLI 工具配置備份 |
+| POST | `/api/cli-tools/backups` | 建立所有 CLI 工具配置的備份 |
+| POST | `/api/cli-tools/[id]/restore` | 從備份還原 CLI 工具 |
+| GET | `/api/cli-tools/antigravity-mitm` | Antigravity MITM 代理狀態(「antigravity-mitm」CLI 工具) |
+| POST | `/api/cli-tools/antigravity-mitm/alias` | 配置 antigravity-mitm 別名 |
**驗證:** 需要管理工作階段。
@@ -1210,15 +1210,15 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理 AI 代理程式技能(類似於 OpenAI 的自訂 GPT,但用於代理程式)。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------------- | ------------------------------------------------------------------------------------ |
-| GET | `/api/agent-skills` | 列出所有代理程式技能(內建 + 自訂) |
-| GET | `/api/agent-skills/[id]` | 取得特定代理程式技能 |
-| POST | `/api/agent-skills` | 建立自訂代理程式技能 — 主體:`{name, description, prompt, model?, temperature?}` |
-| PUT | `/api/agent-skills/[id]` | 更新自訂代理程式技能 |
-| DELETE | `/api/agent-skills/[id]` | 刪除自訂代理程式技能 |
-| GET | `/api/agent-skills/[id]/raw` | 取得原始提示詞 + 中繼資料(不含執行) |
-| POST | `/api/agent-skills/generate` | 以自然語言描述 AI 生成新技能 |
+| 方法 | 路徑 | 說明 |
+| ------ | ---------------------------- | -------------------------------------------------------------------------------- |
+| GET | `/api/agent-skills` | 列出所有代理程式技能(內建 + 自訂) |
+| GET | `/api/agent-skills/[id]` | 取得特定代理程式技能 |
+| POST | `/api/agent-skills` | 建立自訂代理程式技能 — 主體:`{name, description, prompt, model?, temperature?}` |
+| PUT | `/api/agent-skills/[id]` | 更新自訂代理程式技能 |
+| DELETE | `/api/agent-skills/[id]` | 刪除自訂代理程式技能 |
+| GET | `/api/agent-skills/[id]/raw` | 取得原始提示詞 + 中繼資料(不含執行) |
+| POST | `/api/agent-skills/generate` | 以自然語言描述 AI 生成新技能 |
**驗證:** 需要管理工作階段或管理範圍的 API 金鑰。
@@ -1228,14 +1228,14 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理語義快取和推理快取。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------- | ----------------------------------------------------------------------------------------------------- |
-| GET | `/api/cache` | 快取概覽:總條目數、命中率、磁碟大小 |
-| GET | `/api/cache/entries` | 列出快取條目(支援分頁) |
-| DELETE | `/api/cache/entries` | 刪除快取條目(依查詢參數過濾) |
-| GET | `/api/cache/stats` | 詳細快取統計(各提供者、各模型) |
-| GET | `/api/cache/reasoning` | 推理快取狀態(用於推理重播) |
-| DELETE | `/api/cache/reasoning` | 清除推理快取 — 查詢參數:`?toolCallId=`(單一)或 `?provider=` 或無參數(全部) |
+| 方法 | 路徑 | 說明 |
+| ------ | ---------------------- | -------------------------------------------------------------------------------------- |
+| GET | `/api/cache` | 快取概覽:總條目數、命中率、磁碟大小 |
+| GET | `/api/cache/entries` | 列出快取條目(支援分頁) |
+| DELETE | `/api/cache/entries` | 刪除快取條目(依查詢參數過濾) |
+| GET | `/api/cache/stats` | 詳細快取統計(各提供者、各模型) |
+| GET | `/api/cache/reasoning` | 推理快取狀態(用於推理重播) |
+| DELETE | `/api/cache/reasoning` | 清除推理快取 — 查詢參數:`?toolCallId=`(單一)或 `?provider=` 或無參數(全部) |
**驗證:** 需要管理工作階段。
@@ -1245,16 +1245,16 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理持久性記憶(FTS5 + 向量嵌入)。
-| 方法 | 路徑 | 說明 |
-| ------ | ----------------------- | ----------------------------------------------------------- |
-| GET | `/api/memory` | 列出記憶條目(依範圍、類型、搜尋查詢過濾) |
-| POST | `/api/memory` | 建立新的記憶條目 — 主體:`{scope, type, content, metadata?}`|
-| GET | `/api/memory/[id]` | 取得特定記憶條目 |
-| PUT | `/api/memory/[id]` | 更新記憶條目 |
-| DELETE | `/api/memory/[id]` | 刪除記憶條目 |
-| GET | `/api/memory/search` | 搜尋記憶(FTS5 + 向量) |
-| POST | `/api/memory/clear` | 清除記憶條目(含過濾器) |
-| GET | `/api/memory/stats` | 記憶統計(總條目數、嵌入覆蓋率等) |
+| 方法 | 路徑 | 說明 |
+| ------ | -------------------- | ------------------------------------------------------------ |
+| GET | `/api/memory` | 列出記憶條目(依範圍、類型、搜尋查詢過濾) |
+| POST | `/api/memory` | 建立新的記憶條目 — 主體:`{scope, type, content, metadata?}` |
+| GET | `/api/memory/[id]` | 取得特定記憶條目 |
+| PUT | `/api/memory/[id]` | 更新記憶條目 |
+| DELETE | `/api/memory/[id]` | 刪除記憶條目 |
+| GET | `/api/memory/search` | 搜尋記憶(FTS5 + 向量) |
+| POST | `/api/memory/clear` | 清除記憶條目(含過濾器) |
+| GET | `/api/memory/stats` | 記憶統計(總條目數、嵌入覆蓋率等) |
**驗證:** 需要管理工作階段或管理範圍的 API 金鑰。
@@ -1264,16 +1264,16 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理事件的 Webhook 訂閱。
-| 方法 | 路徑 | 說明 |
-| ------ | ---------------------------------- | ----------------------------------------------------------------------- |
-| GET | `/api/webhooks` | 列出所有 Webhook 訂閱 |
-| POST | `/api/webhooks` | 建立 Webhook 訂閱 — 主體:`{url, events[], secret?, active?}` |
-| GET | `/api/webhooks/[id]` | 取得特定 Webhook 訂閱 |
-| PUT | `/api/webhooks/[id]` | 更新 Webhook 訂閱 |
-| DELETE | `/api/webhooks/[id]` | 刪除 Webhook 訂閱 |
-| GET | `/api/webhooks/events` | 列出所有可用的 Webhook 事件類型 |
-| GET | `/api/webhooks/[id]/deliveries` | 列出 Webhook 的傳遞歷史記錄(成功/失敗日誌) |
-| POST | `/api/webhooks/[id]/test` | 向 Webhook 傳送測試事件 |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------------- | ------------------------------------------------------------- |
+| GET | `/api/webhooks` | 列出所有 Webhook 訂閱 |
+| POST | `/api/webhooks` | 建立 Webhook 訂閱 — 主體:`{url, events[], secret?, active?}` |
+| GET | `/api/webhooks/[id]` | 取得特定 Webhook 訂閱 |
+| PUT | `/api/webhooks/[id]` | 更新 Webhook 訂閱 |
+| DELETE | `/api/webhooks/[id]` | 刪除 Webhook 訂閱 |
+| GET | `/api/webhooks/events` | 列出所有可用的 Webhook 事件類型 |
+| GET | `/api/webhooks/[id]/deliveries` | 列出 Webhook 的傳遞歷史記錄(成功/失敗日誌) |
+| POST | `/api/webhooks/[id]/test` | 向 Webhook 傳送測試事件 |
**驗證:** 需要管理工作階段。
@@ -1285,14 +1285,14 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理技能(代理程式擴充框架)。
-| 方法 | 路徑 | 說明 |
-| ------ | --------------------------- | ------------------------------------------------------------------------------------ |
-| GET | `/api/skills` | 列出所有已安裝的技能(內建 + 自訂) |
-| POST | `/api/skills/install` | 從本機路徑或 URL 安裝技能 |
-| DELETE | `/api/skills/[id]` | 解除安裝技能 |
-| PUT | `/api/skills/[id]` | 啟用或停用技能 — 主體:`{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` |
-| POST | `/api/skills/executions` | 執行技能 — 主體:`{skillName, apiKeyId, input?, sessionId?}` |
-| GET | `/api/skills/executions` | 列出所有技能的執行歷史(依 `?apiKeyId=` 過濾) |
+| 方法 | 路徑 | 說明 |
+| ------ | ------------------------ | ---------------------------------------------------------------------------- |
+| GET | `/api/skills` | 列出所有已安裝的技能(內建 + 自訂) |
+| POST | `/api/skills/install` | 從本機路徑或 URL 安裝技能 |
+| DELETE | `/api/skills/[id]` | 解除安裝技能 |
+| PUT | `/api/skills/[id]` | 啟用或停用技能 — 主體:`{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` |
+| POST | `/api/skills/executions` | 執行技能 — 主體:`{skillName, apiKeyId, input?, sessionId?}` |
+| GET | `/api/skills/executions` | 列出所有技能的執行歷史(依 `?apiKeyId=` 過濾) |
**驗證:** 需要管理工作階段或管理範圍的 API 金鑰。
@@ -1304,15 +1304,15 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
管理 OmniRoute 外掛程式(第三方擴充套件)。
-| 方法 | 路徑 | 說明 |
-| ------ | ----------------------------------- | --------------------------------- |
-| GET | `/api/plugins` | 列出已安裝的外掛程式 |
-| POST | `/api/plugins/install` | 從本機路徑或 URL 安裝外掛程式 |
-| DELETE | `/api/plugins/[name]` | 解除安裝外掛程式 |
-| POST | `/api/plugins/[name]/activate` | 啟用外掛程式 |
-| POST | `/api/plugins/[name]/deactivate` | 停用外掛程式 |
-| GET | `/api/plugins/[name]/config` | 取得外掛程式設定 |
-| PUT | `/api/plugins/[name]/config` | 更新外掛程式設定 |
+| 方法 | 路徑 | 說明 |
+| ------ | -------------------------------- | ----------------------------- |
+| GET | `/api/plugins` | 列出已安裝的外掛程式 |
+| POST | `/api/plugins/install` | 從本機路徑或 URL 安裝外掛程式 |
+| DELETE | `/api/plugins/[name]` | 解除安裝外掛程式 |
+| POST | `/api/plugins/[name]/activate` | 啟用外掛程式 |
+| POST | `/api/plugins/[name]/deactivate` | 停用外掛程式 |
+| GET | `/api/plugins/[name]/config` | 取得外掛程式設定 |
+| PUT | `/api/plugins/[name]/config` | 更新外掛程式設定 |
**驗證:** 需要管理工作階段。
@@ -1330,10 +1330,10 @@ ACP 代理程式以子程序執行。這些端點管理 ACP 代理程式偵測
檢查執行時期防護機制(PII 偵測、提示注入偵測、視覺橋接)。防護機制在每個請求上執行;每次呼叫的選擇退出方式是透過 `x-omniroute-disabled-guardrails` 請求標頭 — 沒有持久的啟用/停用表面。
-| 方法 | 路徑 | 說明 |
-| ------ | ------------------------- | ----------------------------------------------------------------------------------- |
-| GET | `/api/guardrails` | 列出已註冊的防護機制及其狀態(名稱/已啟用/優先順序) |
-| POST | `/api/guardrails/test` | 對範例輸入乾執行呼叫前管線 — 主體:`{input, disabledGuardrails?}` |
+| 方法 | 路徑 | 說明 |
+| ---- | ---------------------- | ----------------------------------------------------------------- |
+| GET | `/api/guardrails` | 列出已註冊的防護機制及其狀態(名稱/已啟用/優先順序) |
+| POST | `/api/guardrails/test` | 對範例輸入乾執行呼叫前管線 — 主體:`{input, disabledGuardrails?}` |
**驗證:** 需要管理工作階段。
diff --git a/docs/i18n/zh-TW/docs/reference/CLI-TOOLS.md b/docs/i18n/zh-TW/docs/reference/CLI-TOOLS.md
index 78fa31ea92..fba38c4d49 100644
--- a/docs/i18n/zh-TW/docs/reference/CLI-TOOLS.md
+++ b/docs/i18n/zh-TW/docs/reference/CLI-TOOLS.md
@@ -1,6 +1,6 @@
# CLI-TOOLS (中文 (繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇸🇦 [ar](../../../ar/docs/reference/CLI-TOOLS.md) · 🇦🇿 [az](../../../az/docs/reference/CLI-TOOLS.md) · 🇧🇬 [bg](../../../bg/docs/reference/CLI-TOOLS.md) · 🇧🇩 [bn](../../../bn/docs/reference/CLI-TOOLS.md) · 🇨🇿 [cs](../../../cs/docs/reference/CLI-TOOLS.md) · 🇩🇰 [da](../../../da/docs/reference/CLI-TOOLS.md) · 🇩🇪 [de](../../../de/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇮🇷 [fa](../../../fa/docs/reference/CLI-TOOLS.md) · 🇫🇮 [fi](../../../fi/docs/reference/CLI-TOOLS.md) · 🇫🇷 [fr](../../../fr/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇮🇩 [in](../../../in/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇵🇭 [phi](../../../phi/docs/reference/CLI-TOOLS.md) · 🇵🇱 [pl](../../../pl/docs/reference/CLI-TOOLS.md) · 🇵🇹 [pt](../../../pt/docs/reference/CLI-TOOLS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/CLI-TOOLS.md) · 🇷🇴 [ro](../../../ro/docs/reference/CLI-TOOLS.md) · 🇷🇺 [ru](../../../ru/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇪 [sv](../../../sv/docs/reference/CLI-TOOLS.md) · 🇰🇪 [sw](../../../sw/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ta](../../../ta/docs/reference/CLI-TOOLS.md) · 🇮🇳 [te](../../../te/docs/reference/CLI-TOOLS.md) · 🇹🇭 [th](../../../th/docs/reference/CLI-TOOLS.md) · 🇹🇷 [tr](../../../tr/docs/reference/CLI-TOOLS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/CLI-TOOLS.md) · 🇵🇰 [ur](../../../ur/docs/reference/CLI-TOOLS.md) · 🇻🇳 [vi](../../../vi/docs/reference/CLI-TOOLS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/CLI-TOOLS.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇸🇦 [ar](../../../ar/docs/reference/CLI-TOOLS.md) · 🇦🇿 [az](../../../az/docs/reference/CLI-TOOLS.md) · 🇧🇬 [bg](../../../bg/docs/reference/CLI-TOOLS.md) · 🇧🇩 [bn](../../../bn/docs/reference/CLI-TOOLS.md) · 🇨🇿 [cs](../../../cs/docs/reference/CLI-TOOLS.md) · 🇩🇰 [da](../../../da/docs/reference/CLI-TOOLS.md) · 🇩🇪 [de](../../../de/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇮🇷 [fa](../../../fa/docs/reference/CLI-TOOLS.md) · 🇫🇮 [fi](../../../fi/docs/reference/CLI-TOOLS.md) · 🇫🇷 [fr](../../../fr/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇵🇭 [phi](../../../phi/docs/reference/CLI-TOOLS.md) · 🇵🇱 [pl](../../../pl/docs/reference/CLI-TOOLS.md) · 🇵🇹 [pt](../../../pt/docs/reference/CLI-TOOLS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/CLI-TOOLS.md) · 🇷🇴 [ro](../../../ro/docs/reference/CLI-TOOLS.md) · 🇷🇺 [ru](../../../ru/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇪 [sv](../../../sv/docs/reference/CLI-TOOLS.md) · 🇰🇪 [sw](../../../sw/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ta](../../../ta/docs/reference/CLI-TOOLS.md) · 🇮🇳 [te](../../../te/docs/reference/CLI-TOOLS.md) · 🇹🇭 [th](../../../th/docs/reference/CLI-TOOLS.md) · 🇹🇷 [tr](../../../tr/docs/reference/CLI-TOOLS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/CLI-TOOLS.md) · 🇵🇰 [ur](../../../ur/docs/reference/CLI-TOOLS.md) · 🇻🇳 [vi](../../../vi/docs/reference/CLI-TOOLS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/CLI-TOOLS.md)
---
diff --git a/docs/i18n/zh-TW/docs/reference/ENVIRONMENT.md b/docs/i18n/zh-TW/docs/reference/ENVIRONMENT.md
index b064777868..00887fb2c1 100644
--- a/docs/i18n/zh-TW/docs/reference/ENVIRONMENT.md
+++ b/docs/i18n/zh-TW/docs/reference/ENVIRONMENT.md
@@ -1,6 +1,6 @@
# Environment Variables Reference (中文 (簡體))
-🌐 **Languages:** 🇺🇸 [English](../../../../docs/ENVIRONMENT.md) · 🇸🇦 [ar](../../ar/docs/ENVIRONMENT.md) · 🇧🇬 [bg](../../bg/docs/ENVIRONMENT.md) · 🇧🇩 [bn](../../bn/docs/ENVIRONMENT.md) · 🇨🇿 [cs](../../cs/docs/ENVIRONMENT.md) · 🇩🇰 [da](../../da/docs/ENVIRONMENT.md) · 🇩🇪 [de](../../de/docs/ENVIRONMENT.md) · 🇪🇸 [es](../../es/docs/ENVIRONMENT.md) · 🇮🇷 [fa](../../fa/docs/ENVIRONMENT.md) · 🇫🇮 [fi](../../fi/docs/ENVIRONMENT.md) · 🇫🇷 [fr](../../fr/docs/ENVIRONMENT.md) · 🇮🇳 [gu](../../gu/docs/ENVIRONMENT.md) · 🇮🇱 [he](../../he/docs/ENVIRONMENT.md) · 🇮🇳 [hi](../../hi/docs/ENVIRONMENT.md) · 🇭🇺 [hu](../../hu/docs/ENVIRONMENT.md) · 🇮🇩 [id](../../id/docs/ENVIRONMENT.md) · 🇮🇹 [it](../../it/docs/ENVIRONMENT.md) · 🇯🇵 [ja](../../ja/docs/ENVIRONMENT.md) · 🇰🇷 [ko](../../ko/docs/ENVIRONMENT.md) · 🇮🇳 [mr](../../mr/docs/ENVIRONMENT.md) · 🇲🇾 [ms](../../ms/docs/ENVIRONMENT.md) · 🇳🇱 [nl](../../nl/docs/ENVIRONMENT.md) · 🇳🇴 [no](../../no/docs/ENVIRONMENT.md) · 🇵🇭 [phi](../../phi/docs/ENVIRONMENT.md) · 🇵🇱 [pl](../../pl/docs/ENVIRONMENT.md) · 🇵🇹 [pt](../../pt/docs/ENVIRONMENT.md) · 🇧🇷 [pt-BR](../../pt-BR/docs/ENVIRONMENT.md) · 🇷🇴 [ro](../../ro/docs/ENVIRONMENT.md) · 🇷🇺 [ru](../../ru/docs/ENVIRONMENT.md) · 🇸🇰 [sk](../../sk/docs/ENVIRONMENT.md) · 🇸🇪 [sv](../../sv/docs/ENVIRONMENT.md) · 🇰🇪 [sw](../../sw/docs/ENVIRONMENT.md) · 🇮🇳 [ta](../../ta/docs/ENVIRONMENT.md) · 🇮🇳 [te](../../te/docs/ENVIRONMENT.md) · 🇹🇭 [th](../../th/docs/ENVIRONMENT.md) · 🇹🇷 [tr](../../tr/docs/ENVIRONMENT.md) · 🇺🇦 [uk-UA](../../uk-UA/docs/ENVIRONMENT.md) · 🇵🇰 [ur](../../ur/docs/ENVIRONMENT.md) · 🇻🇳 [vi](../../vi/docs/ENVIRONMENT.md) · 🇨🇳 [zh-CN](../../zh-CN/docs/ENVIRONMENT.md)
+🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇰🇷 [ko](../../../ko/docs/reference/ENVIRONMENT.md) · 🇮🇳 [mr](../../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [ms](../../../ms/docs/reference/ENVIRONMENT.md) · 🇳🇱 [nl](../../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [no](../../../no/docs/reference/ENVIRONMENT.md) · 🇵🇭 [phi](../../../phi/docs/reference/ENVIRONMENT.md) · 🇵🇱 [pl](../../../pl/docs/reference/ENVIRONMENT.md) · 🇵🇹 [pt](../../../pt/docs/reference/ENVIRONMENT.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/ENVIRONMENT.md) · 🇷🇴 [ro](../../../ro/docs/reference/ENVIRONMENT.md) · 🇷🇺 [ru](../../../ru/docs/reference/ENVIRONMENT.md) · 🇸🇰 [sk](../../../sk/docs/reference/ENVIRONMENT.md) · 🇸🇪 [sv](../../../sv/docs/reference/ENVIRONMENT.md) · 🇰🇪 [sw](../../../sw/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ta](../../../ta/docs/reference/ENVIRONMENT.md) · 🇮🇳 [te](../../../te/docs/reference/ENVIRONMENT.md) · 🇹🇭 [th](../../../th/docs/reference/ENVIRONMENT.md) · 🇹🇷 [tr](../../../tr/docs/reference/ENVIRONMENT.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/ENVIRONMENT.md) · 🇵🇰 [ur](../../../ur/docs/reference/ENVIRONMENT.md) · 🇻🇳 [vi](../../../vi/docs/reference/ENVIRONMENT.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/ENVIRONMENT.md)
---
diff --git a/docs/i18n/zh-TW/llm.txt b/docs/i18n/zh-TW/llm.txt
index ed887f4833..2caf3c753c 100644
--- a/docs/i18n/zh-TW/llm.txt
+++ b/docs/i18n/zh-TW/llm.txt
@@ -1,6 +1,6 @@
# OmniRoute (中文(繁體))
-🌐 **Languages:** 🇺🇸 [English](../../../llm.txt) · 🇸🇦 [ar](../ar/llm.txt) · 🇧🇬 [bg](../bg/llm.txt) · 🇧🇩 [bn](../bn/llm.txt) · 🇨🇿 [cs](../cs/llm.txt) · 🇩🇰 [da](../da/llm.txt) · 🇩🇪 [de](../de/llm.txt) · 🇪🇸 [es](../es/llm.txt) · 🇮🇷 [fa](../fa/llm.txt) · 🇫🇮 [fi](../fi/llm.txt) · 🇫🇷 [fr](../fr/llm.txt) · 🇮🇳 [gu](../gu/llm.txt) · 🇮🇱 [he](../he/llm.txt) · 🇮🇳 [hi](../hi/llm.txt) · 🇭🇺 [hu](../hu/llm.txt) · 🇮🇩 [id](../id/llm.txt) · 🇮🇳 [in](../in/llm.txt) · 🇮🇹 [it](../it/llm.txt) · 🇯🇵 [ja](../ja/llm.txt) · 🇰🇷 [ko](../ko/llm.txt) · 🇮🇳 [mr](../mr/llm.txt) · 🇲🇾 [ms](../ms/llm.txt) · 🇳🇱 [nl](../nl/llm.txt) · 🇳🇴 [no](../no/llm.txt) · 🇵🇭 [phi](../phi/llm.txt) · 🇵🇱 [pl](../pl/llm.txt) · 🇵🇹 [pt](../pt/llm.txt) · 🇧🇷 [pt-BR](../pt-BR/llm.txt) · 🇷🇴 [ro](../ro/llm.txt) · 🇷🇺 [ru](../ru/llm.txt) · 🇸🇰 [sk](../sk/llm.txt) · 🇸🇪 [sv](../sv/llm.txt) · 🇰🇪 [sw](../sw/llm.txt) · 🇮🇳 [ta](../ta/llm.txt) · 🇮🇳 [te](../te/llm.txt) · 🇹🇭 [th](../th/llm.txt) · 🇹🇷 [tr](../tr/llm.txt) · 🇺🇦 [uk-UA](../uk-UA/llm.txt) · 🇵🇰 [ur](../ur/llm.txt) · 🇻🇳 [vi](../vi/llm.txt) · 🇨🇳 [zh-CN](../zh-CN/llm.txt)
+🌐 **Languages:** 🇺🇸 [English](../../../llm.txt) · 🇸🇦 [ar](../ar/llm.txt) · 🇦🇿 [az](../az/llm.txt) · 🇧🇬 [bg](../bg/llm.txt) · 🇧🇩 [bn](../bn/llm.txt) · 🇨🇿 [cs](../cs/llm.txt) · 🇩🇰 [da](../da/llm.txt) · 🇩🇪 [de](../de/llm.txt) · 🇪🇸 [es](../es/llm.txt) · 🇮🇷 [fa](../fa/llm.txt) · 🇫🇮 [fi](../fi/llm.txt) · 🇫🇷 [fr](../fr/llm.txt) · 🇮🇳 [gu](../gu/llm.txt) · 🇮🇱 [he](../he/llm.txt) · 🇮🇳 [hi](../hi/llm.txt) · 🇭🇺 [hu](../hu/llm.txt) · 🇮🇩 [id](../id/llm.txt) · 🇮🇹 [it](../it/llm.txt) · 🇯🇵 [ja](../ja/llm.txt) · 🇰🇷 [ko](../ko/llm.txt) · 🇮🇳 [mr](../mr/llm.txt) · 🇲🇾 [ms](../ms/llm.txt) · 🇳🇱 [nl](../nl/llm.txt) · 🇳🇴 [no](../no/llm.txt) · 🇵🇭 [phi](../phi/llm.txt) · 🇵🇱 [pl](../pl/llm.txt) · 🇵🇹 [pt](../pt/llm.txt) · 🇧🇷 [pt-BR](../pt-BR/llm.txt) · 🇷🇴 [ro](../ro/llm.txt) · 🇷🇺 [ru](../ru/llm.txt) · 🇸🇰 [sk](../sk/llm.txt) · 🇸🇪 [sv](../sv/llm.txt) · 🇰🇪 [sw](../sw/llm.txt) · 🇮🇳 [ta](../ta/llm.txt) · 🇮🇳 [te](../te/llm.txt) · 🇹🇭 [th](../th/llm.txt) · 🇹🇷 [tr](../tr/llm.txt) · 🇺🇦 [uk-UA](../uk-UA/llm.txt) · 🇵🇰 [ur](../ur/llm.txt) · 🇻🇳 [vi](../vi/llm.txt) · 🇨🇳 [zh-CN](../zh-CN/llm.txt)
---
@@ -26,7 +26,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
- **Background jobs:** Custom token health check scheduler, 24h model auto-sync
- **Streaming:** Server-Sent Events (SSE) for real-time proxy responses
- **Proxy engine:** Custom pipeline with format translation, circuit breaker, rate limiting, auto-combo engine
-- **i18n:** next-intl with 43 languages
+- **i18n:** next-intl with 42 languages
- **Desktop:** Electron (cross-platform: Windows, macOS, Linux)
- **Package:** Published on npm (`omniroute`) and Docker Hub (`diegosouzapw/omniroute`)
@@ -98,7 +98,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ │ ├── configAudit.ts # Configuration auditing
│ │ └── responses.ts # Domain response types
│ ├── i18n/ # Internationalization
-│ │ └── messages/ # 43 language JSON files
+│ │ └── messages/ # 42 language JSON files
│ ├── lib/ # Core libraries
│ │ ├── a2a/ # Agent-to-Agent v0.3 protocol server
│ │ │ ├── skills/ # A2A skills (quotaManagement, smartRouting)
@@ -263,7 +263,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ ├── translator/ # Translator-specific tests
│ └── load/ # Load tests
├── docs/ # Documentation
-│ ├── i18n/ # 43-language translated docs
+│ ├── i18n/ # 41-language translated docs
│ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md
│ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md
│ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md
@@ -371,8 +371,8 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
**Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs
### Internationalization
-- 43 languages for UI (all dashboard pages)
-- 42 translated documentation sets in docs/i18n/
+- 42 languages for UI (all dashboard pages)
+- 41 translated documentation sets in docs/i18n/
- Language switcher in documentation
## Key Architectural Decisions
diff --git a/docs/ops/RELEASE_CHECKLIST.md b/docs/ops/RELEASE_CHECKLIST.md
index 53fa6bb733..f6bf96790b 100644
--- a/docs/ops/RELEASE_CHECKLIST.md
+++ b/docs/ops/RELEASE_CHECKLIST.md
@@ -46,8 +46,8 @@ That is the bypass npm sanctions now that tokens which skip 2FA are being retire
it restores the fully automatic flow the project had up to v3.8.48 while keeping the
WS1.3 guarantee (a leaked token cannot publish alone — there is no token).
-**One-time setup (owner):** npmjs.com → package `omniroute` → Settings → *Trusted
-Publisher* → GitHub: owner `diegosouzapw`, repo `OmniRoute`, workflow `npm-publish.yml`
+**One-time setup (owner):** npmjs.com → package `omniroute` → Settings → _Trusted
+Publisher_ → GitHub: owner `diegosouzapw`, repo `OmniRoute`, workflow `npm-publish.yml`
(environment: none). Until that exists, the automatic step fails with `ENEEDAUTH`:
re-dispatch with `publish_mode=staged` (below) or `direct`.
@@ -193,7 +193,7 @@ Breaking changes: add `BREAKING CHANGE:` footer or `!` after the scope (e.g. `fe
- [ ] `npm run i18n:check` exits 0 — translation state (`.i18n-state.json`) in sync with source docs (no drifted sources in strict mode; warn-mode advisory is acceptable for last-minute doc touch-ups, but should be 0 before tagging)
- [ ] `npm run i18n:check-ui-coverage` exits 0 — every UI locale at or above the 80% coverage floor
-- [ ] `npm run i18n:sync-ui:dry` reports 0 missing keys across all 43 locales
+- [ ] `npm run i18n:sync-ui:dry` reports 0 missing keys across all 42 locales
- [ ] If source English docs changed, run `npm run i18n:run` (requires `OMNIROUTE_TRANSLATION_API_KEY` in `.env`) before tagging
- [ ] Translation contributions can be deferred to next release if minor (track in CHANGELOG)
diff --git a/docs/ops/VM_DEPLOYMENT_GUIDE.md b/docs/ops/VM_DEPLOYMENT_GUIDE.md
index 41a77d9e98..df220c7e90 100644
--- a/docs/ops/VM_DEPLOYMENT_GUIDE.md
+++ b/docs/ops/VM_DEPLOYMENT_GUIDE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-06-28
# OmniRoute — Deployment Guide on VM with Cloudflare
-🌐 **Languages:** 🇺🇸 [English](./VM_DEPLOYMENT_GUIDE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇪🇸 [Español](../i18n/es/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇷 [Français](../i18n/fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇹 [Italiano](../i18n/it/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇺 [Русский](../i18n/ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇭 [ไทย](../i18n/th/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇦 [العربية](../i18n/ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇯🇵 [日本語](../i18n/ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇧🇬 [Български](../i18n/bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇰 [Dansk](../i18n/da/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇱 [עברית](../i18n/he/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇰🇷 [한국어](../i18n/ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇴 [Norsk](../i18n/no/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇴 [Română](../i18n/ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇱 [Polski](../i18n/pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/ops/VM_DEPLOYMENT_GUIDE.md)
+🌐 **Languages:** 🇺🇸 [English](./VM_DEPLOYMENT_GUIDE.md) | 🇸🇦 [العربية](../i18n/ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇦🇿 [Azərbaycan dili](../i18n/az/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇧🇬 [Български](../i18n/bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇧🇩 [বাংলা](../i18n/bn/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇰 [Dansk](../i18n/da/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇪🇸 [Español](../i18n/es/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇷 [فارسی](../i18n/fa/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇫🇷 [Français](../i18n/fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [ગુજરાતી](../i18n/gu/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇱 [עברית](../i18n/he/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [हिन्दी](../i18n/hi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇹 [Italiano](../i18n/it/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇯🇵 [日本語](../i18n/ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇰🇷 [한국어](../i18n/ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [मराठी](../i18n/mr/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇳🇴 [Norsk](../i18n/no/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇱 [Polski](../i18n/pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇴 [Română](../i18n/ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇷🇺 [Русский](../i18n/ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇰🇪 [Kiswahili](../i18n/sw/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [தமிழ்](../i18n/ta/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇮🇳 [తెలుగు](../i18n/te/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇭 [ไทย](../i18n/th/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇷 [Türkçe](../i18n/tr/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇵🇰 [اردو](../i18n/ur/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md) | 🇹🇼 [中文 (繁體)](../i18n/zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md)
Complete guide to install and configure OmniRoute on a VM (VPS) with domain managed via Cloudflare.
diff --git a/docs/reference/API_REFERENCE.md b/docs/reference/API_REFERENCE.md
index 42dbb44632..f25634059e 100644
--- a/docs/reference/API_REFERENCE.md
+++ b/docs/reference/API_REFERENCE.md
@@ -6,7 +6,7 @@ lastUpdated: 2026-08-31
# API Reference
-🌐 **Languages:** 🇺🇸 [English](./API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/reference/API_REFERENCE.md) | 🇪🇸 [Español](../i18n/es/docs/reference/API_REFERENCE.md) | 🇫🇷 [Français](../i18n/fr/docs/reference/API_REFERENCE.md) | 🇮🇹 [Italiano](../i18n/it/docs/reference/API_REFERENCE.md) | 🇷🇺 [Русский](../i18n/ru/docs/reference/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/reference/API_REFERENCE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/reference/API_REFERENCE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/reference/API_REFERENCE.md) | 🇹🇭 [ไทย](../i18n/th/docs/reference/API_REFERENCE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/reference/API_REFERENCE.md) | 🇸🇦 [العربية](../i18n/ar/docs/reference/API_REFERENCE.md) | 🇯🇵 [日本語](../i18n/ja/docs/reference/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/reference/API_REFERENCE.md) | 🇧🇬 [Български](../i18n/bg/docs/reference/API_REFERENCE.md) | 🇩🇰 [Dansk](../i18n/da/docs/reference/API_REFERENCE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/reference/API_REFERENCE.md) | 🇮🇱 [עברית](../i18n/he/docs/reference/API_REFERENCE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/reference/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/reference/API_REFERENCE.md) | 🇰🇷 [한국어](../i18n/ko/docs/reference/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/reference/API_REFERENCE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/reference/API_REFERENCE.md) | 🇳🇴 [Norsk](../i18n/no/docs/reference/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/reference/API_REFERENCE.md) | 🇷🇴 [Română](../i18n/ro/docs/reference/API_REFERENCE.md) | 🇵🇱 [Polski](../i18n/pl/docs/reference/API_REFERENCE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/reference/API_REFERENCE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/reference/API_REFERENCE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/reference/API_REFERENCE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/reference/API_REFERENCE.md)
+🌐 **Languages:** 🇺🇸 [English](./API_REFERENCE.md) | 🇸🇦 [العربية](../i18n/ar/docs/reference/API_REFERENCE.md) | 🇦🇿 [Azərbaycan dili](../i18n/az/docs/reference/API_REFERENCE.md) | 🇧🇬 [Български](../i18n/bg/docs/reference/API_REFERENCE.md) | 🇧🇩 [বাংলা](../i18n/bn/docs/reference/API_REFERENCE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/reference/API_REFERENCE.md) | 🇩🇰 [Dansk](../i18n/da/docs/reference/API_REFERENCE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/reference/API_REFERENCE.md) | 🇪🇸 [Español](../i18n/es/docs/reference/API_REFERENCE.md) | 🇮🇷 [فارسی](../i18n/fa/docs/reference/API_REFERENCE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/reference/API_REFERENCE.md) | 🇫🇷 [Français](../i18n/fr/docs/reference/API_REFERENCE.md) | 🇮🇳 [ગુજરાતી](../i18n/gu/docs/reference/API_REFERENCE.md) | 🇮🇱 [עברית](../i18n/he/docs/reference/API_REFERENCE.md) | 🇮🇳 [हिन्दी](../i18n/hi/docs/reference/API_REFERENCE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/reference/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/reference/API_REFERENCE.md) | 🇮🇹 [Italiano](../i18n/it/docs/reference/API_REFERENCE.md) | 🇯🇵 [日本語](../i18n/ja/docs/reference/API_REFERENCE.md) | 🇰🇷 [한국어](../i18n/ko/docs/reference/API_REFERENCE.md) | 🇮🇳 [मराठी](../i18n/mr/docs/reference/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/reference/API_REFERENCE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/reference/API_REFERENCE.md) | 🇳🇴 [Norsk](../i18n/no/docs/reference/API_REFERENCE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/reference/API_REFERENCE.md) | 🇵🇱 [Polski](../i18n/pl/docs/reference/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/reference/API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/reference/API_REFERENCE.md) | 🇷🇴 [Română](../i18n/ro/docs/reference/API_REFERENCE.md) | 🇷🇺 [Русский](../i18n/ru/docs/reference/API_REFERENCE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/reference/API_REFERENCE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/reference/API_REFERENCE.md) | 🇰🇪 [Kiswahili](../i18n/sw/docs/reference/API_REFERENCE.md) | 🇮🇳 [தமிழ்](../i18n/ta/docs/reference/API_REFERENCE.md) | 🇮🇳 [తెలుగు](../i18n/te/docs/reference/API_REFERENCE.md) | 🇹🇭 [ไทย](../i18n/th/docs/reference/API_REFERENCE.md) | 🇹🇷 [Türkçe](../i18n/tr/docs/reference/API_REFERENCE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/reference/API_REFERENCE.md) | 🇵🇰 [اردو](../i18n/ur/docs/reference/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/reference/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/reference/API_REFERENCE.md) | 🇹🇼 [中文 (繁體)](../i18n/zh-TW/docs/reference/API_REFERENCE.md)
Core reference for the OmniRoute API. It covers the public `/v1` surface and the most-used management endpoints; the machine-readable [`docs/openapi.yaml`](../openapi.yaml) and the route tree under `src/app/api/` are the exhaustive sources.
diff --git a/llm.txt b/llm.txt
index a78b3a97f6..9789ad5c22 100644
--- a/llm.txt
+++ b/llm.txt
@@ -22,7 +22,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
- **Background jobs:** Custom token health check scheduler, 24h model auto-sync
- **Streaming:** Server-Sent Events (SSE) for real-time proxy responses
- **Proxy engine:** Custom pipeline with format translation, circuit breaker, rate limiting, auto-combo engine
-- **i18n:** next-intl with 43 languages
+- **i18n:** next-intl with 42 languages
- **Desktop:** Electron (cross-platform: Windows, macOS, Linux)
- **Package:** Published on npm (`omniroute`) and Docker Hub (`diegosouzapw/omniroute`)
@@ -94,7 +94,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ │ ├── configAudit.ts # Configuration auditing
│ │ └── responses.ts # Domain response types
│ ├── i18n/ # Internationalization
-│ │ └── messages/ # 43 language JSON files
+│ │ └── messages/ # 42 language JSON files
│ ├── lib/ # Core libraries
│ │ ├── a2a/ # Agent-to-Agent v0.3 protocol server
│ │ │ ├── skills/ # A2A skills (quotaManagement, smartRouting)
@@ -259,7 +259,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
│ ├── translator/ # Translator-specific tests
│ └── load/ # Load tests
├── docs/ # Documentation
-│ ├── i18n/ # 43-language translated docs
+│ ├── i18n/ # 41-language translated docs
│ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md
│ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md
│ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md
@@ -367,8 +367,8 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
**Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs
### Internationalization
-- 43 languages for UI (all dashboard pages)
-- 42 translated documentation sets in docs/i18n/
+- 42 languages for UI (all dashboard pages)
+- 41 translated documentation sets in docs/i18n/
- Language switcher in documentation
## Key Architectural Decisions
diff --git a/package.json b/package.json
index 214c6ea22e..f019c45e90 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
"src/sse/",
"src/types/",
".env.example",
+ "config/i18n.json",
"scripts/build/postinstall.mjs",
"scripts/build/fixPlaywrightAndroid.mjs",
"bin/cli/runtime/",
@@ -161,6 +162,10 @@
"i18n:check-value-drift:warn": "node scripts/i18n/check-ui-value-drift.mjs --warn",
"i18n:check-glossary": "node scripts/i18n/check-glossary-consistency.mjs",
"i18n:check-glossary:ko": "node scripts/i18n/check-glossary-consistency.mjs --locale=ko",
+ "i18n:check-ratio": "node scripts/i18n/check-translation-ratio.mjs",
+ "i18n:check-ratio:update": "node scripts/i18n/check-translation-ratio.mjs --update",
+ "i18n:sync-bars": "node scripts/i18n/sync-language-bars.mjs",
+ "i18n:add-locale": "node scripts/i18n/add-locale.mjs",
"check:native-deps": "node scripts/check/check-native-deps.mjs",
"check:node-runtime": "node --import tsx scripts/check/check-supported-node-runtime.ts",
"check:pack-artifact": "node --import tsx scripts/build/validate-pack-artifact.ts",
diff --git a/scripts/build/pack-artifact-policy.ts b/scripts/build/pack-artifact-policy.ts
index bbead7311d..378d3a2805 100644
--- a/scripts/build/pack-artifact-policy.ts
+++ b/scripts/build/pack-artifact-policy.ts
@@ -122,6 +122,11 @@ export const PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS: string[] = [
"bin/restore-policies.sh",
"bin/rollback.sh",
"bin/snapshot-data.sh",
+ // Locale source of truth read at runtime by bin/cli/i18n.mjs (OMNIROUTE_LANG alias
+ // resolution: uk → uk-UA, fil/tl → phi, zh-hk/zh-mo/zh-hant → zh-TW) and by
+ // bin/cli/commands/config.mjs (`config lang list`). Shipped via package.json "files";
+ // without it the published CLI cannot resolve aliases and `config lang list` is empty.
+ "config/i18n.json",
"open-sse/mcp-server/README.md",
"open-sse/mcp-server/audit.ts",
"open-sse/mcp-server/httpTransport.ts",
@@ -223,6 +228,10 @@ export const PACK_ARTIFACT_REQUIRED_PATHS: string[] = [
// or the CLI fails to boot — list them REQUIRED so a regression is loud.
"bin/aliasResolver.mjs",
"bin/aliasResolverHook.mjs",
+ // Locale aliases consumed by bin/cli/i18n.mjs at runtime. config/ is not an allowlist
+ // PREFIX, so a vanished file would never fail the unexpected-paths check — list it
+ // REQUIRED so the tarball can never silently lose it again (#7065 class).
+ "config/i18n.json",
"config/release/wreq-js-native-manifest.json",
"config/release/wreq-js-rust-license-inventory.json",
"config/release/wreq-js-rust-notices.md",
diff --git a/scripts/i18n/add-locale.mjs b/scripts/i18n/add-locale.mjs
new file mode 100644
index 0000000000..0b1a3623bc
--- /dev/null
+++ b/scripts/i18n/add-locale.mjs
@@ -0,0 +1,880 @@
+#!/usr/bin/env node
+/**
+ * OmniRoute — add one locale to every surface with a single command.
+ *
+ * npm run i18n:add-locale -- --code=el --english=Greek --native=Ελληνικά --flag=🇬🇷 \
+ * [--aliases=el-gr] [--flag-file=gr.svg] [--rtl] [--docs=core|all | --files=] [--cli-full] \
+ * [--force-cli] [--site-dir=../omnirouteSite] [--batch-size=40] [--only=] \
+ * [--skip=] [--dry-run]
+ *
+ * Phases, in order. Every phase checks presence first, so re-running the command
+ * for an already-added locale is a no-op apart from re-translating whatever is
+ * still missing (`__MISSING__` markers, untranslated CLI / site keys):
+ *
+ * config config/i18n.json entry (+ aliases, rtl) — the single source of truth
+ * flag docs/assets/flags/.svg from lipis/flag-icons (MIT) when missing
+ * ui src/i18n/messages/.json — scaffold, then sync-ui-keys --translate-markers;
+ * markers still __MISSING__ afterwards are reported and fail the run (exit 1)
+ * docs docs/i18n//** via run-translation — the core set every existing locale
+ * carries (lib/docs-core-set.mjs; --docs=all for the full source set, --files=
+ * for an explicit list) — then the llm.txt / CHANGELOG.md mirror stubs
+ * cli bin/cli/locales/.json — generate-locales --code scaffold, then the
+ * common + program sections (--cli-full: every section) translated in batches
+ * readme README flag link, docs/i18n/README.md row, docs/guides/I18N.md row, and the
+ * locale counts in llm.txt (+ sync-llm-mirrors), docs/README.md and
+ * docs/diagrams/i18n-flow.mmd
+ * bars sync-language-bars — every 🌐 Languages bar gains the new locale
+ * site /lang/.json (translated), js/i18n.js SUPPORTED_LANGS and the
+ * language dropdowns (lib/site-scaffold.mjs); node --check on the edited JS
+ *
+ * A real run ends with Prettier on the touched repo files (never the site checkout).
+ * `--dry-run` prints every
+ * planned write / command — including the computed docs core set — and touches
+ * nothing: no files, no network, no child processes.
+ *
+ * The translating phases (ui, docs, cli, site) need OMNIROUTE_TRANSLATION_API_URL,
+ * _API_KEY and _MODEL (docs/guides/I18N.md → "Translation pipeline"); `.env` is loaded
+ * automatically. Child scripts run through execFileSync with an argument array —
+ * nothing is ever interpolated into a shell.
+ */
+
+import { promises as fs, existsSync, readFileSync } from "node:fs";
+import path from "node:path";
+import process from "node:process";
+import { execFileSync } from "node:child_process";
+import { fileURLToPath } from "node:url";
+
+import { computeDocsCoreSet, docsLocaleDirs } from "./lib/docs-core-set.mjs";
+import { buildMirrorBar } from "./lib/language-bar.mjs";
+import {
+ bumpCounts,
+ buildMirrorStub,
+ flagFileFor,
+ insertDocsIndexRow,
+ insertI18nGuideRow,
+ insertLocaleEntry,
+ insertReadmeFlagLink,
+} from "./lib/locale-scaffold.mjs";
+import { addDropdownOption, addSupportedLang } from "./lib/site-scaffold.mjs";
+import { backendConfig, translateBatch, translateString } from "./lib/translate-backend.mjs";
+
+const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
+const ROOT = path.resolve(SCRIPT_DIR, "..", "..");
+
+const PHASES = ["config", "flag", "ui", "docs", "cli", "readme", "bars", "site"];
+// Phases whose outcome must agree with config/i18n.json ON DISK: the child scripts
+// (ui, docs, cli, bars) read the locale list from there, and the readme edits list
+// the locale on every surface the parity test checks against the config. For a
+// brand-new locale they need the config phase in the same run. readme is guarded in
+// dry-run too — its edits are computed in-process, so nothing else would flag the
+// inconsistency — while the child-backed phases stay previewable (--only=docs).
+const PHASES_REQUIRING_CONFIG_ON_DISK = ["ui", "docs", "cli", "readme", "bars"];
+const PHASES_GUARDED_IN_DRY_RUN = ["readme"];
+const PHASES_TRANSLATING = ["ui", "docs", "cli", "site"];
+const FLAG_CDN = "https://raw.githubusercontent.com/lipis/flag-icons/main/flags/4x3/";
+const SITE_PAGES = ["index.html", "why/index.html", "viral/index.html"];
+const CLI_DEFAULT_SECTIONS = ["common", "program"];
+const MIRROR_STUBS = [
+ ["llm.txt", "OmniRoute"],
+ ["CHANGELOG.md", "Changelog"],
+];
+const PLACEHOLDER_PREFIX = "__MISSING__:";
+const LOCALE_CODE = /^[a-z]{2,3}(-[A-Z][A-Za-z]{1,3})?$/;
+// docs/guides/I18N.md locale table row, capturing the code between backticks.
+// Static on purpose: the code is compared as a string, so no CLI value ever
+// reaches a RegExp constructor.
+const I18N_GUIDE_ROW_RE = /^\| `([^`]+)` +\|/;
+const ALIAS = /^[a-z]{2,3}(-[a-z0-9]{2,8})*$/;
+const FORBIDDEN_KEYS = new Set(["__proto__", "prototype", "constructor"]);
+const DEFAULT_BATCH_SIZE = 40;
+
+const USAGE = `Usage: node scripts/i18n/add-locale.mjs --code= --english= --native= --flag= [options]
+
+ --code= locale code, e.g. el, pt-PT, zh-TW (required)
+ --english= English language name, e.g. Greek (required for a new locale)
+ --native= native language name, e.g. Ελληνικά (required for a new locale)
+ --flag= flag emoji, e.g. 🇬🇷 (required for a new locale)
+ --aliases= browser/OS tags resolving to this locale, e.g. el-gr
+ --flag-file= docs/assets/flags/ when it cannot be derived from the emoji
+ --rtl add the code to config/i18n.json "rtl"
+ --docs=core|all docs to translate: the core set every locale carries (default) or every source
+ --files= repo-relative English sources to translate instead of the core set (not with --docs=all)
+ --cli-full translate every CLI catalog section (default: common + program)
+ --force-cli retranslate CLI keys that already have a value
+ --site-dir= omnirouteSite checkout (relative to the repo root or absolute); skipped when absent
+ --batch-size= strings per translation request (default ${DEFAULT_BATCH_SIZE})
+ --only= run only these phases
+ --skip= skip these phases
+ --dry-run print every planned write / command and touch nothing
+
+Phases, in order: ${PHASES.join(", ")}
+The translating phases (${PHASES_TRANSLATING.join(", ")}) need OMNIROUTE_TRANSLATION_API_URL / _API_KEY / _MODEL
+(docs/guides/I18N.md → "Translation pipeline"); .env is loaded automatically.`;
+
+// ----- .env loader ---------------------------------------------------------
+// Same semantics as sync-ui-keys.mjs / run-translation.mjs: variables already
+// set in the environment win over the file.
+function loadDotEnv() {
+ const envPath = path.join(ROOT, ".env");
+ if (!existsSync(envPath)) return;
+ try {
+ for (const rawLine of readFileSync(envPath, "utf8").split(/\r?\n/)) {
+ const line = rawLine.trim();
+ if (!line || line.startsWith("#")) continue;
+ const eq = line.indexOf("=");
+ if (eq <= 0) continue;
+ const key = line.slice(0, eq).trim();
+ if (!key || process.env[key] !== undefined) continue;
+ let value = line.slice(eq + 1);
+ if (
+ (value.startsWith('"') && value.endsWith('"')) ||
+ (value.startsWith("'") && value.endsWith("'"))
+ ) {
+ value = value.slice(1, -1);
+ }
+ process.env[key] = value;
+ }
+ } catch {
+ /* ignore — backendConfig() reports the missing variable */
+ }
+}
+
+// ----- CLI -----------------------------------------------------------------
+
+function parsePhaseList(value, flag) {
+ const set = new Set(
+ value
+ .split(",")
+ .map((s) => s.trim())
+ .filter(Boolean)
+ );
+ for (const phase of set) {
+ if (!PHASES.includes(phase)) {
+ throw new Error(`${flag}: unknown phase "${phase}" (known: ${PHASES.join(", ")})`);
+ }
+ }
+ return set;
+}
+
+function parseArgs(argv) {
+ const o = {
+ code: null,
+ english: null,
+ native: null,
+ flag: null,
+ aliases: [],
+ flagFile: null,
+ rtl: false,
+ docs: "core",
+ files: null,
+ cliFull: false,
+ forceCli: false,
+ siteDir: null,
+ batchSize: DEFAULT_BATCH_SIZE,
+ only: null,
+ skip: new Set(),
+ dryRun: false,
+ };
+ for (const arg of argv.slice(2)) {
+ const eq = arg.indexOf("=");
+ const key = eq === -1 ? arg : arg.slice(0, eq);
+ const value = eq === -1 ? "" : arg.slice(eq + 1);
+ switch (key) {
+ case "--help":
+ case "-h":
+ console.log(USAGE);
+ process.exit(0);
+ break;
+ case "--code":
+ o.code = value;
+ break;
+ case "--english":
+ o.english = value;
+ break;
+ case "--native":
+ o.native = value;
+ break;
+ case "--flag":
+ o.flag = value;
+ break;
+ case "--aliases":
+ o.aliases = value
+ .split(",")
+ .map((s) => s.trim().toLowerCase())
+ .filter(Boolean);
+ break;
+ case "--flag-file":
+ o.flagFile = value;
+ break;
+ case "--rtl":
+ o.rtl = true;
+ break;
+ case "--docs":
+ o.docs = value;
+ break;
+ case "--files":
+ o.files = value
+ .split(",")
+ .map((s) => s.trim())
+ .filter(Boolean);
+ break;
+ case "--cli-full":
+ o.cliFull = true;
+ break;
+ case "--force-cli":
+ o.forceCli = true;
+ break;
+ case "--site-dir":
+ o.siteDir = path.resolve(ROOT, value);
+ break;
+ case "--batch-size":
+ // Whole numbers only; NaN / 0 / negatives fall back to the default.
+ o.batchSize = Math.max(1, Math.floor(Number(value)) || DEFAULT_BATCH_SIZE);
+ break;
+ case "--only":
+ o.only = parsePhaseList(value, "--only");
+ break;
+ case "--skip":
+ o.skip = parsePhaseList(value, "--skip");
+ break;
+ case "--dry-run":
+ o.dryRun = true;
+ break;
+ default:
+ throw new Error(`unknown argument ${arg}\n\n${USAGE}`);
+ }
+ }
+ if (!o.code) throw new Error(`--code is required\n\n${USAGE}`);
+ if (!LOCALE_CODE.test(o.code)) {
+ throw new Error(`invalid locale code "${o.code}" (expected e.g. el, pt-PT, zh-TW)`);
+ }
+ if (!["core", "all"].includes(o.docs)) {
+ throw new Error(`--docs must be "core" or "all" (got "${o.docs}")`);
+ }
+ if (o.files && o.files.length === 0) {
+ throw new Error("--files needs at least one repo-relative path");
+ }
+ if (o.files && o.docs === "all") throw new Error("--files and --docs=all are mutually exclusive");
+ for (const alias of o.aliases) {
+ if (!ALIAS.test(alias))
+ throw new Error(`invalid alias "${alias}" (lower-case BCP-47, e.g. el-gr)`);
+ }
+ return o;
+}
+
+function selectPhases(o) {
+ return PHASES.filter((phase) => (!o.only || o.only.has(phase)) && !o.skip.has(phase));
+}
+
+// ----- Helpers -------------------------------------------------------------
+
+const log = (...parts) => console.log("[add-locale]", ...parts);
+const warn = (...parts) => console.warn("[add-locale] WARN", ...parts);
+const dryTag = (ctx) => (ctx.dry ? "[DRY] " : "");
+
+function insideRepo(file) {
+ const relative = path.relative(ROOT, file);
+ return Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative);
+}
+
+/** Repo-relative POSIX path for files inside the repo, absolute otherwise (site files). */
+function display(file) {
+ return insideRepo(file) ? path.relative(ROOT, file).split(path.sep).join("/") : file;
+}
+
+const readText = (file) => fs.readFile(file, "utf8");
+const readJson = async (file) => JSON.parse(await readText(file));
+
+async function writeFile(ctx, file, text) {
+ log(`${dryTag(ctx)}write ${display(file)}`);
+ ctx.touched.add(file);
+ if (ctx.dry) return;
+ await fs.mkdir(path.dirname(file), { recursive: true });
+ await fs.writeFile(file, text, "utf8");
+}
+
+function runNode(ctx, script, args = [], note = "") {
+ const command = ["node", display(script), ...args].join(" ");
+ log(`${dryTag(ctx)}${command}${note ? ` — ${note}` : ""}`);
+ if (ctx.dry) return;
+ execFileSync(process.execPath, [script, ...args], { cwd: ROOT, stdio: "inherit" });
+}
+
+/** `{ id: "a.b.c", text }` for every string leaf of a nested catalog. */
+function flattenLeaves(node, prefix = "", out = []) {
+ if (typeof node === "string") {
+ out.push({ id: prefix, text: node });
+ } else if (node && typeof node === "object" && !Array.isArray(node)) {
+ for (const [key, value] of Object.entries(node)) {
+ if (FORBIDDEN_KEYS.has(key)) continue;
+ flattenLeaves(value, prefix ? `${prefix}.${key}` : key, out);
+ }
+ }
+ return out;
+}
+
+/** Leaves still carrying the `__MISSING__:` placeholder that sync-ui-keys leaves behind. */
+const countMarkers = (leaves) =>
+ leaves.filter((leaf) => leaf.text.startsWith(PLACEHOLDER_PREFIX)).length;
+
+function getDeep(node, id) {
+ let cursor = node;
+ for (const segment of id.split(".")) {
+ if (!cursor || typeof cursor !== "object") return undefined;
+ cursor = cursor[segment];
+ }
+ return cursor;
+}
+
+function setDeep(node, id, value) {
+ const segments = id.split(".");
+ if (segments.some((segment) => FORBIDDEN_KEYS.has(segment))) {
+ throw new Error(`refusing to write key ${id}`);
+ }
+ let cursor = node;
+ for (const segment of segments.slice(0, -1)) {
+ if (!cursor[segment] || typeof cursor[segment] !== "object") cursor[segment] = {};
+ cursor = cursor[segment];
+ }
+ cursor[segments[segments.length - 1]] = value;
+}
+
+async function walkFiles(dir, out = []) {
+ for (const entry of await fs.readdir(dir, { withFileTypes: true })) {
+ const abs = path.join(dir, entry.name);
+ if (entry.isDirectory()) await walkFiles(abs, out);
+ else out.push(abs);
+ }
+ return out;
+}
+
+/** Files under docs/ that carry a 🌐 Languages bar — what sync-language-bars rewrites. */
+async function countLanguageBarFiles() {
+ let count = 0;
+ for (const file of await walkFiles(path.join(ROOT, "docs"))) {
+ if (!file.endsWith(".md") && path.basename(file) !== "llm.txt") continue;
+ const text = await readText(file);
+ if (text.split("\n").some((line) => line.startsWith("🌐 **Languages:**"))) count += 1;
+ }
+ return count;
+}
+
+/**
+ * Translates `entries` (`{ id, text }`) in batches of `--batch-size`; a batch
+ * that fails or cannot be parsed is retried one string at a time. Strings that
+ * still fail are left out of the result and recorded in `ctx.failures`, so a
+ * later run fills them in (the run exits 1 to flag them).
+ */
+async function translateEntries(ctx, entries, label) {
+ ctx.backend ??= backendConfig();
+ const out = new Map();
+ const size = ctx.o.batchSize;
+ const batches = Math.ceil(entries.length / size);
+ for (let i = 0; i < entries.length; i += size) {
+ const chunk = entries.slice(i, i + size);
+ try {
+ const translated = await translateBatch(chunk, ctx.entry, ctx.backend);
+ for (const { id } of chunk) out.set(id, translated.get(id));
+ } catch (err) {
+ warn(
+ `${label}: batch ${i / size + 1}/${batches} failed (${err.message}) — retrying one by one`
+ );
+ for (const { id, text } of chunk) {
+ try {
+ const value = await translateString(text, ctx.entry, ctx.backend);
+ if (!value) throw new Error("empty translation");
+ out.set(id, value);
+ } catch (inner) {
+ ctx.failures.push(`${label}: ${id} (${inner.message})`);
+ }
+ }
+ }
+ log(`${label}: ${Math.min(i + size, entries.length)}/${entries.length} strings translated`);
+ }
+ return out;
+}
+
+// ----- Phases --------------------------------------------------------------
+
+async function phaseConfig(ctx) {
+ if (ctx.nextConfigText === ctx.configText) {
+ log(`config: ${ctx.code} already configured — nothing to change`);
+ return;
+ }
+ const changes = [];
+ if (!ctx.stored) changes.push(`add ${ctx.code} entry`);
+ if (ctx.o.rtl && !ctx.before.rtl.includes(ctx.code)) changes.push("add to rtl");
+ log(`config: ${changes.join(", ")} (total locales → ${ctx.total})`);
+ await writeFile(ctx, ctx.configPath, ctx.nextConfigText);
+}
+
+async function phaseFlag(ctx) {
+ const file = path.join(ROOT, "docs", "assets", "flags", ctx.flagFile);
+ if (existsSync(file)) {
+ log(`flag: ${display(file)} present`);
+ return;
+ }
+ const url = `${FLAG_CDN}${ctx.flagFile}`;
+ log(`${dryTag(ctx)}fetch ${url} → ${display(file)}`);
+ if (ctx.dry) return;
+ const res = await fetch(url);
+ if (!res.ok) {
+ throw new Error(
+ `flag download failed (${res.status}) for ${url} — place docs/assets/flags/${ctx.flagFile} manually (or pass --flag-file) and re-run`
+ );
+ }
+ const svg = await res.text();
+ if (!svg.trimStart().startsWith("