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 决策

POST
/v1/systemone

提交一段状态和一组结构化问题,一次返回全部答案。

本接口固定使用 System One / Jev 契约,同步返回单个 JSON 对象,不提供 SSE 或增量事件。请求体没有 stream 字段;若仍传入 stream,网关会忽略该字段,不会因此返回 400,也不会改成流式响应。

请求约束(网关入站校验,失败为 400)

  • model、state、questions 必填。model 必须是非空白字符串,且是控制台中可用的决策模型;支持模型别名。响应里的 model 是解析后的入口模型,不是上游渠道模型名。
  • state 与每题 instructions 只接受 JSON string、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 相同。

认证方式

BearerAuthBEARER

仅接受 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 除字符串外也可以传对象或数组:把问题与它引用的数据放进同一个结构,并在问题中用反引号引用字段名,适合问题依赖多条上下文的场景。

请求

POST/v1/systemone
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": [
        "低",
        "中",
        "高"
      ]
    }
  }
}'

响应

object

决策成功。单个 JSON 对象,无流式事件。

响应体属性

  • idstring, 必填

    网关请求 ID,前缀 chatdecisions-,与 http_x_reqid 相同。

  • modelstring, 必填

    解析后的入口模型 ID,不是上游渠道模型名。

  • answersobject, 必填

    与请求 questions 相同的题目 ID。成功响应包含每一题。

    • *object | object | object

      单题答案。出现哪些字段由 type 决定。

  • usageobject, 必填

    System One 对外 usage。只有 input_tokens 与 output_tokens,没有 total_tokens,也没有缓存或思考明细。

    • input_tokensinteger, 必填
      必填。

      minimum: 0

    • output_tokensinteger, 必填

      可为 0。缺少该字段时请求失败,而不是写成 0。

      minimum: 0

响应

application/json
{
  "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

POST
/v1/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_image parts。
  • 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 的模型权限。

认证方式

BearerAuthBEARER

仅接受 Modelink API Key。在 Authorization 请求头中传入 Bearer <api_key>;不能使用控制台登录访问令牌。

请求体

请求体属性

  • modelstring, 必填

    控制台中的决策模型 ID。入口要求非空字符串。

  • inputstring | object[], 必填

    标准 input:字符串,或 user message 数组。图片 part 只属于原生渠道;Jev 转换会拒绝它,这不是所有渠道共用的入口 400。

    • oneOf[0]string
      可选。
    • oneOf[1]object[]
  • questionsobject | object | object[], 必填

    有序题目。标准形状为非空数组。入口不本地校验题目语义。

    • oneOf[0]object

      是/否题。标准形状不带 choices 或 levels。

    • oneOf[1]object

      单选。标准形状的 choices 为 2–255 项,同一题内 value 不能重复。该数量与去重约束是原生上游与 Jev 可转换子集的约束,不是入口对所有渠道的统一 400。

    • oneOf[2]object

      评分题。标准形状的 levels 为 2–10 档,顺序即响应中的 value 索引;不能携带 choices。数量约束属于原生上游与 Jev 可转换子集,不是入口统一校验。

  • streamfalse

    只接受缺省或 false。JSON true 会在入口直接 400。本接口没有流式响应。

    const: false

请求

POST/v1/decisions
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": "高"
        }
      ]
    }
  ]
}'

响应

object

决策成功。单个 JSON 对象,无流式事件。原生渠道的扩展字段会保留;schema 列出的是标准答案字段。

响应体属性

  • idstring, 必填

    网关请求 ID,前缀 chatdecisionsoai-。覆盖上游同名 id。

  • modelstring, 必填

    解析后的入口模型 ID。

  • answersobject | object | object | object[]

    标准成功响应按请求题目顺序返回。原生渠道可能额外返回 refusal 或其他类型,网关不改写。

    • oneOf[0]object

      predicate 答案。probability 为 0–1。

    • oneOf[1]object

      choice 答案。choice 保持字符串或布尔。原生渠道可能省略 probabilities 或 confidence;Jev 回译成功时二者都会出现。

    • oneOf[2]object

      score 答案。score 是档位索引尺度上的加权得分,不是 0–1 概率。

    • oneOf[3]object

      仅原生渠道可能原样返回的 refusal。Jev 回译不会生成该类型;上游 refusal 在 Jev 路径按错误处理。不要把它写成所有渠道都会返回的统一答案。

  • 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 回译不会生成该对象。

    • output_tokens_detailsobject

      仅原生渠道可能返回的输出明细。Jev 回译不会生成该对象。

响应

application/json
{
  "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
  }
}