# CLI Tools — OmniRoute (Tiếng Việt) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇪🇹 [am](../../../am/docs/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) · 🇧🇦 [bs](../../../bs/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) · 🇬🇷 [el](../../../el/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇪🇪 [et](../../../et/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) · 🇮🇪 [ga](../../../ga/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇳🇬 [ha](../../../ha/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇷 [hr](../../../hr/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇦🇲 [hy](../../../hy/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇳🇬 [ig](../../../ig/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇬🇪 [ka](../../../ka/docs/reference/CLI-TOOLS.md) · 🇰🇭 [km](../../../km/docs/reference/CLI-TOOLS.md) · 🇮🇳 [kn](../../../kn/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇱🇹 [lt](../../../lt/docs/reference/CLI-TOOLS.md) · 🇱🇻 [lv](../../../lv/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ml](../../../ml/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇲🇹 [mt](../../../mt/docs/reference/CLI-TOOLS.md) · 🇲🇲 [my](../../../my/docs/reference/CLI-TOOLS.md) · 🇳🇵 [ne](../../../ne/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇮🇳 [or](../../../or/docs/reference/CLI-TOOLS.md) · 🇮🇳 [pa](../../../pa/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) · 🇱🇰 [si](../../../si/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇮 [sl](../../../sl/docs/reference/CLI-TOOLS.md) · 🇷🇸 [sr](../../../sr/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) · 🇺🇿 [uz](../../../uz/docs/reference/CLI-TOOLS.md) · 🇳🇬 [yo](../../../yo/docs/reference/CLI-TOOLS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/CLI-TOOLS.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/CLI-TOOLS.md) --- Cập nhật lần cuối: 2026-08-23 OmniRoute tích hợp với ba loại công cụ CLI, được phân bổ trên ba trang bảng điều khiển chuyên biệt: | Trang | Tuyến | Khái niệm | Số lượng | | -------------- | ----------------------- | ---------------------------------------------------------------------------------------- | ------------ | | **CLI Code's** | `/dashboard/cli-code` | Các công cụ lập trình mà bạn trỏ đến OmniRoute (Client → CLI → OmniRoute → Nhà cung cấp) | 26 | | **CLI Agents** | `/dashboard/cli-agents` | Các tác nhân tự động mà bạn trỏ đến OmniRoute (cùng luồng, phạm vi rộng hơn) | 10 | | **ACP Agents** | `/dashboard/acp-agents` | Các CLI được OmniRoute khởi chạy làm backend qua stdio/ACP (luồng ngược) | xem registry | Các tuyến cũ chuyển hướng bằng mã 308: `/dashboard/cli-tools` → `/dashboard/cli-code`, `/dashboard/agents` → `/dashboard/acp-agents`. --- ## Cách hoạt động ``` CLI Code's / CLI Agents (luồng sử dụng): Claude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ... │ ▼ (tất cả đều trỏ đến OmniRoute) http://YOUR_SERVER:20128/v1 │ ▼ (OmniRoute định tuyến đến đúng nhà cung cấp) Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ... ACP Agents (luồng khởi chạy ngược): Yêu cầu từ client → OmniRoute → khởi chạy CLI qua stdio/ACP → phản hồi ``` **Lợi ích:** - Một khóa API để quản lý tất cả công cụ - Theo dõi chi phí của tất cả CLI trong bảng điều khiển - Chuyển đổi mô hình mà không cần cấu hình lại từng công cụ - Hoạt động cả cục bộ lẫn trên máy chủ từ xa (VPS, Docker, Akamai, Cloudflare Tunnel) --- ## Tự động cấu hình với `setup-*` Bạn không cần phải viết thủ công cấu hình cho từng công cụ. OmniRoute cung cấp một lệnh `setup-*` cho mỗi CLI được hỗ trợ; lệnh này đọc danh mục mô hình **trực tiếp** từ một OmniRoute đang chạy (cục bộ hoặc từ xa) và ghi cấu hình riêng của công cụ đó trên máy của bạn: ```bash omniroute setup-codex omniroute setup-claude omniroute setup-opencode omniroute setup-cline omniroute setup-kilo omniroute setup-continue omniroute setup-cursor omniroute setup-roo omniroute setup-crush omniroute setup-goose omniroute setup-qwen omniroute setup-aider omniroute setup-5dive omniroute setup-zed ``` Mỗi lệnh đều chấp nhận `--remote --api-key ` (cấu hình một công cụ cục bộ để kết nối với OmniRoute từ xa), `--dry-run` (xem trước mà không ghi) và `--port`. Các công cụ không hỗ trợ tự động phát hiện mô hình (Cline, Kilo, Roo, Goose, Aider, Qwen, 5dive) nhận `--model ` (và `--yes` cho các lần chạy không tương tác). `setup-5dive` là công thức duy nhất không ghi vào `$HOME`: nó cấu hình một cụm tác nhân 5dive bằng cách ghi hồ sơ xác thực thuộc sở hữu của root trên máy chủ của cụm, vì vậy nó tự thực thi lại thông qua `sudo` và không có chế độ từ xa riêng. Để khởi chạy một CLI với các biến môi trường phù hợp được chèn vào mà hoàn toàn không ghi cấu hình, hãy dùng trình khởi chạy chung `omniroute run ` (claude, codex, aider, goose, opencode, qwen, gemini — các đích và bí danh đến từ `bin/cli/cli-manifest.mjs`); các trình khởi chạy riêng cho từng công cụ kiểu cũ là `omniroute launch` (Claude Code) và `omniroute launch-codex` (Codex) vẫn khả dụng. Gemini CLI chỉ hỗ trợ khởi chạy: đây là một đích của `omniroute run` nhưng không có công thức `setup-*`/`configure`. > **Tài liệu tham khảo đầy đủ:** bảng tổng hợp — mỗi lệnh ghi những gì, tất cả các cờ, > chế độ cục bộ so với từ xa và những công cụ nào yêu cầu hậu tố `/v1` — có trong > **[Tích hợp CLI](../guides/CLI-INTEGRATIONS.md)**. ### Chạy các lệnh này bên trong container Một lệnh `setup-*` được thực thi bên trong container OmniRoute sẽ ghi vào thư mục home riêng của container, nơi không CLI nào trên máy chủ đọc được và sẽ biến mất cùng với container. OmniRoute phát hiện điều đó và thoát với mã `2`, kèm theo hướng dẫn thay vì ghi dữ liệu. Có hai hướng xử lý được hỗ trợ — cài đặt CLI trên máy chủ và dùng `omniroute connect` để kết nối với container, hoặc bind-mount các thư mục cấu hình và đặt `CLI_CONFIG_HOME` (profile `host` của compose). Mọi lệnh `setup-*`, cùng với `omniroute configure` và `omniroute config set`, đều chấp nhận `--allow-container-write` khi điều bạn thực sự muốn là cấu hình các CLI riêng của container; `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` cũng thực hiện điều tương tự cho máy chủ. Xem [Hướng dẫn Docker → Cấu hình các công cụ CLI trên máy chủ](../guides/DOCKER_GUIDE.md#configuring-host-cli-tools-when-omniroute-runs-in-docker). **Endpoint áp dụng** của bảng điều khiển (`POST /api/cli-tools/apply`) thực thi cùng một cơ chế bảo vệ: trong container, thao tác ghi có đích không được bind-mount từ máy chủ sẽ trả về **`422`** cùng với `containerEphemeralTarget: true`, nội dung lỗi an toàn và — đối với các công cụ có công thức dành cho máy chủ (claude, codex, opencode, cline, kilo, continue) — một `hostSetupCommand` (ví dụ: `omniroute setup-opencode`) để chạy trên máy chủ thay thế; không có gì được ghi. `dryRun: true` vẫn hoạt động trong chế độ container và trả về bản xem trước đã được che thông tin nhạy cảm cùng với đường dẫn đích mà không tác động đến ổ đĩa. Nội dung xem trước không phải là một cấu hình chứa thông tin xác thực để sao chép hoặc nhập. Hãy áp dụng với các đầu vào ban đầu về công cụ/URL cơ sở/API key/mô hình trên máy chủ, hoặc sử dụng lệnh thiết lập phía máy chủ được chỉ định. Xem [Bảo mật cấu hình CLI](../security/CLI-CONFIGURATION.md) để biết tiêu đề xem trước và quy ước yêu cầu. Hành vi này là có chủ đích và được bảo vệ khỏi hồi quy bởi `tests/unit/api/cli-tools/apply-container-guard.test.ts` — tuyệt đối không “sửa” lỗi 422 bằng cách loại bỏ cơ chế bảo vệ. --- ## Nguồn Chân Lý Danh mục hợp nhất nằm trong `src/shared/constants/cliTools.ts` dưới dạng `CLI_TOOLS: Record`. Mỗi mục có các trường sau (được định nghĩa trong `src/shared/schemas/cliCatalog.ts`): | Trường | Kiểu | Mô tả | | ----------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------- | | `category` | `"code" \| "agent"` | Công cụ xuất hiện trên trang nào | | `vendor` | `string` | Nguồn gốc công cụ ("Anthropic", "OSS (P. Gauthier)") | | `acpSpawnable` | `boolean` | Cũng có thể dùng làm ACP Agent (hiển thị huy hiệu) | | `baseUrlSupport` | `"full" \| "partial" \| "none"` | Mức hỗ trợ endpoint tùy chỉnh. `"none"` = tồn đọng MITM | | `configType` | `"env" \| "custom" \| "guide" \| "custom-builder" \| "mitm"` | Cơ chế cấu hình | | `id`, `name`, `color`, `description`, `docsUrl` | tiêu chuẩn | Các trường hiển thị cốt lõi | Các mục có `baseUrlSupport: "none"` **không được hiển thị** trên các trang bảng điều khiển — chúng được đăng ký trong danh sách tồn đọng MITM cho kế hoạch 11 (xem `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`). ### Các cấp độ khả năng (được lập danh mục × có thể phát hiện × có thể cấu hình × có thể khởi chạy) Không phải mọi công cụ được lập danh mục đều có thể được phát hiện, cấu hình hoặc khởi chạy. Mỗi cấp độ có một nguồn khai báo và một bài kiểm thử độ lệch giúp duy trì tính đồng bộ giữa chúng: | Cấp độ | Ý nghĩa | Được khai báo trong | | --------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | **Được lập danh mục** | Xuất hiện trong danh mục bảng điều khiển (tên, nhà cung cấp, tài liệu, kiểu cấu hình) | `src/shared/constants/cliTools.ts` (`CLI_TOOLS`) | | **Có thể phát hiện** | Phát hiện tệp nhị phân/cấu hình, kiểm tra trạng thái, đường dẫn cấu hình | `src/shared/services/cliRuntime.ts` (danh mục thời gian chạy `CLI_TOOLS`) | | **Có thể cấu hình** | Được `omniroute configure ` hỗ trợ (có quy trình thiết lập) | `bin/cli/cli-manifest.mjs` (`configure: true`) | | **Có thể khởi chạy** | Được `omniroute run ` hỗ trợ (đã định nghĩa việc chèn env/đối số) | `bin/cli/cli-manifest.mjs` (`run: true`) | `bin/cli/cli-manifest.mjs` là manifest thực thi chuẩn cho các bề mặt lệnh CLI: `run`, `configure` và các trình tạo tính năng hoàn thành lệnh shell đều lấy danh sách đích, cách phân giải bí danh (ví dụ `kilocode`/`kilo-code`/`kilo_cli` → `kilo`) và cách kết nối cờ `--model` từ đó. Cơ chế bảo vệ khỏi độ lệch `tests/unit/cli/cli-manifest-drift.test.ts` xác nhận rằng manifest, danh mục thời gian chạy, danh mục giao diện người dùng và mọi bề mặt sử dụng luôn đồng bộ — một đích được thêm vào một bề mặt mà không được thêm vào các bề mặt khác sẽ khiến bộ kiểm thử thất bại thay vì âm thầm trở nên sai lệch. --- ## 1. Danh mục CLI Code (27 công cụ) Tất cả các công cụ xuất hiện trong `/dashboard/cli-code`. Những công cụ có `baseUrlSupport: none` được kết nối thông qua MITM hoặc hướng dẫn thủ công thay vì URL cơ sở tùy chỉnh: | id | name | vendor | baseUrlSupport | configType | acpSpawnable | | ------------ | ----------------------- | ------------------- | -------------- | -------------- | ------------ | | claude | Claude Code | Anthropic | full | env | true | | codex | OpenAI Codex CLI | OpenAI | full | custom | true | | zcode | ZCode (GLM Coding Plan) | Z.ai | none | custom | false | | cline | Cline | OSS (ex-Claude Dev) | full | custom | true | | kilo | Kilo Code | Kilo-Org | full | custom | false | | roo | Roo Code | Roo (OSS) | full | guide | false | | continue | Continue | continue.dev | full | guide | false | | aider | Aider | OSS (P. Gauthier) | full | guide | true | | forge | ForgeCode | Antinomy HQ | full | custom | true | | jcode | jcode | 1jehuang (OSS) | full | custom | false | | deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false | | codewhale | CodeWhale | Hmbown (OSS) | full | custom | false | | opencode | OpenCode | Anomaly (ex-SST) | full | guide | true | | droid | Factory Droid | Factory AI | partial | guide | false | | copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false | | cursor-cli | Cursor CLI | Anysphere | partial | guide | true | | smelt | Smelt | leonardcser (OSS) | full | custom | false | | pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false | | grok-build | Grok Build | xAI | full | custom | false | | crush | Crush | OSS (Charm) | full | custom | false | | qwen | Qwen Code | Alibaba | full | guide | true | | zed | Zed | Zed Industries | full | guide | false | | cursor | Cursor | Anysphere | none | guide | false | | antigravity | Antigravity | Google | none | mitm | false | | hermes | Hermes | Nous Research | none | guide | false | | kiro | Kiro AI | Amazon | none | mitm | false | | custom | Custom CLI | — | full | custom-builder | false | Các công cụ có `baseUrlSupport: "partial"` hiển thị huy hiệu "⚠ URL cơ sở được hỗ trợ một phần" trong thẻ trên bảng điều khiển. --- ## 2. Danh mục CLI Agent (10 công cụ) Các agent tự trị xuất hiện trong `/dashboard/cli-agents`: | id | tên | nhà cung cấp | hỗ trợ base URL | có thể khởi chạy qua ACP | | ------------ | ---------------- | ------------------------ | --------------- | ------------------------ | | hermes-agent | Hermes Agent | Nous Research | full | false | | openclaw | OpenClaw | OSS (P. Steinberger) | full | true | | goose | Goose | Block / Linux Foundation | full | true | | interpreter | Open Interpreter | OSS | full | true | | warp | Warp AI | Warp Inc. | partial | true | | agent-deck | Agent Deck | asheshgoplani (OSS) | full | false | | omp | Oh My Pi | OSS | full | true | | letta | Letta CLI | Letta | full | false | | prime-agent | Prime Agent | Prime Intellect (OSS) | full | false | | 5dive | 5dive | OSS (5dive-ai) | full | false | --- ## 3. ACP Agent (/dashboard/acp-agents) Trang này (được đổi tên từ `/dashboard/agents`) hiển thị các CLI mà OmniRoute có thể **khởi chạy** làm công cụ thực thi backend thông qua giao thức stdio/ACP. Danh mục này được duy trì riêng trong `src/lib/acp/registry.ts` và **không** giống với `CLI_TOOLS`. --- ## 4. Danh sách tồn đọng MITM (không hiển thị trong bảng điều khiển) Các CLI sau đây không hỗ trợ URL cơ sở tùy chỉnh theo cách nguyên bản và **không được liệt kê** trong các trang CLI Code hoặc CLI Agent. Chúng là các ứng viên để chặn MITM trong kế hoạch 11: | CLI | Lý do | | ------------------- | -------------------------------------------------------------- | | windsurf | BYOK giới hạn ở một số mô hình Claude + URL/token doanh nghiệp | | amp | Hệ sinh thái khép kín (Sourcegraph) | | amazon-q / kiro-cli | Xác thực AWS SSO, không có URL tùy chỉnh | | cowork | Anthropic Desktop, không có endpoint có thể cấu hình | Xem `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md` để biết toàn bộ thông tin tham chiếu chéo. --- ## 5. API phát hiện hàng loạt Toàn bộ quá trình phát hiện công cụ được tổng hợp thông qua một endpoint duy nhất: **`GET /api/cli-tools/all-statuses`** - Xác thực: `requireCliToolsAuth(request)` (giống như các route `/api/cli-tools/` khác) - Trả về: `Record` (kiểu: `src/shared/types/cliBatchStatus.ts`) - Chiến lược: `Promise.all` trên tất cả công cụ, thời gian chờ 5 giây cho mỗi công cụ - Bộ nhớ đệm: LRU trong bộ nhớ được lập chỉ mục theo `mtime` của tệp cấu hình. Bộ nhớ đệm bị vô hiệu hóa khi mtime thay đổi. Được đặt lại khi máy chủ khởi động lại. Cấu trúc phản hồi cho mỗi công cụ: ```ts interface ToolBatchStatus { detection: { installed: boolean; runnable: boolean; version?: string; command?: string; commandPath?: string; reason?: string; }; config: { status: "configured" | "not_configured" | "not_installed" | "unknown" | "other"; endpoint?: string | null; lastConfiguredAt?: string | null; }; error?: string; // đã được làm sạch, không có stack trace } ``` --- ## 6. Trình xử lý cài đặt cho các công cụ mới Các công cụ mới có `configType: "custom"` sử dụng các route API cài đặt chuyên biệt: | Route | Công cụ | | ------------------------------------------- | ------------------------------------------------------------- | | `POST /api/cli-tools/forge-settings` | ForgeCode (.forge.toml) | | `POST /api/cli-tools/jcode-settings` | jcode (cờ --base-url) | | `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI (OPENAI_BASE_URL, cũ) | | `POST /api/cli-tools/codewhale-settings` | CodeWhale (OPENAI_BASE_URL, chính + đồng bộ `~/.deepseek` cũ) | | `POST /api/cli-tools/smelt-settings` | Smelt | | `POST /api/cli-tools/pi-settings` | Tác nhân lập trình Pi | | `POST /api/cli-tools/grok-build-settings` | Grok Build (~/.grok/config.toml, `[model.omniroute]`) | | `POST /api/cli-tools/qwen-settings` | Qwen Code (`~/.qwen/settings.json` + khóa `.env` chuyên biệt) | Tất cả các route sử dụng `sanitizeErrorMessage()` cho phản hồi lỗi (Quy tắc cứng #12). --- ## 7. Kiến trúc các trang bảng điều khiển ### CLI Code (`/dashboard/cli-code`) - `src/app/(dashboard)/dashboard/cli-code/page.tsx` — thành phần máy chủ - `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — lưới phía máy khách - `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — trang chi tiết công cụ - `src/app/(dashboard)/dashboard/cli-code/components/` — 12 thẻ công cụ chuyên biệt + `ToolDetailClient.tsx` ### Tác nhân CLI (`/dashboard/cli-agents`) - `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — thành phần máy chủ - `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — lưới phía máy khách - `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — tái sử dụng `ToolDetailClient` ### Tác nhân ACP (`/dashboard/acp-agents`) - `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — thành phần máy chủ (được chuyển từ `agents/`) ### Các thành phần giao diện dùng chung (`src/shared/components/cli/`) | Tệp | Mục đích | | ----------------------- | ----------------------------------------------------------- | | `CliToolCard.tsx` | Thẻ trạng thái thông minh (phát hiện + cấu hình + endpoint) | | `CliConceptCard.tsx` | Thẻ giải thích khái niệm cho từng trang | | `CliComparisonCard.tsx` | So sánh ba cột giữa các loại CLI | | `BaseUrlSelect.tsx` | Danh sách endpoint thả xuống (Cục bộ/Đám mây/Tùy chỉnh) | | `ApiKeySelect.tsx` | Bộ chọn khóa API | | `ManualConfigModal.tsx` | Hộp thoại đoạn mã cấu hình có thể sao chép | ### Hook dùng chung (`src/shared/hooks/cli/`) | Tệp | Mục đích | | ------------------------- | ----------------------------------------------------------------------- | | `useToolBatchStatuses.ts` | Truy xuất `/api/cli-tools/all-statuses`, quản lý trạng thái tải/làm mới | --- ## 8. i18n Các namespace mới được thêm vào trong kế hoạch 14 F9: | Namespace | Mục đích | | ----------- | ------------------------------------------------------------------------------- | | `cliCommon` | Các chuỗi dùng chung (nhãn thẻ, văn bản khái niệm/so sánh, nhãn trang chi tiết) | | `cliCode` | Các chuỗi trên trang CLI Code | | `cliAgents` | Các chuỗi trên trang CLI Agents | | `acpAgents` | Các chuỗi trên trang ACP Agents | Đã cung cấp đầy đủ bản dịch PT-BR và EN. 39 locale khác tự động sử dụng EN làm phương án dự phòng thông qua cơ chế hợp nhất ở cấp namespace trong `src/i18n/request.ts`. --- ## 9. Bắt đầu nhanh ### Bước 1 — Lấy khóa API OmniRoute 1. Mở `/dashboard/api-manager` → **Tạo khóa API** 2. Đặt tên cho khóa (ví dụ: `cli-tools`) và chọn tất cả quyền 3. Sao chép khóa — bạn sẽ cần khóa này cho mọi CLI bên dưới > Khóa của bạn có dạng: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx` --- ### Bước 2 — Cài đặt các công cụ CLI Tất cả công cụ dựa trên npm đều yêu cầu Node.js 22.22.2+ hoặc 24.x: ```bash # Claude Code (Anthropic) npm install -g @anthropic-ai/claude-code # OpenAI Codex npm install -g @openai/codex # OpenCode npm install -g opencode-ai # Cline npm install -g cline # KiloCode npm install -g kilocode # Qwen Code npm install -g @qwen-code/qwen-code # Google Gemini CLI (có thể khởi chạy qua `omniroute run gemini` → giao diện /v1beta) npm install -g @google/gemini-cli # Aider pip install aider-chat # Smelt cargo install smelt # Dựa trên Rust # Tác nhân lập trình Pi # xem https://github.com/zechnerj/pi-coding-agent để biết cách cài đặt # jcode # xem https://github.com/1jehuang/jcode để biết cách cài đặt ``` --- ### Bước 3 — Cấu hình qua bảng điều khiển 1. Truy cập `http://localhost:20128/dashboard/cli-code` 2. Tìm công cụ của bạn trong lưới 3. Nhấp vào thẻ để mở trang chi tiết của công cụ 4. Chọn khóa API và URL cơ sở 5. Nhấp vào **Áp dụng cấu hình** hoặc sao chép đoạn cấu hình thủ công --- ### Bước 4 — Thiết lập các biến môi trường toàn cục ```bash # Endpoint phổ quát của OmniRoute export OPENAI_BASE_URL="http://localhost:20128/v1" export OPENAI_API_KEY="sk-your-omniroute-key" export ANTHROPIC_BASE_URL="http://localhost:20128" export ANTHROPIC_AUTH_TOKEN="sk-your-omniroute-key" # Gemini CLI đọc GOOGLE_GEMINI_BASE_URL tại URL GỐC (SDK của nó tự nối thêm /v1beta/...) export GOOGLE_GEMINI_BASE_URL="http://localhost:20128" export GEMINI_API_KEY="sk-your-omniroute-key" ``` > Đối với **máy chủ từ xa**, hãy thay `localhost:20128` bằng địa chỉ IP hoặc miền của máy chủ, > ví dụ: `http://:20128`. --- ### Bước 4 — Cấu hình từng công cụ #### Claude Code ```bash # Tạo ~/.claude/settings.json: mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF { "env": { "ANTHROPIC_BASE_URL": "http://localhost:20128", "ANTHROPIC_AUTH_TOKEN": "sk-your-omniroute-key" } } EOF ``` Sử dụng URL gốc của cổng Anthropic hợp nhất cho Claude Code. Không thêm `/v1` tại đây. **Kiểm tra:** `claude "say hello"` --- #### OpenAI Codex Codex hiện đại (v0.137+) chỉ đọc `~/.codex/config.toml` — tệp `config.yaml` cũ thuộc về npm CLI kế thừa và bị âm thầm bỏ qua. Khóa API được lưu trong biến môi trường `OMNIROUTE_API_KEY` (`env_key`), không bao giờ nằm trong tệp: ```bash mkdir -p ~/.codex && cat > ~/.codex/config.toml << EOF model_provider = "omniroute" [model_providers.omniroute] name = "OmniRoute" base_url = "http://localhost:20128/v1" env_key = "OMNIROUTE_API_KEY" requires_openai_auth = false EOF export OMNIROUTE_API_KEY="sk-your-omniroute-key" ``` Tài liệu tham khảo đầy đủ (profile, `wire_api`, cửa sổ ngữ cảnh): [CODEX-CLI-CONFIGURATION.md](../guides/CODEX-CLI-CONFIGURATION.md). **Kiểm tra:** `codex "what is 2+2?"` --- #### OpenCode ```bash mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF { "\$schema": "https://opencode.ai/config.json", "provider": { "omniroute": { "npm": "@ai-sdk/openai-compatible", "name": "OmniRoute", "options": { "baseURL": "http://localhost:20128/v1", "apiKey": "sk-your-omniroute-key" }, "models": { "claude-sonnet-4-5": { "name": "claude-sonnet-4-5" }, "claude-sonnet-4-5-thinking": { "name": "claude-sonnet-4-5-thinking" }, "gemini-3-flash": { "name": "gemini-3-flash" } } } } } EOF ``` **Kiểm tra:** `opencode` > Sử dụng `opencode run "your prompt" --model omniroute/claude-sonnet-4-5-thinking --variant high` > để gửi các biến thể suy luận. --- #### Cline (CLI hoặc VS Code) **Chế độ CLI:** ```bash mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF { "apiProvider": "openai", "openAiBaseUrl": "http://localhost:20128/v1", "openAiApiKey": "sk-your-omniroute-key" } EOF ``` **Chế độ VS Code:** Cài đặt tiện ích mở rộng Cline → Nhà cung cấp API: `OpenAI Compatible` → URL cơ sở: `http://localhost:20128/v1` Hoặc sử dụng bảng điều khiển OmniRoute → **Công cụ CLI → Cline → Áp dụng cấu hình**. --- #### KiloCode (CLI hoặc VS Code) **Chế độ CLI:** ```bash kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key ``` **Cài đặt VS Code:** ```json { "kilo-code.openAiBaseUrl": "http://localhost:20128/v1", "kilo-code.apiKey": "sk-your-omniroute-key" } ``` Hoặc sử dụng bảng điều khiển OmniRoute → **Công cụ CLI → KiloCode → Áp dụng cấu hình**. --- #### Continue (Tiện ích mở rộng VS Code) Chỉnh sửa `~/.continue/config.yaml`: ```yaml models: - name: OmniRoute provider: openai model: auto apiBase: http://localhost:20128/v1 apiKey: sk-your-omniroute-key default: true ``` Khởi động lại VS Code sau khi chỉnh sửa. --- #### VS Code Insiders (`chatLanguageModels.json`) Sử dụng tùy chọn này khi VS Code Insiders được cấu hình cho các mô hình endpoint tùy chỉnh và bạn muốn OmniRoute hoạt động mà không cần trường header tùy chỉnh. **Vị trí được khuyến nghị:** - Linux: `~/.config/Code - Insiders/User/chatLanguageModels.json` - Windows: `%APPDATA%/Code - Insiders/User/chatLanguageModels.json` **Ví dụ sử dụng bí danh OmniRoute được mã hóa bằng token:** ```json [ { "vendor": "customendpoint", "id": "auto", "name": "OmniRoute Auto", "family": "gpt-4", "version": "1.0.0", "url": "http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/chat/completions", "modelsUrl": "http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/models", "requestFormat": "openai-chat-completions", "contextWindow": 256000, "maxOutputTokens": 32768, "auth": { "type": "none" } } ] ``` **Lưu ý:** - Thay thế `sk-your-omniroute-key` bằng khóa API được tạo trong OmniRoute. - Trường `url` phải trỏ đến `/api/v1/vscode/{token}/chat/completions`. - Trường `modelsUrl` phải trỏ đến `/api/v1/vscode/{token}/models`. - Ưu tiên quy trình `/v1` thông thường kết hợp với header Bearer khi ứng dụng khách hỗ trợ header tùy chỉnh. - Token được nhúng trong URL là phương án dự phòng để đảm bảo khả năng tương thích và có thể xuất hiện trong nhật ký của trình soạn thảo hoặc lịch sử proxy. --- #### Kiro CLI (Amazon) ```bash # Đăng nhập vào tài khoản AWS/Kiro của bạn: kiro-cli login # CLI sử dụng cơ chế xác thực riêng — bản thân Kiro CLI không cần OmniRoute làm backend. # Sử dụng kiro-cli cùng với OmniRoute cho các công cụ khác. kiro-cli status ``` Đối với ứng dụng máy tính **Kiro IDE**, hãy sử dụng endpoint MITM do OmniRoute cung cấp tại `/dashboard/cli-tools → Kiro`. --- ## 10. CLI OmniRoute nội bộ Tệp nhị phân `omniroute` cung cấp các lệnh để quản lý vòng đời máy chủ, thiết lập, chẩn đoán và quản lý nhà cung cấp. Điểm vào: `bin/omniroute.mjs`. ```bash omniroute # Khởi động máy chủ (cổng mặc định 20128) omniroute setup # Trình hướng dẫn thiết lập tương tác omniroute doctor # Kiểm tra cấu hình, DB, cổng, môi trường thực thi omniroute providers list # Các kết nối nhà cung cấp đã cấu hình omniroute providers test-all # Kiểm tra mọi kết nối đang hoạt động omniroute reset-password # Đặt lại mật khẩu quản trị viên omniroute logs # Truyền trực tiếp nhật ký yêu cầu omniroute health # Thông tin sức khỏe chi tiết (bộ ngắt mạch, bộ nhớ đệm, bộ nhớ) omniroute --version # In phiên bản omniroute --help # Hiển thị tất cả lệnh ``` ### Thiết lập & Khởi tạo ```bash omniroute setup # Trình hướng dẫn thiết lập tương tác omniroute setup --non-interactive # Chế độ CI/tự động hóa (đọc biến môi trường + cờ) omniroute setup --password '' # Đặt trực tiếp mật khẩu quản trị viên omniroute setup --add-provider \ --provider openai \ --api-key '' \ --test-provider # Thêm và kiểm tra nhà cung cấp trong một lần ``` Các biến môi trường được nhận dạng cho thiết lập không tương tác: | Biến | Mục đích | | ------------------- | -------------------------------------------------------------------------------------- | | `OMNIROUTE_API_KEY` | Khóa API của nhà cung cấp (được liên kết với `--api-key` thông qua Commander `.env()`) | | `DATA_DIR` | Ghi đè thư mục dữ liệu OmniRoute | Tất cả đầu vào không tương tác khác được truyền dưới dạng cờ, không phải biến môi trường: `--password`, `--provider`, `--provider-name`, `--provider-base-url`, `--default-model` (xem các tùy chọn `omniroute setup` ở trên). ### Chẩn đoán ```bash omniroute doctor # Kiểm tra cấu hình, DB, cổng, môi trường thực thi, bộ nhớ, trạng thái hoạt động omniroute doctor --json # JSON có thể đọc bằng máy omniroute doctor --no-liveness # Bỏ qua phép thăm dò sức khỏe HTTP omniroute doctor --host 0.0.0.0 # Ghi đè máy chủ dùng để kiểm tra trạng thái hoạt động omniroute doctor --liveness-url # Ghi đè URL đầy đủ của điểm cuối sức khỏe ``` Lệnh doctor thực hiện các kiểm tra sau: `Cấu hình`, `Cơ sở dữ liệu`, `Lưu trữ/mã hóa`, `Khả dụng của cổng`, `Môi trường thực thi Node`, `Tệp nhị phân gốc` (better-sqlite3), `Bộ nhớ` và `Trạng thái hoạt động của máy chủ`. Lệnh thoát với mã khác 0 nếu có bất kỳ kiểm tra nào là `fail`. ### Quản lý nhà cung cấp ```bash omniroute providers available # Danh mục nhà cung cấp OmniRoute omniroute providers available --search openai # Lọc danh mục theo id/tên/bí danh/danh mục omniroute providers available --category api-key # Lọc theo danh mục (api-key, oauth, free, ...) omniroute providers available --json # JSON có thể đọc bằng máy omniroute providers list # Các kết nối nhà cung cấp đã cấu hình omniroute providers list --json omniroute providers test # Kiểm tra một kết nối đã cấu hình omniroute providers test-all # Kiểm tra mọi kết nối đang hoạt động omniroute providers validate # Xác thực cấu trúc chỉ ở cục bộ omniroute providers add --credential-env PROVIDER_KEY omniroute providers import ./providers.json --dry-run --json omniroute providers auth # Luồng OAuth hiện có omniroute providers edit --default-model omniroute providers remove --yes ``` `providers add/import/auth/edit/remove` ưu tiên API và do đó hoạt động với ngữ cảnh cục bộ hoặc từ xa đang hoạt động. Đầu vào thông tin xác thực nên sử dụng `--credential-stdin` hoặc `--credential-env`; `--dry-run --json` chỉ báo cáo sự hiện diện/hình dạng đã được che thông tin nhạy cảm. `providers available` đọc danh mục OmniRoute; `providers list/test/test-all/validate` duy trì hành vi SQLite cục bộ và không yêu cầu máy chủ phải đang chạy. Đối với một nút tùy chỉnh tương thích với OpenAI hoặc Anthropic, hãy gắn thông tin xác thực vào ID nút do `omniroute nodes add` trả về bằng `omniroute keys add "$NODE_ID" --stdin`. Thao tác này yêu cầu máy chủ đang chạy và xác thực quản lý cho ngữ cảnh đang hoạt động. CLI sử dụng `POST /api/providers`, thao tác này xác thực nút và sao chép các cài đặt điểm cuối của nút vào kết nối. Nếu thiếu nút, xác thực thất bại hoặc máy chủ không khả dụng, lệnh sẽ trả về lỗi mà không tạo thông tin xác thực dự phòng cục bộ. `nodes add --base-url` đặt điểm cuối của nút; địa chỉ này khác với địa chỉ máy chủ trong `OMNIROUTE_BASE_URL`. Đối với các tệp OpenAPI, hãy sử dụng `omniroute openapi dump --format json --out ./openapi.json`; `--output` toàn cục chọn định dạng hiển thị của CLI, không phải tên tệp đích. ### Khôi phục & Đặt lại ```bash omniroute reset-password # Đặt lại mật khẩu quản trị viên (cũng có thể dùng: omniroute-reset-password) omniroute reset-encrypted-columns # Hiển thị cảnh báo + chạy thử việc đặt lại thông tin xác thực được mã hóa omniroute reset-encrypted-columns --force # Thực sự đặt thông tin xác thực được mã hóa thành null trong SQLite ``` ### Xuất thông tin xác thực (⚠ xử lý cẩn thận) ```bash omniroute auth export # Hiển thị cảnh báo + yêu cầu xác nhận — không truy cập DB omniroute auth export --force # Xuất thông tin xác thực ĐÃ GIẢI MÃ của TẤT CẢ kết nối ra stdout dưới dạng JSON omniroute auth export --force --id # Chỉ xuất kết nối khớp omniroute auth export --force --format env # Xuất các dòng OMNIROUTE__= omniroute auth export --force --out creds.json # Ghi vào tệp (được tạo với quyền 0600) ``` `auth export` **chỉ hoạt động cục bộ** (đọc trực tiếp SQLite, không có tuyến HTTP) và chủ đích in/ghi các giá trị `apiKey`/`accessToken`/`refreshToken`/`idToken` ở dạng **văn bản thuần túy** — đây là tính năng, không phải lỗi. Không có dữ liệu nào được đọc từ cơ sở dữ liệu và không có dữ liệu nào được giải mã nếu không có `--force`. Một biểu ngữ cảnh báo luôn được in ra stderr trước khi bất kỳ văn bản thuần túy nào được xuất. Yêu cầu phải thiết lập `STORAGE_ENCRYPTION_KEY`. Trường không thể giải mã (khóa cũ, bản mã bị hỏng) được báo cáo dưới dạng `DecryptFailed: true` thay vì hủy toàn bộ quá trình xuất hoặc làm lộ lỗi cơ bản. ### Các lệnh con khác Các lệnh này giả định máy chủ OmniRoute đang chạy, trừ khi có ghi chú khác: ```bash omniroute status # Trạng thái thời gian chạy toàn diện omniroute logs # Truyền trực tiếp nhật ký yêu cầu (--json, --search, --follow) omniroute config list # Hiển thị các công cụ CLI đã cấu hình omniroute provider list # Liệt kê các nhà cung cấp khả dụng (bí danh của providers list) omniroute provider add # Đăng ký OmniRoute làm nhà cung cấp trên một công cụ omniroute keys add | list | remove # Quản lý khóa API omniroute models [provider] # Liệt kê các mô hình (--json, --search) omniroute combo list | switch | create | delete omniroute backup # Tạo ảnh chụp nhanh cấu hình + DB omniroute restore # Khôi phục từ một ảnh chụp nhanh trước đó omniroute health # Thông tin tình trạng chi tiết (bộ ngắt mạch, bộ nhớ đệm, bộ nhớ) omniroute quota # Mức sử dụng hạn ngạch của nhà cung cấp omniroute cache # Trạng thái bộ nhớ đệm omniroute cache clear # Xóa bộ nhớ đệm ngữ nghĩa + chữ ký omniroute mcp status | restart # Trạng thái / khởi động lại máy chủ MCP omniroute a2a status | card # Trạng thái máy chủ A2A / thẻ tác nhân omniroute tunnel list | create | stop # Quản lý đường hầm (cloudflare/tailscale/ngrok) omniroute env show | get | set # Kiểm tra / đặt biến môi trường (tạm thời) omniroute test # Kiểm tra nhanh khả năng kết nối của nhà cung cấp omniroute update # Kiểm tra bản cập nhật omniroute completion # Tạo lệnh hoàn thành cho shell ``` ### Các cờ thông dụng | Cờ | Mô tả | | ------------------- | --------------------------------------------------------- | | `--no-open` | Không tự động mở trình duyệt khi khởi động | | `--port ` | Ghi đè cổng API (mặc định 20128) | | `--mcp` | Chạy dưới dạng máy chủ MCP qua stdio (dành cho IDE) | | `--non-interactive` | Chế độ CI (không nhắc; đọc từ biến môi trường/cờ) | | `--json` | Đầu ra JSON có thể được máy đọc (doctor, providers, v.v.) | | `--help`, `-h` | Hiển thị trợ giúp dành riêng cho lệnh | | `--version`, `-v` | In phiên bản đã cài đặt | --- ## Các endpoint API khả dụng | Endpoint | Mô tả | Dùng cho | | -------------------------- | ------------------------------------------- | -------------------------------- | | `/v1/chat/completions` | Trò chuyện tiêu chuẩn (tất cả nhà cung cấp) | Tất cả công cụ hiện đại | | `/v1/responses` | Responses API (định dạng OpenAI) | Codex, quy trình làm việc tác tử | | `/v1/completions` | Hoàn thành văn bản kiểu cũ | Công cụ cũ sử dụng `prompt:` | | `/v1/embeddings` | Embedding văn bản | RAG, tìm kiếm | | `/v1/images/generations` | Tạo hình ảnh | GPT-Image, Flux, v.v. | | `/v1/audio/speech` | Chuyển văn bản thành giọng nói | ElevenLabs, OpenAI TTS | | `/v1/audio/transcriptions` | Chuyển giọng nói thành văn bản | Deepgram, AssemblyAI | Các ví dụ có thể dán để sử dụng ngay với URL OmniRoute đã được gắn token: ```txt Ví dụ về token: sk-a3ab3c080beaee3a-69f4a4-070d71af Base OpenAI tiêu chuẩn: http://localhost:20128/v1 Các model VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/models Trò chuyện VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/chat/completions Responses VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/responses Các tag Ollama: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/tags Trò chuyện Ollama: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/chat ``` --- ## Khắc phục sự cố | Lỗi | Nguyên nhân | Cách khắc phục | | ------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------ | | `Connection refused` | OmniRoute không chạy | `omniroute serve` | | `401 Unauthorized` | API key không chính xác | Kiểm tra trong `/dashboard/api-manager` | | `No combo configured` | Không có tổ hợp định tuyến đang hoạt động | Thiết lập trong `/dashboard/combos` | | CLI hiển thị "not installed" | Tệp nhị phân không có trong PATH | Kiểm tra `which ` | | Dashboard hiển thị "not detected" sau khi cài đặt | Bộ nhớ đệm đã cũ | Nhấp vào "⟳ Làm mới phát hiện" trong dashboard | | Liên kết cũ `/dashboard/cli-tools` | Dấu trang trước v3.8.6 | Tự động chuyển hướng đến `/dashboard/cli-code` (308) | | Liên kết cũ `/dashboard/agents` | Dấu trang trước v3.8.6 | Tự động chuyển hướng đến `/dashboard/acp-agents` (308) | ## Quản lý chính sách inference-key bằng OmniRoute CLI Sử dụng ngữ cảnh quản lý đã xác thực (xem [Chế độ từ xa](../guides/REMOTE-MODE.md)) để kiểm tra hoặc cập nhật một inference key hiện có theo ID của key đó: ```bash omniroute --output json keys policy show KEY_ID omniroute keys policy set KEY_ID --unrestricted omniroute --output json keys policy show KEY_ID ``` `--unrestricted` là bí danh của `--model-access-mode all`. Thao tác cập nhật sẽ xóa danh sách model được phép. Thao tác này giữ nguyên các scope, quy tắc kết nối, model bị chặn, giới hạn tốc độ và giới hạn chi phí, vì vậy các biện pháp kiểm soát khác đó vẫn có thể từ chối một yêu cầu. Việc chỉ định rõ `--allowed-models ""` cũng chọn `all`; hãy kết hợp tùy chọn này với `--model-access-mode restricted` để giữ một key bị hạn chế nhưng không có model nào được phép. Một danh sách không rỗng được phân tách bằng dấu phẩy sẽ chọn `restricted`, trừ khi được chỉ định rõ ràng. Tổ hợp mâu thuẫn giữa `all` và một danh sách cho phép không rỗng sẽ bị từ chối trước khi gửi yêu cầu. `--rate-limit 30` đặt số lượng yêu cầu mỗi phút và giữ nguyên các quy tắc cho những khoảng thời gian khác. `--max-cost 5` bật mức trần USD hằng ngày mà không thay đổi mức trần hằng tuần; `--max-cost 0` xóa mức trần hằng ngày và giữ nguyên tùy chọn bật/tắt giới hạn sử dụng cũng như mức trần hằng tuần hiện có. Các trường chính sách bị bỏ qua sẽ không thay đổi. Các thay đổi về tốc độ sẽ đọc chính sách hiện tại trước; tránh chỉnh sửa đồng thời mảng giới hạn tốc độ của cùng một key. Các lệnh chính sách sử dụng `GET`/`PATCH /api/keys/{id}` đã xác thực và tuân theo ngữ cảnh đang hoạt động cũng như tùy chọn `--api-key` toàn cục. Đầu ra JSON chỉ chứa các trường chính sách, không chứa key đã lưu trữ hoặc biểu diễn đã che của key đó. Thông tin xác thực chỉ dành cho suy luận không thể cấp quyền cho các thay đổi quản lý. Phản hồi 401/403 yêu cầu kiểm tra thông tin xác thực quản lý và ngữ cảnh; phản hồi này không xác nhận lỗi token CLI cục bộ hoặc salt. Xem [Token CLI](../security/CLI_TOKEN.md) để biết hợp đồng xác thực cục bộ riêng biệt.