# Без хранения данных (ZDR)

Отправляйте запрос только провайдерам, которые не хранят промпты и ответы, и узнайте, что хранит сам роутер.

**Без хранения данных (ZDR, zero data retention)** означает, что провайдер, на котором работает модель, не хранит ваши промпты и ответы после того, как ответил, и не обучает на них модели.

По умолчанию запрос в глобальном регионе может уйти любому провайдеру модели, в том числе тем, кто какое-то время хранит запросы или может использовать их для улучшения своих моделей. Чтобы исключить таких провайдеров, запросите ZDR.

## Запрос с ZDR

Добавьте `"provider": {"zdr": true}`:

```bash
curl https://router.nodul.ru/api/v1/chat/completions \
  -H "Authorization: Bearer $NODUL_ROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-3-4b-it",
    "provider": {"zdr": true},
    "messages": [{"role": "user", "content": "Summarize this contract: …"}]
  }'
```

```python
import os
from openai import OpenAI

client = OpenAI(base_url="https://router.nodul.ru/api/v1", api_key=os.environ["NODUL_ROUTER_API_KEY"])
completion = client.chat.completions.create(
    model="google/gemma-3-4b-it",
    messages=[{"role": "user", "content": "Summarize this contract: …"}],
    extra_body={"provider": {"zdr": True}},
)
print(completion.choices[0].message.content)
```

```js
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://router.nodul.ru/api/v1", apiKey: process.env.NODUL_ROUTER_API_KEY });
const completion = await client.chat.completions.create({
  model: "google/gemma-3-4b-it",
  messages: [{ role: "user", content: "Summarize this contract: …" }],
  // @ts-expect-error: router field, not part of the OpenAI types
  provider: { zdr: true },
});
console.log(completion.choices[0].message.content);
```

Что с этим делает роутер:

1. До вызова провайдера он оставляет только модели, у которых есть хотя бы один ZDR-эндпоинт. Модель без него дает `400`, поэтому запрос никогда не переключится на модель, которая хранит данные, даже через список `models`.
2. Флаг передается в глобальный регион, и тот выполняет запрос только на ZDR-эндпоинтах модели.
3. Регион Россия для ZDR-запросов не используется: правила хранения данных его провайдеров не подтверждены, а неизвестные правила роутер считает хранящими данные.

## Как найти модели с ZDR

- В [каталоге](/models) включите фильтр **Без хранения данных (ZDR)**: у таких моделей есть соответствующий значок.
- В `GET /api/v1/models` смотрите на `routes[].zdr`:

```bash
curl -s https://router.nodul.ru/api/v1/models | jq -r '.data[] | select(any(.routes[]; .zdr)) | .id'
```

Список регулярно обновляется по данным провайдеров: модель может получить или потерять ZDR.

## ZDR или запрет сбора данных

| Поле                        | Исключает                                                                                                                                                                                       |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"zdr": true`               | Всех провайдеров, которые хранят промпты или ответы хоть сколько-нибудь. Самый строгий вариант.                                                                                                 |
| `"data_collection": "deny"` | Провайдеров, которые могут хранить данные для обучения или продавать их; провайдер все еще может недолго хранить логи, например для проверок на злоупотребления. Также исключает регион Россия. |

Оба поля можно сочетать. `"zdr": false` и `"data_collection": "allow"` ничего не меняют.

## Что хранит сам роутер

ZDR касается провайдера. Роутер хранит:

- **метаданные запроса** для оплаты и логов: время, модель, ключ, токены, стоимость, статус. Никогда не содержимое;
- **содержимое запросов и ответов, только если включено логирование содержимого** в пространстве Router. По умолчанию оно выключено; владелец или администратор пространства включает его в настройках и выбирает срок хранения (от 1 до 30 дней).

> **Важно:** `"zdr": true` не выключает логирование содержимого в вашем пространстве Router. Если пространство хранит содержимое, роутер сохранит запрос и ответ на выбранное число дней. Чтобы получить ZDR на всем пути, выключите логирование содержимого в настройках пространства или используйте отдельное пространство без него.

Роутер никогда не передает провайдерам ваши заголовки, ваш ключ или название вашего приложения.

## Ошибки

| Статус       | Сообщение                                                       | Причина                                                                                                   |
| ------------ | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `400`        | `no route of <model> offers zero data retention (provider.zdr)` | У модели нет ZDR-эндпоинта. Выберите модель со значком.                                                   |
| `400`        | `no route of <model> satisfies provider.data_collection "deny"` | Модель есть только в регионе Россия.                                                                      |
| `400`        | `provider.zdr must be a boolean`                                | Передайте `true` или `false`, а не строку.                                                                |
| `404`, `503` | Сообщение провайдера                                            | ZDR-эндпоинты модели временно недоступны. Повторите позже или добавьте резервную модель с ZDR в `models`. |

## Цена

ZDR-эндпоинт модели может стоить дороже цены в каталоге: там указана самая низкая цена модели. Вы платите фактическую стоимость: `usage.cost` в ответе точен.

Кеширование промптов в памяти провайдера не считается хранением: модели с ZDR тоже могут давать скидки за кеш.
