# Многоходовой диалог без памяти на сервере

Курс: Claude API для разработчиков — https://zero2claude.ru/learn/api
Канонический URL: https://zero2claude.ru/learn/api/1-2-mnogohodovoy-dialog

API не помнит прошлые запросы — контекст держим, отправляя всю историю messages заново.

## API не помнит ничего

Claude API — **stateless**: сервер не хранит ваш диалог между запросами. Каждый вызов `/v1/messages` он обрабатывает с чистого листа. Если первым запросом ты спросил «как оформить возврат?», а вторым — «а сколько это займёт?», то во втором запросе модель *не видит* первого. Для неё «это» — пустота.

Значит, многоходовой диалог = **ты сам собираешь историю** и отправляешь её целиком в каждом новом запросе.

## Как собрать историю

Добавляй и вопрос пользователя, и ответ ассистента в один и тот же массив `messages`, чередуя роли `user` и `assistant`:

```
from anthropic import Anthropic
client = Anthropic()

messages = [
    {"role": "user", "content": "Как оформить возврат товара?"},
]
resp = client.messages.create(
    model="claude-opus-4-8", max_tokens=1024, messages=messages
)
# кладём ответ обратно в историю
messages.append({"role": "assistant", "content": resp.content[0].text})
# следующий ход — снова шлём ВЕСЬ список
messages.append({"role": "user", "content": "А сколько это займёт?"})
resp2 = client.messages.create(
    model="claude-opus-4-8", max_tokens=1024, messages=messages
)
```

Первое сообщение всегда `user`, дальше роли чередуются. Ответ модели лежит в `resp.content` — это **массив блоков**, текст берут из блока с `type == "text"`, а не из `content[0]` вслепую.

Чем длиннее история, тем больше токенов на входе при каждом запросе — а значит дороже. Старые сообщения иногда обрезают или сжимают, чтобы не платить за весь диалог снова и снова.
