---
id: collections-post-id-blocks-blockid-decompose
title: "POST /api/collections/:id/blocks/:blockId/decompose"
domain: collections
kind: api-method
http: "POST /api/collections/:id/blocks/:blockId/decompose"
---

# POST /api/collections/:id/blocks/:blockId/decompose {#collections-post-id-blocks-blockid-decompose}

## Сводка

| Поле | Значение |
|---|---|
| **HTTP** | `POST /api/collections/:id/blocks/:blockId/decompose` |
| **Auth** | `—` |
| **Scope токена** | `read_write` |
| **PG-функции** | `api.decompose_collection_block` |
| **Таблицы** | `collection_block`, `collection_edge`, `generation_job` |
| **SRM** | SRM-360 |
| **RP (права)** | — |
| **Файл роута** | `server/routes/collections.js` |
| **Статус** | done |

**Аргументы запроса** (best-effort из хендлера; путь-параметры опущены):

| Аргумент | Где | Обяз. | Заметка |
|---|---|---|---|
| `apply` | body | | _подтвердить_ |
| `guidance` | body | | _подтвердить_ |
| `pro` | body | | _подтвердить_ |
| `targetCount` | body | | _подтвердить_ |
| `mode` | query | | _подтвердить_ |

**Коды ответов/ошибок** (из хендлера): `202`, `429`, `500` (+ `200`) — _уточнить причины вручную_

**Scope токена:** `read_write`. Требует прав collection admin.

**Тело запроса** (`Content-Type: application/json`):

| Аргумент | Тип | Обяз. | Описание |
|---|---|---|---|
| `guidance` | string | нет | Инструкция для LLM: как декомпозировать блок |
| `targetCount` | number | нет | Желаемое число подблоков |
| `pro` | boolean | нет | `true` → качество pro (Best-of-N), `false` → fast (дефолт) |

**Query-параметры:**

| Параметр | Описание |
|---|---|
| `mode=async` | Асинхронный режим (только с Bearer-токеном). Возвращает `202 {job_id, poll}` — опрашивать через `GET /api/collections/:id/jobs/:jobId` |

**Заголовки:**

| Заголовок | Описание |
|---|---|
| `If-Match: <updated_at>` | Защита от TOCTOU. При async — рекомендуется. Если коллекция изменилась с момента снятия — SSE ошибка `{code:"stale"}` |

**Режим SSE (без `?mode=async`):**

Ответ — поток `text/event-stream`. События:
- `block` — промежуточные данные о подблоках
- `done` — успешное завершение
- `error` — ошибка (`{code:"stale"}` при If-Match fail; `{code:...}` при LLM-ошибке)

**Режим async:**

```
POST /api/collections/{id}/blocks/{blockId}/decompose?mode=async
Authorization: Bearer <token>
If-Match: <updated_at>
Content-Type: application/json

{"guidance": "Разбить на 3-4 атомарных шага", "targetCount": 3}
```

Ответ `202`:
```json
{"job_id": "uuid", "poll": "/api/collections/{id}/jobs/{job_id}"}
```

**Affordances:** у блока с ненулевым `decompose_count = 0` может быть affordance `decompose` — если коллекция поддерживает декомпозицию. Смотри `GET /api/collections/:id` или GET блока.

<!-- gen:start:related -->
## Связанные
- Экраны: [Редактор коллекции](../screens/collection-editor.md#collections-screen-collection-editor)
- [Конвенции](../../../shared/conventions.md#conventions) · [Роли](../../../shared/roles.md#roles) · [Ошибки](../../../shared/errors.md#errors) · [Глоссарий](../../../shared/glossary.md#glossary)
<!-- gen:end:related -->

---

Human view: https://docs.vnimanie.ai/specbuilder/v1/domains/collections/api/post-id-blocks-blockid-decompose/