OpenAPI 参考
Modelink API · 决策
结构化决策 API。POST /v1/systemone 使用 System One / Jev 契约(state + questions 对象);POST /v1/decisions 使用 OpenAI Decisions 原生契约(input + questions 数组)。两个入口都是同步 JSON,没有 SSE,也没有增量事件。
版本 1.0.0
创建 System One 决策
提交一段状态和一组结构化问题,一次返回全部答案。
本接口固定使用 System One / Jev 契约,同步返回单个 JSON 对象,不提供 SSE 或增量事件。请求体没有 stream 字段;若仍传入 stream,网关会忽略该字段,不会因此返回 400,也不会改成流式响应。
请求约束(网关入站校验,失败为 400)
model、state、questions必填。model必须是非空白字符串,且是控制台中可用的决策模型;支持模型别名。响应里的model是解析后的入口模型,不是上游渠道模型名。state与每题instructions只接受 JSONstring、object或array。null、布尔、数字以及缺省都会被拒绝。空字符串合法。questions必须是非空对象,不是数组。键是题目 ID,成功响应的answers使用同一组键。键不能为空白。type大小写敏感,只接受noul、choice、score。noul.criteria可省略。一旦提供,必须是对象,且键只能是"true"/"false";值只接受string、object或array,不接受null。choice.criteria必填,为 1–255 个「选项 → 描述」。选项名不能为空白。描述接受string、object、array或null。score.criteria必填,为有序数组,2–10 档。每一档只接受string、object或array。- 未知字段会被 JSON 绑定忽略,不要依赖它们被保存或回显。
响应
成功时每个请求题目都有对应答案,否则视为上游不完整(502),不会补造答案。usage 只有 input_tokens 与 output_tokens;上游缺少 usage 时同样报错,不会伪造零用量。output_tokens 为 0 是合法值。
score 是 legend 索引尺度上的加权得分,不是 0–1 概率。档位从 0 编号;例如三档且概率为 0.1 / 0.7 / 0.2 时,得分可以是 1.1。noul、probabilities 与 confidence 才是 0–1 概率,显式 0 合法。
顶层 id 是本次网关请求 ID,前缀为 chatdecisions-,与响应头 http_x_reqid 相同。
认证方式
仅接受 Modelink API Key。在 Authorization 请求头中传入 Bearer <api_key>;不能使用控制台登录访问令牌。
请求体
请求体属性
- modelstring, 必填
控制台中的决策模型 ID,非空白。可使用模型别名。响应 model 为解析后的入口模型。
- statestring | object | unknown[], 必填
待判断的状态。string、object 或 array。空字符串合法。目前只接受文本类输入;图片、音频、视频和二进制内容需要先转换成文本或结构化字段再传入。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- questionsobject, 必填
题目 ID 到题目的映射,不能为空,也不能是数组。ID 不能为空白。
- *object | object | object
单道 System One 题目。由 type 决定 criteria 形状。instructions 除字符串外也可以传对象或数组:把问题与它引用的数据放进同一个结构,并在问题中用反引号引用字段名,适合问题依赖多条上下文的场景。
- oneOf[0]object
是/否概率题。criteria 可选。答案是 0–1 的「是」概率,不含 confidence,由业务代码自行设置阈值。
- type"noul", 必填必填。
const: noul
- instructionsstring | object | unknown[], 必填
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- criteriaobject
noul 的 true/false 说明。其他键会被网关拒绝。值不接受 null。
additionalProperties: false
- truestring | object | unknown[]
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- falsestring | object | unknown[]
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- oneOf[1]object
单选。criteria 为选项到描述的映射,1–255 项。choice 是概率最高的选项,probabilities 是完整分布,confidence 由分布计算得出。
- type"choice", 必填必填。
const: choice
- instructionsstring | object | unknown[], 必填
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- criteriaobject, 必填
选项名不能为空白。描述可为 string、object、array 或 null。
- *string | object | unknown[] | null
choice 选项描述。比 DecisionTextValue 多接受 null。
- oneOf[0]string | object | unknown[]
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- oneOf[1]null可选。
- oneOf[2]object
有序评分。criteria 为 2–10 档,顺序即 legend 索引。score 是概率加权值,可能落在两个档位之间。
- type"score", 必填必填。
const: score
- instructionsstring | object | unknown[], 必填
System One 中 state、instructions 与多数说明文本允许的 JSON 值:string、object 或 array。不接受 null、布尔或数字。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
- criteriastring | object | unknown[][], 必填
从索引 0 开始的有序档位。
- oneOf[0]string可选。
- oneOf[1]object可选。
- oneOf[2]unknown[]可选。
请求
curl https://api.qnaigc.com/v1/systemone \
--request POST \
--header 'Authorization: Bearer YOUR_BEARER_AUTH' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"model": "your-decision-model",
"state": "我的订单 #42 到货时已经压坏,想退款。",
"questions": {
"wants_refund": {
"type": "noul",
"instructions": "用户是否希望退款?",
"criteria": {
"true": "明确要求退款",
"false": "没有退款诉求"
}
},
"queue": {
"type": "choice",
"instructions": "应由哪个队列处理?",
"criteria": {
"billing": "账单与退款",
"technical": "技术问题",
"other": null
}
},
"urgency": {
"type": "score",
"instructions": "紧急程度如何?",
"criteria": [
"低",
"中",
"高"
]
}
}
}'响应
决策成功。单个 JSON 对象,无流式事件。
响应体属性
- idstring, 必填
网关请求 ID,前缀
chatdecisions-,与 http_x_reqid 相同。 - modelstring, 必填
解析后的入口模型 ID,不是上游渠道模型名。
- answersobject, 必填
与请求 questions 相同的题目 ID。成功响应包含每一题。
- *object | object | object
单题答案。出现哪些字段由 type 决定。
- oneOf[0]object
noul 答案。noul 为 0–1 概率。
- type"noul", 必填必填。
const: noul
- noulnumber, 必填
判断为真的概率。0 合法。
minimum: 0; maximum: 1
- oneOf[1]object
choice 答案。probabilities 的键是请求中的选项名,值是 0–1 概率,成功时覆盖全部选项。
- type"choice", 必填必填。
const: choice
- choicestring, 必填
选中的选项名。
- probabilitiesobject, 必填
选项名到 0–1 概率。显式 0 会保留。
- *number
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- confidencenumber, 必填
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- oneOf[2]object
score 答案。score 使用 legend 索引尺度,不是 0–1 概率。
- type"score", 必填必填。
const: score
- scorenumber, 必填
按档位索引加权的得分。索引 0 是 criteria 的第一档。三档概率 0.1 / 0.7 / 0.2 时得分可以是 1.1。不要把它当成 0–1 概率。
- legendobject, 必填
索引字符串到档位说明。上游未返回时,网关用请求 criteria 补齐,这是已知映射,不是预测值。
- *string可选。
- probabilitiesobject, 必填
索引字符串到 0–1 概率。成功时覆盖 0 到档数-1 的每一个索引。
- *number
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- confidencenumber, 必填
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- usageobject, 必填
System One 对外 usage。只有 input_tokens 与 output_tokens,没有 total_tokens,也没有缓存或思考明细。
- input_tokensinteger, 必填必填。
minimum: 0
- output_tokensinteger, 必填
可为 0。缺少该字段时请求失败,而不是写成 0。
minimum: 0
响应
{
"id": "chatdecisions-0123456789abcdef0123456789abcdef",
"model": "your-decision-model",
"answers": {
"wants_refund": {
"type": "noul",
"noul": 0.93
},
"queue": {
"type": "choice",
"choice": "billing",
"probabilities": {
"billing": 0.88,
"technical": 0.12,
"other": 0
},
"confidence": 0.81
},
"urgency": {
"type": "score",
"score": 1.1,
"legend": {
"0": "低",
"1": "中",
"2": "高"
},
"probabilities": {
"0": 0.1,
"1": 0.7,
"2": 0.2
},
"confidence": 0.55
}
},
"usage": {
"input_tokens": 296,
"output_tokens": 20
}
}创建 OpenAI Decisions
按 OpenAI Decisions 原生契约提交 input 和有序 questions,一次返回有序 answers。
本接口同步返回单个 JSON 对象,不提供 SSE 或增量事件。
网关入口实际校验
入口只检查三件事,失败为 400:
- 请求体必须是 JSON 对象。
model必须是非空字符串。stream的 JSON 值为布尔true时直接拒绝,不会发往上游。缺省或false可以。其他类型的stream不在入口本地校验。
input、questions、图片、布尔选项、题名和客户端扩展字段的语义不是入口上的统一 400 校验。下面的 schema 描述的是标准调用形状和原生上游约束,不是「所有渠道都会在网关被同一套规则拒绝」。
标准调用形状
input为字符串,或仅含role: "user"的 message 数组。content 可以是字符串,或input_text/input_imageparts。questions为非空数组,保持客户端顺序。type为predicate、choice或score。name可省略、为null、为空字符串,也可以重复。choice.choices[].value为字符串或布尔。布尔true与字符串"true"是不同选项。score.levels[].label为字符串。标准形状下 choices 为 2–255 项,levels 为 2–10 档。- 成功响应按题目顺序返回。
predicate给出 0–1 的probability;choice/score的probabilities[].probability与confidence也是 0–1。score本身是档位索引尺度上的加权得分,不是 0–1 概率,可以是 1.1 这样的小数。
原生透传与 Jev 可转换子集
选中原生渠道时,网关只替换请求和响应的顶层 model,并覆盖写入顶层 id。图片、布尔 choice、null 题名、refusal、safety_identifier 以及其他扩展字段逐字保留,由该上游校验。上游省略 usage 时,网关不补造用量字段。
只有能表达为 Jev 契约的请求才会同时允许 Jev 渠道。转换会拒绝图片、非 user 消息、未知字段、safety_identifier、非法题型,以及 choices / levels 数量越界等 Jev 无法承载的构造。该拒绝不是原生渠道的统一入口校验:存在原生渠道时这些字段仍会透传。若模型只有 Jev 渠道、而请求又无法转换,调度返回 400,code 为 protocol_unsupported。
经 Jev 渠道回译时,usage 固定为 input_tokens、output_tokens 与 total_tokens(total 为二者之和),不会生成 usage 明细。原生渠道则可能附带 input_tokens_details / output_tokens_details。
顶层 id 前缀为 chatdecisionsoai-,覆盖上游同名字段,并与 http_x_reqid 相同。响应 model 是解析后的入口模型。本入口额外检查 API Key 的模型权限。
认证方式
仅接受 Modelink API Key。在 Authorization 请求头中传入 Bearer <api_key>;不能使用控制台登录访问令牌。
请求体
请求体属性
- modelstring, 必填
控制台中的决策模型 ID。入口要求非空字符串。
- inputstring | object[], 必填
标准 input:字符串,或 user message 数组。图片 part 只属于原生渠道;Jev 转换会拒绝它,这不是所有渠道共用的入口 400。
- oneOf[0]string可选。
- oneOf[1]object[]
- role"user", 必填必填。
const: user
- type"message"
可选。标准值为 message。
const: message
- contentstring | object | object[], 必填
message content:字符串,或 content parts 数组。
- oneOf[0]string可选。
- oneOf[1]object | object[]
- oneOf[0]object
文本 part。
- type"input_text", 必填必填。
const: input_text
- textstring, 必填必填。
- oneOf[1]object
图片 part。原生渠道逐字保留。Jev 契约没有图像输入,因此带图片的请求不能转换到 Jev 渠道;若当时没有原生渠道,结果是 protocol_unsupported,而不是一条适用于所有原生渠道的入口校验。
- type"input_image", 必填必填。
const: input_image
- image_urlstring, 必填
图片 URL 或原生渠道接受的图片引用。
- detailstring
可选的原生细节提示。入口不校验取值。
- questionsobject | object | object[], 必填
有序题目。标准形状为非空数组。入口不本地校验题目语义。
- oneOf[0]object
是/否题。标准形状不带 choices 或 levels。
- type"predicate", 必填必填。
const: predicate
- instructionsstring, 必填
标准形状为字符串。Jev 转换要求字符串;原生入口不本地强制该类型。
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- oneOf[1]object
单选。标准形状的 choices 为 2–255 项,同一题内 value 不能重复。该数量与去重约束是原生上游与 Jev 可转换子集的约束,不是入口对所有渠道的统一 400。
- type"choice", 必填必填。
const: choice
- instructionsstring, 必填必填。
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- choicesobject[], 必填
- valuestring | boolean, 必填
字符串或布尔。
true与"true"不相同。同一题内选项值不能重复。- oneOf[0]string可选。
- oneOf[1]boolean可选。
- descriptionstring | null
可选说明。标准形状为字符串或 null。
- oneOf[2]object
评分题。标准形状的 levels 为 2–10 档,顺序即响应中的 value 索引;不能携带 choices。数量约束属于原生上游与 Jev 可转换子集,不是入口统一校验。
- type"score", 必填必填。
const: score
- instructionsstring, 必填必填。
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- levelsobject[], 必填
- labelstring, 必填必填。
- descriptionstring | null
可选说明。
- streamfalse
只接受缺省或 false。JSON true 会在入口直接 400。本接口没有流式响应。
const: false
请求
curl https://api.qnaigc.com/v1/decisions \
--request POST \
--header 'Authorization: Bearer YOUR_BEARER_AUTH' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"model": "your-decision-model",
"input": "我的订单 #42 到货时已经压坏,想退款。",
"questions": [
{
"type": "predicate",
"instructions": "用户是否希望退款?",
"name": "wants_refund"
},
{
"type": "choice",
"instructions": "应由哪个队列处理?",
"name": "queue",
"choices": [
{
"value": "billing",
"description": "账单与退款"
},
{
"value": "technical",
"description": "技术问题"
}
]
},
{
"type": "score",
"instructions": "紧急程度如何?",
"name": "urgency",
"levels": [
{
"label": "低"
},
{
"label": "中"
},
{
"label": "高"
}
]
}
]
}'响应
决策成功。单个 JSON 对象,无流式事件。原生渠道的扩展字段会保留;schema 列出的是标准答案字段。
响应体属性
- idstring, 必填
网关请求 ID,前缀
chatdecisionsoai-。覆盖上游同名 id。 - modelstring, 必填
解析后的入口模型 ID。
- answersobject | object | object | object[]
标准成功响应按请求题目顺序返回。原生渠道可能额外返回 refusal 或其他类型,网关不改写。
- oneOf[0]object
predicate 答案。probability 为 0–1。
- type"predicate", 必填必填。
const: predicate
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- probabilitynumber, 必填
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- oneOf[1]object
choice 答案。choice 保持字符串或布尔。原生渠道可能省略 probabilities 或 confidence;Jev 回译成功时二者都会出现。
- type"choice", 必填必填。
const: choice
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- choicestring | boolean, 必填
选中值,类型与请求中的 value 一致。
- oneOf[0]string可选。
- oneOf[1]boolean可选。
- confidencenumber
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- probabilitiesobject[]
按请求 choices 顺序。choice 项没有 label。
- valuestring | boolean, 必填
- oneOf[0]string可选。
- oneOf[1]boolean可选。
- probabilitynumber, 必填
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- oneOf[2]object
score 答案。score 是档位索引尺度上的加权得分,不是 0–1 概率。
- type"score", 必填必填。
const: score
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- scorenumber, 必填
索引尺度得分。三档时 1.1 表示介于第 2 档与第 3 档之间,不是超出 0–1 的概率。原生渠道不把该值夹紧到 0–1。
- confidencenumber
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- probabilitiesobject[]
按 levels 顺序。value 为从 0 开始的索引。Jev 回译会带上请求中的 label,空字符串也保留。
- valueinteger, 必填
档位索引,从 0 开始。
minimum: 0
- labelstring
请求档位的 label。可为空字符串。choice 分布项没有该字段。
- probabilitynumber, 必填
0–1 概率。显式 0 合法,与字段缺失不同。
minimum: 0; maximum: 1
- oneOf[3]object
仅原生渠道可能原样返回的 refusal。Jev 回译不会生成该类型;上游 refusal 在 Jev 路径按错误处理。不要把它写成所有渠道都会返回的统一答案。
- type"refusal", 必填必填。
const: refusal
- namestring | null
题名。可省略、为 null、为空字符串,也可在数组中重复。
- usageobject
usage 不是成功响应的必填字段。原生渠道省略时,网关不补造,客户端响应保持上游原文。经 Jev 渠道回译时固定包含 input_tokens、output_tokens、total_tokens,且不生成明细。
- input_tokensinteger可选。
minimum: 0
- output_tokensinteger可选。
minimum: 0
- total_tokensinteger
Jev 回译时等于 input_tokens + output_tokens。原生渠道若提供该字段则原样保留。
minimum: 0
- input_tokens_detailsobject
仅原生渠道可能返回的输入明细。Jev 回译不会生成该对象。
- cached_tokensinteger可选。
minimum: 0
- cache_write_tokensinteger可选。
minimum: 0
- output_tokens_detailsobject
仅原生渠道可能返回的输出明细。Jev 回译不会生成该对象。
- reasoning_tokensinteger可选。
minimum: 0
响应
{
"id": "chatdecisionsoai-0123456789abcdef0123456789abcdef",
"model": "your-decision-model",
"answers": [
{
"type": "predicate",
"name": "wants_refund",
"probability": 0.93
},
{
"type": "choice",
"name": "queue",
"choice": "billing",
"confidence": 0.81,
"probabilities": [
{
"value": "billing",
"probability": 0.88
},
{
"value": "technical",
"probability": 0.12
}
]
},
{
"type": "score",
"name": "urgency",
"score": 1.1,
"confidence": 0.55,
"probabilities": [
{
"label": "低",
"value": 0,
"probability": 0.1
},
{
"label": "中",
"value": 1,
"probability": 0.7
},
{
"label": "高",
"value": 2,
"probability": 0.2
}
]
}
],
"usage": {
"input_tokens": 296,
"output_tokens": 20,
"total_tokens": 316
}
}