# π¦ @goodandready/dsh-subscriptions
---
## β‘ ΠΠ±Π·ΠΎΡ
**`dsh-subscriptions`** ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ Π²Π°ΡΠΈ ΠΏΠ»Π°ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π° Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠΈ Π½Π°ΠΏΡΡΠΌΡΡ Π² **DeepSeek Harness** Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ
LLM-ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ².
ΠΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠΌΠΈΠ½ΡΡΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°ΡΡ Π΄ΠΎΡΠΎΠ³ΠΈΡ
API-ΠΊΠ»ΡΡΠ΅ΠΉ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΡΡ
Π·Π°Π΄Π°Ρ Π°Π³Π΅Π½ΡΠ°, ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°ΡΡ Π²Π°ΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π²Π΅Π±-ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» OAuth PKCE. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ **ΠΏΡΠ»Ρ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ²** Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΡΠΈ ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡΠΎΠ², **ΡΠΏΡΠ΅ΠΆΠ΄Π°ΡΡΠ΅Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ** ΠΈ **Π²Π½ΡΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ Cordis (`ctx.subscriptions`)**, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΈΡΠ°Π΅Ρ ΡΠΎΡΠ΅Π΄Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, [`dsh-image-gen`](https://github.com/GooDAnDReaDY/dsh-image-gen) ΠΈ [`dsh-grok-xsearch`](https://github.com/GooDAnDReaDY/dsh-grok-xsearch)) Π±Π΅Π· ΡΡΠ΅ΡΠΊΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π² ΡΠ΅ΡΡ.
```mermaid
graph LR
subgraph DSHCore [Π‘Π΅ΡΡΠΈΡ Π΄ΠΈΠ°Π»ΠΎΠ³Π° DeepSeek Harness]
Agent[π€ ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ Π°Π³Π΅Π½ΡΠΎΠΌ] --> Router{ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ²}
end
subgraph SubscriptionsCore [Π―Π΄ΡΠΎ dsh-subscriptions]
Router --> Pool{ΠΡΠ» Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Π²Π΅Π½Π΄ΠΎΡΠ°}
Pool -->|ΠΠΊΠΊΠ°ΡΠ½Ρ 1| Acc1[π€ ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ: ΠΠΊΡΠΈΠ²Π΅Π½]
Pool -->|ΠΠΊΠΊΠ°ΡΠ½Ρ 2| Acc2[π€ ΠΡΠΎΡΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ: ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅]
Pool -->|ΠΠΊΠΊΠ°ΡΠ½Ρ 3| Acc3[π€ ΠΠ°ΠΏΠ°ΡΠ½ΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ: Cooldown]
Acc1 -->|HTTP 429 / ΠΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡΡ| Rotate[Π£ΠΌΠ½ΡΠΉ ΡΠΎΡΠ°ΡΠΎΡ ΠΊΠ²ΠΎΡ ΠΈ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ]
Rotate -->|ΠΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠ°| Acc2
end
subgraph VendorBridges [4 ΠΠ΄Π°ΠΏΡΠ΅ΡΠ° Π²Π΅Π½Π΄ΠΎΡΠΎΠ²]
Acc1 --> B1[ΠΡΠΊΠ΅Π½Π΄ ChatGPT / Codex]
Acc1 --> B2[ΠΡΠΎΡΠΎΠΊΠΎΠ» Claude Pro / Max]
Acc1 --> B3[ΠΠΎΠ΄ΠΏΠΈΡΠΊΠΈ xAI / Grok]
Acc1 --> B4[Google Cloud Code Assist / Antigravity]
end
subgraph EcosystemBridge [Π‘Π΅ΡΠ²ΠΈΡ Cordis: ctx.subscriptions]
Pool --> ImgGen[dsh-image-gen: ΠΠ΅ΡΠΏΠ»Π°ΡΠ½Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ]
Pool --> XSearch[dsh-grok-xsearch: ΠΠΎΠΈΡΠΊ Π² X Twitter]
end
style DSHCore fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
style SubscriptionsCore fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
style VendorBridges fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
style EcosystemBridge fill:#181825,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4
```
---
## β¨ ΠΠ»ΡΡΠ΅Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
### 1. π 16 ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
Π²Π΅Π½Π΄ΠΎΡΠΎΠ² ΠΏΠΎΠ΄ΠΏΠΈΡΠΎΠΊ
| ΠΠ»ΡΡ Π²Π΅Π½Π΄ΠΎΡΠ° | Π’Π°ΡΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ | ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ |
|---|---|---|
| `codex` | ChatGPT Plus / Pro | Π‘ΡΡΠΈΠΌΠΈΠ½Π³ Codex, Π²ΡΠ·ΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ (`/backend-api/codex/...`) |
| `claude` | Claude Pro / Max | ΠΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Claude Messages, ΡΡΠ΅ΠΊΠΈΠ½Π³ ΡΠ°ΡΡ
ΠΎΠ΄Π° (`/v1/messages`, `/api/oauth/...`) |
| `grok` | xAI / X Premium | ΠΡΠ²Π΅ΡΡ Ρ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡΠΌΠΈ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π±Π°Π»Π°Π½ΡΠ° ΠΈ ΠΏΠΎΠΈΡΠΊ Π² ΡΠΎΡΡΠ΅ΡΠΈ |
| `antigravity` | Google Cloud Code Assist | ΠΠ²ΠΈΠΆΠΎΠΊ Antigravity (`/v1/loadCodeAssist`, `/v1/streamGenerateContent`) |
| `kimi` | Moonshot Kimi | ΠΡ
ΠΎΠ΄ ΠΏΠΎ OAuth Device Flow (`auth.kimi.com`), OpenAI-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΡΠ°Ρ |
| `glm` | Z.ai GLM Coding Plan | ΠΠΎΠ΄ΠΈΠ½Π³-ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ GLM (`api.z.ai`), ΠΆΠΈΠ²ΠΎΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΊΠ²ΠΎΡΡ (`/api/monitor/usage/quota/limit`) |
| `cursor` | Cursor | ΠΡΠΊΠ΅Π½Π΄ Cursor (`api2.cursor.sh`), ΡΠ°Π·Π±ΠΎΡ Π΄Π°ΡΠ±ΠΎΡΠ΄Π° ΡΠ°ΡΡ
ΠΎΠ΄Π° Π·Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ |
| `kiro` | AWS Kiro | ΠΠ΅ΡΠΊΡΠΎΠΏΠ½ΡΠΉ OAuth Kiro (`app.kiro.dev`), ΡΡΡΠΈΠΌΠΈΠ½Π³ ΠΊΠΎΠ΄Π° |
| `copilot` | GitHub Copilot | ΠΡ
ΠΎΠ΄ ΠΏΠΎ GitHub Device Flow (`github.com/login/device`), chat completions Copilot |
| `qwen` | Alibaba Qwen (DashScope) | OpenAI-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ (`dashscope.aliyuncs.com/compatible-mode/v1`), Π²Ρ
ΠΎΠ΄ ΠΏΠΎ API-ΠΊΠ»ΡΡΡ |
| `ernie` | Baidu ERNIE (Qianfan) | ΠΡΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ OAuth2-ΡΠΎΠΊΠ΅Π½Π° ΠΏΠΎ ΡΠ²ΡΠ·ΠΊΠ΅ API Key + Secret Key, ΡΠ°Ρ Wenxinworkshop |
| `spark` | iFlytek Spark | OpenAI-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ HTTP API Spark (`spark-api-open.xf-yun.com/v1`) |
| `jetbrains` | JetBrains AI Assistant | Π Π΅Π»Π΅ΠΉ JetBrains AI (`api.jetbrains.ai`) |
| `perplexity` | Perplexity Pro | ΠΠ°ΡΠ°Π»ΠΎΠ³ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Sonar (`api.perplexity.ai`) |
| `replit` | Replit Core | Replit AI API (`replit.com/api/v1/ai`), Π²Ρ
ΠΎΠ΄ ΠΏΠΎ connect-ΡΠΎΠΊΠ΅Π½Ρ |
| `cody` | Sourcegraph Cody Pro | Sourcegraph API (`sourcegraph.com/.api`), Π²Ρ
ΠΎΠ΄ ΠΏΠΎ access-ΡΠΎΠΊΠ΅Π½Ρ |
*Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ
Π²Π΅Π½Π΄ΠΎΡΠΎΠ² ΡΠ΅ΡΠ΅Π· ΡΠ°Π±ΡΠΈΠΊΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ `createVendorFromProfile`.*
---
### 2. π Π ΠΎΡΠ°ΡΠΈΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠ° ΠΎΡ Π»ΠΈΠΌΠΈΡΠΎΠ² (`rotate.js`, `ratelimit.js`)
* **ΠΡΠ»Ρ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ²**: ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Π½Π° Π²Π΅Π½Π΄ΠΎΡΠ° (`CODEX_OAUTH_1`, `CODEX_OAUTH_2`...).
* **ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ 429**: ΠΏΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΡΠ°ΡΠΈΠΊ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ.
* **Π£ΠΏΡΠ΅ΠΆΠ΄Π°ΡΡΠ΅Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ (`switchAtRemaining`)**: ΡΠΌΠ΅Π½Π° Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Π΄ΠΎ ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π² ΠΎΡΠΈΠ±ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠΊΠ½ΠΎ ΡΠ±ΡΠΎΡΠ° Π±Π»ΠΈΠ·ΠΊΠΎ.
* **ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΡΡΡΡ Cooldown**: ΠΏΠ°ΡΡΠΈΠ½Π³ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² `Retry-After`, `x-ratelimit-reset`, Π΄Π°Ρ ISO ΠΈ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π½ΡΡ
ΠΌΠ΅ΡΠΎΠΊ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ ΠΎΡΡΡΠ²ΡΠΈΡ
Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Π² ΡΡΡΠΎΠΉ.
---
### 3. π ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π½Π° headless-ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ
* **ΠΡΠ»Π΅Π²Π°Ρ ΡΡΠ΅ΡΠΊΠ° ΡΠΎΠΊΠ΅Π½ΠΎΠ²**: ΡΠΎΠΊΠ΅Π½ OAuth **Π½ΠΈΠΊΠΎΠ³Π΄Π°** Π½Π΅ ΠΎΡΠ΄Π°ΡΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ HTTP API. Π ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ Π²ΠΈΠ΄Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΡΡ, ΠΈΠΌΡ ΠΈ ΠΎΡΡΠ°ΡΠΎΠΊ ΠΊΠ²ΠΎΡΡ.
* **Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Ρ
ΠΎΡΡΠ°**: ΡΠΎΠΊΠ΅Π½Ρ ΡΠΈΡΡΡΡΡΡΡ Π² `$DSH_HOME/.credentials.yaml`.
* **ΠΡ
ΠΎΠ΄ Π±Π΅Π· Π±ΡΠ°ΡΠ·Π΅ΡΠ° (SSH / Remote)**: Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ ΡΠ΄Π°Π»ΡΠ½Π½ΠΎ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ, ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠ°Π²ΠΈΠ² ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ redirect URL ΠΈΠ»ΠΈ authorization code Π² ΠΊΠ°ΡΡΠΎΡΠΊΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°.
* **Π€ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ²**: ΠΏΠ»Π°Π³ΠΈΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½Ρ Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΡ
ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
---
### 4. π§© ΠΠ½ΡΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ Cordis (`ctx.subscriptions`)
ΠΡΡΠ³ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π°ΠΏΡΡΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ:
```javascript
// ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΈΠ· dsh-image-gen:
const res = await ctx.subscriptions.request('codex', '/backend-api/codex/images/generations', {
method: 'POST',
body: JSON.stringify({ prompt: 'Cyberpunk landscape', size: '1024x1024' }),
})
```
* **ΠΡΠ»Π΅Π²ΠΎΠΉ ΠΎΠ²Π΅ΡΡ
Π΅Π΄**: ΠΏΡΡΠΌΠΎΠ΅ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ
HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ².
* **ΠΠ΅Π»ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΡΠ΅ΠΉ (`ALLOWLIST`)**: ΡΡΡΠΎΠ³ΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ
ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ² Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ SSRF.
---
### 5. π ΠΡ
ΠΎΠ΄ Π±Π΅Π· Π±ΡΠ°ΡΠ·Π΅ΡΠ°: loopback ΠΈ device-ΠΊΠΎΠ΄ (`v0.4.9`)
* **ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ loopback-callback (`autoLoopback`, Π²ΠΊΠ»ΡΡΡΠ½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ)**: Π΅ΡΠ»ΠΈ redirect_uri Π²Π΅Π½Π΄ΠΎΡΠ° β loopback-Π°Π΄ΡΠ΅Ρ (Codex `:1455`, Grok `:56121`), ΠΏΠ»Π°Π³ΠΈΠ½ ΡΠ°ΠΌ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ HTTP-ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π»ΠΎΠ²ΠΈΡ callback Π±Π΅Π· ΡΡΡΠ½ΠΎΠΉ Π²ΡΡΠ°Π²ΠΊΠΈ ΡΡΡΠ»ΠΊΠΈ. Π ΡΡΠ½Π°Ρ Π²ΡΡΠ°Π²ΠΊΠ° ΠΎΡΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΠ°ΡΠ½ΠΎΠΉ ΠΏΡΡΡ.
* **ΠΡ
ΠΎΠ΄ ΠΏΠΎ ΠΊΠΎΠ΄Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° (Codex)**: Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ headless-ΠΌΠ°ΡΠΈΠ½Π°Ρ
Π½Π°ΠΆΠΌΠΈΡΠ΅ **Device login** Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Codex: ΠΏΠ»Π°Π³ΠΈΠ½ Π·Π°ΠΏΡΠΎΡΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° `auth.openai.com`, Π²Ρ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΠ΅ `https://auth.openai.com/codex/device` Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π²Π²ΠΎΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ΄ β ΠΏΠ»Π°Π³ΠΈΠ½ ΡΠ°ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ PKCE-ΠΎΠ±ΠΌΠ΅Π½.
* **ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅**: redirect Π½Π° origin Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (`useWebCallback`) ΠΈ ΡΡΡΠ½Π°Ρ Π²ΡΡΠ°Π²ΠΊΠ° Π°Π΄ΡΠ΅ΡΠ°/ΠΊΠΎΠ΄Π° Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅.
### 6. π ΠΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ HTTP/SOCKS-ΠΏΡΠΎΠΊΡΠΈ Π½Π° Π°ΠΊΠΊΠ°ΡΠ½Ρ (`v0.4.9`)
* **ΠΡΠΎΠΊΡΠΈ Π½Π° ΡΠ»ΠΎΡ (`proxyUrl`)**: ΠΊΠ°ΠΆΠ΄ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ²ΠΎΠΉ Π°Π΄ΡΠ΅Ρ `http://`, `https://`, `socks5://[user:pass@]host:port`. Π§Π΅ΡΠ΅Π· Π½Π΅Π³ΠΎ ΠΈΠ΄ΡΡ Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° β ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π΅Π½Π΄ΠΎΡΠ°, Π·Π°ΠΏΡΠΎΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠΡΡΡΠΎ = ΠΏΡΡΠΌΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
* **ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ**: ΠΊΠ½ΠΎΠΏΠΊΠ° **Check proxy** Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Π΄Π΅Π»Π°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ URL Π²Π΅Π½Π΄ΠΎΡΠ° ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠΊΡΠΈ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΈΠ»ΠΈ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΎΡΠΊΠ°Π·Π°.
* **Π’Π°ΠΉΠΌΠΈΠ½Π³ΠΈ Π² ΠΈΡΡΠΎΡΠΈΠΈ**: ΠΊΠ°ΠΆΠ΄Π°Ρ Π·Π°ΠΏΠΈΡΡ ΠΈΡΡΠΎΡΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ (`ms`) β ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΏΡΡΠΌΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠΊΡΠΈ.
### 7. πΆοΈ Π Π΅ΠΆΠΈΠΌ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΠΈ ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΡΡΡΡ (`v0.4.9`)
* **ΠΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (`privacyMask`)**: ΠΎΠ΄ΠΈΠ½ ΡΡΠΌΠ±Π»Π΅Ρ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΡΠΊΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎ Π²ΡΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅: email ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ `j***n@example.com` (ΡΠΏΠΈΡΠΊΠΈ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ², ΡΡΠ°ΡΡΡΡ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ). ΠΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ β Π»ΠΈΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΡΡΠ΅ΠΊΡΡ ΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ²Π΅ΡΡ API; ΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ. ΠΠ°Π΄ΡΠΌΠ°Π½ΠΎ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΉ ΡΠΊΡΠ°Π½Π° ΠΈ ΡΡΡΠΈΠΌΠΎΠ².
* **ΠΠ½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΡΡΡΡ**: Π±Π»ΠΎΠΊ **Generate diagnostics report**: ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ β ΠΎΡΡΡΡ (Π²Π΅ΡΡΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°/ΡΠ°Π½ΡΠ°ΠΉΠΌΠ°, ΠΠ‘, ΡΡΡΡΡΠΈΠΊΠΈ Π·Π΄ΠΎΡΠΎΠ²ΡΡ ΠΏΠΎ Π²Π΅Π½Π΄ΠΎΡΠ°ΠΌ, Π°Π³ΡΠ΅Π³Π°ΡΡ HTTP-ΡΡΠ°ΡΡΡΠΎΠ², ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ β₯400 Ρ ΡΠ°ΠΉΠΌΠΈΠ½Π³Π°ΠΌΠΈ, Π½Π΅-ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ) ΡΠΊΠ°ΡΠ°Π½ ΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ Π² Π±ΡΡΠ΅Ρ. Π’ΠΎΠΊΠ΅Π½Ρ, email, ΠΈΠΌΠ΅Π½Π° ΡΡΡΡΠ½ΡΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ Π°Π΄ΡΠ΅ΡΠ° ΠΏΡΠΎΠΊΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½Ρ (ΠΏΠΎΠΊΡΡΡΠΎ ΡΠ΅ΡΡΠ°ΠΌΠΈ).
* **ΠΠΎΡΠΎΠ²ΠΎ Π΄Π»Ρ issue**: ΡΡΠ΄ΠΎΠΌ ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΠ΅ΠΊΠ΅Ρ Π·Π°Π΄Π°Ρ β Π±Π°Π³-ΡΠ΅ΠΏΠΎΡΡ ΡΡΠΎ Β«ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ β Π²ΡΡΠ°Π²ΠΈΡΡ β ΠΎΡΠΏΡΠ°Π²ΠΈΡΡΒ».
### 8. π HTTP API (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² `v0.4.9`)
| ΠΠ°ΡΡΡΡΡ | ΠΠ΅ΡΠΎΠ΄ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
| `/dsh-subscriptions/diagnostics` | GET | ΠΠ½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΡΡΡΡ (Π±Π΅Π· ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ², ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ² ΠΏΡΠΎΠΊΡΠΈ) |
| `/dsh-subscriptions/proxy-check` | POST | ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΡΠΎΠΊΡΠΈ ΡΠ»ΠΎΡΠ° ΡΠ΅ΡΠ΅Π· Π±Π°Π·ΠΎΠ²ΡΠΉ URL Π²Π΅Π½Π΄ΠΎΡΠ° |
| `/dsh-subscriptions/oauth/device/start` | POST | ΠΠ°ΡΠ°ΡΡ Π²Ρ
ΠΎΠ΄ Codex ΠΏΠΎ ΠΊΠΎΠ΄Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° (Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΈ Π°Π΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ) |
| `/dsh-subscriptions/oauth/device/poll` | POST | ΠΠΏΡΠΎΡ ΡΡΠ°ΡΡΡΠ° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠ΄Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° |
---
### 9. π¦ ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ»ΡΠ· Ollama ΠΈ Π±Π΅ΡΡΠΎΠ²Π½ΡΠΉ ΡΠΎΠ»Π±ΡΠΊ (`v0.4.17`)
* **ΠΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅Ρ (`ollama`)**: Π΅ΡΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ Ollama Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ `ollamaBaseUrl` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `http://127.0.0.1:11434`), ΠΎΠ½ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² Π½Π°ΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ DSH Ρ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ ΠΈΠ· `/api/tags`. ΠΠ»ΡΡ Π½Π΅ Π½ΡΠΆΠ΅Π½.
* **ΠΠ΅ΡΡΠΎΠ²Π½ΡΠΉ ΡΠΎΠ»Π±ΡΠΊ (`ollamaFallback`, Π²ΠΊΠ»ΡΡΡΠ½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ)**: ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° ΠΈΡΡΠ΅ΡΠΏΠ°Π½Ρ (ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ) ΠΈ Π΅ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ, ΡΠ°Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ (`ollamaFallbackModel`, Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ²Π°Ρ ΠΈΠ· `/api/tags`). Π€ΠΎΠ»Π±ΡΠΊ ΠΏΠΈΡΠ΅ΡΡΡ Π² ΠΆΡΡΠ½Π°Π» ΠΈ Π² ΠΈΡΡΠΎΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊΠ°ΠΊ `kind: fallback`.
* **ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ ($0) Π°Π²Π°ΡΠΈΠΉΠ½ΡΠΉ ΠΏΡΡΡ**: ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° ΠΈ Π±Π΅Π· ΠΊΠ²ΠΎΡ β ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ ΠΎΡΠ»Π°ΠΉΠ½-Π΄Π΅ΠΌΠΎ.
### 10. β‘ Effort, Verbosity ΠΈ Fast Mode (`v0.4.17`)
* **Π£ΡΠΎΠ²Π΅Π½Ρ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ (Effort)**: ΠΌΠΎΠ΄Π΅Π»ΠΈ Codex ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΡΠΎΠ²Π½ΠΈ ΠΈΠ· ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°; Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠ΅Π»Π΅ΠΊΡΠΎΡ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅Ρ Π²ΡΠ±ΠΎΡ, ΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ `reasoning.effort` Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ» `/responses`. Grok ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ effort ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³-ΠΎΡΠΎΠ·Π½Π°Π½Π½ΠΎΠΉ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ.
* **ΠΠ΅ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (`codexVerbosity`)**: `low` / `medium` / `high` ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ `text.verbosity` Π΄Π»Ρ reasoning-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Codex. ΠΡΡΡΠΎ = Π΄Π΅ΡΠΎΠ»Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
* **Fast Mode (`codexFastMode`)**: c ΠΊΠ°ΠΆΠ΄ΡΠΌ Codex-Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ `service_tier: priority` (ΠΏΠ»Π°ΡΠ½ΡΠΉ ΡΠΊΠΎΡΠΎΡΡΠ½ΠΎΠΉ ΡΠΈΡ 1.5x). Π ΡΠΈΠΏΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΠΏΡΠΈ Π²ΠΊΠ»ΡΡΡΠ½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ `β‘`.
### 11. π¦ ΠΡΠ»Π΄Π°ΡΠ½Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°ΠΌ ΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (`v0.4.17`)
* **Reasoning vs Standard**: 429 Π½Π° reasoning-ΠΌΠΎΠ΄Π΅Π»ΠΈ (claude `*thinking*`, grok `*reasoning*`, Π²ΡΠ΅ codex-ΠΌΠΎΠ΄Π΅Π»ΠΈ) ΠΎΡ
Π»Π°ΠΆΠ΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ reasoning ΡΡΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° β standard-ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Legacy-ΠΊΡΠ»Π΄Π°ΡΠ½Ρ (ΠΎΡ ΡΡΠ°ΡΡΡ
Π²Π΅ΡΡΠΈΠΉ) ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡ Π²Π΅ΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ.
* **Π‘ΠΊΡΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ (`hideDeprecatedModels`)**: ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΈΠ· Π½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠ° id Ρ `test`/`preview`/`dev`/`alpha`/`beta`/`legacy` (Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΈ Π½Π° ΠΆΠΈΠ²ΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ, ΠΈ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΡΠΉ ΡΠΎΠ»Π±ΡΠΊ).
### 12. β‘ ΠΠΈΠ·Π°ΠΉΠ½ Π² ΡΡΠΈΠ»Π΅ ClineBot ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΡ (`v0.6.6`)
* **Π‘ΡΡΠΎΠΊΠ° ΡΡΠ°ΡΡΡΠ° Ρ Π±Π΅ΠΉΠ΄ΠΆΠ°ΠΌΠΈ**: ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ Π·Π°ΠΌΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Ρ
ΠΎΡΡΠ° (`Host online (XX ms)`), ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΡ
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ»Π°.
* **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ Smoke Test (Ping)**: ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ²ΡΠ·ΠΈ Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠΌ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΡΠΊΠ»ΠΈΠΊΠ° Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
.
* **ΠΠ°Π½Π΅Π»Ρ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠΈ ΡΠ΅ΡΡΠΈΠΈ**: 4 ΠΊΠ°ΡΡΠΎΡΠΊΠΈ ΠΌΠ΅ΡΡΠΈΠΊ (ΡΡΠΏΠ΅ΡΠ½ΡΡ
/Π²ΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΡΠ΅Π΄Π½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°, ΠΏΡΠΎΡΠ΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ).
* **ΠΠ°ΡΠ°Π»ΠΎΠ³ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΎΠΊ**: ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (128k, 200k, 1M) ΠΈ ΡΠ΅Π³Π°ΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
* **ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½Π°Ρ ΠΈΡΡΠΎΡΠΈΡ**: ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π΄Π΅Π±Π°ΡΠ½ΡΠΈΠ½Π³ Π·Π°ΠΏΠΈΡΠΈ `HistoryStore`, ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ°Π΄ΠΊΠΈ event loop ΠΏΡΠΈ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΠΌ ΡΡΡΠΈΠΌΠΈΠ½Π³Π΅.
---
## π¦ ΠΡΡΡΡΠ°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
```bash
dsh plugin --profile web add @goodandready/dsh-subscriptions
```
---
> [!TIP]
> **ΠΠ°ΡΡΠΎΡΠΊΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π² UI vs ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π² YAML**:
> ΠΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΡΠ»ΠΎΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ², ΠΏΠ΅ΡΠ΅Ρ
Π²Π°Ρ autoLoopback, privacyMask, ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ composerQuota, ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ expiryNotifyDays, codexFastMode, codexVerbosity, ollamaFallback/baseUrl/model, ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ cooldown ΠΈ probe) Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Π² Web UI: **Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β ΠΠ»Π°Π³ΠΈΠ½Ρ β ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² β SubscriptionsΒ»**. ΠΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΎΠ²Π΅ΡΡΠ°ΠΉΠ΄Ρ (ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ OAuth Client ID / Redirect URI, Base URL Π΄Π»Ρ ΠΏΡΠΎΠΊΡΠΈ, ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ Π²Π΅Π½Π΄ΠΎΡΡ) Π·Π°Π΄Π°ΡΡΡΡ Π² `settings.yaml`.
## βοΈ ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (`settings.yaml`)
```yaml
dsh-subscriptions:
switchAtRemaining: 1
cooldownMs: 60000
autoLoopback: true # v0.4.9: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΠΎΠ²ΠΈΡΡ loopback-callback
privacyMask: false # v0.4.9: ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°ΡΡ email ΠΈ ΡΡΡΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² UI
ollamaBaseUrl: http://127.0.0.1:11434 # v0.4.17: Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ»ΡΠ· Ollama
ollamaFallback: true # v0.4.17: Π±Π΅ΡΡΠΎΠ²Π½ΡΠΉ ΡΠΎΠ»Π±ΡΠΊ ΠΏΡΠΈ ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠΈ Π²ΡΠ΅Ρ
Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ²
ollamaFallbackModel: '' # v0.4.17: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ qwen2.5-coder; ΠΏΡΡΡΠΎ = ΠΏΠ΅ΡΠ²Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ· /api/tags
hideDeprecatedModels: false # v0.4.17: ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ test/preview/beta/legacy id ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
codexVerbosity: '' # v0.4.17: low | medium | high (text.verbosity)
codexFastMode: false # v0.4.17: service_tier priority (ΡΠΊΠΎΡΠΎΡΡΠ½ΠΎΠΉ ΡΠΈΡ 1.5x)
composerQuota: 'off' # v0.4.18: ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π² ΡΡΡΠΎΠΊΠ΅ Π²Π²ΠΎΠ΄Π°: off | percent | bar | forecast
# ΠΠΎΠ»Ρ ΡΠ»ΠΎΡΠ° (v0.4.9): expiresAt (ms), proxyUrl (http/https/socks5://)
accounts:
codex:
- ref: CODEX_OAUTH_1
label: "Π Π°Π±ΠΎΡΠΈΠΉ Pro-Π°ΠΊΠΊΠ°ΡΠ½Ρ"
- ref: CODEX_OAUTH_2
label: "ΠΠΈΡΠ½ΡΠΉ Plus-Π°ΠΊΠΊΠ°ΡΠ½Ρ"
claude:
- ref: CLAUDE_OAUTH_1
label: "Claude Max"
grok:
- ref: GROK_OAUTH_1
label: "X Premium"
```
---
## π§ ΠΠ΄Π°ΠΏΡΠΈΠ²Π½ΠΎΠ΅ ΠΌΡΡΠ»Π΅Π½ΠΈΠ΅ Claude ΠΈ ΡΡΠΎΠ²Π½ΠΈ ΡΡΠΈΠ»ΠΈΡ (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.7)
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΡΡΠ»Π΅Π½ΠΈΡ Anthropic (`thinking: { type: "adaptive" }`) ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³Π»ΡΠ±ΠΈΠ½ΠΎΠΉ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ (`output_config: { effort }`):
- **ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ**: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ²Π½Π΅ΠΉ ΡΡΠΈΠ»ΠΈΡ Π΄Π»Ρ Opus 4.6+, Opus 4.7+, Opus 5 (`low`, `medium`, `high`, `xhigh`, `max`) ΠΈ Sonnet 4.6+, Sonnet 5 (`low`, `medium`, `high`).
- **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΡΠΎΠ»Π»Π±ΡΠΊ**: ΠΠΎΠ΄Π΅Π»ΠΈ Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ (Haiku, Fable, 4.5 ΠΈ ΡΡΠ°ΡΡΠ΅) Π½Π΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ Anthropic API (400 Bad Request).
- **ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³**: Π ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΠΈΡ `reasoning.efforts`, Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ DeepSeek Harness.
---
## π ΠΠ²ΡΡΠ·ΡΡΠ½Π°Ρ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (EN / ZH) ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π΄ΠΎΡΠΎΠ²ΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.8)
- **Π‘ΡΠ°Π½Π΄Π°ΡΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ**: ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΡΠ°Π» Π½Π° 100% Π΄Π²ΡΡΠ·ΡΡΠ½ΡΠΌ β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Ρ ΠΏΠΎΠ»Π½ΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ (`en`) ΠΈ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠΌ ΠΊΠΈΡΠ°ΠΉΡΠΊΠΎΠΌ (`zh`) ΡΠ·ΡΠΊΠ°Ρ
.
- **ΠΠ½Π΅ΡΠ½ΡΡ ΡΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ**: Π ΡΡΡΠΊΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠ΄Π΅Π»Π΅Π½Ρ ΠΎΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ ΡΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ (`dsh-russian-lang`).
- **ΠΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°**: ΠΠ½ΠΎΠΏΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ ΡΠ»ΠΎΡΠ° ΠΈΠ·ΠΌΠ΅ΡΡΠ΅Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ (`latencyMs`) ΠΈ ΡΡΠ°ΡΡΡ Π·Π΄ΠΎΡΠΎΠ²ΡΡ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°.
---
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.9)
- **ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π°ΠΏΠ΄Π΅ΠΉΡΠ΅Ρ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ**: Π€ΠΎΠ½ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½ΠΎΠ²ΡΡ
Π²Π΅ΡΡΠΈΠΉ Π² npm registry ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΡΠ΅ ΠΏΠΎ ΠΌΠ°ΡΡΡΡΡΡ `/dsh-subscriptions/update` ΡΠ΅ΡΠ΅Π· Ρ
ΠΎΡΡΠΎΠ²ΡΠΉ CLI DSH (`dsh plugin add`).
- **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ Π·Π°ΡΠΈΡΠ° ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ°**: Π‘ΡΡΠΎΠ³Π°Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ loopback-Π°Π΄ΡΠ΅ΡΠΎΠ² (ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° IPv4 `127.0.0.1`, IPv6 `::1`, `localhost`), Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° `x-dsh-plugin-update` ΠΈ Π·Π°ΡΠΈΡΠ° ΠΎΡ CSRF/cross-origin Π·Π°ΠΏΡΠΎΡΠΎΠ².
- **ΠΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π² ΡΠ°ΠΏΠΊΠ΅ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ**: Π ΡΡΡΠΎΠΊΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ, Π±Π΅ΠΉΠ΄ΠΆ Π½Π°Π»ΠΈΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (Β«Update β vX.Y.ZΒ») Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ»ΡΠΆΠ±Ρ.
- **Π‘Π΅ΡΠ΅Π²ΡΠ΅ ΡΠ°ΠΉΠΌΠ°ΡΡΡ ΠΈ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ**: ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π±Π°Π»Π°Π½ΡΠ° ΠΈ smoke-ΡΠ΅ΡΡΠΎΠ² Π΄ΠΎ 15 ΡΠ΅ΠΊΡΠ½Π΄ (`AbortSignal.timeout(15_000)`), ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡΠ΅Π΅ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΏΡΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ
API.
- **ΠΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ**: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π°Π»ΠΈΠ°ΡΠΎΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² `provider || vendor` ΠΈ `index || accountIndex` Π² ΡΡΠ°ΡΡΡΠ½ΡΡ
ΠΌΠ°ΡΡΡΡΡΠ°Ρ
, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΊΠ»Π° Π½ΠΎΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ Π² `lib/accounts.js`.
---
---
## π‘οΈ ΠΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΡΡ
ΠΎΠ΄Π° ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΉ ΡΠ΅ΡΡΠΈΠΉ (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.12)
- **ΠΠ°ΡΠΈΡΠ° ΠΎΡ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΠΉ (GitHub #4)**: Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΈΠ·-Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ Ρ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ ChatGPT Codex ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π°Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΠΈ Π½Π΅ ΠΎΡΠΊΡΡΠ²Π°Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ `received NaN, expected number on uncachedInputTokens and outputTokens`.
- **ΠΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ `TokenUsage`**: ΠΠ½Π΅Π΄ΡΠ΅Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ `toTokenUsage()` Π²ΠΎ Π²ΡΠ΅Ρ
ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ
Π°Π΄Π°ΠΏΡΠ΅ΡΠ°Ρ
(`codexResponsesStream`, `openaiChatStream`, `anthropicStream`, `googleStream`) Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ Π²Π΅Π½Π΄ΠΎΡΡΠΊΠΈΡ
ΡΡΡΡΠΊΡΡΡ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ DSH `TokenUsage` (`inputTokens`, `outputTokens`, `cacheReadTokens`, `cacheWriteTokens`, `reasoningTokens`, `totalTokens`).
- **ΠΠ°ΡΠΈΡΠ° ΠΎΡ `NaN` ΠΈ disjoint-ΡΠ°ΡΡΠ΅Ρ**: ΠΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ ΡΠ΅Π»ΡΠΌ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΈΡΠ»Π°ΠΌ (Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ fallback Π² `0`, Π±Π΅Π· `NaN` ΠΈ `undefined`). ΠΠ»Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ², ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡΠΈΡ
ΠΊΡΡ Ρ ΠΏΡΠΎΠΌΠΏΡΠΎΠΌ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ Π½Π΅ΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.
- **ΠΡΠ΅Π»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π·Π°ΡΠΈΡΠ° Π°Π΄Π°ΠΏΡΠ΅ΡΠ°**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°Ρ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ°Π½ΠΊΠΎΠ² ΡΠ°ΡΡ
ΠΎΠ΄Π° ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π° ΡΡΠΎΠ²Π½Π΅ `SubscriptionAdapter`, ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
Π² ΠΆΡΡΠ½Π°Π» ΠΈ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΠΉ DSH.
---
## π ΠΠ°ΡΠΈΡΠ° OAuth Client ID ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΎΠΊ (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.11)
- **ΠΠ°ΡΠΈΡΠ° OAuth Client ID (GitHub #2)**: uildAuthorizeUrl ΠΈ ntigravity.authorizeUrl ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΡΡ Π½Π΅ΠΏΡΡΡΠΎΠΉ clientId. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π΅ Π·Π°Π΄Π°Π½, ΡΠ΅ΡΠ²Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ²Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ HTTP 400 (missing_client_id), Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ ntigravityClientId Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΈΠ»ΠΈ Π½Π°ΠΆΠ°ΡΡ Β«π₯ ΠΠ· CLIΒ», ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΡ Π±ΠΈΡΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² Google OAuth.
- **Π‘Π΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π² ΡΡ
Π΅ΠΌΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ**: Π ΡΡ
Π΅ΠΌΡ Config Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ ntigravityClientSecret Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° Client Secret ΡΡΠ΄ΠΎΠΌ Ρ ntigravityClientId Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΌ API.
- **ΠΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΡΡΡΠ° Zhipu GLM (GitHub #3)**: Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ API-ΠΊΠ»ΡΡΠ΅ΠΉ Zhipu GLM ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° Π½Π° Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ (https://bigmodel.cn/usercenter/proj-mgmt/apikeys), ΡΡΡΡΠ°Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ 404 (Β«ι‘΅ι’θ·δΈ’ε¦οΌοΌΒ»), Π²ΡΠ·Π²Π°Π½Π½ΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠ΅ΠΉ ΠΌΠ°ΡΡΡΡΡΠΎΠ² Π²Π΅Π½Π΄ΠΎΡΠ°.
---
## π‘οΈ ΠΠ°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° (ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² v0.6.10)
- **Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ**: Π£ΡΡΡΠ°Π½Π΅Π½Ρ Π²ΡΠ΅ ΠΏΡΡΡΡΠ΅ Π±Π»ΠΎΠΊΠΈ catch Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠΌ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Ρ
Π΅Π»ΠΏΠ΅Ρ `bestEffort` Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
- **ΠΠ°ΡΠΈΠ²Π½ΡΠΉ Π»ΠΎΠ³Π³Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°**: ΠΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Ρ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ Cordis `ctx.logger('subscriptions')`.
- **ΠΠ°ΡΠΈΡΠ° Π²Π½Π΅ΡΠ½ΠΈΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΠ°ΠΉΠΌΠ°ΡΡΠ°ΠΌΠΈ**: ΠΡΠ΅ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΊ API Π²Π΅Π½Π΄ΠΎΡΠΎΠ² (`listModels`, `fetchFor`, `quotaFetch`, `jsonTokenRequest`) Π·Π°ΡΠΈΡΠ΅Π½Ρ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· `fetchWithTimeout` ΠΈ `AbortSignal.timeout`.
- **Π‘Π΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠ°Ρ UI-ΡΠ΅ΠΌΠΈΠ·Π°ΡΠΈΡ**: Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²Π΅ΡΠ° ΠΈ rgba-Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² `client.js` Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ Π½Π° Π½Π°ΡΠΈΠ²Π½ΡΠ΅ CSS-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄ΠΈΠ·Π°ΠΉΠ½-ΡΠΈΡΡΠ΅ΠΌΡ DeepSeek Harness (`--dsw-alias-*`, `color-mix`), Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ 0 ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΡ
`rgba`.
- **ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ**: ΠΠ°Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ½ΠΆΠ΅ΠΊΡΡ (`@deepseek-ai/dsh-client-locale`, `@deepseek-ai/dsh-client-ui-slots`) Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅ `package.json`.
- **Π§ΠΈΡΡΠΎΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ**: ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½Ρ ΠΈΠ· git-ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² `.gitignore`.
---
## π ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠ·ΡΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π° - ΡΠΎΠ»ΡΠΊΠΎ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ. Π ΡΡΡΠΊΠΈΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ·ΡΠΊΠΎΠ²ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ»Π°Π³ΠΈΠ½ ΡΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ), ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΡΠΈΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠ»ΡΡΠΈ Π»ΠΎΠΊΠ°Π»ΠΈ, - ΡΠ°ΠΌ ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² (Changed in 0.6.1).
---
## π ΠΠΈΡΠ΅Π½Π·ΠΈΡ
MIT Β© [GooDAnDReaDY](https://github.com/GooDAnDReaDY)