AI 与 API
OpenAI Decisions API 入门:三种接入方法
用同一条客服工单,学会通过 OpenAI 官方、OpenRouter 和 decisions-api.dev 调用 Decisions API,理解三种问题类型、返回格式、概率阈值与费用。

OpenAI Decisions API 是一个用于分类和评分的接口。你提供一份材料和若干问题,它返回选项、概率或分数,供程序继续处理。
很多产品都需要这种能力:工单该交给哪个团队,一条反馈是否需要跟进,一段内容应该评为哪个等级。把这些判断接入程序,首先需要明确输入、选项和返回格式。
OpenAI 在 2026 年 10 月 6 日发布了 Decisions API 的 Beta 版本,首个支持的模型是 gpt-6-luna。它也已经出现在 OpenRouter 和 decisions-api.dev 上。OpenAI 更新记录、OpenRouter 模型页、decisions-api.dev 模型页
下面用同一个「工单分流」例子,介绍这三种接入方法。三家的请求格式有差异,读懂这些差异,就能少走很多弯路。
一、先把问题和答案写清楚
假设你正在开发一个客服系统,收到下面这条工单。
订单 R-208 被扣款两次,请协助退回多收的一笔。
程序需要把它分给账单团队、账号团队,或者通用处理队列。这里可以先列出三个固定的业务值:billing、account、other。
这很像给收件员一张分拣表:包裹上的地址是待判断的材料,表格里的格子是允许选择的结果。收件员根据材料选择格子,后面的配送流程再按格子执行。
对应到 API,材料叫输入,判断要求叫问题,分拣表叫选项。选项的说明写得越清楚,结果就越容易接入业务。
Decisions API 提供三种基本问题。原生接口与中转接口的名称对应如下。OpenAI 接口定义、OpenRouter Decisions 接口定义
| 你要问什么 | OpenAI 原生类型 | OpenRouter 与本站类型 | 主要结果 |
|---|---|---|---|
| 工单是否提出退款要求? | predicate |
noul |
条件成立的概率 |
| 工单应该交给哪个团队? | choice |
choice |
选中的业务值,以及各选项的概率 |
| 工单的处理优先级有多高? | score |
score |
有序等级上的分数,以及各等级的概率 |
例如,团队之间没有高低顺序,适合用 choice。低、中、高三个优先级有顺序,适合用 score。
还要给分类准备一个兜底选项。other 的意思是「现有团队都不适合」,应用可以把它送到通用处理队列。这样,遇到新类型的工单时,程序也有明确的处理路径。
二、三种接入方式有什么差别
三种方式都能使用 OpenAI 的决策能力,但你连接的服务、使用的密钥和读写的 JSON 不一样。

截至 2026 年 10 月 7 日,三家的主要差异如下。OpenAI 原生接口、OpenRouter 中转接口、本站接口文档
| 项目 | OpenAI 官方 | OpenRouter | decisions-api.dev |
|---|---|---|---|
| POST 地址 | https://api.openai.com/v1/decisions |
https://openrouter.ai/api/alpha/decisions |
https://decisions-api.dev/v1/systemone |
| 请求中的模型名 | gpt-6-luna |
openai/gpt-6-luna-decisions |
openai/gpt-6-luna-decisions |
| 密钥由谁签发 | OpenAI | OpenRouter | decisions-api.dev |
| 材料字段 | input |
state |
state |
| 问题集合 | 数组,问题用 name 命名 |
对象,对象键就是问题名 | 对象,对象键就是问题名 |
| 读取答案 | answers 数组 |
answers 对象 |
data.result.answers 对象 |
配图只展示应用、接入服务和模型提供方,省略服务内部的转发层。对于这个模型,本站通过 OpenRouter 调用上游,并有自己的额度和请求限制。本站模型说明
下面从最小的文本请求开始。代码里的三个环境变量分别保存三家签发的密钥;替换示例值后,在自己的终端或服务器运行。密钥应留在服务端。
三、方案一:直接调用 OpenAI
如果你的项目已经使用 OpenAI 的服务,可以直接调用官方接口。
先把下面的内容保存为 openai-request.json。
{
"model": "gpt-6-luna",
"input": "订单 R-208 被扣款两次,请协助退回多收的一笔。",
"questions": [
{
"name": "route",
"type": "choice",
"instructions": "选择负责处理这条工单的团队。没有合适的团队时选择 other。",
"choices": [
{ "value": "billing", "description": "扣款、账单与退款" },
{ "value": "account", "description": "登录与账号访问" },
{ "value": "other", "description": "上述团队职责之外的问题" }
]
}
]
}
上面代码中,input 是所有问题共用的材料。questions 是数组,route 是问题名。每个 choices 元素包含一个供程序使用的 value,以及它的含义。
接下来,用 curl 发出请求。
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"
curl --fail-with-body https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @openai-request.json
上面代码中,Authorization 使用 OpenAI 密钥,--data-binary 读取刚才保存的 JSON 文件。返回结构由官方的 Create a decision 文档 定义。
下面是一个用来解释结构的响应节选。数值是示意值,不代表这条工单的实测结果。
{
"answers": [
{
"name": "route",
"type": "choice",
"choice": "billing",
"probabilities": [
{ "value": "billing", "probability": 0.92 },
{ "value": "account", "probability": 0.03 },
{ "value": "other", "probability": 0.05 }
],
"confidence": 0.84
}
]
}
上面代码中,choice 是选中的业务值,probabilities 是各选项的概率。confidence 是另一个返回字段,不能直接用它替代选项概率。
原生接口还可能针对某个问题返回 type: "refusal"。读取答案时,应先检查类型,再取 choice 或分数;同一请求中的其他问题仍可能得到正常答案。官方拒答定义
四、方案二:通过 OpenRouter 调用
如果项目已经使用 OpenRouter,可以继续使用它签发的密钥。这里调用的是专用的 Decisions 地址:/api/alpha/decisions。OpenRouter 请求文档
先把下面的内容保存为 gateway-request.json。
{
"model": "openai/gpt-6-luna-decisions",
"state": "订单 R-208 被扣款两次,请协助退回多收的一笔。",
"questions": {
"route": {
"type": "choice",
"instructions": "选择负责处理这条工单的团队。没有合适的团队时选择 other。",
"criteria": {
"billing": "扣款、账单与退款",
"account": "登录与账号访问",
"other": "上述团队职责之外的问题"
}
}
}
}
上面代码中,模型名增加了 openai/ 前缀和 -decisions 后缀。输入改为 state,问题名变成对象键,选项改为 criteria 对象。
接下来,发出中转请求。
export OPENROUTER_API_KEY="YOUR_OPENROUTER_API_KEY"
curl --fail-with-body https://openrouter.ai/api/alpha/decisions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @gateway-request.json
上面代码中,密钥必须由 OpenRouter 签发。返回结果按问题名组织,可以从 answers.route 读取这条问题的答案。
同样的分类结果,在这里的结构可以表示为下面这样。数值仍是示意值。
{
"answers": {
"route": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.92, "account": 0.03, "other": 0.05 },
"confidence": 0.84
}
}
}
上面代码中,答案和概率分布都变成了对象。迁移官方代码时,要一起修改请求构造和响应读取逻辑。
模型页目前列出文本与图片输入、1,050,000 token 上下文,以及最多 200 个问题的上游能力。这里采用一个问题的短文本请求,完整上限应以当前服务文档和账号实际可用能力为准。OpenRouter 模型说明
五、方案三:通过 decisions-api.dev 调用
decisions-api.dev 把这个模型接入了自己的工作台和 API。模型页可以用来试写问题、查看请求格式,接入程序时使用本站签发的密钥。GPT-6 Luna Decisions 模型页
对于这个模型,可以复用上一节的 gateway-request.json。本站接受同样的 model、state 和命名问题对象,但调用地址和返回外层不同。本站接入文档
下面把本站响应保存到 result.json,后面会用它演示业务判断。
export DECISIONS_API_KEY="YOUR_DECISIONS_API_KEY"
curl --fail-with-body https://decisions-api.dev/v1/systemone \
-H "Authorization: Bearer $DECISIONS_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @gateway-request.json \
--output result.json
上面代码中,密钥来自 decisions-api.dev。--output 把 JSON 响应写入本地文件,方便后续程序读取。
下面是本站成功响应的结构节选;省略了用量等字段。数值是示意值。
{
"code": 0,
"message": "ok",
"data": {
"result": {
"answers": {
"route": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.92, "account": 0.03, "other": 0.05 },
"confidence": 0.84
}
}
}
}
}
上面代码中,code: 0 表示本站请求成功,分类答案位于 data.result.answers.route。读取用量时,使用 data.result.usage;本站扣除的额度位于 data.creditsUsed。本站响应文档
本站还有自己的限制:最多 8 个问题,文本与问题合计 32 KiB;图片最多 4 张。上游模型的上下文窗口不会自动提高本站的这些限制。本站模型限制
六、再加两个问题
工单分流跑通以后,可以继续判断「是否要求退款」和「处理优先级」。这两个问题都直接判断原始工单,不依赖 route 的答案。
在 OpenAI 原生请求中,将下面的问题对象加入 questions 数组即可。
{
"name": "needs_refund",
"type": "predicate",
"instructions": "工单是否明确要求退回款项?"
}
上面代码中,predicate 返回条件成立的概率,字段名是 probability。应用可以根据自己的规则,把概率转换成是否进入退款审核流程。
下面是原生接口的优先级问题,也加入同一个数组。
{
"name": "priority",
"type": "score",
"instructions": "仅根据明确描述的影响,评估处理优先级。",
"levels": [
{ "label": "low", "description": "咨询或建议,现有功能仍可使用" },
{
"label": "medium",
"description": "已有资金或功能问题,但未说明完全受阻"
},
{ "label": "high", "description": "核心业务完全受阻,需要尽快处理" }
]
}
上面代码中,levels 按低到高排列。等级索引从 0 开始,三个等级对应 0、1、2;返回的 score 是按概率加权的平均值,所以可能出现 1.4 这样的分数。官方评分说明
使用 OpenRouter 或本站时,把相同的业务问题改成下面的写法,加入 questions 对象。
{
"needs_refund": {
"type": "noul",
"instructions": "工单是否明确要求退回款项?"
},
"priority": {
"type": "score",
"instructions": "仅根据明确描述的影响,评估处理优先级。",
"criteria": [
"低:咨询或建议,现有功能仍可使用",
"中:已有资金或功能问题,但未说明完全受阻",
"高:核心业务完全受阻,需要尽快处理"
]
}
}
上面代码中,是非问题改为 noul,它的结果字段也叫 noul,表示条件成立的概率;有序等级则写成 criteria 字符串数组。OpenRouter 问题格式
这些问题可以共用一次请求。如果后一个问题必须根据前一个答案才知道怎么问,就需要分成两次调用。官方多问题说明
七、让程序处理不确定的结果
拿到 billing 以后,程序仍要决定是否自动分流。这个决定取决于业务规则和模型返回的概率。
例如,选中的团队概率很高,可以进入对应队列;概率不够高,或者选中了 other,就进入人工复核队列。

下面用本站保存的 result.json 演示这个处理过程。将代码保存为 route.mjs,执行 node route.mjs。这里的 0.85 只是演示阈值。
import { readFileSync } from 'node:fs';
const body = JSON.parse(readFileSync('result.json', 'utf8'));
if (body.code !== 0) throw new Error(body.message || 'Request failed');
const answer = body.data?.result?.answers?.route;
const probability = answer?.probabilities?.[answer.choice];
const canRoute =
answer?.type === 'choice' &&
['billing', 'account'].includes(answer.choice) &&
Number.isFinite(probability) &&
probability >= 0.85;
console.log(canRoute ? answer.choice : 'manual-review');
上面代码中,程序检查答案类型、允许的业务值和选中选项的概率。不满足条件时,统一输出 manual-review,供后续队列逻辑使用。
0.85 不能直接理解成「实际正确率达到 85%」。应当用已经人工标注的真实工单,观察自动分流的错误和人工复核量,再决定阈值。confidence 也是单独的信号,不能未经验证就当作准确率。官方答案解读
退款的例子还要区分两个动作:模型判断工单提出了退款要求,业务代码再检查订单、支付记录和退款权限。上面的决策请求只负责分类。
八、费用和限制要一起看
截至 2026 年 10 月 7 日,基础输入计费如下。实际成本还取决于处理的输入量和服务计费规则。
| 接入方式 | 基础输入价格 | 输出费用 | 来源 |
|---|---|---|---|
| OpenAI 官方 Decisions | 每百万 token 0.10 美元 | 不收取输出 token 费用 | 官方费用说明 |
| OpenRouter | 模型页列出每百万 token 0.10 美元 | 模型页列出 0 美元 | 模型价格 |
| decisions-api.dev | 每百万输入 token 1,500 credits,折合 0.15 美元 | 不额外收取输出费用 | 本站价格与公式 |
OpenAI 的基础价格之外,区域处理溢价和长上下文输入倍率可能适用。不要把短请求的价格直接外推为所有场景的价格。官方费用说明
本站按每次请求向上取整,成功调用至少扣除 1 credit。下面是它对这个模型使用的公式。
credits = max(1, ceil(input_tokens × 1500 / 1,000,000))
上面公式中,input_tokens 使用上游实际返回的输入用量,包含问题和处理后的图片。例如,1,000 个输入 token 扣除 2 credits,5,000 个扣除 8 credits。短请求的费用会受到最低额度和取整影响。本站计费说明
如果要加入图片,也要重新核对协议。OpenAI 原生接口把图片放在 input 的用户消息中,使用 input_image 和内嵌 data URL;本站另外提供 images 字段,并在转发前转换格式。图片数量、大小和 URL 规则分别以各家文档为准。OpenAI 图片输入定义、本站图片参数
接入失败时,可以按三个方向排查:格式不对,检查字段名与 HTTP 400;密钥不对,检查密钥签发平台与 HTTP 401;额度、频率或请求体超限,结合 HTTP 402、429、413 和返回的错误信息处理。OpenRouter 错误定义、本站错误说明
三种方案的选择,可以沿着现有项目来判断:已经使用 OpenAI,就直接接原生接口;已经通过 OpenRouter 管理模型,就使用它的 Decisions 中转;需要在同一工作台试写问题并接入本站额度体系,就使用本站接口。
先用一个问题和几条工单跑通,再增加问题、收集标注样本、调整阈值。这时,Decisions API 才会成为产品里可以检验和维护的一段判断逻辑。
(完)
资料核对日期:2026 年 10 月 7 日。本文核对了公开文档、真实服务页面和本仓库当天的 OpenRouter 调用记录;本次写作没有新增三家带密钥的在线调用。示例工单为原创,正文响应数值为结构示意,未用作准确率或性能证据。配图由 ImageGen 原创生成,采用英文标注的铅笔画风格。