ΠΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° ClineBot / ClinePass Π΄Π»Ρ DeepSeek Harness
0.6.15 ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ Π±ΡΠ΄ΠΆΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π·Π°ΠΌΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡΡ, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π°Π²ΡΠΎΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅Π½ ΠΈ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π½Π°Ρ
ΠΎΠ΄ΠΊΠΈ Π°ΡΠ΄ΠΈΡΠ°. Π§Π°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· Π½Π°ΡΠΈΠ²Π½ΡΠΉ Π°Π΄Π°ΠΏΡΠ΅Ρ ctx.llm, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ DSH 0.2.1-rc.2; ΡΡΠ°ΡΡΠ΅ llm-pi-ai, loopback-ΠΏΡΠΎΠΊΡΠΈ ΠΈ llm/stream ΡΠ΄Π°Π»Π΅Π½Ρ.
π¬π§ English β’
π·πΊ Π ΡΡΡΠΊΠΈΠΉ β’
π¨π³ δΈζθ―΄ζ
β ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠ°Π²ΠΈΡΡΡ ΡΡΠΎΡ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠΎΡΡΠ°Π²ΡΡΠ΅ Π΅ΠΌΡ Π·Π²Π΅Π·Π΄Ρ Π½Π° GitHub β ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΠΌΠ½Π΅, ΡΡΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Π²Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΈ Π±ΡΠ΄Π΅Ρ ΠΌΠΎΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅Π½Ρ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π°Π»ΡΡΠ΅.
π ΠΡΠ»ΠΈ Π²Ρ Π½Π°ΡΠ»ΠΈ Π±Π°Π³ ΠΈΠ»ΠΈ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue Π½Π° GitHub Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΠ·ΡΠΊΠ΅ β Ρ ΡΠ°ΡΡΠΌΠΎΡΡΡ Π²Π°ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΈΠ΄Π΅ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
Π²Π΅ΡΡΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½Π°.
|
---
## β‘ ΠΠ±Π·ΠΎΡ ΠΈ ΡΠ΅ΡΠ°Π΅ΠΌΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
**ClinePass** (`https://cline.bot`) β ΡΠ΅ΡΠ²ΠΈΡ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΡΠ΅ Π»ΠΈΠΌΠΈΡΡ (Π² 2β5 ΡΠ°Π· Π²ΡΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ
) Π½Π° ΠΏΠ΅ΡΠ΅Π΄ΠΎΠ²ΡΠ΅ open-weights ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· Π΅Π΄ΠΈΠ½ΡΠΉ OpenAI-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (`https://api.cline.bot/api/v1`).
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ClinePass Π² DeepSeek Harness (DSH) Π½Π°ΠΏΡΡΠΌΡΡ ΡΠΎΠΏΡΡΠΆΠ΅Π½Π° ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ:
1. **ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ° `/v1/models`**: Π·Π°ΠΏΡΠΎΡ `GET /v1/models` ΠΊ `api.cline.bot` Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ `404 Not Found`, ΠΈΠ·-Π·Π° ΡΠ΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠΈΡΠΊ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² DSH ΠΏΠ°Π΄Π°Π΅Ρ ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΡΡΡΠΌ.
2. **Π‘ΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²**: ΠΌΠΎΠ΄Π΅Π»ΡΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠ΅ΡΠΈΠΊΡ `cline-pass/` (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, `cline-pass/deepseek-v4.1-flash`, `cline-pass/kimi-k3`).
3. **ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π»ΠΈΠΌΠΈΡΠΎΠ²**: 5-ΡΠ°ΡΠΎΠ²ΡΠ΅ ΠΈ Π½Π΅Π΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠΈΠ΅ ΠΎΠΊΠ½Π° ΡΠ°ΡΡ
ΠΎΠ΄Π° ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΡΡΠ΅Π±ΡΡΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΠΉ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅.
4. **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ**: Ρ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ API-ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π² ΠΎΡΠΊΡΡΡΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ
Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ.
ΠΠ»Π°Π³ΠΈΠ½ **`@goodandready/dsh-clinebot`** ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ»:
* π **ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ**: ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DSH ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· Π·Π°ΡΠΈΡΡΠ½Π½ΡΠΉ loopback-ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ `/dsh-clinebot/update`.
* β‘ **SWR-ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ ΠΈ Π·Π΄ΠΎΡΠΎΠ²ΡΡ**: ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ (<2 ΠΌΡ) Π½Π° Π·Π°ΠΏΡΠΎΡΡ ΡΡΠ°ΡΡΡΠ° Ρ ΡΠΎΠ½ΠΎΠ²ΡΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ
Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ UI.
* π **Smart Quota-Aware Failover**: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΎΡΠ°ΡΠΈΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Π² ΠΏΡΠ»Π΅ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ°Ρ
429 ΠΈ ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠΈ ΠΊΠ²ΠΎΡΡ Π² ΡΡΡΠΈΠΌΠ΅ (Ρ 30-ΡΠ΅ΠΊΡΠ½Π΄Π½ΠΎΠΉ Π·Π°ΡΠΈΡΠΎΠΉ ΠΎΡ ΡΡΠΎΡΠΌΠ°; ΡΠ΅ΠΊΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π΅ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ, ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΡΡΠ°Π·Ρ ΠΈΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ).
* π₯οΈ **Π‘ΡΡΠ°Π½ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°**: ΠΎΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ClineBot ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π’Π°ΠΌ ΠΈΠΌΡ ΡΡΡΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
, ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠ²ΠΎΡΠ° ΠΈ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ. ΠΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ½ΠΊΡΠ° Π±ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Π½Ρ Π½Π΅Ρ.
* π **ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ**: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΠ· `GET /api/v1/users/me/plan` ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° DSH Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ. Π DSH ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ ΡΡΡΠΎΠ³ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΡΠΈΡΠ°, Π° Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ»ΡΠΆΠΈΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠΎΠΌ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ ΠΈ Π·Π°ΠΏΠ°ΡΠ½ΡΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΏΡΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ API.
* β οΈ **ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΠ± ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠΈ ΠΊΠ²ΠΎΡΡ**: Π±Π°Π½Π½Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ 80% (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅) ΠΈ 95% (ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΎ) 5-ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ Π»ΠΈΠΌΠΈΡΠ° Ρ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠΌ ΡΠ±ΡΠΎΡΠ°.
* π **ΠΠ΅ΡΡΠΈΠΊΠΈ ΡΠ΅ΡΡΠΈΠΈ**: Π£ΡΠ΅Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ° DSH-ΡΠ°ΡΠΎΠ² ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅Ρ ClineBot Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°ΠΏΡΡΠΊΠ° (ΡΡΠΏΠ΅ΡΠ½ΡΠ΅, ΠΏΡΠ΅ΡΠ²Π°Π½Π½ΡΠ΅ ΠΈ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΡΠΎΠΊΠ΅Π½Ρ prompt/completion, Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΡΡΡΠΈΠΌΠ°).
* π **ΠΠ°ΡΠ±ΠΎΡΠ΄ Π»ΠΈΠΌΠΈΡΠΎΠ² ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ (Usage)**: Π½Π°Π³Π»ΡΠ΄Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ-Π±Π°ΡΡ ΡΠ°ΡΡ
ΠΎΠ΄Π° 5-ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΈ Π½Π΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π° ΠΈΠ· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ API `GET /users/me/plan/usage-limits`.
* π **Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° ΠΏΡΡΠΌΠΎ ΠΈΠ· UI**: ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° ΠΊΠ»ΡΡΠ° Ρ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ; ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ `credentials` (`~/.dsh/.credentials.yaml`) Π±Π΅Π· ΡΡΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
* π― **Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ Π² ΠΏΠΈΠΊΠ΅ΡΠ΅**: Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Π΄ΠΈΠ°Π»ΠΎΠ³Π°Ρ
ΡΠ°ΡΠ°.
* π¬ **Π‘Π»ΡΡ-ΠΊΠΎΠΌΠ°Π½Π΄Π° `/cline` Π² ΡΠ°ΡΠ΅**: ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΎΡΡΠ°ΡΠΊΠ° ΠΊΠ²ΠΎΡ, ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΡΠ΅ΡΡΠΈΠΈ, Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΡΠ°ΡΠ°.
---
## ποΈ ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°
```mermaid
graph LR
subgraph UI [ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DSH]
Page["ΠΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° (ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ -> ClineBot)"]
QuotaBar["ΠΡΠΎΠ³ΡΠ΅ΡΡ-Π±Π°ΡΡ 5h ΠΈ Π½Π΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π»ΠΈΠΌΠΈΡΠ° + ΠΠ°Π½Π½Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ"]
KeyInput["ΠΠ²ΠΎΠ΄ ΠΈ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ API-ΠΊΠ»ΡΡΠ°"]
ModelPick["ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΈΠΊΠ΅Ρ"]
StatsCard["ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅ΡΡΠΈΠΈ"]
end
subgraph PluginHost [Π₯ΠΎΡΡ-ΡΠ°ΡΡΡ dsh-clinebot]
HttpEndpoints["API: /dsh-clinebot/*"]
ClientCore["lib/cline-client.js"]
ModelCatalog["lib/models.js (ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ + ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ· ΠΏΠ»Π°Π½Π°)"]
SlashCmd["Π‘Π»ΡΡ-ΠΊΠΎΠΌΠ°Π½Π΄Π°: /cline"]
end
subgraph DSHCore [Π‘Π΅ΡΠ²ΠΈΡΡ DSH]
Credentials["Π‘Π΅ΡΠ²ΠΈΡ credentials (~/.dsh/.credentials.yaml)"]
end
subgraph Upstream [Π‘Π΅ΡΠ²Π΅Ρ Cline]
ClinePass["api.cline.bot/api/v1/chat/completions"]
ClineQuota["api.cline.bot/api/v1/users/me/plan/usage-limits"]
ClinePlan["api.cline.bot/api/v1/users/me/plan"]
end
Page -->|GET /status & /usage| HttpEndpoints
KeyInput -->|POST /save-key| HttpEndpoints
ModelPick -->|POST /models/sync| HttpEndpoints
HttpEndpoints --> Credentials
HttpEndpoints --> ClientCore
ClientCore --> ModelCatalog
ClientCore -->|Π§Π°Ρ| ClinePass
ClientCore -->|ΠΠ²ΠΎΡΡ| ClineQuota
ClientCore -->|Π’Π°ΡΠΈΡΠ½ΡΠΉ ΠΏΠ»Π°Π½| ClinePlan
```
---
## β¨ Π‘ΡΡΡΠΊΡΡΡΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
* **`lib/models.js`**: Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΡΡΠΎΠ²Π½Π΅ΠΉ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ (`Off` / `Low` / `Medium` / `High` / `Max`), ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΡ
Π»ΠΈΠΌΠΈΡΠΎΠ², ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (`customModels`) ΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π° ΡΠ°ΡΠΈΡΠ° (`parsePlanIncludedModels`, `getAllModels`, `getDynamicModels`).
* **Π¦Π΅Π½Ρ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ**: ΠΊΠ½ΠΎΠΏΠΊΠ° **Ping** Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ `POST /models/probe` ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ TTFT; ΠΊΠ½ΠΎΠΏΠΊΠ° **ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡ** ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²ΡΠ±ΠΎΡ Π²ΠΈΠ΄ΠΈΠΌΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΡΠΈΠ»ΡΡΡ ΡΠ°ΡΠΈΡΠ° ΡΠ΅ΡΠ΅Π· `POST /models/visible`. ΠΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΈΠ· models.dev Π΄Π»Ρ Π½ΠΎΠ²ΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ; ΡΡΠΎ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΌ `priceAutoSync` (ΠΈΠ»ΠΈ `priceAutoSync: false`), ΡΡΡΠ½Π°Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΎΡΡΠ°ΡΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ.
* **`lib/cline-client.js`**:
* `fetchUsageLimits`: ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ ΠΎΠΏΡΠΎΡ `GET /users/me/plan/usage-limits`, `GET /users/me/plan` ΠΈ `GET /users/me` Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΠΈ.
* `sessionStats` / `recordSessionRequest`: ΡΡΠ΅ΡΡΠΈΠΊΠΈ ΡΠ΅ΡΡΠΈΠΈ (Π·Π°ΠΏΡΠΎΡΡ, ΡΠΎΠΊΠ΅Π½Ρ, Π·Π°Π΄Π΅ΡΠΆΠΊΠ°, Π²ΡΠ΅ΠΌΡ).
* `saveCredentialKey`: Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ Π² `~/.dsh/.credentials.yaml`.
* `smokeChat`: Π·Π°ΠΌΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΏΠΈΠ½Π³ Ρ ΡΠΈΠΊΡΠ°ΡΠΈΠ΅ΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ.
* **`lib/index.js`**: ΡΠ΅ΡΠ²ΠΈΡ Cordis, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
ΠΌΠ°ΡΡΡΡΡΠΎΠ² (Π²ΠΊΠ»ΡΡΠ°Ρ `/dsh-clinebot/models/sync`), ΡΠ°ΡΡΠ΅Ρ ΠΏΠΎΡΠΎΠ³ΠΎΠ² ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΠ²ΠΎΡΡ ΠΈ ΡΠ»ΡΡ-ΠΊΠΎΠΌΠ°Π½Π΄Ρ `/cline`.
* **`lib/client.js`**: ΡΡΡΠ°Π½ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΡΡΠΎΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° (`plugins.row.config`) Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡΠΌΠΈ, ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ, ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ Π·Π°ΠΏΠ°ΡΠ½ΠΎΠΉ ΠΊΠ°ΡΡΠΎΡΠΊΠΎΠΉ (`settings.plugin.item`). ΠΡΠ½ΠΊΡΠ° `settings.section` Π² Π±ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΌΠ΅Π½Ρ Π½Π΅Ρ.
---
## π¦ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
```bash
dsh plugin --profile web add @goodandready/dsh-clinebot
```
ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ DeepSeek Harness ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
---
## π¬ Π‘Π»ΡΡ-ΠΊΠΎΠΌΠ°Π½Π΄Π° `/cline` Π² ΡΠ°ΡΠ΅
Π Π»ΡΠ±ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ ΡΠ°ΡΠ° Π²Π²Π΅Π΄ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ `/cline` Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΡΠ°ΡΠΊΠ° Π»ΠΈΠΌΠΈΡΠΎΠ², ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ:
```text
### π€ ClinePass Status (ClinePass)
* ΠΠΈΠ½Π³ Ρ
ΠΎΡΡΠ°: β
210 ΠΌΡ
* ΠΠΊΡΠΈΠ²Π½ΡΠΉ ΠΊΠ»ΡΡ: CLINEBOT_API_KEY (credentials)
* ΠΠΎΠ΄Π΅Π»Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: `cline-pass/deepseek-v4.1-flash`
β± 5-ΡΠ°ΡΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ: [ββββββββββ] 42% (ΡΠ±ΡΠΎΡ: 18:00)
π
ΠΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ: [ββββββββββ] 60% (ΡΠ±ΡΠΎΡ: 08.09)
* ΠΠΊΠΊΠ°ΡΠ½Ρ: `developer@example.com`
π Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅ΡΡΠΈΠΈ:
* ΠΠ°ΠΏΡΠΎΡΠΎΠ²: 14 Π²ΡΠ·ΠΎΠ²ΠΎΠ²
* Π’ΠΎΠΊΠ΅Π½Ρ: ~8,450 (ΠΡΠΎΠΌΠΏΡ: 6,100 | ΠΡΠ²Π΅Ρ: 2,350)
* ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΎΡΠ²Π΅ΡΠ°: 210 ΠΌΡ
```
---
## βοΈ ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ DSH ΠΈ Web UI)
Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ DeepSeek Harness (0.1.7+) Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ°ΡΡΠΎΡΠΊΡ Π² Web UI ΠΈΠ»ΠΈ `PUT /dsh-clinebot/config`, Π° ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Ρ
ΡΠ°Π½ΡΡΡΡ Π² DSH Credentials (`~/.dsh/.credentials.yaml`).
```yaml
dsh-clinebot:
enabled: true
baseUrl: https://api.cline.bot/api/v1
apiKeyEnv: CLINEBOT_API_KEY
defaultModel: your-default-model
disabledModels: []
customModels: []
modelReasoningDefaults:
your-reasoning-model: high
modelContextOverrides: []
statsPath: ~/.dsh/clinebot-stats.json
statsRetentionDays: 95
dailyBudgetUsd: 0
monthlyBudgetUsd: 0
timeoutMs: 30000
smokeTimeoutMs: 60000
streamIdleTimeoutMs: 60000
accounts:
- label: Team Key
apiKeyEnv: CLINEBOT_API_KEY_2
```
### ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
| ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | Π’ΠΈΠΏ | ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|:---|:---|:---|:---|
| `enabled` | `boolean` | `true` | ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΡΡΠ° ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° ClineBot Π² DSH |
| `baseUrl` | `string` | `"https://api.cline.bot/api/v1"` | ΠΠ°Π·ΠΎΠ²ΡΠΉ URL OpenAI-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ³ΠΎ API ClinePass |
| `apiKeyEnv` | `string` | `"CLINEBOT_API_KEY"` | ΠΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ / ΠΊΠ»ΡΡΠ° Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ credentials |
| `defaultModel` | `string` | `"cline-pass/deepseek-v4.1-flash"` | ΠΠΎΠ΄Π΅Π»Ρ, Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌΠ°Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΠ°ΡΠ° ΠΈ smoke-ΡΠ΅ΡΡΠΎΠ² |
| `disabledModels` | `array` | `[]` | Π‘ΠΏΠΈΡΠΎΠΊ ΠΎΡΠΊΠ»ΡΡΡΠ½Π½ΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (Π½ΠΎΠ²ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ) |
| `customModels` | `array` | `[]` | ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ»ΡΠ·Π° (`[{ id, name, contextLength, maxTokens, category, isReasoning }]`) |
| `modelReasoningDefaults` | `object` | `{}` | ΠΠ½Π°ΡΠ΅Π½ΠΈΡ thinking effort ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (`low`, `medium`, `high`, `max`) |
| `modelContextOverrides` | `array` | `[]` | ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Π»ΠΈΠΌΠΈΡΠ° ΡΠΎΠΊΠ΅Π½ΠΎΠ² |
| `statsPath` | `string` | `"~/.dsh/clinebot-stats.json"` | ΠΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΠΉ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² |
| `statsRetentionDays` | `number` | `95` | Π‘ΡΠΎΠΊ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π½Π΅Π²Π½ΠΎΠΉ/ΡΠ°ΡΠΎΠ²ΠΎΠΉ/ΡΠ΅ΡΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠΈ; 0 β Ρ
ΡΠ°Π½ΠΈΡΡ Π²ΡΡ |
| `dailyBudgetUsd` | `number` | `0` | ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ Π΄Π½Π΅Π²Π½ΠΎΠΉ Π»ΠΈΠΌΠΈΡ ΠΎΡΠ΅Π½ΠΎΡΠ½ΡΡ
ΡΡΠ°Ρ; 0 ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ |
| `monthlyBudgetUsd` | `number` | `0` | ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΡΡΠ½ΡΠΉ Π»ΠΈΠΌΠΈΡ ΠΎΡΠ΅Π½ΠΎΡΠ½ΡΡ
ΡΡΠ°Ρ; 0 ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ |
| `accounts` | `array` | `[]` | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ Π΄Π»Ρ ΡΠΎΡΠ°ΡΠΈΠΈ ΠΊΠ²ΠΎΡΡ ΠΈ failover (`[{ label, apiKeyEnv }]`) |
| `activeAccount` | `string` | `""` | ΠΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ (ΠΏΡΡΡΠΎ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ±ΠΎΡΠ° least-used) |
| `timeoutMs` | `number` | `15000` | Π’Π°ΠΉΠΌΠ°ΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² (ΠΌΡ) |
| `smokeTimeoutMs` | `number` | `25000` | Π’Π°ΠΉΠΌΠ°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΈΠ½Π³Π° ΠΈΠ½ΡΠ΅ΡΠ΅Π½ΡΠ° (ΠΌΡ) |
| `streamIdleTimeoutMs` | `number` | `30000` | Π’Π°ΠΉΠΌΠ°ΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π½ΠΊΠ°ΠΌΠΈ SSE-ΠΏΠΎΡΠΎΠΊΠ° (ΠΌΡ) |
| `enabledModels` | `array` | *(ΡΡΡΠ°ΡΠ΅Π»ΠΎ)* | Π’ΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π² public config; ΠΎΡΠΊΠ»ΠΎΠ½ΡΠ΅ΡΡΡ ΠΏΡΠΈ `PUT /config` Π² ΠΏΠΎΠ»ΡΠ·Ρ `disabledModels` |
| `dynamicModels` | `array` | `[]` | ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ°ΡΠΈΡΠ° |
---
## π ΠΠ°ΡΡΡΡΡΡ HTTP API
ΠΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ Ρ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ `/dsh-clinebot/*` ΠΈ Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΎΡ ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² (ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ same-origin ΠΈ loopback). Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ Π»ΠΈΠΌΠΈΡΠΎΠΌ 256 ΠΠΈΠ:
### Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ (ΠΌΠ°ΠΊΡ. 256 ΠΠΈΠ)
* `GET /dsh-clinebot/status` β Π’Π΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°, Π°ΠΊΡΠΈΠ²Π½ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ, ΠΊΠ²ΠΎΡΡ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΠ΅ΡΡΠΈΠΉ.
* `GET /dsh-clinebot/config` β ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΡΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΠΎΡΠΊΡΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Π±Π΅Π· ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ²).
* `PUT /dsh-clinebot/config` β ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ `enabledModels` Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ).
* `POST /dsh-clinebot/key/verify` β ΠΡΠΎΠ²Π΅ΡΠΊΠ° API-ΠΊΠ»ΡΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ `api.cline.bot` Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ email ΠΈ ΡΠ°ΡΠΈΡΠ°.
* `POST /dsh-clinebot/save-key` β Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π² ΡΠ΅ΡΠ²ΠΈΡ credentials DSH ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ `CLINEBOT_API_KEY*`.
* `POST /dsh-clinebot/models/sync` β Π‘ΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΡΠ°ΡΠΈΡΠΎΠΌ ClinePass.
* `POST /dsh-clinebot/models/toggle` β ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡΠ΅ΡΠ΅Π· `disabledModels` Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ Volatile-ΡΡΡΠ»ΠΎΠΊ.
* `POST /dsh-clinebot/models/custom` / `DELETE /dsh-clinebot/models/custom` β Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ.
* `POST /dsh-clinebot/models/context` / `DELETE /dsh-clinebot/models/context` β ΠΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
* `POST /dsh-clinebot/accounts` β ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Π² ΠΏΡΠ» ΡΠΎΡΠ°ΡΠΈΠΈ.
* `POST /dsh-clinebot/accounts/delete` β Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ Π·Π°ΡΠΈΡΠΎΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°.
* `POST /dsh-clinebot/accounts/active` β ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΠΈΠ· ΠΏΡΠ»Π° (ΠΈΠ»ΠΈ ΠΏΡΡΡΠΎ Π΄Π»Ρ auto least-used).
* `POST /dsh-clinebot/stats/reset` β Π‘Π±ΡΠΎΡ ΡΡΡΡΡΠΈΠΊΠΎΠ² Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ².
* `POST /dsh-clinebot/smoke` β ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΈΠ½Π³Π° Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
* `GET /dsh-clinebot/update/status` β ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½Π°.
* `POST /dsh-clinebot/update/apply` β ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π³ΡΡΠΏΠΏ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΡΠΈΠ»Ρ.
---
## π§ͺ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°ΠΏΡΡΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΡΠ΅ΡΡΠΎΠ²:
```bash
npm test
```
---
## π ΠΠΈΡΠ΅Π½Π·ΠΈΡ
MIT Β© [GooDAnDReaDY](https://github.com/GooDAnDReaDY)