JEV 1.13 接入教程:Python 调用 Decisions API,实现分类、评分与 Agent 路由

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 天了,集成一直失败,正在损失销售额。请尽快处理。

系统需要判断:

  1. 应该交给账单、技术还是销售团队?
  2. 是否紧急?
  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 片段、工具路由、生产事故分级。

操作步骤:

  1. 从 Crazyrouter Token 管理页 获取 Token,填入页面。
  2. 选择"客服工单分流",检查 State 和 Questions。
  3. 点击"运行决策",查看答案、分布、耗时和用量。
  4. 修改背景再测试;问题定义不变时,更容易比较输入变化带来的影响。
  5. 通过"预览请求"查看 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 的分类器、评分器或路由器。

十、参考资料

  1. TypeSafe 官方发布文章:产品定位、价格和性能指标的来源及限定条件。
  2. TypeSafe Quick start:原生请求结构。
  3. Score 文档与 Confidence 文档:评分和分布确定程度的定义。
  4. Jev with coding agents:模型与编程 Agent 的能力边界。
  5. 站内实测原文:本文使用的数据与截图来源。

本文为同一轮测试的 CSDN 技术教程版。示例截图为实际调用结果,代码中的请求体与已保存的测试请求一致。

相关推荐
CubeSandbox1 小时前
沙箱是选项,不是标配:花椒 Agent 平台的架构思考与 Cube 实践
大数据·人工智能·架构
Rocky Ding*1 小时前
一文读懂Qwen-Audio-3.1核心基础知识:从语音识别到可控声景与实时Agent
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·qwen-audio
桃西西呀1 小时前
Laya 源码级原理拆解之四:路由检测与服务部署
人工智能·llm·ai编程
努力努力再努力wz1 小时前
【边缘计算入门系列】从“在哪里算”到“怎么算”:一文建立边缘计算、算子、计算图与 Tensor 的底层心智模型
人工智能·docker·边缘计算
黄啊码1 小时前
【黄啊码】一个陪伴类的 Agent 产品,凭什么我觉得它做得好?
人工智能
leoZ2311 小时前
第 34 篇 Copilot 与嵌入式 AI:把能力缝进工作流
人工智能·大模型·copilot·agent
桃西西呀1 小时前
Laya 源码级原理拆解之三:字段编译与业务胶水
人工智能·llm·ai编程
欧特克_Glodon1 小时前
OpenCV计算机视觉开发入门与实践(基于C++):专栏内容介绍及目录
c++·人工智能·opencv·计算机视觉
55873 生态系统1 小时前
55873 全域文明生态系统:技术价值矩阵与底层创新内核
大数据·人工智能·55873全域文明生态体系·55873操作系统