## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.21: ΠΠΈΠ»ΡΠ»Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° Π² ΠΊΠΎΠΌΠΏΠΎΠ·Π΅ΡΠ΅ ΠΈ ΠΌΠΎΠ΄Π°Π»ΠΊΠ° Regenerate (#501, #502)
- **ΠΡΡΡΡΡΠΉ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° Π² ΠΊΠΎΠΌΠΏΠΎΠ·Π΅ΡΠ΅ ΡΠ°ΡΠ° (#501)**: ΠΠΈΠ»ΡΠ»Ρ Π² ΡΠ»ΠΎΡΠ΅ `conversation.input.right` Ρ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π»Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π· Π²ΡΡ
ΠΎΠ΄Π° ΠΈΠ· ΡΠ°ΡΠ°.
- **ΠΠΎΠ΄Π°Π»ΠΊΠ° Regenerate Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΌΠΏΡΠ° Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ (#502)**: ΠΠ½ΠΎΠΏΠΊΠ° `π Regenerateβ¦` ΠΏΡΡΠΌΠΎ Π½Π° ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΌΠΏΡ, Π²ΡΠ±ΡΠ°ΡΡ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΌΠ΅Π½Ρ ΡΠΈΠ΄Π° ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.20: ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ A/B ΡΠΏΠ»ΠΈΡ-ΡΠ»Π°ΠΉΠ΄Π΅Ρ ΠΈ ΠΊΠ°ΡΡΡΠ΅Π»Ρ ΡΠ΅Π²ΠΈΠ·ΠΈΠΉ (#499, #500)
- **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ A/B Π‘ΠΏΠ»ΠΈΡ-ΡΠ»Π°ΠΉΠ΄Π΅Ρ Π² ΡΠ°ΡΠ΅ (#499)**: Π‘ΠΏΠ»ΠΈΡ-ΡΠ»Π°ΠΉΠ΄Π΅Ρ Β«ΠΠΎ / ΠΠΎΡΠ»Π΅Β» Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΌΡΡΠΈ ΠΈ ΡΠ°Ρ-ΠΆΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π΅ΠΌΡΠΌ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΠΎΠ»ΡΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌΠΈ Π±Π΅ΠΉΠ΄ΠΆΠ°ΠΌΠΈ. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π» ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈ ΡΠ΅ΡΡΠ°Π²ΡΠ°ΡΠΈΠΈ Π»ΠΈΡ, ΠΈΠ½ΠΏΠ΅ΠΉΠ½ΡΠΈΠ½Π³Π΅, ΡΠ΅ΠΌΠΈΠΊΡΠ°Ρ
ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡΡ
.
- **ΠΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΠΊΠ°ΡΡΡΠ΅Π»Ρ ΡΠ΅Π²ΠΈΠ·ΠΈΠΉ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ (#500)**: ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΈΡΡΠΎΡΠΈΠΈ Π²Π΅ΡΡΠΈΠΉ `< v1 / N >` Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ ΡΠΈΠ΄Π°/Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² `localStorage` Π±ΡΠ°ΡΠ·Π΅ΡΠ° (Π΄ΠΎ 20 Π²Π΅ΡΡΠΈΠΉ Π½Π° ΠΊΠ°ΡΡΠΎΡΠΊΡ) ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ°ΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΡ.
# π¦ @goodandready/dsh-image-gen
---
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.12: ΠΠ°Π½Π΅Π»Ρ Image Studio Π² ΠΏΡΠ°Π²ΠΎΠΌ ΡΠ°ΠΉΠ΄Π±Π°ΡΠ΅ ΠΈ ΡΠ΅ΡΡΠΈΠΎΠ½Π½Π°Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈΠ·Π°ΡΠΈΡ (#452, #453)
- **ΠΠ°ΡΠΈΠ²Π½Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ Image Studio Π² ΠΏΡΠ°Π²ΠΎΠΌ ΡΠ°ΠΉΠ΄Π±Π°ΡΠ΅ (#452)**: ΠΠΎΡΡΠΎΡΠ½Π½ΡΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ»ΠΎΡ `sidebarRightTabs` ΠΈ `sidebar.right.pane.tab` Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ `dsh-image-studio`. ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π°Π²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΈΠ»Π΅ΠΉ, ΡΠΈΠΏΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠΏΡΠ°, ΡΠ΅Π»Π΅ΠΊΡΠΎΡΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°, ΠΌΠΎΠ΄Π΅Π»ΠΈ, aspect ratio, ΡΠ΅ΠΊΠ±ΠΎΠΊΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ½Π°, ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ ΡΠ΅ΡΠΊΡ Π½Π΅Π΄Π°Π²Π½ΠΈΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ ΠΈ Π±ΡΡΡΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ: ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΡΠΈ ΠΊ ΡΠ°ΠΉΠ»Ρ ΠΈ Π²ΡΡΠ°Π²ΠΊΠ° Markdown-ΡΡΡΠ»ΠΊΠΈ Π² ΡΠ°Ρ.
- **Π‘Π΅ΡΡΠΈΠΎΠ½Π½Π°Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ (#453)**: ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° `organizeBySession: boolean` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `true`) ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π°ΡΡΠ΅ΡΡ Π² `/assets/images//`. ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ `buildSemanticSlug` ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΡΠΈΡΡΡΠ΅ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΡΠΈΡΠ°Π΅ΠΌΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΎΠΌΠΏΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, `futuristic-hero-banner-cyberpunk-v1.png`) Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ Π² Asset Vault.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.9: ΠΠΎΠ»Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ DSH Desktop Electron (#478)
- **ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΉ ΡΡ
Π΅ΠΌΡ DSH Desktop**: Π Π°ΡΡΠΈΡΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ `isTrustedLocalRequest`, `getRouteRejectionStatus` ΠΈ `getRouteWriteRejectionStatus` Π΄Π»Ρ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡ
Π΅ΠΌΡ `dsh-app://app/` ΠΏΡΠΈ loopback-ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡ
.
- **Π Π°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π²ΡΡ**: Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ° HTTP 403 Forbidden Π² DSH Desktop Π΄Π»Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ² `/dsh-image-gen/image`, `/dsh-image-gen/approval`, `/dsh-image-gen/vault` ΠΈ `/dsh-image-gen/config`, Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ ΠΏΠΎΠΊΠ°Π· ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ, ΡΠ°Π±ΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Approval Gate ΠΈ Studio Vault Π² Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅.
- **Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ Π³Π΅ΠΉΡΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ**: ΠΠ½Π΅ΡΠ½ΠΈΠ΅ LAN-Π·Π°ΠΏΡΠΎΡΡ Ρ ΠΏΠΎΠ΄Π΄Π΅Π»ΡΠ½ΡΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΈ Π½Π΅Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠ΅ ΡΡ
Π΅ΠΌΡ/Ρ
ΠΎΡΡΡ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 403 Forbidden.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.8: ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠ»ΡΠ· ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ (#450)
- **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠ»ΡΠ· ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ**: ΠΠ°ΡΠΈΡΠ° ΠΎΡ Π½Π΅ΡΠ°Π½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡ
ΠΎΠ΄Π° Π±Π°Π»Π°Π½ΡΠ° ΠΏΡΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ Π°Π³Π΅Π½ΡΠ°. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ `requireApproval: boolean` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `false`) ΠΈ `approvalTimeoutSec: number` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `120`, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ 5-600) Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΒ».
- **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ ΠΊΠ°ΡΡΠΎΡΠΊΠ° `FalApprovalCard`**: ΠΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π² ΡΠ°ΡΠ΅ ΠΊΠ°ΡΡΠΎΡΠΊΡ Ρ ΠΏΠ»Π°Π½ΠΎΠΌ Π·Π°Π΄Π°ΡΠΈ (ΠΏΡΠΎΠΌΠΏΡ, ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅Ρ, ΠΌΠΎΠ΄Π΅Π»Ρ, ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΊΠ°Π΄ΡΠ° ΠΈ ΡΠ°ΡΡΡΡΠ½Π°Ρ ΡΡΠΎΠΈΠΌΠΎΡΡΡ Π² USD) ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ `[π ΠΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ]` ΠΈ `[βοΈ ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ]`.
- **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΎΡΠΊΠ°Ρ ΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ**: ΠΡΠ»Π΅Π²ΠΎΠΉ ΡΠ°ΡΡ
ΠΎΠ΄ Π±ΡΠ΄ΠΆΠ΅ΡΠ° ΠΏΡΠΈ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ΅ ΠΈΠ»ΠΈ ΠΎΡΠΌΠ΅Π½Π΅; ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΡΡΡ `/dsh-image-gen/approval`. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `approved: true` Π΄Π»Ρ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π°Π³Π΅Π½ΡΠΎΠΌ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.12.5: ΠΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ° ΡΡΠΆΠ΅Π»ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (#456, #458)
* **Π‘ΠΊΠ²ΠΎΠ·Π½Π°Ρ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ (`reference_image`, `reference_strength`) (#458)**: ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ (URL, ΡΠ°ΠΉΠ», data URI, Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅) Ρ ΡΠ΅Π³ΡΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΈΠ»ΠΎΠΉ Π²Π»ΠΈΡΠ½ΠΈΡ (0.1β1.0) Π² `generate_image`. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ FAL Π½Π° FLUX Redux (`fal-ai/flux/dev/redux`), ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° multimodal reference Π² Seedream, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° `--cref --cw ` Π² Midjourney ΠΈ IP-Adapter Π²Π΅ΡΠΎΠ² Π² Replicate.
* **ΠΠ°ΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ° ΡΡΠΆΠ΅Π»ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (#456)**: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°Ρ ΡΡΠΆΠ΅Π»ΡΡ
inline base64 data URI ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΡΡ
Π±ΡΡΠ΅ΡΠΎΠ² Ρ Π²ΡΠ³ΡΡΠ·ΠΊΠΎΠΉ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ `/dsh-image-gen/image?id=...`, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° LLM Π² Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ΅ΡΡΠΈΡΡ
Π΄ΠΈΠ°Π»ΠΎΠ³Π°. Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΊΠ»ΡΡΠ΅Π²ΡΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.11.9: ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠ° ComfyUI (#322, GitHub #7)
* **Π£ΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΌΠΏΡΠ° Π² ComfyUI**: Π `lib/providers/backends/local.js` ΡΡΡΡΠ°Π½Π΅Π½Π° Π»ΠΈΡΠ½ΡΡ ΠΎΠ±ΡΡΡΠΊΠ° `{ prompt: workflow }`, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ²ΡΠ°Ρ ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ `{ prompt: { prompt: workflowGraph } }` ΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ComfyUI `missing_node_type: Node 'ID #prompt' has no class_type`. ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΡΠ΅Π²Π΅Π½ΡΠΈΠ²Π½Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π³ΡΠ°ΡΠ° Π½ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.11.8: ΠΠ°ΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΠΌΠ°ΡΡΡΡΡΠΎΠ², ΠΏΠ°ΡΠΈΡΠ΅Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠ½Π°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°
* **ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ΅Π»Π° Π½Π°ΡΡΡΠΎΠ΅ΠΊ (#313)**: ΠΠ°ΡΡΡΡΡ `PUT /dsh-image-gen/config` Π·Π°ΡΠΈΡΡΠ½ Π»ΠΈΠΌΠΈΡΠΎΠΌ 64 ΠΠ Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ HTTP 413 `Payload Too Large` ΠΏΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ, ΠΈΡΠΊΠ»ΡΡΠ°Ρ DoS ΡΠ΄ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠ΅ ΠΊΡΡΠΈ.
* **ΠΠΎΠ½ΡΡΠΎΠ»Ρ ΠΏΠ°ΡΠΈΡΠ΅ΡΠ° ΡΠ±ΠΎΡΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (#316)**: Π `scripts/build-client.mjs` Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ `--check`, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² `npm test` Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠ°ΡΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ `lib/client.js` Ρ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ `src/client/*`.
* **ΠΠ΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ (#317)**: `lib/index.js` ΡΠΎΠΊΡΠ°ΡΡΠ½ Π΄ΠΎ ΡΠΎΠ½ΠΊΠΎΠ³ΠΎ ΡΠ°ΡΠ°Π΄Π° (<400 ΡΡΡΠΎΠΊ); ΡΡ
Π΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΠ½Π΅ΡΠ΅Π½Π° Π² `lib/config-schema.js`, Π° ΡΠ΅Π·ΠΎΠ»Π²Π΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² β Π² `lib/resolve-source.js`.
* **ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (#318, #319)**: Π£ΡΡΡΠ°Π½Π΅Π½ΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠ°Π² ΠΈΡΡΠΎΡΠΈΠΈ ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°; ΡΠ΄Π°Π»ΡΠ½ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ fallback `loc.get` Π² ΠΏΠΎΠ»ΡΠ·Ρ ΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ API Cordis.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.26: ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½Π°Ρ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈ ΡΠΈΡΡΠΎΡΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (#235, #238, #239)
* **ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½Π°Ρ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (#239)**: ΠΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² `lib/` ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΠΎΠΌΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ <= 600 ΡΡΡΠΎΠΊ: Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π²ΡΠ½Π΅ΡΠ΅Π½Π° Π² `lib/tools/generation-pack.js` (74 ΡΡΡΠΎΠΊΠΈ, `generation.js` ΡΠ½ΠΈΠΆΠ΅Π½ Π΄ΠΎ 547 ΡΡΡΠΎΠΊ), ΠΊΡΡ ΠΈ ΠΈΡΡΠΎΡΠΈΡ β Π² `lib/history.js` (93 ΡΡΡΠΎΠΊΠΈ), Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ°ΠΉΠ΄ΠΊΠ°ΡΡ β Π² `lib/attachment-helper.js` (82 ΡΡΡΠΎΠΊΠΈ, `index.js` ΡΠ½ΠΈΠΆΠ΅Π½ Π΄ΠΎ 557 ΡΡΡΠΎΠΊ). ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ°Π·Π±ΠΈΡ Π½Π° 15 ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² `src/client/*` (ΠΊΠ°ΠΆΠ΄ΡΠΉ <= 337 ΡΡΡΠΎΠΊ).
* **Π§ΠΈΡΡΠΎΡΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (#235)**: Π‘Π»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π°Π³Π΅Π½ΡΠΎΠ² (`AGENTS.md`, `index.md`) ΡΠ½ΡΡΡ Ρ git-ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈ Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ Π² `.gitignore` ΠΈ `.gitattributes`.
* **ΠΠ°ΡΠΈΡΠ΅Ρ ΡΠ΅ΠΌ ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΡ (#238)**: ΠΠΎΠ»Π½Π°Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ Ρ
Π°ΡΠ΄ΠΊΠΎΠ΄Π° ΡΠ²Π΅ΡΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ΅ΠΉ UI ΡΠ΅ΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ `--dsw-alias-*` ΠΈ `color-mix(...)`.
* **Π¦Π΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°**: ΠΠ°Π½ΠΈΡΠ΅ΡΡ `files` Π² `package.json` ΡΠ°ΡΡΠΈΡΠ΅Π½ ΡΠ·ΡΠΊΠΎΠ²ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ `README.ru.md` ΠΈ `README.zh.md`.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.25: Π§ΠΈΡΡΠΎΡΠ° ΡΠ΅ΠΌΡ DSH, Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠ΅ ΠΌΠΎΠΊΠ°ΠΏΡ, Π±Π΅ΡΡΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ ΠΈ ΡΠΏΡΠ°ΠΉΡΡΠΈΡΡ (#173, #177, #178, #238)
* **100% Π°Π΄Π°ΠΏΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΠΌΡ DSH (#238)**: ΠΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΡΡΠ°Π½Π΅Π½Ρ Π²ΡΠ΅ Π·Π°Ρ
Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π»ΠΈΡΠ΅ΡΠ°Π»Ρ `rgba(...)` ΠΈ hex-ΡΠ²Π΅ΡΠΎΠ² Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ (`src/client/10-css.js`, `src/client/80-gallery.js`). ΠΠΎΠ»ΡΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠ΅ ΡΡΠ°ΡΡΡΠ½ΡΠ΅ ΡΠΎΠ½Ρ Π±Π΅ΠΉΠ΄ΠΆΠ΅ΠΉ, Π°Π»Π΅ΡΡΠΎΠ² ΠΈ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΡ
ΠΎΠ²Π΅ΡΠ»Π΅Π΅Π² ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Ρ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΡΠ΅ΠΌΡ ΡΠ΅ΡΠ΅Π· `color-mix(...)`.
* **ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ
ΠΌΠΎΠΊΠ°ΠΏΠΎΠ² (`generate_responsive_mockups`, #173)**: ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΡΠΊΡΠ°Π½ΠΎΠ² Mobile (9:16), Tablet (3:4) ΠΈ Desktop (16:9) ΠΏΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΌΡ ΠΏΡΠΎΠΌΠΏΡΡ Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· `asyncPool` (concurrency 3) ΠΈ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠ°Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ ΡΠ°ΡΠ°.
* **ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π±Π΅ΡΡΠΎΠ²Π½ΡΡ
ΡΠ΅ΠΊΡΡΡΡ ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ² (`generate_seamless_pattern`, #178)**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΡΡΠΈΡ
ΡΡ ΡΠΎΠ½ΠΎΠ²ΡΡ
ΡΠ΅ΠΊΡΡΡΡ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ ΡΠ²ΠΎΠ² ΠΈ Π³ΠΎΡΠΎΠ²ΡΠΌ CSS-ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡΠΎΠΌ.
* **ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ 2D-ΡΠΏΡΠ°ΠΉΡΡΠΈΡΠΎΠ² (`generate_spritesheet`, #177)**: Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΡ
ΡΠ°ΡΠΊΠ°Π΄ΡΠΎΠ²ΠΎΠΊ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ ΠΈ UI Ρ Π°Π²ΡΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ CSS `@keyframes` ΠΈ SVG-ΠΏΡΠ΅Π²ΡΡ ΠΏΠΎΠ»ΠΎΡΡ ΠΊΠ°Π΄ΡΠΎΠ².
* **ΠΠΎΠ΄ΡΠ»ΡΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (#244)**: ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΡΠ°ΡΡΡ ΡΠ°Π·Π½Π΅ΡΠ΅Π½Π° Π½Π° 15 ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² `src/client/*` ΡΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠΌ ΡΠ±ΠΎΡΠΊΠΈ `scripts/build-client.mjs`. Preflight-ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° `FAIL=0`, 179 ΠΈΠ· 179 ΡΠ΅ΡΡΠΎΠ² ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠΉΠ΄Π΅Π½Ρ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.24: ΠΠ»ΠΎΠΊ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° β ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½Π°Ρ Π³ΡΠ°Π½ΠΈΡΠ°, ΡΡΠ°ΡΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΡΠ²Π΅ΡΠ° ΡΠ΅ΠΌΡ ΠΈ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (#235β#242)
* **ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½Π°Ρ Π³ΡΠ°Π½ΠΈΡΠ°**: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ `.gitattributes` c `export-ignore` Π΄Π»Ρ `AGENTS.md`, `index.md`, `docs/` ΠΈ `.gitea/` β Π°ΡΡ
ΠΈΠ²Ρ GitHub source ΠΈ `git archive` Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ workflow.
* **Π‘ΡΠ°ΡΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ**: ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ fallback ΡΡΠ°ΡΡΡΠ° ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°/ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ β ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅/Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π»ΠΎΠΆΠ½ΡΠΌ Β«unavailableΒ».
* **ΠΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ Π΄ΠΈΠ·Π°ΠΉΠ½-ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ**: ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠ΅ CSS-ΠΊΠ»Π°ΡΡΡ `fal-` ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ Π² ΠΏΡΠ΅ΡΠΈΠΊΡ `ig-`; ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΠ΅ΠΌΡ DSH ΡΠ΅ΡΠ΅Π· `var(--dsw-alias-*, )`.
* **ΠΠ°ΡΠΈΡΠ° ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²**: Π·Π°ΠΏΠΈΡΡ history, cache meta/data ΠΈ spend-meter ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ°Π²Π° `0600`.
* **Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΌΡΡΡΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ**: ΡΠ΄Π°Π»ΡΠ½ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ `listCuratedStyles`; ΡΠΊΡΡΠΏΠ½ΡΠ½Π½ΡΠ΅ server-ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ°Π·Π½Π΅ΡΠ΅Π½Ρ β ΡΡΠΈΠ»ΠΈΡΡ `providers.js` β `provider-utils.js`, `processing.js` β `processing-basic.js` + `processing-advanced.js`. Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ client ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΎ Π² #244.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.23: ΠΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ Π°Π²ΡΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Ρ ΠΈ ΡΠΈΡΡΠΎΡΠ° ΡΠ·ΡΠΊΠ° (#232)
* **ΠΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² 1 ΠΊΠ»ΠΈΠΊ**: ΠΡΡΠΌΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ (`UpdaterSection`) ΡΠ΅ΡΠ΅Π· ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ `/api/dsh-image-gen/update`. ΠΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅Π΅ΡΡΡ npm, ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ semver-Π²Π΅ΡΡΠΈΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΡΠ΅ΡΠ΅Π· `dsh plugin add` Ρ Π·Π°ΡΠΈΡΠΎΠΉ ΠΏΠΎ loopback ΠΈ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΈ (RFC 1918).
* **Π‘ΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ 1:1**: ΠΠΎΠ»Π½ΠΎΠ΅ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΡ
Π΅ΠΌΡ Ρ
ΠΎΡΡΠ° `Config` Π² `lib/index.js` ΠΈ ΠΏΠΎΠ»Π΅ΠΉ UI `FIELDS` Π² `lib/client.js` β Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡ Β«β¨ ΠΡΠΎΠΌΠΏΡ ΠΈ ΡΡΠΈΠ»ΠΈΒ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΡΠΌΠ±Π»Π΅ΡΡ `autoEnhancePrompt` ΠΈ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ `defaultStylePreset`.
* **ΠΠΊΡΠΈΠ²Π½ΡΠ΅ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Ρ**: ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² `testProviderConnection` Π΄Π»Ρ Replicate (`/v1/models`), Google Gemini (`/v1beta/models`) ΠΈ ByteDance Seedream Ρ Π·Π°ΡΠΈΡΠΎΠΉ ΠΏΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ ΠΈ Π·Π°ΠΌΠ΅ΡΠΎΠΌ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
* **Π‘ΡΡΠΎΠ³ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΌΡΠ»ΡΡΠΈΡΠ·ΡΡΠ½ΠΎΡΡΠΈ**: Π§ΠΈΡΡΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΠΈ `en` ΠΈ `zh` Π² ΡΠ΄ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°; ΡΡΡΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎ Π²ΡΠ½Π΅ΡΠ΅Π½Ρ Π² `goodandready/dsh-russian-lang` Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ DSH. Π ΠΎΠ²Π½ΠΎ 0 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ (`lib/`).
* **ΠΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (WAI-ARIA A11y)**: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° Π²ΠΊΠ»Π°Π΄ΠΎΠΊ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠΎΡΠΌ Ρ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ `role="tablist"`, `role="tab"`, `aria-selected`, `aria-controls`, `role="tabpanel"`, `aria-describedby` ΠΈ `role="alert"`.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.22: Π‘ΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ React Error #185 (#230)
* **Π Π΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ**: Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° React #185 (`Maximum update depth exceeded`) Π² `FalSettingsCardController` ΠΈ `CardForm.prototype.bind`. Π‘Π½ΠΈΠΌΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΊΡΡΠΈΡΡΡΡΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ (`Object.is(prev, next) === true`) Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΈΠΊΠ»ΠΎΠ² ΡΠ΅Π½Π΄Π΅ΡΠ°, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΠΈΠΊΠ»Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ Π² React 18 / `useSyncExternalStore`.
* **ΠΠ»ΡΠ±ΠΎΠΊΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠΎ ΡΡΠΎΡΠΎΠΌ DSH**: ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±Π΅ΡΡΠΎΠ²Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ `@deepseek-ai/dsh-client-store` (`runtime.createSnapshotStore`) Ρ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΌ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΌ ΠΊΡΡΠΈΡΡΡΡΠΈΠΌ fallback-ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ.
* **ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΡΡΡΠ»ΠΎΠΊ Π² `test/client-syntax.test.mjs`, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΡ ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΠ΅Π½ΠΈΡΡ
, Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΠΎΡΠΏΠΈΡΠΊΡ.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.21: ΠΠ΅ΡΡΡΠ°ΠΊ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ, ΡΠΌΠ½ΡΠΉ ΠΊΡΠΎΠΏΠΏΠ΅Ρ ΠΈ ΡΠΊΡΠΏΠΎΡΡ Π±ΡΠ΅Π½Π΄-Π°ΡΡΠ΅ΡΠΎΠ² (#228)
* **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ Π²Π΅ΡΡΡΠ°ΠΊ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ ΠΈ ΡΠ΅ΠΌΠΈΠΊΡΠΎΠ² (Remix Workbench)**: ΠΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ Π² `FalImageCard` ΠΈ Π³Π°Π»Π΅ΡΠ΅Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΈΠ»Ρ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ ΠΏΠΎΠ»Π·ΡΠ½ΠΊΠΎΠΌ ΠΊΡΠ΅Π°ΡΠΈΠ²Π½ΠΎΡΡΠΈ (0.05β0.95), Π±ΡΡΡΡΡΠ΅ ΠΏΡΠ΅ΡΠ΅ΡΡ (Β«Π’ΠΎΠ½ΠΊΠΈΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ 0.25Β», Β«ΠΡΠ΅Π°ΡΠΈΠ² 0.65Β») ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ Π΄ΠΎ-ΡΡΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΠ»Π΅ΠΌ.
* **Π£ΠΌΠ½ΠΎΠ΅ ΠΊΠ°Π΄ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΉ (`smart_crop_image`)**: ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΈ ΠΊΠ°Π΄ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΡΠΎΡΡΠ΅ΡΠΈ ΠΈ Π±Π°Π½Π½Π΅ΡΡ (`1:1`, `16:9`, `9:16`, `4:3`, `3:2`, `2:3`) Ρ ΡΠ΅ΠΆΠΈΠΌΠ°ΠΌΠΈ ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠ΅ΡΠ΅ΠΉ (`rule_of_thirds`), ΡΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΡΡΠ° ΠΈ ΡΠ°ΠΌΠΊΠΈ (`letterbox`) Π½Π° ΡΠΈΡΡΠΎΠΌ SVG Π±Π΅Π· Π²Π½Π΅ΡΠ½ΠΈΡ
Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΎΠ².
* **ΠΠΊΡΠΏΠΎΡΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π²Π΅Π±-Π°ΡΡΠ΅ΡΠΎΠ² (`export_asset_pack`)**: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ±ΠΎΡΠΊΠ° ΡΠ°Π²ΠΈΠΊΠΎΠ½ΠΎΠΊ (`favicon.svg`), PWA-ΠΈΠΊΠΎΠ½ΠΎΠΊ (`icon-192.svg`, `icon-512.svg`), `manifest.webmanifest`, ΠΊΠ°ΡΡΠΎΡΠΊΠΈ ΡΠΎΡΡΠ΅ΡΠ΅ΠΉ OpenGraph (`og-card.svg` 1200Γ630) ΠΈ `catalog.json`.
* **ΠΠ°ΡΠΈΠ²Π½ΡΠ΅ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ-ΡΡΠ»Π²ΡΡ Π΄Π»Ρ 12 Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²**: ΠΡΡΡΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΠΌΠΈΠΊΡΠ°, Π°ΠΏΡΠΊΠ΅ΠΉΠ»Π°, ΠΊΡΠΎΠΏΠ° ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΡΠ°ΡΠ° DSH.
* **Π‘ΡΡΠΎΠ³Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ**: ΠΠΎΠ»Π½ΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΠΈ `zh` ΠΈ `en`; ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΡΠΎΠΊ ΡΡΡΡΠΊΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· `goodandready/dsh-russian-lang`.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.19: ΠΡΡΡΠΎΠ΅Π½Π½Π°Ρ Π³Π°Π»Π΅ΡΠ΅Ρ Π² ΡΠ°ΠΉΠ΄Π±Π°ΡΠ΅, Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ ΡΡΠΈΠ»Π΅ΠΉ (#224)
* **ΠΠ°ΡΠΈΠ²Π½Π°Ρ Π³Π°Π»Π΅ΡΠ΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ Π² ΡΠ°ΠΉΠ΄Π±Π°ΡΠ΅**: ΠΡΡΠΌΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² ΠΏΡΠ°Π²ΡΠΉ ΡΠ°ΠΉΠ΄Π±Π°Ρ DSH (`sidebarRightTabs`, ΡΠ»ΠΎΡ `sidebar.right.pane.tab`, ΡΠ΅ΡΠ²ΠΈΡ `betterSidebar`) ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΎΡΠΊΡΡΡΠΈΡ Π² ΡΠ°ΠΏΠΊΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³Π° (`conversation.session.header.utilities`). ΠΡΠΎΡΠΌΠΎΡΡ ΠΈΡΡΠΎΡΠΈΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ, ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΌΠΏΡΠΎΠ² ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ.
* **ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ²**: ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ²ΡΠ·ΡΒ» Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡΒ». ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΅ΡΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Fal.ai, ComfyUI, Automatic1111 ΠΈ Custom API ΡΠΎ ΡΡΠ°ΡΡΡΠ½ΡΠΌΠΈ Π±Π΅ΠΉΠ΄ΠΆΠ°ΠΌΠΈ.
* **ΠΠ²ΠΈΠΆΠΎΠΊ ΡΡΠΈΠ»Π΅ΠΉ ΠΈ ΡΠ»ΡΡΡΠ°ΠΉΠ·Π΅Ρ ΠΏΡΠΎΠΌΠΏΡΠΎΠ²**: ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΈΠ· 10 ΡΡΠΈΠ»Π΅ΠΉ (`cinematic`, `photorealistic`, `anime`, `minimalist_vector`, `isometric_3d`, `analog_film`, `cyberpunk`, `pixel_art`, `oil_painting`, `claymation`), Π½Π°ΡΡΡΠΎΠΉΠΊΠ° `autoEnhancePrompt` ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ `style_preset` Π² `generate_image`.
* **Π‘Π±ΠΎΡΠΊΠ° ΠΊΠΎΠ»Π»Π°ΠΆΠ΅ΠΉ ΠΈ ΡΠ΅ΡΠΎΠΊ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (`assemble_image_grid`)**: ΠΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ 2β4 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ»Π»Π°ΠΆ (side-by-side, 2x2, vertical) Π½Π° ΡΠΈΡΡΠΎΠΌ SVG Π±Π΅Π· Π²Π½Π΅ΡΠ½ΠΈΡ
ΡΡΠΆΠ΅Π»ΡΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ (ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΡΡΠΎΠ³ΠΎ < 250 ΠΠ).
* **ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ ΡΠ²Π΅ΡΠΎΠ²ΡΡ ΠΏΠ°Π»ΠΈΡΡΡ Π±ΡΠ΅Π½Π΄Π°**: ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `palette_colors` (ΠΌΠ°ΡΡΠΈΠ² hex-ΡΠ²Π΅ΡΠΎΠ²) Π² `generate_image` Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΉ Π³Π°ΠΌΠΌΡ Π² ΠΏΡΠΎΠΌΠΏΡΠ΅ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°ΡΡΠ° WCAG.
* **Inpainting ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠ°ΡΠΊΠ΅ Π² `edit_image`**: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° `mask_image` ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `strength` (0.0β1.0) Π΄Π»Ρ ΡΠΎΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ ΡΠΎΠ½Π°.
* **ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΉ ΠΈ ΠΊΠΈΡΠ°ΠΉΡΠΊΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ**: Π‘Π»ΠΎΠ²Π°ΡΠΈ `zh` ΠΈ `en` Π² Web UI; ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΡΡΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ΅ΡΠ΅Π· `goodandready/dsh-russian-lang`.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.18: Π£ΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ (#222)
* **ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ ΠΈ ΠΏΠ°ΠΊΠΎΠ²**: ΠΠ°ΠΏΡΠΎΡΡ Ρ `count > 1`, ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΠΌΠΏΡΡ `prompts` ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ `generate_image_pack` ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Ρ ΠΏΡΠ»ΠΎΠΌ Π·Π°Π΄Π°Ρ (`concurrency: 3`), ΡΠΎΠΊΡΠ°ΡΠ°Ρ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎ **3 ΡΠ°Π·**.
* **ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠΏΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ (Zero-Delay Initial Poll)**: Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΡΡΠ°ΡΡΡΠ° Π² `pollStatus` (Fal.ai, ComfyUI), ΡΠΊΠΎΠ½ΠΎΠΌΡ 1β1.5 Ρ Π½Π° Π±ΡΡΡΡΡΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡΡ
.
* **Π‘ΡΠ±ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π½ΡΠΉ L1-ΠΊΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ**: 32-ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΉ LRU-ΠΊΡΡ ΠΏΠΎΠ²Π΅ΡΡ
Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ L2 ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΄Π°ΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ (< 0.1 ΠΌΡ) Π±Π΅Π· ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ Ρ Π΄ΠΈΡΠΊΠ°.
* **Fast-Fail ΠΏΡΠΈ ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΠΈ ΠΊΠ²ΠΎΡΡ**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ HTTP 402 (Payment Required) ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π±Π°Π»Π°Π½ΡΠ°/ΠΊΡΠ΅Π΄ΠΈΡΠΎΠ² Π² `isFatalClientError` Π΄Π»Ρ ΡΠΈΡΡΠΎΠ³ΠΎ ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° Π·Π°ΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°.
* **Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ Π½Π°Π±ΠΎΡ `test/batch5-speed-quality.test.mjs`, ΠΎΠ±ΡΠ΅Π΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ Π²ΡΡΠΎΡΠ»ΠΎ Π΄ΠΎ **136 ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠΎΠ² (100% pass)**.
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.17: ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΡΡΠ»ΠΎΠ² (#216, #217)
* **Π’ΡΠ»Ρ Π²ΡΠ½Π΅ΡΠ΅Π½Ρ ΠΈΠ· `apply()`**: host `lib/index.js` β ΡΠΎΠ½ΠΊΠ°Ρ cordis-ΡΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π°. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠ»ΠΎΠ² β Π² `lib/tools/*` ΡΠ΅ΡΠ΅Π· `lib/register-tools.js`.
* **Π‘Π²ΠΎΠΉ labeled `ctx.effect` Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ tool** (`dsh-image-gen: tool `) Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ.
* **Meta-ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°**: `AGENTS.md` ΠΈ `index.md` (Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² npm-ΠΏΠ°ΠΊΠ΅Ρ).
* **DESIGN.md** Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΠ΄Π°Π»ΡΠ½Π½ΡΡ HistoryGallery (#203).
* **Π’Π΅ΡΡΡ**: `lifecycle-structure` + ΠΏΠΎΠ»Π½ΡΠΉ suite β **132 unit tests**.
## β‘ ΠΠ±Π·ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ
**`@goodandready/dsh-image-gen`** β ΡΠ»Π°Π³ΠΌΠ°Π½ΡΠΊΠΈΠΉ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ DeepSeek Harness, ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ Π°Π³Π΅Π½ΡΠ° Π² ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΡΠ²ΠΎΡΡΠ΅ΡΠΊΡΡ ΡΡΡΠ΄ΠΈΡ. ΠΠ»Π°Π³ΠΈΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ³Π°ΡΡΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ, ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π°ΠΏΡΠΊΠ΅ΠΉΠ»Π°, Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ 8 ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ, ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΠ°ΡΡΠΎΡΠΊΠΎΠΉ Π² ΡΠ°ΡΠ΅.
```mermaid
graph LR
subgraph Input [π€ ΠΠ³Π΅Π½Ρ ΠΈ ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ]
Agent[ΠΡΠΎΠΌΠΏΡ / ΠΠ°Π΄Π°ΡΠ° Π°Π³Π΅Π½ΡΠ°]
UserUI[ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ / Π§Π°Ρ]
end
subgraph Tools [π οΈ ΠΠ°ΠΊΠ΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²]
T1[generate_image]
T2[remove_background]
T3[upscale_image]
T4[vectorize_image]
T5[blend_images]
T6[generate_image_pack]
T7[compare_images]
T8[inspect_image_quality]
T9[edit_image]
T10[vary_image]
end
subgraph Core [π‘οΈ Π―Π΄ΡΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΠΊΡΡΠ°]
Cache[ΠΠ΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ sha256 Hash Cache]
Backoff[Exponential Backoff + Jitter]
Classifier[ΠΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ°ΡΠ°Π»ΡΠ½ΡΡ
ΠΎΡΠΈΠ±ΠΎΠΊ 400]
Snap64[VAE 64-Multiple Dimension Snapping]
end
subgraph Engine [βοΈ ΠΠΈΡΠΏΠ΅ΡΡΠ΅Ρ Π±ΡΠΊΠ΅Π½Π΄ΠΎΠ²]
P_FAL[FAL.ai Queue]
P_REP[Replicate API]
P_CUST[OpenAI / SiliconFlow]
P_COD[ChatGPT Plus/Pro OAuth]
P_GROK[Grok Imagine OAuth]
P_LOC[ComfyUI / A1111]
P_SEA[ByteDance SeaDream]
P_GEM[Google Imagen 3]
end
subgraph Store [πΎ Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈ UI]
Sidecar[.json Sidecar + Parameters tEXt]
A1111[Drag-and-Drop Π² ComfyUI / WebUI]
Card[πΌοΈ ΠΠ°ΡΡΠΎΡΠΊΠ° Π² ΡΠ°ΡΠ΅ Ρ Re-roll, ΠΡΠ°Π²ΠΊΠΎΠΉ, NoBG]
end
Input --> Tools
Tools --> Core
Core --> Engine
Engine --> Store
style Input fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
style Tools fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
style Core fill:#11111b,stroke:#fab387,stroke-width:2px,color:#cdd6f4
style Engine fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
style Store fill:#1e1e2e,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4
```
---
## π οΈ ΠΠΎΠ»Π½ΡΠΉ ΡΠ΅Π΅ΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²
* **`save_image_to_workspace` (#510)**: ΠΠ΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΊΡΠΏΠΎΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π΄ΠΈΡΠΊ ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (`image-.`) Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΠΏΡΡΠ΅ΠΉ (lexical + realpath) ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
* **`compose_baoyu_prompt` (#505)**: 5-ΠΎΡΠ΅Π²ΠΎΠΉ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ ΡΡΠΈΠ»Ρ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΏΡΠΎΠΌΠΏΡΠΎΠ² (Baoyu framework). Π‘ΠΈΠ½ΡΠ΅Π·ΠΈΡΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΏΠΎ 5 Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΠΎΡΡΠΌ: ΡΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΏΠ°Π»ΠΈΡΡΠ°, ΡΡΠ΅Π΄Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, ΡΠ΅ΠΊΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ²Π΅ΡΠ° ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ ΡΠ°ΠΊΡΠΎΠ½ΠΎΠΌΠΈΠΈ.
* **`canvas_state` (#506)**: ΠΠ½ΡΠΏΠ΅ΠΊΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ Ρ
ΠΎΠ»ΡΡΠ° Π²ΠΎΡΠΊΠ±Π΅Π½ΡΠ°: ΡΠΈΠ³ΡΡΡ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΡΠΎΠΈΡΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ (ΠΌΠΎΠ΄Π΅Π»Ρ/ΠΏΡΠΎΠΌΠΏΡ), ΡΠΈΡΡΠ½ΠΊΠΈ ΠΎΡ ΡΡΠΊΠΈ, Π·Π°ΠΌΠ΅ΡΠΊΠΈ ΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅.
* **`view_canvas` (#507)**: ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Ρ
ΠΎΠ»ΡΡΠ° Π² Π²ΠΈΠ΄Π΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ-ΡΠΊΡΠΈΠ½ΡΠΎΡΠ° Π² Π΄ΠΈΠ°Π»ΠΎΠ³ Π΄Π»Ρ ΠΌΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ sketch-to-image Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ.
* **`compare_models_matrix` (#503)**: ΠΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΠΉ Π±Π°ΡΠ» (Shootout). ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΡΠΎΠΌΠΏΡΠ° Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΌΠΎΠ΄Π΅Π»ΡΡ
(Google Imagen 3, FAL FLUX Dev, Replicate FLUX Schnell, Seedream 3, DALL-E 3) Ρ Π°Π΄Π°ΠΏΡΠ΅ΡΠ°ΠΌΠΈ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΉ, Π·Π°ΠΌΠ΅ΡΠΎΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ, ΠΈ ΡΠ±ΠΎΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· Sharp.
* **`search_inspiration_prompts` (#504)**: ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΎΡΡΠ»Π°ΠΉΠ½-ΠΊΠ°ΡΠ°Π»ΠΎΠ³ 970+ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΡ
ΠΏΡΠΎΠΌΠΏΡΠΎΠ² ΠΈΠ· `awesome-gpt-image-2` ΠΈ `handraw-style`. Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΏΠΎ ΡΡΠΈΠ»ΡΠΌ, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌ, ΡΡΠ΅Π½Π°ΠΌ ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²Π°ΠΌ Ρ Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠ°ΡΡ
ΠΎΠ΄ΠΎΠΌ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΡΠ΅ΡΠΈ.
* **`generate_seamless_texture` (#468)**: ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ Π±Π΅ΡΡΠΎΠ²Π½ΡΡ
ΡΠ΅ΠΊΡΡΡΡ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ
ΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ² Π΄Π»Ρ 3D-ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ², ΠΈΠ³Ρ ΠΈ Π²Π΅Π±-ΡΠΎΠ½ΠΎΠ² Ρ ΡΠΎΡΠΎΠΈΠ΄Π°Π»ΡΠ½ΡΠΌ ΡΠ΄Π²ΠΈΠ³ΠΎΠΌ ΠΈ ΡΠ΅ΡΠΊΠΎΠΉ ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡΠ° 3Γ3.
* **`reverse_prompt_and_recreate` (#465)**: ΠΠ±ΡΠ°ΡΠ½ΡΠΉ ΠΈΠ½ΠΆΠΈΠ½ΠΈΡΠΈΠ½Π³ ΠΏΡΠΎΠΌΠΏΡΠ° ΠΏΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ Π΄Π΅ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ, ΠΎΠΏΡΠΈΠΊΠΈ, ΠΏΠ°Π»ΠΈΡΡΡ ΠΈ ΡΡΠΈΠ»Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ.
* **`restore_face_and_details` (#467)**: Π’ΠΎΡΠ΅ΡΠ½Π°Ρ ΡΠ΅ΡΡΠ°Π²ΡΠ°ΡΠΈΡ ΡΠ΅ΡΡ Π»ΠΈΡΠ°, Π³Π»Π°Π· ΠΈ ΠΌΠ΅Π»ΠΊΠΈΡ
Π΄Π΅ΡΠ°Π»Π΅ΠΉ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π·ΠΎΠ½ ΠΈ ΠΏΠ»Π°Π²Π½ΡΠΌ Π±Π΅ΡΡΠΎΠ²Π½ΡΠΌ Π°Π»ΡΡΠ°-Π±Π»Π΅Π½Π΄ΠΈΠ½Π³ΠΎΠΌ.
* **`generate_with_control` (#463)**: ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ Ρ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈ ΡΡΡΡΠΊΡΡΡΠ½ΡΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ ΡΠ΅ΡΠ΅Π· ControlNet (`mode: "canny" | "depth" | "pose" | "sketch"`) Ρ ΠΏΡΠ΅Π΄ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΠΎΠ² ΠΈ ΠΊΠ°ΡΡ Π³Π»ΡΠ±ΠΈΠ½ Π½Π° Sharp.
* **`generate_turnaround_sheet` (#464)**: Π‘ΠΈΠ½ΡΠ΅Π· ΠΏΠ°Π½ΠΎΡΠ°ΠΌΠ½ΡΡ
ΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΡ
Π»ΠΈΡΡΠΎΠ² ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ ΠΈ 3D-Π°ΡΡΠ΅ΡΠΎΠ² Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ°ΠΊΡΡΡΠΎΠ² (`front`, `side`, `back`, `three_quarter`) Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π½Π°ΡΠ΅Π·ΠΊΠΎΠΉ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΠΈ JSON-ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠΌ.
| ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ | ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ |
|---|---|---|
| **`outpaint_image`** | ΠΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Ρ
ΠΎΠ»ΡΡΠ° Π² Π»ΡΠ±ΡΡ
Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
(`top`/`bottom`/`left`/`right`) Ρ Π±Π΅ΡΡΠΎΠ²Π½ΡΠΌ ΡΠΈΠ½ΡΠ΅Π·ΠΎΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ ΡΡΠ΅Π½Ρ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΌΠ°ΡΠΎΠΊ (#459) | `image`, `prompt`, `directions` (`top`/`bottom`/`left`/`right`), `feather`, `provider`, `seed` |
| **`async_generate_image`** | ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠΉ Π²ΡΠ΄Π°ΡΠ΅ΠΉ `task_id`, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° ΠΈ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΌ Π±ΡΠΊΠΎΡΡΠΎΠΌ (#460) | `prompt`, `task_id`, `wait` (`true`/`false`), `timeout_seconds`, `image_size`, `provider` |
| **`translate_image_text`** | ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½Π°Ρ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡ
(RU, EN, ZH) Ρ OCR, inpaint-ΠΎΡΠΈΡΡΠΊΠΎΠΉ ΡΠΎΠ½Π° ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ ΡΠΈΠΏΠΎΠ³ΡΠ°ΡΠΈΠΊΠΈ (#454) | `image`, `target_lang`, `source_lang`, `regions`, `font_color`, `font_family`, `inpaint_prompt` |
| **`render_wireframe_asset`** | Π‘ΠΈΠ½ΡΠ΅Π· ΡΠΈΡΡΠΎΠ²ΡΡ
Π΄ΠΈΠ·Π°ΠΉΠ½-Π°ΡΡΠ΅ΡΠΎΠ² ΠΈΠ· ΠΊΠ°ΡΠΊΠ°ΡΠΎΠ² ΠΈ UI-ΠΌΠ°ΠΊΠ΅ΡΠΎΠ² Ρ ΠΏΡΠ΅ΡΠ΅ΡΠ°ΠΌΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½-ΡΠΈΡΡΠ΅ΠΌ ΠΈ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°Π½Π½ΡΠΌ fidelity (#455) | `wireframe_image`, `design_system` (`modern_saas`/`dark_glassmorphism`/`brutalist`/`apple_minimal`), `fidelity`, `style`, `prompt` |
| **`generate_drawio_diagram`** | ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅ΠΌΡΡ
XML-ΡΡ
Π΅ΠΌ Draw.io / diagrams.net (`.drawio`) Ρ ΡΠΈΡΡΡΠΌ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠΌ SVG-ΠΏΡΠ΅Π²ΡΡ (#451) | `title`, `nodes`, `edges`, `layout` (`horizontal`/`vertical`/`grid`/`tree`), `theme` (`light`/`dark`/`blueprint`/`corporate`/`nord`), `output_format` |
| **`generate_image`** | ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ | `prompt`, `image_size`, `seed`, `style_preset`, `negative_prompt`, `guidance_scale`, `steps`, `sampler_name`, `count` |
| **`set_style_anchor`** | Π€ΠΈΠΊΡΠ°ΡΠΈΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΡΠ΅ΡΡΠΈΠΈ (ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΡΡΠΌ, ΠΏΠ°Π»ΠΈΡΡΠ°, ΡΠ²Π΅Ρ) (#283) | `mode` (`character`/`style`), `image`, `description`, `strength`, `clear` |
| **`generate_ui_asset`** | ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ
Π°ΡΡΠ΅ΡΠΎΠ² Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈ Π°Π²ΡΠΎ-ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡΡ (#284) | `prompt`, `asset_type`, `layout_composition`, `transparent`, `output_format` |
| **`generate_style_matrix`** | Π‘Π΅ΡΠΊΠ° 2x2 Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΈΠ½Π³Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠ° Π² 4 ΡΡΠΈΠ»ΡΡ
ΡΠΎ ΡΠ»Π΅ΠΏΡΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ (#286) | `prompt`, `styles`, `blind_mode`, `output_format` |
| **`edit_image`** | ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ / inpainting Ρ Π°Π²ΡΠΎ-ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π° (#142, #144, #145) | `prompt`, `image` (ΠΏΠΎ ΡΠΌΠΎΠ»Ρ. `latest`), `mask`, `strength` |
| **`vary_image`** | ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ (#143, #144) | `image` (ΠΏΠΎ ΡΠΌΠΎΠ»Ρ. `latest`), `prompt`, `variation_strength` (0.1β0.9), `count` |
| **`remove_background`** | Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ½Π° Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΠ³ΠΎ PNG | `image`, `model`, `output_name` |
| **`upscale_image`** | Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π² 2x / 4x Ρ Π΄Π΅ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ | `image`, `scale` (2/4), `prompt`, `creativity` |
| **`vectorize_image`** | ΠΠ΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΡΡΡΠ° Π² ΡΠΈΡΡΡΠΉ SVG Ρ ΠΊΠ²Π°Π½ΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°Π»ΠΈΡΡΡ | `image`, `color_mode`, `paletteSize` |
| **`blend_images`** | Π‘ΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² Π΅Π΄ΠΈΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ | `images`, `weights`, `prompt` |
| **`generate_image_pack`** | ΠΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠΎΡΠΌΠ°ΡΠΎΠ² 1:1, 16:9, 9:16 Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΠ½ΡΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² | `prompt`, `aspect_ratios` |
| **`generate_responsive_mockups`** | ΠΠ°ΠΊΠ΅ΡΠ½Π°Ρ Π°Π΄Π°ΠΏΡΠΈΠ²Π½Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ UI-mockup ΠΏΠΎΠ΄ Mobile 9:16, Tablet 3:4 ΠΈ Desktop 16:9 Ρ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΏΠ°Π»ΠΈΡΡΠΎΠΉ/ΡΡΠΈΠ»Π΅ΠΌ; ΡΠ°Π±Ρ Π² toolview (#173) | `prompt`, `devices`, `style_preset`, `palette_colors`, `seed` |
| **`compare_images`** | Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ
ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ (Π΄ΠΎΠ»Ρ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ) | `image_a`, `image_b` |
| **`inspect_image_quality`** | ΠΡΠ΄ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°, ΡΠ°ΡΡΠ΅Ρ ΡΠ΅Π·ΠΊΠΎΡΡΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π΅ΡΠ΅ΠΊΡΠΎΠ² | `image`, `expected_elements` |
---
## π‘οΈ ΠΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ (v0.10.0)
* **ΠΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Backoff Ρ Jitter**: ΠΎΠΏΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ (FAL, Replicate, ComfyUI) Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ, ΠΈΡΠΊΠ»ΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠΈ `429 Too Many Requests`.
* **ΠΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π² Fallback Cascade**: ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ (Content Policy, 400 Bad Request, NSFW) ΠΎΡΡΠ΅ΠΊΠ°ΡΡΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΏΡΡΡΡΡ ΡΡΠ°ΡΡ Π΄Π΅Π½Π΅Π³ Π½Π° ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ
ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°Ρ
.
* **ΠΠ΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Ρ
ΡΡ-ΠΊΡΡ**: ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΏΡΠΎΠΌΠΏΡΠΎΠΌ, ΠΌΠΎΠ΄Π΅Π»ΡΡ ΠΈ ΡΠΈΠ΄ΠΎΠΌ ΠΎΡΠ΄Π°ΡΡΡΡ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΡΡΠ° Ρ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΡΠΎΠΈΠΌΠΎΡΡΡΡ API.
* **Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ComfyUI / Automatic1111**: ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π²ΡΠΈΠ²Π°ΡΡΡΡ Π² PNG `tEXt` ΡΠ°Π½ΠΊΠΈ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ `Parameters: Prompt\nNegative prompt: ...\nSteps: ... Seed: ...`, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π½Π°ΡΠΈΠ²Π½ΡΠΉ Drag-and-Drop.
* **ΠΡΠ°ΡΠ½ΠΎΡΡΡ 64**: Π²ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΊΡΡΠ³Π»ΡΡΡΡΡ Π΄ΠΎ ΠΊΡΠ°ΡΠ½ΡΡ
64 Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΠΉ VAE.
* **ΠΠ±ΠΎΠ³Π°ΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅ΡΠ΅ΡΡ ΡΡΠΈΠ»Π΅ΠΉ**: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΡΠΈΠ»Ρ Π² `STYLE_PRESETS` ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ `negative_prompt` ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠΉ `guidance_scale`.
---
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.8: ΡΠ½ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Lossless JSON, Dual-Output ΠΈ ΡΡΡΠΎΠ³Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ (#199)
- **Π£Π½ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Lossless JSON ΠΈ Dual-Output**: ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ `upscale_image`, `remove_background`, `blend_images`, `vectorize_image` ΡΠ΅ΠΏΠ΅ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ `toLosslessJson` ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ `summary` Ρ ΠΏΡΠ΅Π²ΡΡ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ
LLM.
- **Π‘ΡΡΠΎΠ³Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ**: Π ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
`extract_design_tokens`, `image_to_css_gradient` ΠΈ `check_image_contrast` Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠ²Π½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ (`Image not found or unreadable: `).
- **Π‘ΠΊΠ²ΠΎΠ·Π½ΠΎΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ΅ΡΡ-ΡΡΡΡ `test/tool-consistency.test.mjs` Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½- ΠΈ PWA-ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ².
## π ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ v0.10.4: ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» Cordis, ΠΏΠΎΠ»Π½ΠΎΡΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ
- **ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» Cordis (#136)**: ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π²ΡΠ΅Ρ
7 ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠ±ΡΡΠ½ΡΡΠ° Π² `ctx.effect` Π΄Π»Ρ ΡΡΠ°ΡΠ½ΠΎΠΉ ΠΎΡΠΏΠΈΡΠΊΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°.
- **ΠΠΎΠ»Π½ΠΎΡΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π² GUI (#137)**: Π² ΠΊΠ°ΡΡΠΎΡΠΊΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΠΎΠ»Ρ Π΄Π»Ρ Replicate, SeaDream, Gemini, Local ComfyUI/A1111, ΠΏΡΠ΅ΡΠ΅ΡΠΎΠ² ΡΡΠΈΠ»Π΅ΠΉ ΠΈ LLM-ΡΠ»ΡΡΡΠΈΡΠ΅Π»Ρ.
- **ΠΠ°Π½ΠΈΡΠ΅ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ (#138)**: Π² `peerDependencies` Π·Π°Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠΎΠ²Π°Π½Ρ Π²ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ»ΡΠΆΠ±Ρ ΡΠ΄ΡΠ° (`host-webserver`, `settings`, `llm`, `system-prompt`).
- **ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (#139)**: ΠΈΠ· `FalImageCard` ΡΠ΄Π°Π»ΡΠ½ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΌΡΡΡΠ²ΡΠΉ ΡΡΠ΅ΠΉΡ.
- **100% ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ (#140)**: ΡΡΡΡΠ°Π½Π΅Π½Ρ Π·Π°Ρ
Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ Π½Π° ΡΡΡΡΠΊΠΈΠΉ, Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΠΈ ΠΊΠΈΡΠ°ΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊΠΈ.
### π Π§ΡΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π² v0.12.10 (#480, #481, #482, #483)
* **ΠΠ°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠ° Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ° (#480)**: Π£ΡΡΡΠ°Π½Π΅Π½Ρ ΠΏΡΡΡΡΠ΅ ΠΎΡΠ²Π΅ΡΡ 400 Bad Request Π½Π° ΠΌΠ°ΡΡΡΡΡΠ°Ρ
DSH ΠΈΠ·-Π·Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π½Π΅ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ connection ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠΊΡΠΈ Cordis. ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ `safeJsonHandler` ΠΈ `getConnection` Π½Π° Π²ΡΠ΅Ρ
ΠΌΠ°ΡΡΡΡΡΠ°Ρ
Π΄Π»Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ JSON-ΠΎΡΠ²Π΅ΡΠ°.
* **Π£ΡΠΈΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ (#481)**: Π£ΡΡΡΠ°Π½ΡΠ½ ΠΎΠ±Ρ
ΠΎΠ΄ `requireApproval` ΡΠ°ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `approved` ΡΠ΄Π°Π»ΡΠ½ ΠΈΠ· ΡΡ
Π΅ΠΌΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΠΎΡΠΈΡΠ΅Π½Π° ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π² ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π΅ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°, Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ ΠΎΠ±Ρ
ΠΎΠ΄ ΡΠ΅ΡΠ΅Π· `approved: true` ΠΈ `force: true`.
* **Π‘ΡΡΠΎΠ³Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Origin Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π·Π°ΡΠΈΡΠ° ΠΎΡ CSRF (#482)**: ΠΠ»Ρ Π²ΡΠ΅Ρ
ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ (POST, PUT, DELETE) Π²Π²Π΅Π΄Π΅Π½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° `Origin` ΠΈΠ»ΠΈ `Referer` Π½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ `Host`, ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ°Ρ ΠΎΠ±Ρ
ΠΎΠ΄ ΡΠ΅ΡΠ΅Π· loopback-ΠΌΠΎΡΡΡ ΠΈ ΠΏΡΠΎΠΊΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, `dsh-lanmode`).
* **ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΎΡΠΈΡΡΠΊΠ° ΡΠΊΡΠΏΠΎΡΡΠΎΠ² (#483)**: ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ Π² ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΏΡΡΠ΅ΠΉ Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΏΡΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π·Π°ΡΠΈΡΠ° ΡΠ΅ΡΡΠΎΠ² Π² ΡΠ΅Π»ΠΈΠ·Π½ΡΡ
Π°ΡΡ
ΠΈΠ²Π°Ρ
, ΡΠ΄Π°Π»Π΅Π½Ρ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠΊΡΠΏΠΎΡΡΡ.
### π Π§ΡΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π² v0.10.16
* **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Fallback ΡΠ΅ΡΠ²ΠΈΡΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ (#214)**: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ `saveAttachmentSafe` Π²ΠΎ Π²ΡΠ΅Ρ
8 Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
(`generate_image`, Π²Π°ΡΠΈΠ°ΡΠΈΠΈ, `remove_background`, `upscale_image`, `blend_images` ΠΈ Π΄Ρ.). ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π² Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π±Π΅Π· ΡΠ΅ΡΠ²ΠΈΡΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΡΠΈ ΡΠ±ΠΎΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΡΠ°ΠΉΠ» Π½Π° Π΄ΠΈΡΠΊ ΠΈ ΠΎΡΠ΄Π°Π΅Ρ ΠΏΡΡΠΈ Π±Π΅Π· ΠΏΠ°Π΄Π΅Π½ΠΈΡ.
* **Π‘ΡΡΠΎΠ³Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ HTTP-ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ**: Π ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ `/dsh-image-gen/image` ΡΡΠΈΠ»Π΅Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° query-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (`b`, `w`, `h`), Π·Π°ΡΠΈΡΠ°ΡΡΠ°Ρ ΠΎΡ `NaN` ΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π», Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ°Ρ ΡΡΠ΅ΡΠΊΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ
ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΎΠΊ ΠΏΡΠΈ 404/500 ΠΎΡΠΈΠ±ΠΊΠ°Ρ
.
* **ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π½ΠΎΠ΄ ComfyUI**: ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ `extractComfyNodeErrors`, ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ
Π½ΠΎΠ΄ ΠΈΠ· `/history/{pid}` ΠΏΡΠΈ ΡΠ±ΠΎΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°.
* **ΠΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Custom/OpenAI API**: ΠΡΠΈΠ±ΠΊΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ
ΡΠ»ΡΠ·ΠΎΠ² ΠΈ API ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· `formatErrorMessage`, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ `[object Object]` ΠΈΠ»ΠΈ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΡ
Π΄Π°ΠΌΠΏΠΎΠ² JSON.
* **Π‘ΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΠΈΡΡΠΎΡΠΈΠΈ ΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΡΡΠ°**: ΠΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΠΊΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
sidecar ΠΈ ΠΈΡΡΠΎΡΠΈΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΉ.
* **Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²**: ΠΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Π½Π°Π±ΠΎΡ `test/batch4-hardening.test.mjs`, ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΠΎΠ² Π²ΡΡΠΎΡΠ»ΠΎ Π΄ΠΎ **128 (100% pass)**.
### π Π§ΡΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π² v0.10.15
* **ΠΠ±Ρ
ΠΎΠ΄ Loop Guard ΠΏΡΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΌ Π»ΠΈΠΌΠΈΡΠ΅ (#212)**: ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ `loopGuardLimit: 0` (ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΡ) ΡΡΠ°Π±Π°ΡΡΠ²Π°Π» `Math.max(1, 0) = 1` ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π» Π²ΡΠ·ΠΎΠ²Ρ Π½Π° 2-ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ 0 Π»ΠΈΠΌΠΈΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ.
* **Π£ΡΠΈΠ»Π΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ²**: Π `sanitizeErrorAndLogs` Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Replicate (`r8_...`) ΠΈ ΠΊΠ»ΡΡΠ΅ΠΉ Google Gemini (`AIza...`).
* **Π£ΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΡΡΠ°**: ΠΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
LRU ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΡΡΠ° β ΠΎΡΠΈΠ±ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΡΠ±ΡΠΎΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΡ
Π±Π°ΠΉΡΠΎΠ² ΠΊΡΡΠ°.
* **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²**: Π `resolveConversationImage` Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°, Π·Π°ΠΏΡΠ΅Ρ 0-Π±Π°ΠΉΡΠ½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ 50 ΠΠ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ.
* **ΠΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Toolview Π΄Π»Ρ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ**: ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ `vectorize_image` ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ SVG Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ `ctx.attachments` ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ `url`, ΡΡΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅Ρ ΠΊΠ°ΡΡΠΎΡΠΊΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π² ΡΠ°ΡΠ΅.
* **ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ SVG-ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ**: `optimizeSvgContent` ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΠ΅Π³Π° `