Amux

Jev

最近更新:2026年10月7日

TypeSafeAI 的决策模型 Jev:三种问题类型、答案结构、置信度与已知短板。

Jev 是 TypeSafeAI 的 System One 模型:它不生成文本,而是对你给的 state 回答一组带类型的问题, 每个问题拿回一个结构化答案,代码可以直接按它分支,不需要解析任何文字。

走的是 TypeSafeAI System One 端点,官方 SDK (typesafe-sdk、@typesafe-ai/sdk)只需把 base URL 指向本站。

模型

站内 IDtypesafe/jev
别名jev-latest(官方 SDK 不传 model 时的默认值)· jev-preview · jev-1.13.0
当前版本jev-1.13.0
上下文单次请求 64K token;state + 最长那一个问题 ≤ 32K
输入只收文本:字符串、JSON 对象或数组。图像、音频、视频要先转成文本或结构化字段
计费只收输入 token,输出免费。单价见模型详情页
流式不支持
POSThttps://gateway.amux.ai/v1/systemone

鉴权

header
Authorizationstring必填

Bearer <你的 Amux 密钥> 站内 API Key。

Content-Typestring必填默认 "application/json"

固定为 application/json。

请求

application/json
modelstring必填

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"是
instructionsstring · object · array是要判断的陈述
criteriaobject否{ "true": …, "false": … },分别说明「是」与「否」指什么
"is_urgent": {
  "type": "noul",
  "instructions": "Does this convey urgency?",
  "criteria": { "true": "Explicitly time-sensitive", "false": "No urgency expressed" }
}

choice:单选

从你定义的选项里恰好选一个,返回每个选项的概率。

字段类型必填说明
type"choice"是
instructionsstring · object · array是要做的决定
criteriamap<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"是
instructionsstring · object · array是要打分的维度
criteriaarray<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字段
noulnoul:0(否)到 1(是)
choicechoice:概率最高的选项;probabilities:选项 → 概率,和为 1;confidence
scorescore:加权分,可落在两档之间;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什么时候
400invalid_request请求体缺字段,或某个问题没通过上游校验——消息会点名字段,例如 questions.q.choice.criteria: Field required
400context_length_exceeded明显超出上下文上限,在本站直接拒绝
402insufficient_credits余额不足
502provider_*上游限流、过载或出错。可以重试

完整的 type 取值与重试语义见错误与重试。

cURL
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
  }
}