API

HarmonyAI API

Шлюз реализует ядро Anthropic Messages API: поля system, messages, tools, max_tokens, temperature, stream и стриминг событий SSE. Claude Code, Cursor, OpenCode и любой клиент с настраиваемым адресом сервера подключаются штатно — меняются только адрес и ключ. Отдельные расширения протокола (например, серверные инструменты и кэширование промптов) могут не поддерживаться; актуальный список возможностей — в справочнике ниже. Оплата — по фактическому числу токенов с баланса API.

https://api.harmonyai.ru
Личный кабинет →

Ключ показывается один раз — сразу после создания.

Быстрый старт

Три шага до первого ответа

Создайте ключ

Кнопка выше или кабинет. Формат — sk-h-….

Пополните баланс

Баланс API отдельный от подписки Pro. Пополнение — в кабинете, от 100 ₽.

Укажите адрес

Замените базовый URL клиента на https://api.harmonyai.ru и выберите модель.

curl https://api.harmonyai.ru/v1/messages \
  -H "Authorization: Bearer $HARMONY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "adanatos",
    "max_tokens": 1024,
    "messages": [
      { "role": "user", "content": "Привет! Объясни в двух предложениях, что такое SSE." }
    ]
  }'

Ключ вместо $HARMONY_API_KEY подставлять в командную строку не стоит: он останется в истории оболочки. Держите его в переменной окружения или в файле настроек клиента.

Подключение

Выберите свой инструмент

Везде принцип один: адрес сервера — https://api.harmonyai.ru, ключ — sk-h-…, модель — dynatos или adanatos. Ниже — точные шаги для каждого клиента.

Claude Code

CLI

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

  1. Установите Claude Code

    Нужен Node.js 18 или новее.

    npm install -g @anthropic-ai/claude-code
  2. Укажите адрес и ключ

    macOS и Linux

    export ANTHROPIC_BASE_URL="https://api.harmonyai.ru"
    export ANTHROPIC_AUTH_TOKEN="sk-h-ваш-ключ"
    export ANTHROPIC_MODEL="dynatos"
    export ANTHROPIC_DEFAULT_HAIKU_MODEL="adanatos"

    Windows, PowerShell

    $env:ANTHROPIC_BASE_URL="https://api.harmonyai.ru"
    $env:ANTHROPIC_AUTH_TOKEN="sk-h-ваш-ключ"
    $env:ANTHROPIC_MODEL="dynatos"
    $env:ANTHROPIC_DEFAULT_HAIKU_MODEL="adanatos"
  3. Запустите
    claude

    Модель на ходу переключает флаг --model или команда /model.

  4. Чтобы не задавать переменные каждый раз

    Перенесите их в ~/.claude/settings.json — файл сильнее оболочки.

    {
      "env": {
        "ANTHROPIC_BASE_URL": "https://api.harmonyai.ru",
        "ANTHROPIC_AUTH_TOKEN": "sk-h-ваш-ключ",
        "ANTHROPIC_MODEL": "dynatos",
        "ANTHROPIC_DEFAULT_HAIKU_MODEL": "adanatos",
        "ANTHROPIC_DEFAULT_SONNET_MODEL": "dynatos",
        "ANTHROPIC_DEFAULT_OPUS_MODEL": "dynatos"
      }
    }
Зачем «лишние» переменные. Часть служебных задач Claude Code выполняет «дешёвой» моделью и запрашивает её по имени из семейства Haiku. Такой модели у нас нет, поэтому без ANTHROPIC_DEFAULT_HAIKU_MODEL в ответ придёт ошибка 404. По той же причине полезны ANTHROPIC_DEFAULT_SONNET_MODEL и ANTHROPIC_DEFAULT_OPUS_MODEL.

Про ANTHROPIC_AUTH_TOKEN. Его значение уходит в заголовок Authorization: Bearer — как и ждёт шлюз. Переменная ANTHROPIC_API_KEY отправляется в x-api-key; он тоже принимается, но для ключей sk-h-… первый вариант привычнее.

Клиента нет в списке? Подойдёт любой, у которого есть провайдер Anthropic и возможность заменить адрес сервера: https://api.harmonyai.ru, ключ sk-h-…, модель dynatos или adanatos.

Справочник

Эндпоинты и заголовки

Авторизация

ЗаголовокЗначение
AuthorizationBearer sk-h-…
x-api-keysk-h-… — альтернатива, используется SDK
anthropic-version2023-06-01. Можно не передавать — шлюз подставит сам
Content-Typeapplication/json

Достаточно одного из двух первых заголовков. Ключ проверяется по хешу; отозванный или удалённый ключ перестаёт работать сразу.

POST /v1/messages

Основной эндпоинт. По умолчанию отвечает потоком (text/event-stream).

ПолеТипОписание
modelstringОбязательно. dynatos или adanatos
max_tokensintegerОбязательно. Ограничивается пределом модели (см. таблицу ниже)
messagesarrayОбязательно. Роли user и assistant; содержимое — строка или блоки text, image, tool_use, tool_result
systemstring / arrayСистемная инструкция
streambooleantrue по умолчанию. false — один JSON-ответ
temperaturenumberПередаётся модели как есть
top_pnumberПередаётся модели как есть
stop_sequencesarrayДо четырёх строк
toolsarrayОписания инструментов с input_schema
tool_choiceobjectauto, any, none, {"type":"tool","name":"…"}
thinkingobject{"type":"enabled","budget_tokens":N} — включает режим размышления. Больше бюджет — выше уровень усилий модели

Ответ без потока:

{
  "id": "msg_…",
  "type": "message",
  "role": "assistant",
  "model": "adanatos",
  "content": [ { "type": "text", "text": "…" } ],
  "stop_reason": "end_turn",
  "usage": { "input_tokens": 24, "output_tokens": 118 }
}

Поток — стандартная последовательность событий:

event: message_start
event: content_block_start
event: ping
event: content_block_delta      // delta.type = text_delta | input_json_delta
event: content_block_stop
event: message_delta            // stop_reason + usage
event: message_stop

Событие ping приходит раз в несколько секунд, чтобы соединение не закрыли промежуточные прокси. Ошибка в середине потока приходит как event: error. Итоговое число токенов — в message_delta.

POST /v1/messages/count_tokens

Оценка длины запроса без обращения к модели и без списания с баланса. Принимает то же тело, что /v1/messages, и возвращает:

{ "input_tokens": 217 }
Это оценка, а не точный подсчёт: у шлюза нет собственного токенизатора модели. Для контроля бюджета — годится, для расчёта итоговой стоимости — используйте usage из ответа.

GET /v1/models

Список доступных моделей с тарифами и лимитами.

{
  "data": [
    {
      "type": "model",
      "id": "dynatos",
      "display_name": "Dynatos",
      "description": "Флагманская модель: длинный контекст, сложные задачи, код",
      "context_window": 200000,
      "max_output_tokens": 64000,
      "pricing": {
        "input_usd_per_million_tokens": 0.6,
        "output_usd_per_million_tokens": 7
      }
    }
  ],
  "has_more": false
}

Ошибки

Формат — как у Anthropic API: { "type": "error", "error": { "type": …, "message": … } }.

КодtypeКогда
400invalid_request_errorНет обязательного поля, неверный JSON, пустой messages
401authentication_errorКлюч отсутствует, неверен или отозван
402invalid_request_errorНедостаточно средств. В ответе — текущий баланс и требуемая сумма
404not_found_errorНеизвестная модель или несуществующий путь
405invalid_request_errorНеподходящий HTTP-метод
429rate_limit_errorСлишком много запросов
502api_errorСбой на стороне модели
503overloaded_errorМодель перегружена, стоит повторить позже

Модели и тарифы

Сколько стоит запрос

Модель Вход, за 1 млн Выход, за 1 млн Контекст Макс. ответ
dynatos
Флагманская модель
$0.60 $7.00 200 000 64 000
adanatos
Быстрая и дешёвая
$0.50 $5.00 200 000 32 000

Стоимость запроса считается по формуле:

стоимость = (input_tokens / 1 000 000 × цена входа)
          + (output_tokens / 1 000 000 × цена выхода)

Рубли считаются по фиксированному курсу 95,00 ₽ за $1 — он не привязан к бирже, поэтому расходы предсказуемы. Все суммы хранятся и складываются в целых числах, без плавающей точки: округления «в свою пользу» в расчётах нет. Вход и выход тарифицируются отдельно, никакой «средней цены за токен» не существует.

Баланс

Как устроена оплата

Баланс отдельно от Pro

Подписка за 299 ₽ открывает возможности чата на сайте и не начисляет баланс API. Баланс API расходуется только на запросы к /v1/… и не включает Pro.

Проверка до запроса

Баланс проверяется перед обращением к модели. Если средств не хватает, запрос не уходит вообще и возвращается ошибка 402 с текущей и требуемой суммой.

Списание по факту

После ответа списывается фактический расход по usage от модели. Данные о расходе, присланные клиентом, не учитываются.

Пополнение — в личном кабинете: сумма от 100 ₽, оплата банковской картой. Баланс увеличивается только после подтверждения платежа — возврат на сайт сам по себе ничего не начисляет. Там же видны история пополнений и расход за последние 30 дней.

Безопасность

Что происходит с ключом

  • Ключ генерируется криптографически стойким источником случайности. Ни времени создания, ни номера аккаунта, ни любых предсказуемых частей в нём нет.
  • Мы не храним ключ. В базе остаются только хеш, префикс для опознания и служебные данные: имя, дата создания, дата последнего использования.
  • Полный ключ виден один раз — в окне сразу после создания. Дальше в кабинете отображается только маска вида sk-h-hd9d••••••••. Восстановить ключ невозможно: если он утерян, его перевыпускают.
  • Перевыпуск мгновенный. Старый ключ становится недействительным в тот же момент, а его хеш помечается отозванным.
  • Ключи принадлежат аккаунту. Право владения проверяется на сервере при каждой операции, а не только в интерфейсе — прочитать, удалить или перевыпустить чужой ключ нельзя.
Не публикуйте ключ в репозиториях, скриншотах и обращениях в поддержку. Если он мог утечь — перевыпустите его, это занимает секунду.