# Руководство API Jev

> Подключите API Jev через curl, Python или Node.js. Разберитесь в Choice, Score, Noul, ключах доступа, контексте, ограничениях частоты и обработке ошибок.

- Canonical HTML: https://omniakey.com/ru/blog/jev-api-guide
- Markdown: https://omniakey.com/ru/blog/jev-api-guide.md
- Published: 2026-09-28 (updated 2026-10-24)
- Author: Kiki, COO at OmniaKey
- Language: ru
- Category: API setup
- Reading time: 11 min
- All posts: https://omniakey.com/blog/llms.txt

---

**API Jev оценивает текст по вопросам, заданным приложением.** Запрос содержит `state`, `model` и словарь `questions`; типизированные решения возвращаются в `answers` под теми же идентификаторами. Это не чат, из свободного текста которого затем нужно извлекать метки.

Здесь рассматривается интеграция. Назначение, стоимость и ограничения модели описаны в [обзоре Jev](https://omniakey.com/ru/blog/jev-model-explained).

> **Проверено 24 октября 2026 года.** Формат запроса и ответа сверен с документацией TypeSafe, маршрут шлюза — с реализацией OmniaKey. Примеры проверены офлайн; нового платного теста производительности не было. Цены и лимиты прямого API не распространяются на шлюз автоматически.

## Выберите адрес и соответствующий API-ключ

|Сервис|Адрес POST|Учётные данные|
|-|-|-|
|OmniaKey|`https://api.omniakey.com/v1/alpha/search`|Ключ OmniaKey с доступом к `jev-latest`|
|TypeSafe напрямую|`https://api.typesafe.ai/v1/systemone`|Ключ TypeSafe|

В обоих случаях используются `Authorization: Bearer ...` и собственный формат Jev. **Не отправляйте ключ одного сервиса другому.** Маршрут шлюза — не `/v1/chat/completions`; замена `state` на `messages` меняет контракт.

Создайте ключ с ограниченными правами, проверьте [текущий маршрут Jev](https://omniakey.com/ru/jev-latest) и задайте `OMNIAKEY_API_KEY` в локальном окружении. Не помещайте ключ в браузерный код, Git или снимки экрана. Общие шаги есть в [быстром старте API](https://docs.omniakey.com/ru/quick-start).

## Полный пример JSON-запроса

Сохраните следующий текст в `jev-request.json`. Один запрос определяет отдел поддержки, степень раздражения и срочность сообщения. Вход в примере оставлен на английском: TypeSafe называет его наиболее сильным языком модели. Русскоязычные задачи проверяйте на собственных репрезентативных данных.

```json
{
  "model": "jev-latest",
  "state": "My payouts have failed for three days. Please help me resolve this today.",
  "questions": {
    "department": {
      "type": "choice",
      "instructions": "Which team should handle this message?",
      "criteria": {
        "billing": "Payments, invoices, or refunds",
        "technical": "Bugs, outages, or integrations",
        "sales": "Pricing, upgrades, or new accounts"
      }
    },
    "frustration": {
      "type": "score",
      "instructions": "How frustrated is the customer?",
      "criteria": ["Calm", "Frustrated", "Very angry"]
    },
    "is_urgent": {
      "type": "noul",
      "instructions": "Does the message express a time-sensitive need?"
    }
  }
}
```

Идентификаторы связывают вопросы с ответами. По документации TypeSafe их имена не участвуют в выводе модели, поэтому формулируйте задачу в `instructions`, а не только в названии ключа. `state` также может быть JSON-объектом или массивом с текстом, например карточкой обращения с отдельными полями.

```bash
curl --fail-with-body https://api.omniakey.com/v1/alpha/search \
  -H "Authorization: Bearer $OMNIAKEY_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @jev-request.json
```

Для прямого TypeSafe используйте `https://api.typesafe.ai/v1/systemone` и `$TYPESAFE_API_KEY`. Сохраните формат JSON и проверьте доступные этому аккаунту имена моделей.

## Как читать Choice, Score и Noul

|Тип|Что задаётся|Поля ответа|Значение|
|-|-|-|-|
|`choice`|Варианты с описаниями, не более 255|`choice`, `probabilities`, `confidence`|Выбранная метка и распределение вероятностей по вариантам|
|`score`|Упорядоченная шкала из 2–10 уровней|`score`, `legend`, `probabilities`, `confidence`|Уровень, взвешенный по вероятностям; возможна дробь|
|`noul`|Вопрос да/нет, необязательные критерии `true` / `false`|`noul`|Вероятность «да» от 0 до 1, а не Boolean|

Ответ также содержит `model` и `usage.input_tokens` / `usage.output_tokens`. Сейчас `jev-latest` указывает на `jev-1.14.0`, но псевдоним может измениться. При оценке качества сохраняйте фактическую версию ответа, а если её нужно зафиксировать, укажите `jev-1.14.0`.

В шкале из трёх уровней `1.05` означает значение чуть выше уровня 1, а не 1,05 балла из 100. Сверяйтесь с `legend`. Noul `0.8` сам по себе не разрешает возврат денег. Настраивайте пороги на размеченных примерах. `confidence` выводится из распределения и не гарантирует правильность решения.

Ниже приведён полный пример ответа для пояснения структуры, а не результат реального вызова API. Значения и количество токенов условные; фактический ответ может отличаться.

```json
{
  "model": "jev-1.14.0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "billing",
      "probabilities": {
        "billing": 0.88,
        "technical": 0.12,
        "sales": 0.0
      },
      "confidence": 0.81
    },
    "frustration": {
      "type": "score",
      "score": 1.05,
      "legend": {
        "0": "Calm",
        "1": "Frustrated",
        "2": "Very angry"
      },
      "probabilities": {
        "0": 0.0,
        "1": 0.95,
        "2": 0.05
      },
      "confidence": 0.92
    },
    "is_urgent": {
      "type": "noul",
      "noul": 0.8
    }
  },
  "usage": {
    "input_tokens": 320,
    "output_tokens": 72
  }
}
```

## Вызов из Python и Node.js

Примеры читают `jev-request.json` и выполняют один запрос. Они выводят исходные ответы, не ожидая поля OpenAI `choices`. Для эксплуатации добавьте ограниченную политику повторов, описанную ниже.

```python
import json
import os
import urllib.error
import urllib.request
from pathlib import Path

request = urllib.request.Request(
    "https://api.omniakey.com/v1/alpha/search",
    data=Path("jev-request.json").read_bytes(),
    headers={
        "Authorization": f"Bearer {os.environ['OMNIAKEY_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=30) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise SystemExit(f"Jev request failed: HTTP {error.code}") from None

print(result["model"])
print(json.dumps(result["answers"], indent=2))
```

```javascript
import { readFile } from 'node:fs/promises';

const key = process.env.OMNIAKEY_API_KEY;
if (!key) throw new Error('Set OMNIAKEY_API_KEY first');

const response = await fetch('https://api.omniakey.com/v1/alpha/search', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${key}`,
    'Content-Type': 'application/json',
  },
  body: await readFile('jev-request.json', 'utf8'),
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Jev request failed: HTTP ${response.status}`);

const result = await response.json();
console.log(result.model);
console.log(result.answers);
```

Нужны Python 3 или Node.js со встроенными `fetch` и `AbortSignal.timeout`. Это HTTP-примеры, а не утверждение о поддержке схемы Jev в OpenAI SDK. Собственные SDK TypeSafe описаны в [официальном справочнике](https://docs.typesafe.ai/api).

## Контекст, лимиты запросов и стоимость

Одновременно действуют два ограничения: **64K токенов на весь запрос** и **32K на `state` вместе с самым длинным отдельным вопросом**. Удаляйте лишний контекст и объединяйте только вопросы, которым действительно нужно одно состояние.

TypeSafe указывает **250,000 токенов в секунду и 1,200 запросов в минуту**, предупреждая об изменениях в период раннего доступа. Это лимиты аккаунта, не скорость одного ответа и не гарантия для OmniaKey. Шлюз может применять дополнительные ограничения.

Проверенная прямая цена — **$0.042 за миллион входных токенов**, выходные токены бесплатны. Их количество всё равно возвращается. Это не делает весь API бесплатным и не определяет единицу тарификации шлюза. Проверяйте актуальную цену и записи использования; контекст приведён в [объяснении модели Jev](https://omniakey.com/ru/blog/jev-model-explained).

В текущем каталоге OmniaKey Jev оплачивается **за каждый запрос**. Для расчёта расходов проверьте актуальную цену модели и записи об использовании в панели управления.

## Ошибки и повторные попытки

|Код прямого TypeSafe|Что проверить сначала|Действие|
|-|-|-|
|`401`|Сервис, которому принадлежит ключ, и Bearer-заголовок|Исправить доступ, не повторять тот же неверный ключ|
|`422`|Обязательные поля, тип и структура `criteria`|Исправить указанное в ошибке поле|
|`429`|Лимит запросов или токенов|Соблюдать `Retry-After`, если он есть; ограниченное экспоненциальное ожидание с jitter|
|`529`|Временная перегрузка|Ограничить число попыток и суммарное время ожидания|

Эти значения описаны для прямого API. У шлюза могут быть свои форматы ошибок авторизации, проверки запроса или провайдера. Если маршрут недоступен, проверьте путь и точный model ID. Не включайте ключи и приватное тело запроса в публикуемую диагностику.

Отделяйте оценку от последующих действий: повтор классификации не должен дважды отправлять письмо или возвращать деньги. После серии неудач показывайте ошибку либо отправляйте случай на проверку, а не незаметно подставляйте уверенное решение по умолчанию.

## Частые вопросы

### Это официальная документация API Jev?

Это руководство по интеграции OmniaKey. Прямой контракт определён в [API-справочнике TypeSafe](https://docs.typesafe.ai/api), цены и лимиты — на [странице моделей](https://docs.typesafe.ai/models). Таблица выше разделяет сервисы.

### Можно отправлять изображения или генерировать текст?

Jev 1.14 по умолчанию принимает текст и возвращает типизированные решения. Нетекстовые материалы сначала преобразуйте в текст или поля; ввод изображений в 1.14 спрятан за экспериментальной настройкой. Для объяснений, изображений или видео нужен другой генеративный шаг.

### Что выбрать: псевдоним или фиксированную версию?

Псевдоним удобен для знакомства. В рабочем процессе с порогами оцените поддерживаемую фиксированную версию, сохраняйте `model` и перепроверяйте пороги перед сменой. Доступные имена у шлюза и прямого API могут различаться.

## Источники

- [Справочник API TypeSafe](https://docs.typesafe.ai/api)
- [Модели, цены, псевдонимы и лимиты](https://docs.typesafe.ai/models)
- [Интерпретация уверенности](https://docs.typesafe.ai/confidence)
- [Ограничения Jev 1.13](https://docs.typesafe.ai/model-jaggedness/jev-1.13)
