Jev
最近更新:2026年10月7日
TypeSafeAI 的决策模型 Jev:三种问题类型、答案结构、置信度与已知短板。
Jev 是 TypeSafeAI 的 System One 模型:它不生成文本,而是对你给的 state 回答一组带类型的问题,
每个问题拿回一个结构化答案,代码可以直接按它分支,不需要解析任何文字。
走的是 TypeSafeAI System One 端点,官方 SDK
(typesafe-sdk、@typesafe-ai/sdk)只需把 base URL 指向本站。
模型
| 站内 ID | typesafe/jev |
| 别名 | jev-latest(官方 SDK 不传 model 时的默认值)· jev-preview · jev-1.13.0 |
| 当前版本 | jev-1.13.0 |
| 上下文 | 单次请求 64K token;state + 最长那一个问题 ≤ 32K |
| 输入 | 只收文本:字符串、JSON 对象或数组。图像、音频、视频要先转成文本或结构化字段 |
| 计费 | 只收输入 token,输出免费。单价见模型详情页 |
| 流式 | 不支持 |
https://gateway.amux.ai/v1/systemone鉴权
headerAuthorizationstring必填Bearer <你的 Amux 密钥> 站内 API Key。
Content-Typestring必填默认 "application/json"固定为 application/json。
请求
application/jsonmodelstring必填typesafe/jev,或它的别名:jev-latest(官方 SDK 的默认值)、jev-preview、jev-1.13.0。调过置信度阈值的话,建议钉住 jev-1.13.0。
statestring | object | array必填要评估的内容:字符串,或 JSON 对象/数组(聊天记录、业务记录、应用状态)。建议用带描述性字段名的对象,并在问题里用反引号引用这些字段,例如 ` message `。只收文本,不收图像、音频、视频。
questionsmap<string, Question>必填问题表,键是你自定的 id,答案按同样的 id 返回。id 不会发给模型,不影响推理。所有问题针对同一个 state 并行评估,多加几个问题几乎不增加延迟。
›questionsmap<string, Question>
‹question id›Question一个带类型的问题。type 决定它是下面三种形状中的哪一种;三种共有 type 与 instructions,各自多一个 criteria。
›‹question id›Question
noulobject是/否问题。答案是这个陈述成立的概率(0–1)。
›noulobject
type"noul"必填固定为 noul。
instructionsstring | object | array必填要判断的是/否陈述。可以是字符串,也可以是对象/数组:把问题放在一个字段里、把它要引用的数据放在其它字段里,再用反引号按名字引用。
criteriaobject可选。说明「是」(接近 1)和「否」(接近 0)各指什么。边界情况写在这里。
›criteriaobject
truestring | object | array「是」的含义。
falsestring | object | array「否」的含义。
choiceobject从你定义的选项里恰好选一个。答案带最可能的选项、每个选项的概率,以及 confidence。
›choiceobject
type"choice"必填固定为 choice。
instructionsstring | object | array必填要模型做的决定。字符串、对象或数组,同 noul。
criteriaobject必填选项名 → 判定说明。某个选项不需要说明时写 null。最多 255 个选项。选项名会原样作为 probabilities 的键返回。
scoreobject在有序的档位上给 state 打分。答案是按概率加权的值,可以落在两档之间。
›scoreobject
type"score"必填固定为 score。
instructionsstring | object | array必填要模型打分的维度。字符串、对象或数组,同 noul。
criteriaarray<string>必填各档位的描述,从低到高:下标 0 是最低档。至少 2 档,最多 10 档。
响应
200response每个问题一个答案,键与请求一致。
400response请求体格式不对;某个问题没通过上游校验(错误信息会点名字段);或明显超出上下文上限。
402response余额不足。
三种问题
每个问题都有 type 与 instructions,再按类型各带一个 criteria。一次请求里可以混用,
所有问题针对同一个 state 并行、互相独立地评估——多加几个问题几乎不增加延迟。
noul:是/否
回答「这个陈述成立的概率」,0 是否、1 是。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | "noul" | 是 | |
instructions | string · object · array | 是 | 要判断的陈述 |
criteria | object | 否 | { "true": …, "false": … },分别说明「是」与「否」指什么 |
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?",
"criteria": { "true": "Explicitly time-sensitive", "false": "No urgency expressed" }
}choice:单选
从你定义的选项里恰好选一个,返回每个选项的概率。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | "choice" | 是 | |
instructions | string · object · array | 是 | 要做的决定 |
criteria | map<string, string · object · array · null> | 是 | 选项名 → 判定说明;不需要说明的选项写 null。最多 255 个 |
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": null
}
}score:有序打分
在一组从低到高的档位上打分,结果按概率加权,可以落在两档之间。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | "score" | 是 | |
instructions | string · object · array | 是 | 要打分的维度 |
criteria | array<string · object · array> | 是 | 各档描述,下标 0 是最低档。2–10 档 |
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}结构化的 instructions 与 criteria
instructions、choice 的选项说明、score 的档位、noul 的 criteria 都可以写成 JSON。
把问题放在一个字段里、把它要引用的数据放在其它字段里,再用反引号按名字引用:
"instructions": {
"potential_duplicate": { "name": "John Smith", "location": "Oakland, California" },
"question": "Is the resume for the same person as `potential_duplicate`?"
}引用 state 里的字段也是同一个写法:state 写成 { "message": "…" },问题里写 `message`。
答案
answers 的键与 questions 一致,每个答案都带与问题相同的 type:
| type | 字段 |
|---|---|
noul | noul:0(否)到 1(是) |
choice | choice:概率最高的选项;probabilities:选项 → 概率,和为 1;confidence |
score | score:加权分,可落在两档之间;legend:档位下标 → 描述;probabilities:档位下标 → 概率;confidence |
响应里的 model 是实际作答的带版本号 ID(例如 jev-1.13.0),我们不改写它——
别名会随新版本移动,按它记录才知道一批答案出自哪个版本。
置信度
choice 与 score 的答案带 confidence(0–1),由概率分布的集中程度算出:概率全压在一个选项上是 1,
平均摊开是 0。noul 没有这个字段——它本身就是一个概率。
一个好用的起点是分三档:高——自动执行;中——请人确认或标记复核;低——不执行,
转人工或交给推理模型。破坏性操作的门槛要比只读操作高。调过阈值的话,建议钉住 jev-1.13.0,
换版本时自己安排重新校准。
已知短板
问题要拆到原子粒度,在代码里组合。Jev 1.13 在下面这些情形上不可靠:
| 情形 | 换个问法 |
|---|---|
| 字面理解 | 把条件写精确,边界情况写进 criteria |
| 算术、计数、数值比较 | 算术放在代码里;逐项各问一个 noul,再求和 |
| 日期时间比较 | 用 choice 抽出日期的各部分,在代码里比较 |
| 间接指代、双重否定 | 直接问,用反引号点名 state 里的字段 |
state 又大又杂 | 先过滤,只发问题需要的部分 |
state 里有对抗性内容 | 在 criteria 里写明,并测边界样例 |
| 跨问题的一致性 | 两个问题的概率之间没有约束(P(是) + P(非是) 不一定等于 1);noul 与 choice 不要共用阈值 |
| 生成 | 用生成式模型产出候选,再让 Jev 在候选里挑 |
英文效果最好;中文等其它语言能用,但要拿自己的数据先测,并更关注置信度。
请求体怎么转发
只有 model、state、questions 会到上游,其余顶层字段一律摘掉,在 amux.droppedParams
与响应头 x-amux-dropped-params 里列出——上游对顶层未知字段一律报错,且报错不点名。
问题对象内部的字段原样转发。
错误
错误用 OpenAI 的错误形状返回({ "error": { "type", "message", … } }),官方 SDK 能正常识别。
| 状态 | type | 什么时候 |
|---|---|---|
| 400 | invalid_request | 请求体缺字段,或某个问题没通过上游校验——消息会点名字段,例如 questions.q.choice.criteria: Field required |
| 400 | context_length_exceeded | 明显超出上下文上限,在本站直接拒绝 |
| 402 | insufficient_credits | 余额不足 |
| 502 | provider_* | 上游限流、过载或出错。可以重试 |
完整的 type 取值与重试语义见错误与重试。
curl https://gateway.amux.ai/v1/systemone \
-H "Authorization: Bearer $AMUX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev",
"state": {
"message": "Hi, my Stripe integration has been failing for 3 days. Please help ASAP."
},
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle `message`?",
"criteria": {
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": null
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated does the customer appear?",
"criteria": [
"Calm",
"Frustrated but civil",
"Very angry"
]
},
"is_urgent": {
"type": "noul",
"instructions": "`message` conveys urgency or time-sensitivity"
}
}
}'{
"model": "jev-1.13.0",
"answers": {
"department": {
"type": "choice",
"choice": "technical",
"confidence": 0.95,
"probabilities": {
"billing": 0.03,
"sales": 0,
"technical": 0.97
}
},
"frustration": {
"type": "score",
"score": 1,
"confidence": 1,
"legend": {
"0": "Calm",
"1": "Frustrated but civil",
"2": "Very angry"
},
"probabilities": {
"0": 0,
"1": 1,
"2": 0
}
},
"is_urgent": {
"type": "noul",
"noul": 1
}
},
"usage": {
"input_tokens": 407,
"output_tokens": 73
}
}