# Messages (Anthropic)

> POST /v1/messages в формате Anthropic Messages, который используют SDK Anthropic и Claude Code.


Запрос и ответ Anthropic Messages на моделях NotHoly. SDK Anthropic принимают base URL `https://api.notholy.com`, без `/v1`. Работают и `x-api-key`, и `Authorization: Bearer`.

```endpoint
POST https://api.notholy.com/v1/messages
```

## Запрос

| Поле | Тип | Обязательное | Примечания |
|---|---|---|---|
| `model` | string | Да | ID модели, например `notholy-specter` |
| `max_tokens` | number | Да | Больше 0. Не больше максимального выхода модели |
| `messages` | array | Да | Ходы `user` и `assistant` с блоками `text`, `image`, `tool_use` и `tool_result`. Ходы `system` между сообщениями тоже принимаются |
| `system` | string или array | Нет | Только текстовые блоки |
| `tools` | array | Нет | Ваши собственные инструменты с `input_schema`. Серверные инструменты вроде поиска в вебе пропускаются |
| `tool_choice` | object | Нет | `auto`, `any`, `none` или `{"type": "tool", "name": …}` |
| `thinking` | object | Нет | `{"type": "enabled", "budget_tokens": N}` или `{"type": "adaptive"}` включает рассуждения |
| `output_config.effort` | string | Нет | Глубина рассуждений; приоритетнее `thinking`. Приводится к ближайшему уровню, который есть у модели |
| `stop_sequences`, `temperature`, `top_p` | | Нет | Передаются модели |
| `stream` | boolean | Нет | `true` возвращает события стрима Anthropic |

`POST /v1/messages/count_tokens` принимает то же тело и возвращает `{"input_tokens": n}` — оценку без вызова модели.

## Ответ без стриминга

```json
{
  "id": "msg_3Jd8a",
  "type": "message",
  "role": "assistant",
  "model": "notholy-specter",
  "content": [
    { "type": "thinking", "thinking": "…", "signature": "nh" },
    { "type": "text", "text": "A Sigma rule is a generic detection rule in YAML…" }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": { "input_tokens": 24, "output_tokens": 131, "cache_read_input_tokens": 0, "cache_creation_input_tokens": 0 }
}
```

- `stop_reason` принимает значения `end_turn`, `max_tokens` или `tool_use`.
- Блоки `thinking`, которые вы отправляете обратно в истории, отбрасываются до того, как их увидит модель.
- `cache_control` принимается и игнорируется.
- PDF и файловые источники `document` возвращают `400 unsupported_parameter`. Отправляйте файлы через чат или `POST /v1/files`.
- В стриме вызовы инструментов приходят целиком: один `input_json_delta` с полными аргументами. Во время долгих пауз приходят события `ping`.

## Пример

```bash test
curl https://api.notholy.com/v1/messages \
  -H "x-api-key: $NOTHOLY_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "notholy-specter", "max_tokens": 512, "messages": [{"role": "user", "content": "What is a Sigma rule?"}]}'
```

```python test
import os
from anthropic import Anthropic

client = Anthropic(base_url="https://api.notholy.com", api_key=os.environ["NOTHOLY_API_KEY"])

with client.messages.stream(
    model="notholy-specter",
    max_tokens=512,
    messages=[{"role": "user", "content": "Write a Sigma rule title for encoded PowerShell."}],
) as s:
    for text in s.text_stream:
        print(text, end="")
print()
```

Подсчёт токенов перед отправкой:

```bash test
curl https://api.notholy.com/v1/messages/count_tokens \
  -H "x-api-key: $NOTHOLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "notholy-specter", "messages": [{"role": "user", "content": "What is a Sigma rule?"}]}'
```

## Ошибки

Ошибки приходят в формате Anthropic, `{"type": "error", "error": {"type", "message"}}`: `invalid_request_error` (400) · `authentication_error` (401) · `billing_error` (402) · `permission_error` (403) · `not_found_error` (404) · `rate_limit_error` (429) · `request_too_large` (413) · `api_error` (500, 502, 504) · `overloaded_error` (503). См. [Ошибки](/ru/guides/errors).
