# Remote Mode (Հայերեն) 🌐 **Languages:** 🇺🇸 [English](../../../../guides/REMOTE-MODE.md) · 🇪🇹 [am](../../../am/docs/guides/REMOTE-MODE.md) · 🇸🇦 [ar](../../../ar/docs/guides/REMOTE-MODE.md) · 🇦🇿 [az](../../../az/docs/guides/REMOTE-MODE.md) · 🇧🇬 [bg](../../../bg/docs/guides/REMOTE-MODE.md) · 🇧🇩 [bn](../../../bn/docs/guides/REMOTE-MODE.md) · 🇧🇦 [bs](../../../bs/docs/guides/REMOTE-MODE.md) · 🇨🇿 [cs](../../../cs/docs/guides/REMOTE-MODE.md) · 🇩🇰 [da](../../../da/docs/guides/REMOTE-MODE.md) · 🇩🇪 [de](../../../de/docs/guides/REMOTE-MODE.md) · 🇬🇷 [el](../../../el/docs/guides/REMOTE-MODE.md) · 🇪🇸 [es](../../../es/docs/guides/REMOTE-MODE.md) · 🇪🇪 [et](../../../et/docs/guides/REMOTE-MODE.md) · 🇮🇷 [fa](../../../fa/docs/guides/REMOTE-MODE.md) · 🇫🇮 [fi](../../../fi/docs/guides/REMOTE-MODE.md) · 🇫🇷 [fr](../../../fr/docs/guides/REMOTE-MODE.md) · 🇮🇪 [ga](../../../ga/docs/guides/REMOTE-MODE.md) · 🇮🇳 [gu](../../../gu/docs/guides/REMOTE-MODE.md) · 🇳🇬 [ha](../../../ha/docs/guides/REMOTE-MODE.md) · 🇮🇱 [he](../../../he/docs/guides/REMOTE-MODE.md) · 🇮🇳 [hi](../../../hi/docs/guides/REMOTE-MODE.md) · 🇭🇷 [hr](../../../hr/docs/guides/REMOTE-MODE.md) · 🇭🇺 [hu](../../../hu/docs/guides/REMOTE-MODE.md) · 🇮🇩 [id](../../../id/docs/guides/REMOTE-MODE.md) · 🇳🇬 [ig](../../../ig/docs/guides/REMOTE-MODE.md) · 🇮🇹 [it](../../../it/docs/guides/REMOTE-MODE.md) · 🇯🇵 [ja](../../../ja/docs/guides/REMOTE-MODE.md) · 🇬🇪 [ka](../../../ka/docs/guides/REMOTE-MODE.md) · 🇰🇭 [km](../../../km/docs/guides/REMOTE-MODE.md) · 🇮🇳 [kn](../../../kn/docs/guides/REMOTE-MODE.md) · 🇰🇷 [ko](../../../ko/docs/guides/REMOTE-MODE.md) · 🇱🇹 [lt](../../../lt/docs/guides/REMOTE-MODE.md) · 🇱🇻 [lv](../../../lv/docs/guides/REMOTE-MODE.md) · 🇮🇳 [ml](../../../ml/docs/guides/REMOTE-MODE.md) · 🇮🇳 [mr](../../../mr/docs/guides/REMOTE-MODE.md) · 🇲🇾 [ms](../../../ms/docs/guides/REMOTE-MODE.md) · 🇲🇹 [mt](../../../mt/docs/guides/REMOTE-MODE.md) · 🇲🇲 [my](../../../my/docs/guides/REMOTE-MODE.md) · 🇳🇵 [ne](../../../ne/docs/guides/REMOTE-MODE.md) · 🇳🇱 [nl](../../../nl/docs/guides/REMOTE-MODE.md) · 🇳🇴 [no](../../../no/docs/guides/REMOTE-MODE.md) · 🇮🇳 [or](../../../or/docs/guides/REMOTE-MODE.md) · 🇮🇳 [pa](../../../pa/docs/guides/REMOTE-MODE.md) · 🇵🇭 [phi](../../../phi/docs/guides/REMOTE-MODE.md) · 🇵🇱 [pl](../../../pl/docs/guides/REMOTE-MODE.md) · 🇵🇹 [pt](../../../pt/docs/guides/REMOTE-MODE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/REMOTE-MODE.md) · 🇷🇴 [ro](../../../ro/docs/guides/REMOTE-MODE.md) · 🇷🇺 [ru](../../../ru/docs/guides/REMOTE-MODE.md) · 🇱🇰 [si](../../../si/docs/guides/REMOTE-MODE.md) · 🇸🇰 [sk](../../../sk/docs/guides/REMOTE-MODE.md) · 🇸🇮 [sl](../../../sl/docs/guides/REMOTE-MODE.md) · 🇷🇸 [sr](../../../sr/docs/guides/REMOTE-MODE.md) · 🇸🇪 [sv](../../../sv/docs/guides/REMOTE-MODE.md) · 🇰🇪 [sw](../../../sw/docs/guides/REMOTE-MODE.md) · 🇮🇳 [ta](../../../ta/docs/guides/REMOTE-MODE.md) · 🇮🇳 [te](../../../te/docs/guides/REMOTE-MODE.md) · 🇹🇭 [th](../../../th/docs/guides/REMOTE-MODE.md) · 🇹🇷 [tr](../../../tr/docs/guides/REMOTE-MODE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/REMOTE-MODE.md) · 🇵🇰 [ur](../../../ur/docs/guides/REMOTE-MODE.md) · 🇺🇿 [uz](../../../uz/docs/guides/REMOTE-MODE.md) · 🇻🇳 [vi](../../../vi/docs/guides/REMOTE-MODE.md) · 🇳🇬 [yo](../../../yo/docs/guides/REMOTE-MODE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/REMOTE-MODE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/guides/REMOTE-MODE.md) --- Գործարկեք `omniroute` CLI-ն ձեր նոթբուքում, մինչդեռ OmniRoute-ն աշխատում է մեկ այլ տեղում (VPS-ում, տնային սերվերում կամ ձեր Tailnet-ի մեկ այլ մեքենայում)։ Մեկ անգամ մուտք եք գործում `omniroute connect`-ի միջոցով, և դրանից հետո CLI-ի **բոլոր** հրամաններն ուղղվում են այդ հեռավար սերվերին՝ նույն հրամանները, նույն ելքը, պարզապես կատարված հեռավար սերվերի նկատմամբ։ Երկրորդ գործիք տեղադրելու կարիք չկա․ հեռավար ռեժիմը սովորական `omniroute` CLI-ն է՝ գործողության տիրույթով սահմանափակված **մուտքի տոկենների** հետ միասին։ ```bash npm install -g omniroute # սովորական CLI-ն omniroute connect 192.168.0.15 # մուտք (գաղտնաբառ → գործողության տիրույթով տոկեն) omniroute models list # ← այժմ ցուցադրում է ՀԵՌԱՎԱՐ սերվերի մոդելները omniroute configure codex # ← հեռավար կատալոգից ստեղծում է տեղային Codex պրոֆիլ ``` --- ## Ինչպես է այն աշխատում ``` ձեր նոթբուքը հեռավար OmniRoute (VPS) ┌────────────────────┐ ┌───────────────────────────────┐ │ omniroute CLI │ POST /api/cli/connect (գաղտնաբառ → տոկեն) │ │ համատեքստ՝ vps │ ───────────────► │ ստեղծում է գործողության տիրույթով│ │ baseUrl, token │ Authorization: Bearer oma_live_… │ │ │ ───────────────► │ մուտքի տոկեն, յուրաքանչյուր կառավարման│ │ կարգավորումները │ ◄─────────────── │ երթուղին ստուգվում է ըստ տոկենի տիրույթի│ │ գրում է ՏԵՂԱՅԻՆ │ └───────────────────────────────┘ └────────────────────┘ ``` - **Համատեքստերը** պահում են մեկական սերվեր (`~/.omniroute/config.json`, `chmod 600`)։ `omniroute contexts use `-ը փոխում է ակտիվ սերվերը․ `default`-ը տեղայինն է։ - **Մուտքի տոկենները** (`oma_live_…`) թույլատրում են կառավարման հրամանները։ Դրանք տարբերվում են inference API բանալիներից (`sk-…`, որոնք օգտագործվում են `/v1/chat/completions`-ի համար)։ - Սերվերի կողմում պահվում է միայն տոկենի SHA-256 հեշը։ Բաց տեքստով արժեքը ցուցադրվում է **մեկ անգամ**՝ ստեղծման պահին։ --- ## Միացում ### Կառավարման գաղտնաբառով (սկզբնական կարգավորում) ```bash omniroute connect 192.168.0.15 # Կառավարման գաղտնաբառը http://192.168.0.15:20128-ի համար՝ ******** # ✔ Միացված է http://192.168.0.15:20128-ին — համատեքստ՝ '192.168.0.15' (գործողության տիրույթ՝ admin) ``` Գաղտնաբառով հոսքը լռելյայն ստեղծում է **admin** տոկեն (քանի որ ունեք գաղտնաբառը, արդեն իսկ ունեք լիարժեք վերահսկողություն)։ Սահմանափակեք գործողության տիրույթը `--scope`-ով՝ ```bash omniroute connect 192.168.0.15 --scope write ``` Ընտրանքներ՝ `--port

` (երբ հոսթում պորտ նշված չէ), `--name ` (համատեքստի անուն), `--scope read|write|admin`։ Ամբողջական URL-ն օգտագործվում է անփոփոխ՝ `omniroute connect https://omni.example.com`։ ### Նախապես ստեղծված տոկենով Կառավարման վահանակում (կամ `omniroute tokens create`-ով) ստեղծեք գործողության սահմանափակ տիրույթով տոկեն և տեղադրեք այն՝ առանց գաղտնաբառի անհրաժեշտության․ ```bash omniroute connect 192.168.0.15 --key oma_live_xxxxxxxx ``` CLI-ն վավերացնում է այն `GET /api/cli/whoami`-ի միջոցով և պահպանում որպես ակտիվ համատեքստ։ --- ## Գործողության տիրույթներ Երեք հիերարխիկ մակարդակ (`admin ⊃ write ⊃ read`)․ | Գործողության տիրույթ | Հնարավորություններ | | -------------------- | -------------------------------------------------------------------------------------------------------- | | `read` | ցուցակագրում/դիտում՝ `models list`, `providers status`, `logs`, `usage`, `cost` | | `write` | read **+** կարգավորում/կիրառում՝ `setup-codex`, `keys add`, `config set`, համակցություններ | | `admin` | write **+** կառավարում՝ `tokens` CRUD, մատակարարների ավելացում, ծառայություններ, քաղաքականություն, oauth | Սերվերը որոշում է յուրաքանչյուր երթուղու համար պահանջվող գործողության տիրույթը՝ ըստ HTTP մեթոդի (`GET`→read, փոփոխություններ→write), ինչպես նաև զգայուն մակերեսների համար նախատեսված admin թույլատրված ցանկի (`/api/cli/tokens`, `/api/providers` փոփոխություններ, `/api/oauth`, `/api/services`, …)։ Անբավարար գործողության տիրույթ ունեցող տոկենը ստանում է `403`՝ հստակ հաղորդագրությամբ։ > Գործընթացներ գործարկող երթուղիները (`/api/services/*`, `/api/mcp/*`, …) մնում են > **միայն loopback-ի համար**․ հեռավար տոկենը երբեք չի կարող հասանելիություն ստանալ դրանց՝ անկախ գործողության տիրույթից։ --- ## Antigravity-ի միացումը հեռակա տեղադրման դեպքում Antigravity-ն օգտագործում է Google-ի firstparty/nativeapp համաձայնության էկրանը։ Google-ը տրամադրում է թույլտվության կոդը միայն այն դեպքում, երբ **loopback վերահղումը** (`http://127.0.0.1:/callback`) **հասանելի է մուտքը հաստատող դիտարկիչից**։ Հեռակա VPS-ում տեղադրման դեպքում այդ loopback-ը գտնվում է սերվերի վրա, այլ ոչ թե ձեր համակարգչում, ուստի համաձայնության էկրանը **ընդմիշտ կախվում է և երբեք կոդ չի տրամադրում**․ սովորական «տեղադրեք հետադարձ կանչի URL-ը» պահուստային տարբերակի դեպքում տեղադրելու ոչինչ չկա։ (Սա Google-ի կողմից սահմանված սահմանափակում է․ նույն կախումը տեղի է ունենում ներկառուցված Antigravity աշխատասեղանի հաճախորդն օգտագործող ցանկացած proxy-ում, ոչ միայն OmniRoute-ում։) Վահանակը հայտնաբերում է դա նախքան ձեր խափանվելը․ ոչ localhost հասցեից **Providers → Antigravity → Connect** բացելիս «պատճենեք հետադարձ կանչի URL-ը» ընդհանուր ծանուցումը փոխարինվում է ստորև ներկայացված երկու լուծումներով, որոնցից յուրաքանչյուրում ձեր host-ը և port-ն արդեն լրացված են։ (LAN հասցեն նույնպես հաշվի է առնվում․ այս հետադարձ կանչի տեսանկյունից `192.168.x.x`-ը localhost չէ։) Հեռակա OmniRoute-ին Antigravity-ն միացնելու երկու աջակցվող եղանակ կա։ ### Տարբերակ A — տեղային մուտքի օգնական (խորհուրդ է տրվում) OAuth-ը գործարկեք **ձեր սեփական համակարգչում**, որտեղ `127.0.0.1`-ը հասանելի է։ Օգնականն անմիջապես հաղորդակցվում է Google-ի հետ, ուստի համաձայնության գործընթացն ավարտվում է այնտեղ, որտեղ վահանակի տարբերակը չի կարող այն ավարտել։ **Եթե արդեն միացած եք** (`omniroute connect `), պատճենելու ոչինչ չկա․ օգնականը հավատարմագիրը ձեզ համար փոխանցում է այդ տեղադրմանը։ ```bash # Ձեր ՏԵՂԱՅԻՆ համակարգչում (պահանջվում են Node.js և դիտարկիչ)․ omniroute connect 192.168.0.15 # մեկ անգամ՝ ստեղծում է ադմինիստրատորի տիրույթով համատեքստային token npx omniroute login antigravity # ↳ բացում է Google-ի համաձայնության էջը, ստանում է հետադարձ կանչը տեղային loopback port-ում, # փոխանակում է այն և POST հարցմամբ հավատարմագիրն ուղարկում ակտիվ համատեքստին․ # # Antigravity-ն միացված է http://192.168.0.15:20128 հասցեում (միացում՝ abc123)։ # Տեղադրելու ոչինչ չկա․ կարող եք փակել այս տերմինալը։ ``` Ուղարկումն ավտոմատ կերպով կատարվում է, երբ ակտիվ համատեքստը մատնանշում է մեկ այլ մեքենա։ Այն հարկադրաբար միացրեք կամ անջատեք `--push` / `--no-push` տարբերակներով, կամ թիրախավորեք որոշակի համատեքստ՝ օգտագործելով `--context `։ **Եթե ձեր համակարգիչը չի կարող հասնել VPS-ին** (firewall-ով արգելափակված է, SSH չկա, աշխատասեղանը մեկուսացված է ցանցից), օգնականը միևնույն է աշխատում է․ նրան իրականում _անհրաժեշտ է_ միայն Google-ը։ Օգտագործեք `--no-push`, կամ պարզապես թույլ տվեք, որ ուղարկումը ձախողվի․ արդեն ավարտված թույլտվությունը դեն նետելու փոխարեն այն կանցնի blob-ը տպելու պահուստային տարբերակին։ ```bash npx omniroute login antigravity --no-push # omniroute-cred-v1.eyJ2IjoxLCJ... ``` Այնուհետև **հեռակա** վահանակում անցեք **Providers → Antigravity → Connect** և `omniroute-cred-v1.…` blob-ը տեղադրեք **Step 2** դաշտում (այն ընդունում է թե՛ հետադարձ կանչի URL, թե՛ հավատարմագրի blob)։ OmniRoute-ը վերծանում է այն, սերվերի կողմից գործարկում է Cloud Code-ի սկզբնական կարգավորումը և պահպանում միացումը։ > Blob-ը պարունակում է refresh token․ վերաբերվեք դրան ինչպես գաղտնաբառի։ Ուղարկման > եղանակի դեպքում այն մեկ անգամ ուղարկվում է ձեր համատեքստի վավերացված կապով, > իսկ տեղադրման եղանակի դեպքում՝ ձեր վահանակի կապով։ Երկու դեպքում էլ այն > պահվում է կոդավորված վիճակում, իսկ հաջող ուղարկման դեպքում երբեք չի տպվում > ձեր տերմինալում։ Դրոշներ՝ `--no-browser` (ինքնաշխատ բացելու փոխարեն տպել URL-ը), `--port ` (ամրագրել loopback port-ը), `--timeout `, `--push` / `--no-push` (վերասահմանել ավտոմատ փոխանցումը), `--context ` (թիրախավորել որոշակի համատեքստ)։ ### Տարբերակ B — SSH տեղային փոխանցման թունել Եթե ունեք SSH հասանելիություն դեպի VPS, փոխանցեք վահանակի port-ը, որպեսզի loopback հետադարձ կանչը թունելով վերադառնա սերվեր․ ```bash # Ձեր ՏԵՂԱՅԻՆ համակարգչում․ ssh -L 20128:127.0.0.1:20128 user@your-vps # ապա ձեր ՏԵՂԱՅԻՆ դիտարկիչում բացեք http://localhost:20128 և սովորական եղանակով միացրեք Antigravity-ն # այժմ 127.0.0.1:20128/callback վերահղումը SSH-ի միջոցով հասնում է VPS-ին։ ``` Քանի որ վահանակին հասնում եք որպես `localhost:20128`, Google-ի համաձայնության գործընթացն ավարտվում է, իսկ հետադարձ կանչը նույն թունելով փոխանցվում է սերվերին․ blob անհրաժեշտ չէ։ Թունելը բաց պահեք, մինչև միացումը ցուցադրվի որպես ակտիվ։ Ի տարբերություն ստորև նշված հաստատուն loopback ունեցող մատակարարների՝ այստեղ **մեկ փոխանցումը բավարար է**․ Antigravity-ի հետադարձ կանչն օգտագործում է հենց վահանակի port-ը, ուստի կարիք չկա թունելավորել մատակարարին հատուկ երկրորդ port։ > Լիովին headless այլընտրանքի համար (առանց օգնականի և առանց թունելի) կարգավորեք > ձեր **սեփական** Google OAuth վեբ հավատարմագրերը և հանրային հիմնական URL-ը․ > տեսեք մատակարարի OAuth միջավայրի փոփոխականները։ Վերոնշյալ երկու տարբերակները > Google-ի որևէ լրացուցիչ կարգավորում չեն պահանջում։ --- ## Codex / Grok-ի միացումը հեռակա տեղադրմանը (ֆիքսված loopback-ով մատակարարներ) Codex-ը, xAI-ը (`xai-oauth`) և Grok CLI-ը (`grok-cli`) իրենց վերին մակարդակի OAuth հավելվածում գրանցում են **ֆիքսված** loopback `redirect_uri`։ OmniRoute-ը չի կարող փոխել այն․ մատակարարը զննարկիչը միշտ վերահղում է նույն՝ կոդում ամրագրված հասցեին. | Մատակարար | Ֆիքսված callback-ը, որին վերահղում է մատակարարը | | ----------- | ----------------------------------------------- | | `codex` | `http://localhost:1455/auth/callback` | | `xai-oauth` | `http://127.0.0.1:56121/callback` | | `grok-cli` | `http://127.0.0.1:56122/callback` | Այստեղ `localhost`-ը նշանակում է **այն մեքենան, որի վրա աշխատում է զննարկիչը**, մինչդեռ OmniRoute-ի PKCE callback սերվերը լսում է **սերվերի** loopback ինտերֆեյսում։ Բացեք կառավարման վահանակը LAN հասցեով, օրինակ՝ `http://192.168.0.15:20128`, և դրանք երբեք չեն կապվի․ նույնականացման կոդը փոխանցվում է ձեր նոթբուքի սեփական `localhost:1455` հասցեին, որտեղ ոչինչ չի լսում, և մատակարարի մուտքի գործընթացը ձախողվում է՝ առանց սխալ ցուցադրելու։ Կառավարման վահանակը սա հայտնաբերում է մինչև բացվող պատուհանը բացելը և, մուտքի գործընթացին աննկատ ձախողվելու հնարավորություն տալու փոխարեն, ցուցադրում է թունելի հրամանը (#8046)։ ### Ուղղում — վերահասցեավորեք **երկու** պորտերն էլ ```bash # ԶՆՆԱՐԿԻՉՆ աշխատեցնող մեքենայի վրա. ssh -L 20128:127.0.0.1:20128 -L 1455:127.0.0.1:1455 @192.168.0.15 # այնուհետև բացեք http://localhost:20128 հասցեն և այնտեղից միացրեք Codex-ը ``` Անհրաժեշտ է երկու վերահասցեավորում, և միայն մեկի վերահասցեավորումը նույնպես ձախողվում է. - **`20128`**-ը (կառավարման վահանակի պորտը) origin-ը դարձնում է իսկապես տեղային localhost, ինչի շնորհիվ OmniRoute-ն ընդհանրապես գործարկում է PKCE callback սերվերը․ LAN origin-ը երբեք չի հասնում այդ ճյուղին։ - **`1455`**-ը (մատակարարի ֆիքսված callback պորտը) այն հասցեն է, ուր զննարկիչը հետ է վերահղվում․ այն պետք է թունելի միջոցով հասնի սերվերի loopback-ին։ xAI-ը կամ Grok CLI-ը միացնելիս `1455`-ը փոխարինեք `56121`/`56122`-ով, իսկ `20128`-ը՝ ձեր կառավարման վահանակի իրական պորտով։ Թունելը բաց պահեք, մինչև կապը ցուցադրվի որպես ակտիվ։ > **SSH հասանելիություն չունե՞ք։** Codex-ը և Grok CLI-ը նաև ընդունում են տեղադրված token՝ միացման երկխոսության պատուհանի **Paste API > Key** / **Import auth.json** ներդիրի միջոցով։ Այդ ուղին loopback > callback չունի, ուստի աշխատում է ցանկացած origin-ից։ Codex-ը նաև ընդունում է պարզապես access > token կամ `~/.codex/auth.json` սեսիայի blob։ --- ## Թոքենների կառավարում ```bash omniroute tokens create --name "laptop" --scope write [--expires 30] # ↳ արտածում է գաղտնիքը ՄԵԿ անգամ — պատճենեք այն հիմա omniroute tokens list # մասկավորված՝ id, name, scope, prefix, status, expiry omniroute tokens revoke # անմիջապես չեղարկել omniroute tokens scopes # բացատրել երեք scope-ները ``` `tokens` հրամանները պահանջում են **admin** հավատարմագիր։ Թոքենները կարող եք կառավարել նաև վահանակում՝ **Settings → Access Tokens**-ում (ստեղծել, չեղարկել, պատճենել մեկ անգամ)։ Token-ը երբեք չի կարող թողարկվել ավելի մեծ արտոնություններով, քան ունի դրա ստեղծողը։ `admin` token-ը կարող է ստեղծվել միայն օպերատորի կողմից՝ վահանակի սեսիայով, սերվերի վրա գտնվող տեղական CLI-ով կամ `omniroute connect`-ով՝ գաղտնաբառով։ Մեքենայական հավատարմագրերը (`admin` access token, կամ `manage`/`admin` scope ունեցող API բանալի) կարող են թողարկել միայն `write` և `read` token-ներ. եթե դրանք խնդրեն `--scope admin`, վերադարձվում է `403`։ Մուտքի անջատումը չի բացում թոքենների թողարկումը. ցանկացած scope-ի access token-ը այն հավատարմագիրն է, որ ընդունում են միշտ նույնականացվող երթուղիները, ուստի անանուն կանչը ստանում է `401` ցանկացած scope-ով։ --- ## CLI-ի կարգավորում հեռավոր կատալոգից `omniroute configure`-ը կարդում է **ակտիվ սերվերի** կենդանի մոդելների կատալոգը և գրում կարգավորում **ձեր** մեքենայի վրա։ ```bash omniroute configure codex # Providers: glm, kmc, ollamacloud, opencode-go, … # Provider: glm # Model id: glm/glm-5.2 # ✔ Wrote ~/.codex/glm52.config.toml # Use it: codex --profile glm52 # ոչ ինտերակտիվ omniroute configure codex --provider glm --model glm/glm-5.2 --name glm52 # պահել հաճախ օգտագործվող մոդելը ինտերակտիվ ընտրիչի վերևում omniroute configure codex --provider glm --model glm/glm-5.2 --favorite --yes ``` Ընտրիչը տեղական `model-preferences.json` ֆայլում պահում է միայն մոդելների ID-ներ (երբեք URL-ներ կամ հավատարմագրեր), որոնք սահմանափակված են ըստ context-ի և CLI թիրախի։ Նախընտրելիները ցուցադրվում են մինչև վերջին ընտրությունները. օգտագործեք `--unfavorite`՝ ընտրված մոդելը այդ context/թիրախի ցանկից հեռացնելու համար։ Գրված պրոֆիլը inference բանալին հղում է անում միջավայրի փոփոխականով (`OMNIROUTE_API_KEY`), ուստի գաղտնիքը երբեք չի գրվում սկավառակի վրա։ Codex-ի միանգամյա հիմնական կարգավորման համար (`[model_providers.omniroute]` բլոկը) տե՛ս [CODEX-CLI-CONFIGURATION.md](./CODEX-CLI-CONFIGURATION.md)։ ### CLI-ի գործարկում հեռավորի դեմ (առանց կարգավորման ֆայլի գրման) `omniroute run `-ը նույնպես հաշվի է առնում ակտիվ context-ը. հեռավոր բազային URL-ը և context-ի հավատարմագիրը ներարկվում են միայն գործարկված պրոցեսի մեջ։ ```bash omniroute connect 192.168.0.15 omniroute run claude --model openai/gpt-5.4 # Claude Code → հեռավոր omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "hello" omniroute run opencode --model glm/glm-5.2 -- run "reply OK" # Նախադիտել, թե ճշգրիտ ինչ կգործարկվի (միայն env ԱՆՈՒՆՆԵՐԸ, երբեք արժեքները)՝ omniroute run codex --dry-run --json ``` Թիրախներ՝ `claude`, `codex`, `aider`, `goose`, `opencode`, `qwen`, `gemini` (մեկ աղբյուր՝ `bin/cli/cli-manifest.mjs`)։ Qwen-ը և Gemini-ն աշխատում են ժամանակավոր, մեկուսացված home-ով, որը հեռացվում է ելքի ժամանակ, որպեսզի գործարկումը երբեք չդիպչի ձեր անձնական գործիքների կարգավորմանը և չթափանցի դրա մեջ։ ### Յուրաքանչյուր CLI-ի կարգավորման հրամաններ Յուրաքանչյուր աջակցվող CLI ունի remote-ին տեղյակ կարգավորման հրաման (բոլորը հաշվի են առնում ակտիվ context-ը կամ `--remote --api-key `)․ | CLI | Հրաման | Ինչ է գրում | | ----------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Codex | `omniroute setup-codex` | `~/.codex/.config.toml` պրոֆիլներ (յուրաքանչյուր մոդելի համար) | | Claude Code | `omniroute setup-claude` | `~/.claude/profiles//settings.json` (յուրաքանչյուր մոդելի համար) | | OpenCode | `omniroute setup-opencode` | `~/.config/opencode/opencode.json` — `omniroute` provider-ը openai-համատեղելի, կատալոգի բոլոր մոդելներով (գործարկեք `opencode -m omniroute/`) | | Cline | `omniroute setup-cline` | `~/.cline/data/{globalState,secrets}.json` (CLI ռեժիմ) + տպում է VS Code ընդլայնման կարգավորումները՝ տեղադրելու համար (OpenAI-compatible, Base URL **առանց** `/v1`) | | Kilo Code | `omniroute setup-kilo` | `~/.local/share/kilo/auth.json` (CLI) + VS Code `kilocode.*` կարգավորումներ — OpenAI-compatible, Base URL **`/v1`-ով** | | Continue | `omniroute setup-continue` | `~/.continue/config.yaml` (VS Code/JetBrains + `cn` CLI) — `provider: openai`, `apiBase` **`/v1`-ով**, բանալին `${{ secrets.OMNIROUTE_API_KEY }}`-ով | | Cursor | `omniroute setup-cursor` | տպում է քայլերը հավելվածում (Settings → Models → Override OpenAI Base URL **`/v1`-ով** + բանալի + մոդել)։ Cursor-ի կարգավորումը անթափանց SQLite է — միայն chat պանելի համար | | Roo Code | `omniroute setup-roo` | գրում է Roo ներմուծման JSON (`~/.omniroute/roo-settings.json`) + սահմանում է `roo-cline.autoImportSettingsPath` + տպում է UI քայլերը (OpenAI-compatible, Base URL **`/v1`-ով**) | | Crush | `omniroute setup-crush` | `~/.config/crush/crush.json` — `openai-compat` provider, `base_url` **`/v1`-ով**, բանալին `$OMNIROUTE_API_KEY`-ի միջոցով | | Zed | `omniroute setup-zed` | `~/.config/zed/settings.json` — `language_models.openai_compatible.omniroute`, `api_url` **`/v1`-ով**, բանալին Zed-ը կարդում է `$OMNIROUTE_API_KEY`-ից (երբեք չի գրվում) | | Goose | `omniroute setup-goose` | `~/.config/goose/config.yaml` (`GOOSE_PROVIDER=openai` + `OPENAI_HOST` **առանց** `/v1`-ի + `GOOSE_MODEL`) + env recipe | | Aider | `omniroute setup-aider` | `~/.aider.conf.yml` (`openai-api-base` **առանց** `/v1`-ի + `model: openai/`) + env recipe (`aider --message --yes`) | | Qwen Code | `omniroute setup-qwen` | `~/.qwen/settings.json` V4 `modelProviders.openai` գրառում + `OMNIROUTE_API_KEY` `~/.qwen/.env`-ում | ```bash # OpenCode (openai-համատեղելի provider, կատալոգի բոլոր մոդելները, հեռավոր VPS) omniroute setup-opencode --remote http://192.168.0.15:20128 --api-key oma_live_xxx omniroute setup-opencode --only glm,kimi # պահել միայն համապատասխան մոդելները opencode -m omniroute/glm/glm-5.2 "..." # նախ արտահանել OMNIROUTE_API_KEY ``` > OpenCode-ն ունի նաև ավելի հարուստ **plugin** ինտեգրում. `omniroute setup opencode`-ը > (արդեն remote-ին տեղյակ՝ `--remote`-ի միջոցով) տեղադրում է `@omniroute/opencode-plugin`-ը։ > `setup-opencode`-ը openai-համատեղելի թեթև այլընտրանքն է։ API բանալին հղում է արվում > `{env:OMNIROUTE_API_KEY}`-ով — երբեք չի գրվում սկավառակի վրա։ > > OpenCode v2-ի դեպքում օգտագործեք `@omniroute/opencode-plugin-v2`-ը. նույն կատալոգը, այլ > loader պայմանագիր։ Այն բանալին կարդում է OpenCode-ի սեփական հավատարմագրերի պահոցից, երբ > ինտեգրումը միացված է, ուստի հեռավոր gateway-ին `opencode.json`-ում բանալի ընդհանրապես պետք չէ։ --- ## Կոնտեքստների կառավարում (անցում սերվերների միջև) **Կոնտեքստը** պահպանված սերվեր է (baseUrl + credential + scope): `omniroute connect` հրամանը ստեղծում է մեկը և դարձնում այն ակտիվ. այսուհետ յուրաքանչյուր հրաման ուղղված է դրան։ Կառավարեք և անցում կատարեք դրանց միջև `omniroute contexts` հրամանով. ```bash omniroute contexts list # բոլոր կոնտեքստները; ակտիվը նշված է ●-ով omniroute contexts current # ակտիվ սերվերը, աուտենտիֆիկացիայի կարգավիճակը, scope-ը ``` ```text | Name | Base URL | Auth | Scope | Description ● | vps | http://100.67.86.91:20128 | token | admin | Հեռավոր OmniRoute (…) | default | http://localhost:20128 | ✗ | | ``` **Փոխել սերվերները** — յուրաքանչյուր հաջորդ հրաման հետևում է ակտիվ կոնտեքստին. ```bash omniroute contexts use vps # → բոլոր հրամաններն այժմ ուղղված են հեռավոր VPS-ին omniroute tokens list # (աշխատում է VPS-ի դեմ) omniroute contexts use default # → վերադարձ դեպի localhost omniroute tokens list # (աշխատում է տեղական սերվերի դեմ) ``` **Ձեռքով ավելացնել կոնտեքստ** (`connect`-ի փոխարեն), ստուգել կամ վերանվանել. ```bash omniroute contexts add staging --url https://staging.example.com:20128 \ --access-token oma_live_xxxx --scope write --description "staging box" omniroute contexts show staging # մեկ կոնտեքստի ամբողջական մանրամասները omniroute contexts rename staging stg ``` **Հեռացնել կոնտեքստ** — հարցնում է հաստատում. փոխանցեք `--yes`՝ այն բաց թողնելու համար (պահանջվում է սկրիպտների / ոչ ինտերակտիվ shell-երի համար, որոնք այլապես ապահով կերպով մերժում են). ```bash omniroute contexts remove stg --yes ``` > `default` (localhost) հնարավոր չէ հեռացնել։ Ակտիվ կոնտեքստը հեռացնելիս համակարգը վերադառնում է `default`։ Հուշում. կոնտեքստը հեռացնելը միայն ջնջում է **տեղական** պահպանված հավատարմագրերը. չեղարկեք թոքենը սերվերի վրա `omniroute tokens revoke ` հրամանով՝ մուտքն իրականում անջատելու համար։ **Արտահանել / ներմուծել** կոնտեքստներ (օրինակ՝ դրանք մեքենաների միջև տեղափոխելու համար)։ Արտահանումները լռելյայն բաց են թողնում հավատարմագրերը, ներառյալ ֆայլի պահուստի միջոցով պահպանված հավատարմագրերը։ Օգտագործեք `--include-secrets` հստակորեն, երբ անհրաժեշտ է շարժական, հավատարմագրեր պարունակող կրկնօրինակ. ```bash omniroute contexts export --out contexts.json # խմբագրված; լռելյայն նպատակակետ՝ stdout omniroute contexts export --include-secrets --out private-contexts.json omniroute contexts import contexts.json # վերագրել; --merge՝ առկա տվյալները պահպանելու համար omniroute contexts migrate --yes # տեղափոխել հին պարզ տեքստային թոքենները keychain ``` `--include-secrets`-ը լուծում է keychain-ի հղումները արտահանելուց առաջ և ձախողվում է, եթե որևէ հղված հավատարմագիր հնարավոր չէ կարդալ։ `--no-secrets`-ը միշտ գերակայում է։ Արտահանման ֆայլերը գրվում են ատոմային կերպով `0600` ռեժիմով։ Հստակ գաղտնիքներ պարունակող արտահանումը դիտարկեք որպես գաղտնի նյութ։ Առանց գրաֆիկական ինտերֆեյսի համակարգերում՝ առանց օգտագործելի OS keychain-ի, CLI-ն վերադառնում է `config.json`՝ `0600` ռեժիմով և տպում է միանվագ նախազգուշացում. լռելյայն արտահանումը մնում է խմբագրված այս ռեժիմում։ --- ## Արագ ամբողջական ստուգում Պատճենելու և տեղադրելու համար նախատեսված ամբողջական կենսացիկլ՝ հեռավար կարգավորումը զրոյից ստուգելու համար․ միացում, սահմանափակ շրջանակով token-ի ստեղծում, հրամանի ուղղորդում, հետանցում և մաքրում։ Փոխարինեք `192.168.0.15`-ը ձեր սերվերի host/IP-ով (Tailscale, LAN կամ հրապարակային `https://…` URL)։ ```bash # 1. Միացում (գաղտնաբառ → admin token, պահպանվում է որպես համատեքստ և դառնում ակտիվ) omniroute connect 192.168.0.15 # կամ՝ --key oma_live_xxxx (առանց գաղտնաբառի) omniroute contexts current # ցուցադրում է հեռավար սերվերը + շրջանակը # 2. Օգտագործում — կառավարման հրամաններն այժմ կատարվում են հեռավար սերվերի նկատմամբ omniroute tokens create --name laptop --scope read # ստեղծել ավելի նեղ շրջանակով token omniroute tokens list # քողարկված ցանկ՝ հեռավար սերվերից # 3. Անցում այս ու այն կողմ omniroute contexts use default # → տեղային omniroute contexts use 192-168-0-15 # → կրկին հեռավար (անունը՝ `contexts list`-ից) # 4. Մաքրում։ ՆՇՈՒՄ․ `contexts remove`-ը ջնջում է միայն ՏԵՂԱՅԻՆ հավատարմագիրը — # այն ՉԻ չեղարկում սերվերի token-ը։ Եթե ցանկանում եք իսկապես դադարեցնել # հասանելիությունը, նախ չեղարկեք այն սերվերի կողմից։ omniroute tokens revoke # դադարեցնում է հասանելիությունը սերվերում omniroute contexts remove 192-168-0-15 --yes # հեռացնել տեղային համատեքստը (նույնիսկ եթե այն ակտիվ է → վերադառնում է default-ին), առանց հարցման ``` > `--yes`-ը `contexts remove`-ը դարձնում է ոչ ինտերակտիվ (պարտադիր է սկրիպտներում/CI-ում․ առանց > դրա ոչ ինտերակտիվ shell-ն ապահով կերպով մերժում է՝ կախվելու փոխարեն)։ **Ակտիվ** > համատեքստի հեռացման դեպքում օգտագործումն ինքնաբերաբար վերադառնում է `default`-ին։ --- ## Անվտանգության նշումներ - Թոքենի բաց տեքստը ցուցադրվում է մեկ անգամ․ պահպանվում է միայն SHA-256 հեշը (ինչպես API բանալիների դեպքում)։ - `omniroute connect`-ը կրկին օգտագործում է մուտք գործելու փորձերի կոպիտ ուժով հարձակման արգելափակումը և աուդիտի գրանցումը։ - Փոխանցման համար նախընտրեք HTTPS կամ Tailnet․ միայն հոսթը նշելու դեպքում լռելյայն օգտագործվում է `http://`՝ LAN/Tailscale-ի հետ հարմար աշխատանքի համար։ TLS օգտագործելու համար փոխանցեք ամբողջական `https://…` URL։ - Նախընտրելի տեղային համատեքստի ֆայլը `~/.omniroute/config.json`-ն է (`chmod 600`), որը պարունակում է միայն `credentialRef`։ Թոքենը պահվում է օպերացիոն համակարգի բանալիների պահոցում (`keytar`) և երբեք չի արտածվում մատյաններում։ Առանց գործող ներկառուցված բանալիների պահոցի՝ առանց գրաֆիկական միջավայրի տեղադրումները որպես բացահայտ պահուստային տարբերակ օգտագործում են նույն `0600` ֆայլը և մեկ անգամ նախազգուշացում են ցուցադրում։ Բանալիների պահոցի բեքենդը տեղադրելուց հետո օգտագործեք `omniroute contexts migrate --yes`։ --- ## API վերջնակետեր (տեղեկատու) | Մեթոդ | Երթուղի | Նույնականացում | Տիրույթ | | ------ | --------------------- | -------------------- | ------------------------------------ | | POST | `/api/cli/connect` | կառավարման գաղտնաբառ | — (հանրային, գաղտնաբառով պաշտպանված) | | GET | `/api/cli/whoami` | հասանելիության թոքեն | read | | GET | `/api/cli/tokens` | հասանելիության թոքեն | admin | | POST | `/api/cli/tokens` | հասանելիության թոքեն | admin | | DELETE | `/api/cli/tokens/:id` | հասանելիության թոքեն | admin | Ամբողջական սխեմաների համար տե՛ս [openapi.yaml](../openapi.yaml)։