现已上线: GPT-6 Luna Decisions

体验模型
返回全部文章

AI 与 API

OpenAI Decisions API 入门:三种接入方法

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

文 / Decisions API2026年10月7日11 分钟阅读
OpenAI 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 不一样。

应用分别通过 OpenAI、OpenRouter 和 decisions-api.dev 三个入口接入 OpenAI 决策模型的铅笔示意图

截至 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 原创生成,采用英文标注的铅笔画风格。

© 2026 Decisions API Journal返回首页