简短回答: jev-1.13 不生成文本。您将一段文本和一组命名问题 POST 到 https://aihubmix.com/v1/systemone,然后根据问题名称返回键入的答案——一个类别、一个分数或一个概率。无需解析。下面是一个有效的请求、完整的响应格式,以及一个会悄悄影响您准确性的设计错误。
Jev 的用途
当您需要一个 判断 而不是段落时使用它:路由支持票、评分严重性、标记紧急性、内容限制。模型页面明确说明——“不生成文本,无需解析。”
当您需要解释、摘要或任何自由格式的输出时,请使用普通的聊天模型。jev 无法生成这些内容。
开始之前
- [ ] 安装 Python 3(标准库即可)
- [ ] 拥有一个 AiHubMix 账户和 API 密钥
- [ ] 将密钥导出为
AIHUBMIX_API_KEY,而不是硬编码在源代码中
您 不需要 OpenAI SDK、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("usage:", data.get("usage"))
验证输出:
department choice billing 0.51
frustration score 1 1
is_urgent noul 1 None
usage: {'input_tokens': 424, 'output_tokens': 73}
步骤 6 — 理解完整的响应
打印循环隐藏了有用的字段。一个 score 答案的原始 JSON:
{
"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标准,使其相互排斥。如果人类在两个标签之间犹豫,模型也会。 - 设置置信度阈值,并将低置信度结果路由到人工队列,而不是接受它们作为决策。一个承认不确定性的模型比一个隐藏不确定性的模型更有价值。
发布前检查清单
- [ ] 从环境或您的 VCS 忽略的
600模式文件加载密钥 - [ ]
choice标准审核以检查重叠 - [ ] 定义置信度阈值,并在其下设置后备路径
- [ ]
noul答案单独处理——它们没有confidence - [ ] 删除未使用的问题(3 个问题消耗 424 个输入令牌;2 个问题消耗 355 个)
- [ ] 记录非 2xx 响应及其原始主体
常见问题
我可以使用 OpenAI SDK 吗? 不可以。 /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 中的请求和步骤 4 中的
ask()函数 - 用您自己队列中的真实记录替换
state - 将结果与您今天对该记录的分类进行比较
如果本指南对您有帮助,请订阅以获取未来关于结构化输出模型和分类管道的帖子。



