Краткий ответ: jev-1.13 не генерирует текст. Вы отправляете фрагмент текста и набор именованных вопросов на https://aihubmix.com/v1/systemone, и получаете обратно типизированные ответы, соответствующие вашим именам вопросов — категория, оценка или вероятность. Ничего парсить не нужно. Ниже приведен рабочий запрос, полный формат ответа и одна дизайнерская ошибка, которая тихо снизит вашу точность.
Для чего нужен Jev
Используйте его, когда вам нужно суждение, а не абзац: маршрутизация тикета поддержки, оценка серьезности, обозначение срочности, контроль контента. Страница модели говорит об этом прямо — "Нет генерации текста, ничего парсить."
Вместо этого используйте обычную модель чата, когда вам нужны объяснения, резюме или любой свободный вывод. Jev не может их производить.
Перед началом
- [ ] Установлен Python 3 (стандартной библиотеки достаточно)
- [ ] Учетная запись AiHubMix и API-ключ
- [ ] Ключ экспортирован как
AIHUBMIX_API_KEY, никогда не закодирован в исходном коде
Вам не нужно SDK OpenAI, LangChain или пакет requests.
Шаг 1 — Узнайте конечную точку
POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json
Это маршрут, специфичный для модели, не /v1/chat/completions. Совместимые с OpenAI клиенты не могут его вызывать. Используйте обычный HTTP.
Шаг 2 — Выберите типы вопросов
Существует три типа, и вы можете свободно комбинировать их в одном запросе:
| Тип | Используйте для | Вы предоставляете |
|---|---|---|
choice | Выбор одной категории | criteria в виде словаря: метка → определение |
score | Оценка по упорядоченной шкале | criteria в виде списка, от меньшего к большему |
noul | Суждение да/нет | ничего, кроме instructions |
Шаг 3 — Постройте запрос
state — это текст, который нужно оценить. questions ключи — это имена, которые вы придумываете; ответ использует те же имена.
payload = {
"model": "jev-1.13",
"state": "Привет, я пытаюсь подключить свой аккаунт Stripe уже 3 дня "
"и он продолжает давать сбой. Я теряю продажи. Пожалуйста, помогите как можно скорее.",
"questions": {
"department": {
"type": "choice",
"instructions": "Какая команда должна заняться этим",
"criteria": {
"billing": "Проблемы с оплатой или подпиской",
"technical": "Ошибки или проблемы с интеграцией",
"sales": "Вопросы по ценам или аккаунту",
},
},
"frustration": {
"type": "score",
"instructions": "Насколько расстроен клиент",
"criteria": [
"Спокойный, просто излагает факты",
"Расстроен, но вежлив",
"Очень зол, использует резкие слова",
],
},
"is_urgent": {
"type": "noul",
"instructions": "Сообщение передает срочность или временную чувствительность",
},
},
}
Шаг 4 — Отправьте его с помощью стандартной библиотеки
import json, os, urllib.error, urllib.request
def ask(payload):
req = urllib.request.Request(
"https://aihubmix.com/v1/systemone",
data=json.dumps(payload).encode(),
headers={"Authorization": "Bearer " + os.environ["AIHUBMIX_API_KEY"],
"Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=60) as r:
return json.loads(r.read())
except urllib.error.HTTPError as e:
raise SystemExit(f"HTTP {e.code}: {e.read().decode(errors='replace')[:500]}")
Держите конструкцию запроса внутри функции. Если вы создаете и отправляете на уровне модуля, импорт файла повторно вызывает вызов и тратит токены.
Шаг 5 — Читайте ответы
Каждый ответ хранит свое значение под ключом, соответствующим его type, так что один аксессуар охватывает все три:
data = ask(payload)
for name, ans in data["answers"].items():
kind = ans["type"]
print(name, kind, ans[kind], ans.get("confidence"))
print("использование:", data.get("usage"))
Проверенный вывод:
department choice billing 0.51
frustration score 1 1
is_urgent noul 1 None
использование: {'input_tokens': 424, 'output_tokens': 73}
Шаг 6 — Поймите полный ответ
Цикл печати скрывает полезные поля. Сырой JSON для ответа score :
{
"type": "score",
"score": 1,
"legend": {"0": "Спокойный, просто излагает факты", "1": "Расстроен, но вежлив", "2": "Очень зол, использует резкие слова"},
"probabilities": {"0": 0, "1": 1, "2": 0},
"confidence": 1
}
legendсоответствует индексу вашей формулировке — целое число самоописывающееся, поэтому вам не нужна таблица поиска в вашем коде.probabilitiesдает полное распределение, полезное для обнаружения близкого равенства.noulне имеет поляconfidence. Его вероятность является сигналом.
На верхнем уровне также возвращается usage, id, provider (TypeSafe), и разрешенная версия бэкенда typesafe/jev-1.13-20260917.
Ошибка, которая снижает вашу точность
В приведенном выше запросе department вернул billing с уверенностью 0.51. Повторение идентичного запроса вернуло тот же ярлык с 0.38 — ответ был стабильным, заявленная уверенность нет.
Причина в критериях, а не в модели. billing — это "Проблемы с оплатой или подпиской", а technical — "Ошибки или проблемы с интеграцией." Интеграция Stripe, которая продолжает давать сбой, действительно соответствует обоим. Модель сообщала о неоднозначности, которая была записана в схеме.
Два правила перед производством:
- Пишите
choiceкритерии, которые являются взаимно исключающими. Если человек будет колебаться между двумя ярлыками, модель тоже будет. - Установите порог уверенности и перенаправьте результаты с низкой уверенностью в очередь к человеку, вместо того чтобы принимать их как решения. Модель, которая признает неопределенность, более ценна, чем та, которая скрывает ее.
Контрольный список перед запуском
- [ ] Ключ загружен из окружения или из файла
600, который игнорирует ваша система контроля версий - [ ]
choiceкритерии проверены на перекрытие - [ ] Определен порог уверенности с резервным путем ниже него
- [ ]
noulответы обрабатываются отдельно — они не имеютconfidence - [ ] Неиспользуемые вопросы удалены (3 вопроса стоят 424 входящих токена; 2 стоят 355)
- [ ] Не 2xx ответы записываются с сырым телом
Часто задаваемые вопросы
Могу ли я использовать SDK OpenAI? Нет. /v1/systemone не является совместимым маршрутом OpenAI.
Может ли jev вернуть предложение или резюме? Нет. Он отвечает только на заданные вами вопросы.
Сколько вопросов на запрос? Проверенные тесты использовали два и три. Каждый вопрос добавляет входящие и исходящие токены, поэтому включайте только то, на что вы будете действовать.
Существует ли псевдоним версии? Страница модели перечисляет псевдоним jev-latest рядом с jev-1.13. Закрепите явную версию, если воспроизводимость имеет значение.
Сколько это стоит? Страница модели публикует $0.0462 / M входящих токенов и $0 / M исходящих токенов. Это данные поставщика — подтвердите текущие цены перед составлением бюджета.
Каков размер окна контекста? Страница модели непоследовательна: 64K в заголовке, 32K в таблице поставщика. Проверьте по своему самому длинному вводу, прежде чем полагаться на любое из них.
Объем этого руководства
Все вышеперечисленное было проверено с помощью трех живых вызовов с одним входом. Оно не охватывает задержку, пакетную обработку, пропускную способность или поведение на входах, отличных от примера. Смещение уверенности является воспроизведенным наблюдением, а не измеренной ошибкой — повторите это на своих данных, прежде чем устанавливать порог.
Начните работу с AiHubMix
jev-1.13 доступен через AiHubMix, а страница модели содержит все, на что ссылается этот учебник: конечная точка /v1/systemone, три типа вопросов с их criteria форматами, полные поля ответа и опубликованные цены $0.0462 / M входящих токенов с $0 / M исходящих токенов. Псевдоним jev-latest разрешается на новейший релиз, поэтому он остается актуальным по мере изменения версий.
Начните здесь: https://aihubmix.com/model/jev-latest
Следующие шаги:
- Создайте учетную запись AiHubMix и сгенерируйте API-ключ
- Скопируйте запрос из Шага 3 и функцию
ask()из Шага 4 - Замените
stateна реальную запись из вашей очереди - Сравните результат с тем, как вы классифицируете эту запись сегодня
Если это руководство было полезным, подписывайтесь на будущие посты о моделях структурированного вывода и классификационных пайплайнах.



