认识 Jev
面向软件的 System One 模型
传统 LLM 主要生成给人阅读的文本。Jev 专注于做出软件可以直接消费的判断:把一份 state 和一组 typed questions 发给模型,得到可分支、排序和路由的结构化结果。
类型化结果
一次请求并行判断
概率与置信度
快速开始
先在测试台验证一个判断
从 Playground 开始最容易理解 Jev 的输入与输出。确认问题定义合理后,再创建 API key 接入产品。
- 1
打开测试台
登录后进入 Jev AI 测试台,输入一段真实业务状态。
- 2
准备 state
可以是一段文本、JSON 对象或文本数组;先把判断所需的上下文放在一起。
- 3
添加问题
根据目标选择 choice、score 或 noul,也可以在一次调用中混合使用。
- 4
连接到代码
在工作区创建 API key,通过 SDK 或 REST 请求调用正式接口。
输入
让 state 包含判断所需的上下文
state 是所有问题共同读取的内容。简单场景使用字符串;需要同时参考工单、订单和规则时,使用 JSON 对象更清晰。
text一段自然语言、工单或消息
object结构化记录与嵌套字段
array多段文本组成的上下文
当前输入边界:Jev 接受文本、JSON 对象和文本数组,暂不支持图片、音频和视频。
问题类型
用最小问题组合出业务判断
每个 question 最好只问一个具体、边界清晰的问题。多个问题会针对同一份 state 并行评估,不需要为了拆分判断而串联多次请求。
通用字段与结构
Question 是三种问题类型之一,所有类型都包含 type 和 instructions,并根据类型添加 criteria。instructions 可以是字符串、对象或数组;当问题需要额外上下文时,可以把问题和数据放进结构化对象中,并用字段名引用数据。
type必填:noul、choice 或 score。
instructions必填:字符串、对象或数组,描述模型需要做的判断。
criteria按问题类型决定格式:Noul 可选对象;Choice 必填 map;Score 必填数组。
{
"type": "noul",
"instructions": "这个消息是否表达了紧迫性?",
"criteria": {
"true": "明确表示需要立即处理",
"false": "没有表达紧迫性"
}
}结构化 instructions 适合较长的问题或需要引用额外数据的场景:把问题放在一个字段,把上下文放在其他字段,并使用字段名引用它们。
"instructions": {
"potential_duplicate": {
"name": "John Smith",
"location": "Oakland, California",
"last_employer": "Google"
},
"question": "这份简历是否属于与 `potential_duplicate` 相同的人?"
}Choice
Choice 用于从预先定义的选项中选择一个答案。type 必须是 choice,instructions 是要做出的判断,criteria 必须是选项到说明的 map;选项最多 255 个,说明可以是字符串、对象、数组或 null。
{
"state": "救命!我的付款已经连续 3 天失败了。",
"model": "jev-latest",
"questions": {
"department": {
"type": "choice",
"instructions": "哪个团队应该处理这个请求?",
"criteria": {
"billing": "付款、发票、退款",
"technical": "错误、故障、集成",
"sales": "定价、升级、新账号"
}
}
}
}Score
Score 用于有序的描述性等级,例如严重程度或满意度。type 必须是 score,instructions 描述要评分的内容,criteria 是按从低到高排列的数组,每项可以是字符串、对象或数组,至少 2 个、最多 10 个等级;返回值是概率加权后的分数,因此可能落在两个等级之间。
{
"state": "救命!我的付款已经连续 3 天失败了。",
"model": "jev-latest",
"questions": {
"frustration": {
"type": "score",
"instructions": "客户有多沮丧?",
"criteria": ["平静", "不满", "非常愤怒"]
}
}
}Noul
Noul 用于 yes / no 判断。type 必须是 noul,instructions 是待评估的问题;criteria 可选,用 true 和 false 分别描述 yes 与 no 的含义,每个值可以是字符串、对象或数组。返回的 noul 是答案为 yes 的概率,不是另一个 confidence 字段。
{
"state": "救命!我的付款已经连续 3 天失败了。",
"model": "jev-latest",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "这是否表达了紧迫性?",
"criteria": {
"true": "明确表示需要立即处理",
"false": "没有表达紧迫性"
}
}
}
}输出
响应为代码准备了什么
result.answers 会沿用你发送的 question ID。类型化输出保证字段形状,但业务系统仍应根据风险设置阈值,并在必要时保留人工复核。
- answers: Choice 返回选择、概率和 confidence;Score 返回 score、legend、各等级概率和 confidence;Noul 返回 noul。
- usage: 包含 input_tokens 和 output_tokens,部分响应还会提供美元计价的 cost。
- elapsedMs: 从发送请求到收到结果的耗时,包含校验,不等同于纯模型推理时间。
概率与置信度是自动化决策的信号,不是业务正确率的保证。高风险动作应设置更高阈值或转人工。
响应字段
model执行本次评估的模型;本项目响应会在 result 中返回答案和用量。answers按请求中的同名 question ID 返回一个 Answer。usage包含 input_tokens 和 output_tokens。elapsed本项目接口额外返回的请求耗时,单位为毫秒。响应示例
{
"model": "jev-1.13.0",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.95
}
},
"usage": { "input_tokens": 296, "output_tokens": 20 }
}答案类型
每个答案的 type 都与对应问题一致。Choice 和 Score 还会返回 0 到 1 之间的 confidence,它来自答案的概率分布。
Choice
返回概率最高的 choice、所有选项的 probabilities,以及由概率分布计算出的 confidence。
type必填,值为 choice。
choice必填,string;概率最高的选项。
probabilities必填,map<string, number>;所有选项的概率之和为 1。
confidence必填,number;根据概率分布计算出的确定程度。
{
"model": "jev-1.13.0",
"answers": {
"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.12, "sales": 0.0 },
"confidence": 0.81
}
},
"usage": { "input_tokens": 318, "output_tokens": 34 }
}Score
返回概率加权后的 score、等级说明 legend、各等级 probabilities,以及 confidence。score 可以落在两个等级之间。
type必填,值为 score。
score必填,number;按各等级概率加权后的分数。
legend必填,map<string, string>;把等级编号映射回等级说明。
probabilities必填,map<string, number>;每个等级编号及其概率之和为 1。
confidence必填,number;根据概率分布计算出的确定程度。
{
"model": "jev-1.13.0",
"answers": {
"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}
},
"usage": { "input_tokens": 304, "output_tokens": 18 }
}Noul
返回 noul,范围是 0 到 1,表示 yes 的概率。
type必填,值为 noul。
noul必填,number;0 表示 no,1 表示 yes。
{
"model": "jev-1.13.0",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.95
}
},
"usage": { "input_tokens": 307, "output_tokens": 20 }
}usage 详细字段
input_tokensinteger · 本次请求消耗的输入 token 数量。
output_tokensinteger · 本次请求生成的输出 token 数量。
API 参考
评估 state,返回结构化 answers
完整 HTTP API 参考:对一份 state 和一组 typed questions 进行评估,并按每个问题返回结构化答案。
评估接口
请求需要携带 Authorization Bearer API key,以及 application/json 内容类型。
Authorization: Bearer <API_KEY>
Content-Type: application/json请求体
每次请求都需要以下三个顶层字段。questions 是一个 map,键名由你定义,返回答案时会沿用这些键名。
statestring | object | array · 必填:要评估的文本或结构化数据。modelstring · 必填:处理请求的模型。使用 TypeSafe 的旗舰模型 jev-latest。questionsmap<string, Question> · 必填:要并行评估的问题集合。questions 中的每个键由你选择;对应的 Answer 会使用同一个 ID 返回。这个键不会发送给底层模型,也不会参与推理。
请求示例
curl -X POST https://bestjevai.com/v1/systemone \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "救命!我的付款已经连续 3 天失败了。",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "这是否表达了紧迫性?"
}
}
}'请求体示例
{
"state": "救命!我的付款已经连续 3 天失败了。",
"model": "jev-latest",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "这是否表达了紧迫性?"
}
}
}请把 API key 保存在服务端环境变量中,不要写入浏览器代码或提交到版本库。请求字段、问题类型、响应结构、错误码和重试方式已在本页列出。
Agent 使用
在编码 Agent 中使用 Jev
Jev Agent Skill 会教会 Codex、Claude Code、Cursor 等兼容 Agent 如何调用这个 API 做边界清晰的判断,同时把执行权和权限留在你的应用中。
安装与配置
安装 Skill,创建 Jev AI API key,并选择首次引导和示例使用的语言。
一次配置
使用环境变量保存 API key,避免密钥进入源代码、日志和 Agent 对话记录。
提出边界清晰的问题
告诉 Agent 需要判断什么;它应该选择 Choice、Score 或 Noul,并只发送完成判断所需的最小 state。
安装与配置
npx skills add jev-ai/jev-agent-skill
export JEV_API_KEY="sk_your_key_here"
export JEV_LANGUAGE="zh-CN"在 https://bestjevai.com/settings/apikeys 创建 API key。默认语言是英文(en-US);设置 JEV_LANGUAGE=zh-CN 后使用简体中文引导。不要把真实 key 写入源代码或公开提示词。
五个实用起点
安装后可以复制下面任意提示词。它们展示 Agent 如何使用 Jev 做判断,同时不会把最终执行权交给 Jev。
路由客服工单
使用 Choice 选择一个允许的处理团队,再由业务代码路由工单,并把不确定的情况交给人工复核。
使用 Jev Agent skill。请把这张客服工单准确分类到 billing、technical、account 或 sales 其中一个团队。返回选择结果、概率和 confidence。暂时不要联系客户,也不要修改工单。
工单:我的年度套餐被重复扣款了,我需要退款。保护工具调用
使用 Noul 判断一个待执行动作是否需要人工批准,同时仍由确定性权限和业务政策负责最终放行。
使用 Jev Agent skill,在执行下面的工具调用前判断是否可以不经过人工批准。考虑副作用、可逆性、范围和政策。如果有风险或不确定,不要执行。
工具:delete_customer_records
参数:{where: last_login < 2023-01-01}
政策:破坏性数据库操作必须先备份并获得人工批准。选择允许的模型
对允许列表中的候选模型使用 Choice;如果没有合适候选,再用单独的 Noul 判断是否升级。
使用 Jev Agent skill 为这个任务选择一个已批准的模型。优先考虑质量,再考虑上下文容量和成本。返回选择结果、概率,以及是否需要升级。暂时不要调用任何模型。
任务:审查一份 100k token 的客户争议。
候选:fast-model(32k、低成本)、reasoning-model(200k、高成本)、fallback-model(128k、中等成本)。验证研究证据
在 Agent 发布或引用结论前,使用 Noul 判断现有证据是否足够支持该主张。
使用 Jev Agent skill 判断下面的证据是否足以发布这个主张。考虑来源质量、时效性、直接支持程度和矛盾证据。返回 yes 概率以及还缺少的验证工作。暂时不要发布。
主张:我们的 API 将处理耗时中位数降低了 40%。
证据:上月对 120 个案例做的内部基准测试;没有生产流量数据;一份旧报告显示提升了 12%。检查任务是否完成
在向用户报告成功前,使用 Choice 或 Score 判断工作是已完成、需要继续验证,还是仍未完成。
使用 Jev Agent skill 检查这个任务是否真的完成。返回 complete、verify_more 或 incomplete 之一。考虑目标、修改的文件、运行的测试、已知缺口,以及是否在目标环境验证过。
目标:为生产接口增加 API key 鉴权。
已完成:增加了 Authorization 检查和 API key 查询。
验证:单元测试通过;生产请求和限流行为尚未测试。错误处理
错误码与重试
接口使用标准 HTTP 状态码,并在 JSON 响应中说明错误原因。
401未授权:缺少或无效的 API key,请检查 Authorization header。422无法处理:请求体校验失败,例如缺少必填字段或问题格式错误,响应内容会指出出错字段。429请求过多:超过速率限制,请等待后重试。529服务过载:服务暂时繁忙,请等待后重试。收到 429 或 529 时,请使用指数退避重试,不要立即连续发送相同请求。使用 SDK 默认重试策略时,这些重试通常会由 SDK 自动处理。