JEV 1.13 接入教程:Python 调用 Decisions API,实现分类、评分与 Agent 路由
JEV 1.13 是 TypeSafe AI 推出的决策模型,适合客服分流、文档相关性判断、业务评分和 Agent 工具路由。开发者提供背景与问题定义,模型返回结构化选择、概率和评分,程序可以直接读取这些字段。
本文通过一个中文客服案例,介绍 Choice、Noul、Score 的参数写法、Python 接入方式、响应解析以及常见问题,并提供可直接操作的在线工作台。
测试日期:2026-09-23。 本文使用同日通过 Crazyrouter 完成的 API 与网页实测数据,包含成功和超时记录。

一、JEV 适合哪些开发任务
一个客服系统收到以下消息:
我尝试连接 Stripe 已经 3 天了,集成一直失败,正在损失销售额。请尽快处理。
系统需要判断:
- 应该交给账单、技术还是销售团队?
- 是否紧急?
- 客户的情绪处于哪个等级?
JEV 可以在一次请求中回答这三个问题。取得结果后,程序选择队列和处理优先级,再由人工或生成式模型撰写回复。
它的主要特点包括:
- 输出结构明确。 开发者预先定义候选项和评分标准,程序读取指定字段。
- 支持多个独立问题。 官方文档说明,各问题针对同一背景独立、并行评估,结果可由业务代码组合。
- 提供概率信息。 Choice 和 Score 附带分布及 confidence,Noul 直接返回"是"的概率。
- 输入单价低。 本次核验的参考价为每百万输入 token 0.042 美元,输出单价为零。
通用大模型也可以完成结构化分类。JEV 的产品定位是专门处理这些判断节点;它不会生成文章、代码或自然语言解释,也不能直接替换 Claude Code、Codex 等编程 Agent 的主模型。
二、接口地址、模型名和认证方式
本文使用 Crazyrouter 的 Decisions 接口:
| 项目 | 配置 |
|---|---|
| 请求方法 | POST |
| 站点 | https://crazyrouter.com |
| 接口路径 | /api/alpha/decisions |
| API 模型名 | jev-1.13 |
| 认证 | Authorization: Bearer <Crazyrouter API Token> |
| 请求格式 | application/json |
| 响应方式 | 同步 JSON;不使用流式输出 |
本次先核验了 /v1/models,公开列表中包含 jev-1.13。在线工作台使用 typesafe/jev-1.13,也已实际调用成功。两种名称的成功响应都返回版本:
text
typesafe/jev-1.13-20260917
JEV 需要使用专门的 Decisions API。 不能只把聊天模型名换成 JEV,就继续向 /v1/chat/completions 或 /v1/responses 发送原来的请求。
三、请求参数:model、state、questions
| 字段 | 类型 | 用途 |
|---|---|---|
model |
字符串 | 指定模型 |
state |
字符串、JSON 对象或数组 | 提供待分析的事实与背景 |
questions |
JSON 对象 | 以自定义问题名为键,定义每个问题 |
每个问题使用 type 指定判断类型,用 instructions 描述判断目标。criteria 的写法取决于类型:
| 类型 | criteria 写法 |
主要结果字段 |
|---|---|---|
choice |
选项键与含义组成的对象 | choice、probabilities、confidence |
noul |
可省略;由 instructions 明确是非问题 | noul,取值 0--1 |
score |
从低到高排列的描述数组 | score、legend、probabilities、confidence |
例如,部门选择可以定义为:
json
{
"department": {
"type": "choice",
"instructions": "应该由哪个团队处理该工单?",
"criteria": {
"billing": "支付、账单或订阅问题",
"technical": "错误或集成故障",
"sales": "价格或采购问题"
}
}
}
这里的 department 是自己定义的问题名,响应中的 answers.department 对应这个问题。上面是问题定义片段,完整请求还需要 model、state 和外层 questions。
问题说明应尽量聚焦一个维度。例如,把"这条反馈有多紧急、是否值得开发、客户是否重要"拆成三个问题,再由代码计算优先级。
同一请求中的问题独立评估。如果第二个判断依赖第一个判断的结果,需要由程序分步骤请求。
四、Python 完整调用示例
1. 安装依赖
bash
python -m pip install requests
2. 配置 API Token
在本机设置环境变量 CRAZYROUTER_API_KEY。以下命令中的示例值需要替换为自己的 Crazyrouter API Token,不要把真实 Token 写入代码仓库。
Linux / macOS:
bash
export CRAZYROUTER_API_KEY='替换为你的 Crazyrouter API Token'
Windows PowerShell:
powershell
$env:CRAZYROUTER_API_KEY = '替换为你的 Crazyrouter API Token'
3. 保存并运行脚本
将以下代码保存为 jev_decision.py。请求内容与本次中文客服实测一致,包含 Choice、Noul、Score 三种问题。
python
import json
import os
import requests
api_key = os.environ.get("CRAZYROUTER_API_KEY", "").strip()
if not api_key:
raise SystemExit("请先设置环境变量 CRAZYROUTER_API_KEY。")
payload = {
"model": "jev-1.13",
"state": "我尝试连接 Stripe 已经 3 天了,集成一直失败,正在损失销售额。请尽快处理。",
"questions": {
"department": {
"type": "choice",
"instructions": "应该由哪个团队处理该工单?",
"criteria": {
"billing": "支付、账单或订阅问题",
"technical": "错误或集成故障",
"sales": "价格或采购问题",
},
},
"is_urgent": {
"type": "noul",
"instructions": "这条消息是否表达了紧迫性?",
},
"frustration": {
"type": "score",
"instructions": "客户表现出的挫败程度如何?",
"criteria": ["平静陈述事实", "不满但克制", "非常愤怒或使用激烈措辞"],
},
},
}
try:
response = requests.post(
"https://crazyrouter.com/api/alpha/decisions",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
json=payload,
timeout=(10, 60),
)
response.raise_for_status()
except requests.Timeout as exc:
raise SystemExit("请求超时,未取得判断。核对调用记录后再决定是否重试。") from exc
except requests.RequestException as exc:
raise SystemExit(f"HTTP 请求失败:{exc}") from exc
try:
data = response.json()
except ValueError as exc:
raise SystemExit("服务没有返回有效 JSON,请检查响应和调用记录。") from exc
if not isinstance(data, dict):
raise SystemExit("响应顶层结构不符合预期。")
answers = data.get("answers")
required = ("department", "is_urgent", "frustration")
if not isinstance(answers, dict) or not all(
isinstance(answers.get(key), dict) for key in required
):
raise SystemExit("响应缺少完整的 decisions answers。")
try:
department = answers["department"]["choice"]
urgent_probability = answers["is_urgent"]["noul"]
frustration_score = answers["frustration"]["score"]
except KeyError as exc:
raise SystemExit(f"响应缺少结果字段:{exc}") from exc
print("部门:", department)
print("紧急概率:", urgent_probability)
print("情绪评分:", frustration_score)
print("实际模型:", data.get("model"))
print("请求 ID:", data.get("id"))
print("用量:", json.dumps(data.get("usage"), ensure_ascii=False))
print("完整答案:", json.dumps(answers, ensure_ascii=False, indent=2))
执行:
bash
python jev_decision.py
timeout=(10, 60) 分别设置连接超时和读取超时,不是整个业务流程的硬性总时限。脚本不会在超时后自动重试。
五、实际响应及字段解释
本次上述请求返回 HTTP 200,关键内容如下。为便于阅读,省略了情绪评分的等级说明与概率分布:
json
{
"id": "gen-dec-1790095587-mts183W9F0rPWFGshpnx",
"model": "typesafe/jev-1.13-20260917",
"answers": {
"department": {
"type": "choice",
"choice": "technical",
"probabilities": {
"technical": 0.94,
"billing": 0.06,
"sales": 0
},
"confidence": 0.91
},
"is_urgent": {
"type": "noul",
"noul": 0.98
},
"frustration": {
"type": "score",
"score": 1.01,
"confidence": 0.98
}
},
"usage": {
"input_tokens": 467,
"output_tokens": 73,
"cost": 0.000019614
}
}
Choice:程序可以直接使用选项键
technical 对应请求里定义的"错误或集成故障"。业务代码读取 answers.department.choice 后,可以把工单送到相应队列。
probabilities 给出各选项概率;confidence 描述分布的确定程度。两者不能混作同一个字段,也不能将 confidence 直接视为经过验证的正确率。
Noul:需要由业务决定阈值
noul=0.98 是"这条消息表达紧迫性"的模型概率。是否升级处理,应根据已有标注样本、漏判代价和人工承接能力设置阈值。
Score:评分是等级索引的概率加权平均
三个等级对应 0、1、2。score=1.01 很接近"不满但克制",不是百分制分数,也不代表不满程度为 1.01%。
usage:用量和实扣需要区分
input_tokens、output_tokens 是上游报告的用量。输出单价为零时,仍然可以有非零的 output_tokens。
在本文的接入路径中,usage.cost 是上游报告费用,账户最终实扣以 Crazyrouter 消费记录为准。
六、先在网页调试,再复制到项目
可以打开 JEV Decision Playground 在线工作台,切换为中文后调试请求。

页面提供 12 个示例,覆盖客服工单、退款、产品反馈、销售线索、交易风险、供应商准入、内容审核、账号接管、合规文档、RAG 片段、工具路由、生产事故分级。
操作步骤:
- 从 Crazyrouter Token 管理页 获取 Token,填入页面。
- 选择"客服工单分流",检查 State 和 Questions。
- 点击"运行决策",查看答案、分布、耗时和用量。
- 修改背景再测试;问题定义不变时,更容易比较输入变化带来的影响。
- 通过"预览请求"查看 JSON、cURL、JavaScript 或 Python 示例。
这是实际计费调用,输入部分收费。页面不会自动重试,Token 不写入 localStorage、sessionStorage 或 Cookie。

截图是另一次网页调用:紧急概率为 0.97,页面显示 0.70 秒。上一节的 JSON 来自 Python 调用,紧急概率为 0.98;两次结果分别记录。
七、中文客服、退款和 RAG 测试结果
本轮测试使用 6 个不同输入,其中两个超时案例各复测一次,另外进行了上面的网页调用。
| 输入场景 | 结果 | Python 客户端耗时 |
|---|---|---|
| Stripe 集成失败,影响销售 | technical;紧急概率 0.98;情绪 1.01/2 |
1.102 秒 |
| 提前询问下个月采购价格,不急 | sales;紧急概率 0.04;情绪 0/2 |
0.784 秒 |
| 同一订单两笔付款均已核实结算 | refund;已证实重复结算概率 0.95 |
0.675 秒 |
| 仅怀疑重复扣款,没有核实流水 | 首次和复测均读取超时 | 各约 60 秒 |
| 文档给出 Python 请求超时参数示例 | 相关性 1.98/2;可回答概率 0.80 | 2.293 秒 |
| 文档介绍图像模型,与超时问题无关 | 首次超时;复测相关性 0/2,可回答概率 0.01 | 复测 5.413 秒 |
共 9 次请求,6 次取得成功响应,3 次读取超时 。成功响应的上游报告费用合计 $0.000115962,不包含未核对的超时请求结算,也不是账户完整实扣金额。
这些结果展示了几个可用方向:客服可以同时判断部门与紧急程度;RAG 可以分别判断片段相关性和可回答性;退款建议可以结合已核实状态生成,再交给业务代码处理。
样本由我们编写,数量有限,不能据此计算通用准确率、概率校准水平或长期成功率。超时原因也不能仅凭客户端记录归因到模型。
八、价格和性能数据怎么理解
按本次核验的参考价计算,每次请求若使用 1,000 个输入 token:
text
单次输入费用 = 1,000 / 1,000,000 × $0.042 = $0.000042
10 万次请求的输入费用 = $4.20
背景、问题、选项都计入输入预算,实际用量以响应为准。当前价格可查看 Crazyrouter 模型列表。
TypeSafe 官方发布文章给出过 70--500 毫秒,以及特定工作流下 193.6 倍速度、444.6 倍成本优势的数字。它们带有明确的评测条件,不能直接套用到所有业务和网络路径。
本次成功 API 调用耗时为 0.675--5.413 秒,包含客户端、网关和上游调用路径。本轮没有与其他模型进行同题性能对照。
九、常见问题与排查方向
以下是接入排查建议;其中读取超时在本次实测中出现,其余项目不是本轮逐项触发的错误测试。
| 现象 | 优先检查 |
|---|---|
| 认证失败 | 是否使用 Crazyrouter Token;是否带 Bearer 前缀;Token 是否有效 |
| 提示模型或端点不可用 | 模型权限、当前可用性,以及是否误用了聊天接口 |
| 请求参数被拒绝 | questions 是否为对象;Choice criteria 是否为对象;Score criteria 是否为数组 |
| HTTP 成功但没有完整答案 | 检查响应中的错误信息和 answers,不要只凭状态码执行后续动作 |
| 读取超时 | 检查调用和消费记录,再决定重试;不要把无响应当成否定或零分 |
| 高 confidence 但分类不对 | 检查选项边界和事实是否充分,并用独立标注数据评估 |
1. 为什么不能直接换成聊天模型调用方式?
JEV 接收 state + questions,输出类型化判断。本文使用的 Decisions 接口不是 messages 聊天接口,不接受流式对话的接入方式。
2. JEV 可以看图片吗?
截至本次核对,官方说明支持文本输入,包括由文本组成的 JSON 对象和数组,不直接支持图像、音频和视频。
3. 怎么判断中文效果够不够用?
本次中文案例取得了有效结果。上线前仍应收集自己的业务样本,覆盖专业术语、否定句、缺失信息和多意图消息,保留一组不参与调参的验证数据。
4. 概率很高,是否一定正确?
不是。类型约束可以限制输出范围,但合法选项仍可能选错。confidence 反映分布的确定程度,不能代替实际准确率验证。
5. 如何让 JEV 参与 Agent 工作流?
先定义有限的动作,例如查订单、检索知识库、补充提问、转人工,让 JEV 选择动作,再由程序执行。涉及退款等操作时,还应由业务规则核对事实与执行条件。
6. 能直接用它替换编程 Agent 的主模型吗?
不能。JEV 不承担代码生成或连续对话。可以让编程 Agent 帮你开发调用 JEV 的分类器、评分器或路由器。
十、参考资料
- TypeSafe 官方发布文章:产品定位、价格和性能指标的来源及限定条件。
- TypeSafe Quick start:原生请求结构。
- Score 文档与 Confidence 文档:评分和分布确定程度的定义。
- Jev with coding agents:模型与编程 Agent 的能力边界。
- 站内实测原文:本文使用的数据与截图来源。
本文为同一轮测试的 CSDN 技术教程版。示例截图为实际调用结果,代码中的请求体与已保存的测试请求一致。