# ๐Ÿ“– Setup Guide โ€” OmniRoute (ืขื‘ืจื™ืช) ๐ŸŒ **Languages:** ๐Ÿ‡บ๐Ÿ‡ธ [English](../../../../guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡น [am](../../../am/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฆ [ar](../../../ar/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฟ [az](../../../az/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฌ [bg](../../../bg/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฉ [bn](../../../bn/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฆ [bs](../../../bs/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ฟ [cs](../../../cs/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ฐ [da](../../../da/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ช [de](../../../de/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ท [el](../../../el/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ธ [es](../../../es/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ช [et](../../../et/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ท [fa](../../../fa/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ฎ [fi](../../../fi/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ท [fr](../../../fr/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ช [ga](../../../ga/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [gu](../../../gu/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ha](../../../ha/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [hi](../../../hi/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡ท [hr](../../../hr/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡บ [hu](../../../hu/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฒ [hy](../../../hy/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ [id](../../../id/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ig](../../../ig/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡น [it](../../../it/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฏ๐Ÿ‡ต [ja](../../../ja/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ช [ka](../../../ka/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ญ [km](../../../km/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [kn](../../../kn/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ท [ko](../../../ko/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡น [lt](../../../lt/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ป [lv](../../../lv/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ml](../../../ml/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [mr](../../../mr/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡พ [ms](../../../ms/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡น [mt](../../../mt/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡ฒ [my](../../../my/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ต [ne](../../../ne/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฑ [nl](../../../nl/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ด [no](../../../no/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [or](../../../or/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [pa](../../../pa/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ญ [phi](../../../phi/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฑ [pl](../../../pl/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡น [pt](../../../pt/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ท [pt-BR](../../../pt-BR/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ด [ro](../../../ro/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡บ [ru](../../../ru/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ฐ [si](../../../si/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฐ [sk](../../../sk/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฎ [sl](../../../sl/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ธ [sr](../../../sr/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ช [sv](../../../sv/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ช [sw](../../../sw/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ta](../../../ta/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [te](../../../te/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ญ [th](../../../th/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ท [tr](../../../tr/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฆ [uk-UA](../../../uk-UA/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฐ [ur](../../../ur/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฟ [uz](../../../uz/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ป๐Ÿ‡ณ [vi](../../../vi/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [yo](../../../yo/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ณ [zh-CN](../../../zh-CN/docs/guides/SETUP_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ผ [zh-TW](../../../zh-TW/docs/guides/SETUP_GUIDE.md) --- > ืžื“ืจื™ืš ื”ืชืงื ื” ืžืœื ืขื‘ื•ืจ OmniRoute. ืœื’ืจืกื” ื”ืžื”ื™ืจื”, ืจืื• ืืช [ื”ืžื“ืจื™ืš ืœื”ืชื—ืœื” ืžื”ื™ืจื” ื‘-README](../README.md#-quick-start). ## ืชื•ื›ืŸ ื”ืขื ื™ื™ื ื™ื - [ืฉื™ื˜ื•ืช ื”ืชืงื ื”](#install-methods) - [ื”ื’ื“ืจืช ื›ืœื™ CLI](#cli-tool-configuration) - [ื”ื’ื“ืจืช ืคืจื•ื˜ื•ืงื•ืœื™ื (MCP + A2A)](#protocol-setup-mcp--a2a) - [ื”ื’ื“ืจืช ื–ืžืŸ ืงืฆื•ื‘](#timeout-configuration) - [ืžืฆื‘ ืคื™ืฆื•ืœ ื™ืฆื™ืื•ืช](#split-port-mode) - [Void Linux (xbps-src)](#void-linux-xbps-src-template) - [ื”ืกืจืช ื”ืชืงื ื”](#uninstalling) --- ## ืฉื™ื˜ื•ืช ื”ืชืงื ื” ### npm (ืžื•ืžืœืฅ) ```bash npm install -g omniroute omniroute ``` ืœื•ื— ื”ื‘ืงืจื” ื ืคืชื— ื‘ื›ืชื•ื‘ืช `http://localhost:20128`, ื•ื›ืชื•ื‘ืช ื”ื‘ืกื™ืก ืฉืœ ื”-API ื”ื™ื `http://localhost:20128/v1`. ### pnpm ```bash pnpm add -g omniroute@latest --allow-build=better-sqlite3 --allow-build=@swc/core omniroute ``` > **ืœืžืฉืชืžืฉื™ pnpm:** ื”ื“ื’ืœ `--allow-build` ื ื“ืจืฉ ื›ื“ื™ ืœืืคืฉืจ ืกืงืจื™ืคื˜ื™ื ืžืงื•ืจื™ื™ื ืฉืœ ื‘ื ื™ื™ื” ืขื‘ื•ืจ `better-sqlite3` ื•-`@swc/core`. ื”ืคืงื•ื“ื” `pnpm approve-builds -g` ืื™ื ื” ื ืชืžื›ืช ื‘ื”ืชืงื ื•ืช ื’ืœื•ื‘ืœื™ื•ืช ื‘-pnpm v11. ### Arch Linux (AUR) ```bash yay -S omniroute-bin systemctl --user enable --now omniroute.service ``` [ื—ื‘ื™ืœืช AUR](https://aur.archlinux.org/packages/omniroute-bin) ืžืชืงื™ื ื” ืืช OmniRoute ื•ืžืกืคืงืช ืฉื™ืจื•ืช ืžืฉืชืžืฉ ืฉืœ systemd. ### ืžืงื•ื“ ื”ืžืงื•ืจ ```bash npm install PORT=20128 DASHBOARD_PORT=20129 NEXT_PUBLIC_BASE_URL=http://localhost:20129 npm run dev ``` > **ื”ืขืจื” ืขื‘ื•ืจ Windows:** ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, OmniRoute ืžืฉืชืžืฉ ื‘-`%APPDATA%\omniroute` ื›ืืฉืจ ื”ืชื™ืงื™ื™ื” ื”ื™ืฉื ื” `%USERPROFILE%\.omniroute` ืื™ื ื” ืงื™ื™ืžืช. ื”ื’ื“ื™ืจื• ืืช `DATA_DIR` ื›ื“ื™ ืœื‘ื—ื•ืจ ืžื™ืงื•ื ืื—ืจ ืขื‘ื•ืจ ืชื™ืงื™ื™ืช ื”ื ืชื•ื ื™ื. > **ื”ืขืจื”:** `npm install` ื™ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช ืืช `.env` ืžืชื•ืš `.env.example` ื‘ื”ืคืขืœื” ื”ืจืืฉื•ื ื”. ื”ืชืงื ื•ืช ืขืชื™ื“ื™ื•ืช ืœื ื™ื“ืจืกื• ืงื•ื‘ืฅ `.env` ืงื™ื™ื, ื•ืœื›ืŸ ื”ื”ืชืืžื•ืช ื”ืื™ืฉื™ื•ืช ื ืฉืžืจื•ืช. ื›ื“ื™ ืœืืชื—ืœ ืื•ืชื• ืžื—ื“ืฉ, ืžื—ืงื• ืืช `.env` ืœืคื ื™ ื”ืคืขืœื” ื—ื•ื–ืจืช. ### Docker ืขื™ื™ื ื• ื‘[ืžื“ืจื™ืš Docker](./DOCKER_GUIDE.md) ืœืงื‘ืœืช ื”ื•ืจืื•ืช ื”ืชืงื ื” ืžืœืื•ืช ืขื‘ื•ืจ Docker, ื›ื•ืœืœ ืคืจื•ืคื™ืœื™ื ืฉืœ Compose ื•-HTTPS ื‘ืืžืฆืขื•ืช Caddy. ### ื™ื™ืฉื•ื ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” (Electron) OmniRoute ื›ื•ืœืœ ืžืขื˜ืคืช ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” ื”ืžื‘ื•ืกืกืช ืขืœ Electron 41 ื•ืขืœ electron-builder 26.10. ื”ืกืงืจื™ืคื˜ื™ื ื”ื–ืžื™ื ื™ื (ื‘ืฉื•ืจืฉ ืกื‘ื™ื‘ืช ื”ืขื‘ื•ื“ื”): ```bash npm run electron:dev # ื”ืคืขืœืช ื™ื™ืฉื•ื ืฉื•ืœื—ืŸ ื”ืขื‘ื•ื“ื” ืขื ื˜ืขื™ื ื” ืžื—ื“ืฉ ื‘ื–ืžืŸ ืืžืช npm run electron:build # ื‘ื ื™ื™ื” ืขื‘ื•ืจ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื ื•ื›ื—ื™ืช (ืžื–ื•ื”ื” ืื•ื˜ื•ืžื˜ื™ืช) npm run electron:build:win # ืชื•ื›ื ื™ืช ื”ืชืงื ื” ืขื‘ื•ืจ Windows (NSIS + ื’ืจืกื” ื ื™ื™ื“ืช) npm run electron:build:mac # macOS (dmg + zip, arm64+x64) npm run electron:build:linux # Linux (AppImage + deb + rpm) npm run electron:smoke:packaged # ื‘ื“ื™ืงืช ืขืฉืŸ ืฉืœ ื”ื‘ื ื™ื™ื” ื”ืืจื•ื–ื” ``` ื’ืจืกืื•ืช ืฉืœ ืชื•ื›ื ื™ื•ืช ื”ื”ืชืงื ื” ืœืฉื•ืœื—ืŸ ื”ืขื‘ื•ื“ื” ืžืฆื•ืจืคื•ืช ืœืžื”ื“ื•ืจื•ืช GitHub. ืœื”ืกื‘ืจ ืžืขืžื™ืง ื•ืžืœื ืขืœ Electron (ื—ืชื™ืžื”, ื’ืฉืจ IPC ื•ื”ืคืฆื•ืช), ืจืื• [`ELECTRON_GUIDE.md`](./ELECTRON_GUIDE.md) _(ื ื•ืฆืจ ื‘ืฉืœื‘ ืžืื•ื—ืจ ื™ื•ืชืจ)_. ### ืฉืจืช ืœืœื ืžืžืฉืง ื’ืจืคื™ (CI/ืื•ื˜ื•ืžืฆื™ื”) ืขื‘ื•ืจ ื”ืชืงื ื•ืช ืœืœื ื”ืชืขืจื‘ื•ืช (Docker, Kubernetes, CI), ื”ืฉืชืžืฉื• ื‘: ```bash omniroute setup --non-interactive omniroute providers test-batch ``` ื‘ืฉื™ืœื•ื‘ ืขื ืžืฉืชื ื™ ืกื‘ื™ื‘ื” (`INITIAL_PASSWORD`, `OMNIROUTE_WS_BRIDGE_SECRET` ื•ื›ื•'), ื”ื“ื‘ืจ ืžืืคืฉืจ ืœื”ืคืขื™ืœ ืžื•ืคืข OmniRoute ืฉื ื™ืชืŸ ืœืฉืœื•ื˜ ื‘ื• ื‘ืื•ืคืŸ ืžืœื ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ื™ื. ### ืืคืฉืจื•ื™ื•ืช CLI | ืคืงื•ื“ื” | ืชื™ืื•ืจ | | ----------------------- | --------------------------------------------------------------- | | `omniroute` | ื”ืคืขืœืช ื”ืฉืจืช (`PORT=20128`, ื”-API ื•ืœื•ื— ื”ื‘ืงืจื” ื‘ืื•ืชื” ื™ืฆื™ืื”) | | `omniroute setup` | ืชื”ืœื™ืš ืงืœื™ื˜ื” ืžื•ื“ืจืš ื‘-CLI ืœื”ื’ื“ืจืช ืกื™ืกืžื” ื•ืกืคืง ืจืืฉื•ืŸ | | `omniroute doctor` | ื”ืคืขืœืช ื‘ื“ื™ืงื•ืช ืชืงื™ื ื•ืช ืžืงื•ืžื™ื•ืช ืžื‘ืœื™ ืœื”ืคืขื™ืœ ืืช ื”ืฉืจืช | | `omniroute providers` | ื’ื™ืœื•ื™, ื”ืฆื’ื”, ืื™ืžื•ืช ื•ื‘ื“ื™ืงืช ืกืคืงื™ื ื“ืจืš ื”-CLI | | `omniroute config` | ื”ื’ื“ืจืช ื›ืœื™ CLI โ€” ื”ืฆื’ื”, ืงื‘ืœื”, ื”ื’ื“ืจื” ื•ืื™ืžื•ืช ืฉืœ ืชืฆื•ืจื•ืช | | `omniroute status` | ืœื•ื— ืžืฆื‘ ืœื ืžืงื•ื•ืŸ โ€” ื’ืจืกื”, ืžืกื“ ื ืชื•ื ื™ื, ื›ืœื™ื ื•ืชืฆื•ืจื” | | `omniroute logs` | ื”ื–ืจืžืช ื™ื•ืžื ื™ ืฉื™ืžื•ืฉ ืžื”-API (ืชื•ืžืš ื‘-`--follow`) | | `omniroute update` | ื‘ื“ื™ืงื” ืื• ื”ื—ืœื” ืฉืœ ืขื“ื›ื•ื ื™ OmniRoute | | `omniroute provider` | ื ื™ื”ื•ืœ ื—ื™ื‘ื•ืจื™ ืกืคืงื™ื โ€” ื”ื•ืกืคื”, ื”ืฆื’ื”, ื”ืกืจื”, ื‘ื“ื™ืงื” ื•ื”ื’ื“ืจืช ื‘ืจื™ืจืช ืžื—ื“ืœ | | `omniroute --port 3000` | ื”ื’ื“ืจืช ื”ื™ืฆื™ืื” ื”ืจืืฉื™ืช/ื™ืฆื™ืืช ื”-API ืœ-3000 | | `omniroute --mcp` | ื”ืคืขืœืช ืฉืจืช MCP (ืชืขื‘ื•ืจืช stdio) | | `omniroute --no-open` | ืžื ื™ืขืช ืคืชื™ื—ื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ื”ื“ืคื“ืคืŸ | | `omniroute --help` | ื”ืฆื’ืช ืขื–ืจื” | ื ื™ืชืŸ ืœื”ืคื•ืš ืืช ื”ื”ืชืงื ื” ืœืœื ืžืžืฉืง ื’ืจืคื™ ืœืื•ื˜ื•ืžื˜ื™ืช ื‘ืืžืฆืขื•ืช ื“ื’ืœื™ื ืื• ืžืฉืชื ื™ ืกื‘ื™ื‘ื”: ```bash omniroute setup --non-interactive --password "$OMNIROUTE_PASSWORD" omniroute setup --non-interactive --add-provider --provider openai --api-key "$OPENAI_API_KEY" omniroute setup --non-interactive --add-provider --provider openai --api-key "$OPENAI_API_KEY" --test-provider ``` ื”ืคืขื™ืœื• ืื‘ื—ื•ืŸ ืžืงื•ืžื™ ืžื‘ืœื™ ืœืคืชื•ื— ืืช ืœื•ื— ื”ื‘ืงืจื”: ```bash omniroute doctor omniroute doctor --json omniroute doctor --no-liveness ``` ื ื”ืœื• ืกืคืงื™ื ื‘ืืžืฆืขื•ืช SSH ืื• ืกืงืจื™ืคื˜ื™ื ืžื‘ืœื™ ืœืคืชื•ื— ืืช ืœื•ื— ื”ื‘ืงืจื”: ```bash omniroute providers available omniroute providers available --search openai omniroute providers available --category api-key omniroute providers list omniroute providers test omniroute providers test-all omniroute providers validate ``` --- ## ื”ื’ื“ืจืช ื›ืœื™ CLI ### 1) ื—ื™ื‘ื•ืจ ืกืคืงื™ื ื•ื™ืฆื™ืจืช ืžืคืชื— API 1. ืคืชื—ื• ืืช ืœื•ื— ื”ื‘ืงืจื” โ†’ `Providers` ื•ื—ื‘ืจื• ืกืคืง ืื—ื“ ืœืคื—ื•ืช (OAuth ืื• ืžืคืชื— API). 2. ืคืชื—ื• ืืช ืœื•ื— ื”ื‘ืงืจื” โ†’ `Endpoints` ื•ืฆืจื• ืžืคืชื— API. 3. (ืื•ืคืฆื™ื•ื ืœื™) ืคืชื—ื• ืืช ืœื•ื— ื”ื‘ืงืจื” โ†’ `Combos` ื•ื”ื’ื“ื™ืจื• ืืช ืฉืจืฉืจืช ื”ื’ื™ื‘ื•ื™ ืฉืœื›ื. ### 2) ื”ืคื ื™ื™ืช ื›ืœื™ ื”ืคื™ืชื•ื— ืฉืœื›ื ```txt ื›ืชื•ื‘ืช URL ื‘ืกื™ืกื™ืช: http://localhost:20128/v1 ืžืคืชื— API: [ื”ืขืชื™ืงื• ืžื“ืฃ ื”-Endpoint] ืžื•ื“ืœ: if/qwen3.8-max-preview (ืื• ื›ืœ ืงื™ื“ื•ืžืช provider/model) ``` ืื ื”ืขื•ืจืš ืฉืœื›ื ืื™ื ื• ื™ื›ื•ืœ ืœืฉืœื•ื— `Authorization: Bearer ...`, ื”ืฉืชืžืฉื• ื‘ืžืงื•ื ื–ืืช ื‘ื›ืชื•ื‘ืช ื”ื‘ืกื™ืก ื”ืชื•ืืžืช ื”ื›ื•ืœืœืช ื˜ื•ืงืŸ: ```txt ื›ืชื•ื‘ืช URL ื‘ืกื™ืกื™ืช: http://localhost:20128/api/v1/vscode/YOUR_KEY/ ื›ืชื•ื‘ืช URL ืœืžื•ื“ืœื™ื: http://localhost:20128/api/v1/vscode/YOUR_KEY/models ื›ืชื•ื‘ืช URL ืœืฆ'ืื˜: http://localhost:20128/api/v1/vscode/YOUR_KEY/chat/completions ื›ืชื•ื‘ืช URL ืœืชื’ื™ื•ืช Ollama: http://localhost:20128/api/v1/vscode/YOUR_KEY/api/tags ``` ืคื•ืขืœ ืขื Claude Code, Codex CLI, Cursor, Cline, OpenClaw, OpenCode ื•ืขืจื›ื•ืช SDK ืชื•ืืžื•ืช OpenAI. #### ื”ื’ื“ืจื” ืื•ื˜ื•ืžื˜ื™ืช ื‘ืืžืฆืขื•ืช `setup-*` ื‘ืžืงื•ื ืœื”ื“ื‘ื™ืง ื™ื“ื ื™ืช ืืช ื›ืชื•ื‘ืช ื”ื‘ืกื™ืก ื•ืืช ื”ืžืคืชื—, ืืคืฉืจื• ืœ-OmniRoute ืœื›ืชื•ื‘ ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ื”ื™ื™ื—ื•ื“ื™ ืฉืœ ื›ืœ ื›ืœื™ ืžืชื•ืš ืงื˜ืœื•ื’ ื”ืžื•ื“ืœื™ื ื”ืคืขื™ืœ. ืคืงื•ื“ื” ืื—ืช ืœื›ืœ ื›ืœื™: ```bash omniroute setup-codex # ืคืจื•ืคื™ืœื™ื ื‘-~/.codex/.config.toml omniroute setup-claude # ~/.claude/profiles//settings.json omniroute setup-opencode # ~/.config/opencode/opencode.json (ืชื•ืื OpenAI) omniroute setup-cline # ื”ื’ื“ืจื•ืช Cline CLI ื•ืชื•ืกืฃ VS Code omniroute setup-kilo # Kilo Code omniroute setup-continue # ~/.continue/config.yaml (Continue / cn) omniroute setup-cursor # ืžื“ืคื™ืก ืืช ืฉืœื‘ื™ ื”ื”ื’ื“ืจื” ื‘ืชื•ืš Cursor omniroute setup-roo # ื™ื™ื‘ื•ื ืœ-Roo Code ื•ืžืฆื‘ื™ืข autoImport omniroute setup-crush # ~/.config/crush/crush.json omniroute setup-zed # ~/.config/zed/settings.json (openai_compatible) omniroute setup-goose # ~/.config/goose/config.yaml omniroute setup-aider # ~/.aider.conf.yml omniroute setup-qwen # ~/.qwen/settings.json + ~/.qwen/.env ``` ื›ืœ ืคืงื•ื“ื” ืžืงื‘ืœืช ืืช `--remote --api-key ` ื›ื“ื™ ืœื”ื’ื“ื™ืจ ื›ืœื™ ืžืงื•ืžื™ ืžื•ืœ OmniRoute **ืžืจื•ื—ืง**, ื•ื›ืŸ ืืช `--dry-run` ืœืชืฆื•ื’ื” ืžืงื“ื™ืžื”. ื›ื“ื™ ืœื”ืคืขื™ืœ CLI ืขื ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื”ืžืชืื™ืžื™ื ืžื•ื–ืจืงื™ื, ืžื‘ืœื™ ืœื›ืชื•ื‘ ื›ืœืœ ืงื•ื‘ืฅ ืชืฆื•ืจื”, ื”ืฉืชืžืฉื• ื‘ืžืคืขื™ืœ ื”ื›ืœืœื™ `omniroute run ` (claude, codex, aider, goose, opencode, qwen, gemini); ื”ืžืคืขื™ืœื™ื ื”ื™ืฉื ื™ื ื”ื™ื™ืขื•ื“ื™ื™ื ืœื›ืœ ื›ืœื™, `omniroute launch` (Claude Code) ื•- `omniroute launch-codex` (Codex), ืขื“ื™ื™ืŸ ื–ืžื™ื ื™ื. ืœื˜ื‘ืœื” ื”ืžืœืื” (ืžื” ื›ืœ ืคืงื•ื“ื” ื›ื•ืชื‘ืช, ื›ืœ ื”ื“ื’ืœื™ื, ืžืงื•ืžื™ ืœืขื•ืžืช ืžืจื•ื—ืง, ื•ื”ืžื•ืกื›ืžื•ืช ืฉืœ `/v1` ื‘ื›ืชื•ื‘ืช ื”ื‘ืกื™ืก), ืจืื• **[ืฉื™ืœื•ื‘ื™ CLI](./CLI-INTEGRATIONS.md)**. ืœื”ื’ื“ืจื” ืžืคื•ืจื˜ืช ืขื‘ื•ืจ ื›ืœ ื›ืœื™ ื‘ื ืคืจื“ (Claude Code, Codex CLI, Cursor, Cline, OpenClaw, Kilo Code, Copilot ื•ืขื•ื“), ืจืื• ืืช **[ื”ืžื“ืจื™ืš ืœื›ืœื™ CLI](../reference/CLI-TOOLS.md)** ื”ื™ื™ืขื•ื“ื™. --- ## ื”ื’ื“ืจืช ืคืจื•ื˜ื•ืงื•ืœื™ื (MCP + A2A) ### ื”ื’ื“ืจืช MCP (Model Context Protocol) ื”ืคืขื™ืœื• ืืช ืชืขื‘ื•ืจืช MCP ื‘ืžืฆื‘ stdio: ```bash omniroute --mcp ``` ืชื”ืœื™ืš ื”ืื™ืžื•ืช ื”ืžื•ืžืœืฅ: ```bash # 1. ื”ืคืขื™ืœื• ืืช ืฉืจืช MCP omniroute --mcp # 2. ืžืœืงื•ื— ื”-MCP ืฉืœื›ื, ืงืจืื• ืœืคืงื•ื“ื•ืช: omniroute_get_health # ืืžื•ืจ ืœื”ื—ื–ื™ืจ ืืช ืชืงื™ื ื•ืช ื”ืžืขืจื›ืช omniroute_list_combos # ืืžื•ืจ ืœื”ื—ื–ื™ืจ ืฉื™ืœื•ื‘ื™ื ืคืขื™ืœื™ื # 3. ืœื—ืœื•ืคื™ืŸ, ื”ืคืขื™ืœื• ืืช ื—ื‘ื™ืœืช ื‘ื“ื™ืงื•ืช E2E ื”ืžืœืื”: npm run test:protocols:e2e ``` #### ื”ื’ื“ืจืช ืœืงื•ื— MCP **Claude Code:** ```bash claude mcp add-server omniroute --type http --url http://localhost:20128/api/mcp/stream ``` **Cursor / Cline:** ื”ื•ืกื™ืคื• ืœื”ื’ื“ืจื•ืช ื”-MCP ืฉืœื›ื: ```json { "mcpServers": { "omniroute": { "command": "omniroute", "args": ["--mcp"], "env": {} } } } ``` **ืชื™ืขื•ื“ MCP ืžืœื:** [README ืฉืœ ืฉืจืช MCP](../../open-sse/mcp-server/README.md) โ€” 110 ื›ืœื™ื, ื”ื’ื“ืจื•ืช IDE ื•ืœืงื•ื—ื•ืช Python/TS/Go. ### ื”ื’ื“ืจืช A2A (ืคืจื•ื˜ื•ืงื•ืœ ืกื•ื›ืŸ-ืœืกื•ื›ืŸ) ืืžืชื• ืืช ื›ืจื˜ื™ืก ื”ืกื•ื›ืŸ: ```bash curl http://localhost:20128/.well-known/agent.json ``` ืฉืœื—ื• ืžืฉื™ืžื”: ```bash curl -X POST http://localhost:20128/a2a \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":"quickstart","method":"message/send","params":{"skill":"quota-management","messages":[{"role":"user","content":"Give me a short quota summary."}]}}' ``` **ืชื™ืขื•ื“ A2A ืžืœื:** [README ืฉืœ ืฉืจืช A2A](../../src/lib/a2a/README.md) โ€” JSON-RPC 2.0, ืžื™ื•ืžื ื•ื™ื•ืช, ื”ื–ืจืžื” ื•ืžื—ื–ื•ืจ ื—ื™ื™ ืžืฉื™ืžื”. --- ## ื”ื’ื“ืจืช ื–ืžื ื™ ืงืฆื•ื‘ ### ื–ืžื ื™ ืงืฆื•ื‘ ื‘ืกื™ืกื™ื™ื ื‘ืจื•ื‘ ื”ืคืจื™ืกื•ืช, ื ื“ืจืฉื™ื ืจืง ืฉื ื™ ื”ืžืฉืชื ื™ื ื”ื‘ืื™ื: | ืžืฉืชื ื” | ื‘ืจื™ืจืช ืžื—ื“ืœ | ืžื˜ืจื” | | ------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `REQUEST_TIMEOUT_MS` | `600000` | ืขืจืš ื‘ืกื™ืก ืžืฉื•ืชืฃ ืœื–ืžืŸ ื”ืงืฆื•ื‘ ืœืชื—ื™ืœืช ืชื’ื•ื‘ื” ืžื”ืฉืจืช ื‘ืžืขืœื” ื”ื–ืจื, ืœื–ืžื ื™ื ื”ืงืฆื•ื‘ื™ื ื”ื ืกืชืจื™ื ืฉืœ Undici, ืœื‘ืงืฉื•ืช ื˜ื‘ื™ืขืช ืืฆื‘ืข ืฉืœ TLS ื•ืœื–ืžื ื™ื ืงืฆื•ื‘ื™ื ืฉืœ ื‘ืงืฉื•ืช/ืชื™ื•ื•ืš ื‘ื’ืฉืจ ื”-API | | `STREAM_IDLE_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `REQUEST_TIMEOUT_MS` | ื”ืžืจื•ื•ื— ื”ืžืจื‘ื™ ื‘ื™ืŸ ืžืงื˜ืขื™ ื–ืจื™ืžื” ืœืคื ื™ ืฉ-OmniRoute ืžื‘ื˜ืœ ืืช ื–ืจื ื”-SSE | ื”ืชืื™ืžื•ืช ืœืื—ื•ืจ ื ืฉืžืจืช: `FETCH_TIMEOUT_MS`,โ€ `API_BRIDGE_PROXY_TIMEOUT_MS` ื•ืžืฉืชื ื™ ื–ืžืŸ ืงืฆื•ื‘ ืื—ืจื™ื ืœื›ืœ ืฉื›ื‘ื” ืžืžืฉื™ื›ื™ื ืœืคืขื•ืœ ื•ื’ื•ื‘ืจื™ื ืขืœ ืขืจืš ื”ื‘ืกื™ืก ื”ืžืฉื•ืชืฃ. ### ื”ืขืจื•ืช ืกืคืฆื™ืคื™ื•ืช ืœืกืคืงื™ื ืขื‘ื•ืจ ืฉืจืชื™ ืžืขืœื” ืชื•ืืžื™ Claude Code (`anthropic-compatible-cc-*`),โ€ OmniRoute ื’ื•ื–ืจ ืืช ื›ื•ืชืจืช ื”-`X-Stainless-Timeout` ื”ื™ื•ืฆืืช ืžื–ืžืŸ ื”ืงืฆื•ื‘ ื”ืžื—ื•ืฉื‘ ืฉืœ ื”ืื—ื–ื•ืจ, ื›ืš ืฉื–ืžื ื™ ื”ืงืฆื•ื‘ ืœืงืจื™ืื” ื‘ืฆื“ ื”ืกืคืง ื ืฉืืจื™ื ืชื•ืืžื™ื ืœื”ื’ื“ืจื•ืช ื”ืกื‘ื™ื‘ื” ืฉืœื›ื. ืขื‘ื•ืจ ืฉืจืชื™ proxy ื”ืคื•ื›ื™ื ืฉืœ ืฆื“ ืฉืœื™ืฉื™ ื”ืชื•ืืžื™ื ืœ-Claude Code,โ€ OmniRoute ืฉื•ืžืจ ืขืœ ืขืจื›ืช ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืžืจื ื™ืช ืฉืœ `anthropic-beta`, ื•ื›ืืฉืจ `Client Cache Control` ื ืฉืืจ ื‘ืžืฆื‘ `Auto`, ืžืขื‘ื™ืจ ืจืง ืกืžื ื™ `cache_control` ืฉืกื•ืคืงื• ืขืœ ื™ื“ื™ ื”ืœืงื•ื—. ื”ืคืขื™ืœื• ืืช ื”ืžืชื’ "Enable redact-thinking beta" ืœื›ืœ ื—ื™ื‘ื•ืจ ืจืง ื›ืืฉืจ ืฉืจืช ื”ืžืขืœื” ื“ื•ืจืฉ ื‘ืžืคื•ืจืฉ ื–ืจืžื™ ื—ืฉื™ื‘ื” ืžื•ืฉื—ืจื™ื ืฉืœ Claude. ### ื“ืจื™ืกื•ืช ืžืชืงื“ืžื•ืช ืฉืœ ื–ืžื ื™ ืงืฆื•ื‘ | ืžืฉืชื ื” | ื‘ืจื™ืจืช ืžื—ื“ืœ | ืžื˜ืจื” | | ---------------------------------------- | ------------------------------------------ | --------------------------------------------------------------- | | `FETCH_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `REQUEST_TIMEOUT_MS` | ื–ืžืŸ ืงืฆื•ื‘ ืœืชื—ื™ืœืช ืชื’ื•ื‘ื” ืžืฉืจืช ื”ืžืขืœื”, ื”ืžืฉืžืฉ ืขื“ ืœืงื‘ืœืช ื›ื•ืชืจื•ืช ื”ืชื’ื•ื‘ื” | | `FETCH_HEADERS_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `FETCH_TIMEOUT_MS` | ืžื’ื‘ืœืช ื”ื–ืžืŸ ืฉืœ Undici ืœืงื‘ืœืช ื›ื•ืชืจื•ืช ืชื’ื•ื‘ื” ืžืฉืจืช ื”ืžืขืœื” | | `FETCH_BODY_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `FETCH_TIMEOUT_MS` | ืžื’ื‘ืœืช ื”ื–ืžืŸ ืฉืœ Undici ื‘ื™ืŸ ืžืงื˜ืขื™ ื’ื•ืฃ ืžืฉืจืช ื”ืžืขืœื” (`0` ืžืฉื‘ื™ืช ืื•ืชื”) | | `FETCH_CONNECT_TIMEOUT_MS` | `30000` | ื–ืžืŸ ืงืฆื•ื‘ ืฉืœ Undici ืœื—ื™ื‘ื•ืจ TCP | | `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | ื–ืžืŸ ืงืฆื•ื‘ ืฉืœ Undici ืœื—ื™ื‘ื•ืจ keep-alive ืœื ืคืขื™ืœ | | `TLS_CLIENT_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `FETCH_TIMEOUT_MS` | ื–ืžืŸ ืงืฆื•ื‘ ืœื‘ืงืฉื•ืช ื˜ื‘ื™ืขืช ืืฆื‘ืข ืฉืœ TLS ื”ืžืชื‘ืฆืขื•ืช ื‘ืืžืฆืขื•ืช `wreq-js` | | `API_BRIDGE_PROXY_TIMEOUT_MS` | ื™ื•ืจืฉ ืืช `REQUEST_TIMEOUT_MS` ืื• `600000` | ื–ืžืŸ ืงืฆื•ื‘ ืœื”ืขื‘ืจืช proxy ืฉืœ `/v1` ืžื™ืฆื™ืืช ื”-API ืœื™ืฆื™ืืช ืœื•ื— ื”ื‘ืงืจื” | | `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `max(API_BRIDGE_PROXY_TIMEOUT_MS, 300000)` | ื–ืžืŸ ืงืฆื•ื‘ ืœื‘ืงืฉื” ื ื›ื ืกืช ื‘ืฉืจืช ื’ืฉืจ ื”-API | | `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | ื–ืžืŸ ืงืฆื•ื‘ ืœื›ื•ืชืจื•ืช ื ื›ื ืกื•ืช ื‘ืฉืจืช ื’ืฉืจ ื”-API | | `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | ื–ืžืŸ ืงืฆื•ื‘ ืœ-keep-alive ื‘ืฉืจืช ื’ืฉืจ ื”-API | | `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | ื–ืžืŸ ืงืฆื•ื‘ ืœื—ื•ืกืจ ืคืขื™ืœื•ืช ืฉืœ socket ื‘ืฉืจืช ื’ืฉืจ ื”-API (`0` ืžืฉื‘ื™ืช ืื•ืชื•) | > **ื”ืขืจื”:** ืขื‘ื•ืจ ื‘ืงืฉื•ืช ื–ื•ืจืžื•ืช, `FETCH_TIMEOUT_MS` ืžื›ืกื” ืจืง ืืช ื”ืงืžืช ื”ื—ื™ื‘ื•ืจ / ื”ื”ืžืชื ื” ืœืชื’ื•ื‘ื” ื”ืจืืฉื•ื ื” ืžืฉืจืช ื”ืžืขืœื”. ืœืื—ืจ ืฉื”ื–ืจื ืคืขื™ืœ, OmniRoute ื™ื‘ื˜ืœ ืื•ืชื• ืจืง ื‘ืžืงืจื” ืฉืœ ืขืฆื™ืจื” ื‘ืคื•ืขืœ (`STREAM_IDLE_TIMEOUT_MS`) ืื• ื—ื•ืกืจ ืคืขื™ืœื•ืช ื‘ื’ื•ืฃ ืœืคื™ Undici (`FETCH_BODY_TIMEOUT_MS`). ### ืชืื™ืžื•ืช ืœืฉืจืช proxy ื”ืคื•ืš ืื ืืชื ืžืจื™ืฆื™ื ืืช OmniRoute ืžืื—ื•ืจื™ Nginx,โ€ Caddy,โ€ Cloudflare ืื• ืฉืจืช proxy ื”ืคื•ืš ืื—ืจ, ื•ื“ืื• ืฉื’ื ื–ืžื ื™ ื”ืงืฆื•ื‘ ืฉืœ ื”-proxy ื’ื‘ื•ื”ื™ื ืžื–ืžื ื™ ื”ืงืฆื•ื‘ ืฉืœ OmniRoute ืœื–ืจื™ืžื”/ืื—ื–ื•ืจ. --- ## ืžืฆื‘ ื™ืฆื™ืื•ืช ืžืคื•ืฆืœื•ืช ื”ืคืขื™ืœื• ืืช ื”-API ื•ืืช ืœื•ื— ื”ื‘ืงืจื” ื‘ื™ืฆื™ืื•ืช ื ืคืจื“ื•ืช ืขื‘ื•ืจ ืชืจื—ื™ืฉื™ื ืžืชืงื“ืžื™ื (ืคืจื•ืงืกื™ ื”ืคื•ืš, ืจืฉืชื•ืช ืงื•ื ื˜ื™ื™ื ืจื™ื): ```bash PORT=20128 DASHBOARD_PORT=20129 omniroute # API: http://localhost:20128/v1 # ืœื•ื— ื”ื‘ืงืจื”: http://localhost:20129 ``` --- ## ืชื‘ื ื™ืช ืขื‘ื•ืจ Void Linuxโ€ (xbps-src) ืžืฉืชืžืฉื™ Void Linux ื™ื›ื•ืœื™ื ืœื‘ื ื•ืช ื—ื‘ื™ืœื” ืžืงื•ืจื™ืช ื‘ืืžืฆืขื•ืช `xbps-src`. ืฉืžืจื• ืืช ื”ื‘ืœื•ืง ื”ื–ื” ื‘ืฉื `srcpkgs/omniroute/template`: ```bash # ืงื•ื‘ืฅ ืชื‘ื ื™ืช ืขื‘ื•ืจ 'omniroute' pkgname=omniroute version=3.8.0 revision=1 hostmakedepends="nodejs python3 make" depends="openssl" short_desc="Universal AI gateway with smart routing for multiple LLM providers" maintainer="zenobit " license="MIT" homepage="https://github.com/diegosouzapw/OmniRoute" distfiles="https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz" # ืฆืจื• ืžื—ื“ืฉ ืืช ืกื›ื•ื ื”ื‘ื™ืงื•ืจืช ืขื‘ื•ืจ ื›ืœ ืžื”ื“ื•ืจื” ื‘ืืžืฆืขื•ืช: # curl -L -o /tmp/omniroute.tar.gz "https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz" && sha256sum /tmp/omniroute.tar.gz checksum=PLACEHOLDER_REGENERATE_PER_RELEASE system_accounts="_omniroute" omniroute_homedir="/var/lib/omniroute" export NODE_ENV=production export npm_config_engine_strict=false export npm_config_loglevel=error export npm_config_fund=false export npm_config_audit=false do_build() { local _gyp_arch case "$XBPS_TARGET_MACHINE" in aarch64*) _gyp_arch=arm64 ;; armv7*|armv6*) _gyp_arch=arm ;; i686*) _gyp_arch=ia32 ;; *) _gyp_arch=x64 ;; esac NODE_ENV=development npm ci --ignore-scripts npm run build cp -r .next/static .next/standalone/.next/static [ -d public ] && cp -r public .next/standalone/public || true local _node_gyp=/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js (cd node_modules/better-sqlite3 && node "$_node_gyp" rebuild --arch="$_gyp_arch") local _bs3_release=.next/standalone/node_modules/better-sqlite3/build/Release mkdir -p "$_bs3_release" cp node_modules/better-sqlite3/build/Release/better_sqlite3.node "$_bs3_release/" rm -rf .next/standalone/node_modules/@img for _mod in pino-abstract-transport split2 process-warning; do cp -r "node_modules/$_mod" .next/standalone/node_modules/ done } do_check() { npm run test:unit } do_install() { vmkdir usr/lib/omniroute/.next vcopy .next/standalone/. usr/lib/omniroute/.next/standalone for _d in \ .next/standalone/.next/server/app/dashboard \ .next/standalone/.next/server/app/dashboard/settings \ .next/standalone/.next/server/app/dashboard/providers; do touch "${DESTDIR}/usr/lib/omniroute/${_d}/.keep" done cat > "${WRKDIR}/omniroute" <<'EOF' #!/bin/sh export PORT="${PORT:-20128}" export DATA_DIR="${DATA_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/omniroute}" export APP_LOG_TO_FILE="${APP_LOG_TO_FILE:-false}" mkdir -p "${DATA_DIR}" exec node /usr/lib/omniroute/.next/standalone/server.js "$@" EOF vbin "${WRKDIR}/omniroute" } post_install() { vlicense LICENSE } ``` --- ## ื”ืกืจืช ื”ืชืงื ื” | ืคืงื•ื“ื” | ืคืขื•ืœื” | | ------------------------ | ---------------------------------------------------------------------------------- | | `npm run uninstall` | ืžืกื™ืจื” ืืช ื™ื™ืฉื•ื ื”ืžืขืจื›ืช, ืืš **ืฉื•ืžืจืช ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ื•ื”ืชืฆื•ืจื•ืช ืฉืœื›ื** ื‘-`~/.omniroute`. | | `npm run uninstall:full` | ืžืกื™ืจื” ืืช ื”ื™ื™ืฉื•ื ื•ื’ื **ืžื•ื—ืงืช ืœืฆืžื™ืชื•ืช ืืช ื›ืœ ื”ืชืฆื•ืจื•ืช, ื”ืžืคืชื—ื•ืช ื•ืžืกื“ื™ ื”ื ืชื•ื ื™ื**. | > ืœื”ื•ืจืื•ืช ืžืคื•ืจื˜ื•ืช ืœื”ืกืจืช ื”ืชืงื ื” ื‘ื›ืœ ื”ืฉื™ื˜ื•ืช, ืจืื• [UNINSTALL.md](./UNINSTALL.md).