InfiniSynapse Partner Silent Provisioning Guide

本文面向希望在自己的产品中静默集成 InfiniSynapse 能力的第三方开发者。与「使用 InfiniSynapse 登录」(见《InfiniSynapse Partner SSO Integration Guide》)不同,本方案全程无需你的用户登录或跳转:你的服务端直接调用一组 M2M(服务端对服务端)接口,为你的每个用户自动开通一个专属的 InfiniSynapse 子账号和 API Key,然后代用户调用 InfiniSynapse 开放 API。

按照本文步骤接入后,你可以:

  • 为你的每个用户静默开通一个独立的 InfiniSynapse 子账号(用户无感,不需要注册或登录 InfiniSynapse);
  • 拿到每个子账号专属的 API Key(sk- 开头),在你的服务端代用户调用 InfiniSynapse 开放 API(如发起数据分析任务);
  • 每个子账号的数据、任务互相隔离;消耗统一从你的主账号(创建该接入应用的 InfiniSynapse 账号)余额中扣除,你只需给主账号正常充值,无需给每个子账号单独充值;
  • 随时轮换 Key、停用子账号、查询用量与主账号余额对账。

整个接入只需要你有一个能发 HTTP 请求的服务端,没有 SDK 依赖,任何语言都可以接。

1. 它是怎么工作的

你的服务端                        InfiniSynapse
   │                                  │
   │ ① 开通子账号(首次用到某用户时调用一次) │
   │ ──── POST /users/provision ────▶│  按 (clientId, externalUserId) 幂等
   │ ◀─── { infiniUserId, apiKey } ──│  建号 + 签发专属 API Key
   │                                  │
   │ ② 代用户调用开放 API(之后日常使用)    │
   │ ── Authorization: Bearer sk-xxx ▶│  用量自动从你的主账号余额扣除
   │ ◀────────── 结果 ───────────────│
  1. 开通:你首次需要代某个用户使用 InfiniSynapse 时,用你系统里该用户的唯一 ID(externalUserId)调用一次开通接口。InfiniSynapse 会为其创建一个独立子账号并签发专属 API Key。同一个 externalUserId 重复调用是幂等的,永远返回同一个子账号和同一把有效的 Key,所以不用担心重复调用。
  2. 调用:拿到 sk- Key 后,在你的服务端用它调用 InfiniSynapse 开放 API。所有子账号的用量都会统一从你的主账号余额中扣除——你只需在 InfiniSynapse 里给主账号正常充值即可,主账号的资金池就是全部子账号共用的资金来源。

子账号默认不能登录 InfiniSynapse App(不设密码),它是一个纯粹由你的服务端托管的账号,也没有独立钱包、不能单独充值。API Key 调用不受影响。

资金模型:子账号共用主账号余额

  • 主账号 = 你(开发者)登录 InfiniSynapse、创建接入应用(clientId)时所用的那个账号。
  • 你名下所有子账号的调用消耗,都从主账号的余额里扣(扣费顺序与主账号自己使用时一致:赠送余额 → 订阅配额 → 充值余额)。
  • 不需要给子账号单独充值,也没有独立预付池;只要保证主账号余额充足即可。
  • 用量记录仍按子账号维度保存,方便你区分是哪个用户产生的消耗(见 4.6 对账)。

2. 准备工作:申请接入凭证

本方案与 Partner SSO 登录共用同一套接入凭证:clientId + clientSecret。如果你已经接入过「使用 InfiniSynapse 登录」,直接复用现有凭证即可,无需重新申请。

还没有凭证的话:

  1. 用你的 InfiniSynapse 账号登录 https://app.infinisynapse.cn/tasks这个账号就是后续所有子账号消耗的付费主账号,请给它保持充足余额);
  2. 点击左下角「设置」齿轮图标,在菜单中选择 第三方接入
  3. 点击 创建接入应用,填写应用名称(回调域名白名单仅登录场景使用,本方案可随意填写);
  4. 创建成功后弹窗展示 clientId / clientSecret密钥只展示这一次,请立即妥善保存。

clientSecret 相当于你应用的密码,只能保存在你的服务端(环境变量、密钥管理系统等),绝对不要写进前端代码、App 客户端或公开仓库。如果怀疑泄露,请立即在页面上重置密钥。

3. 接口基础信息

API 基础地址(国内)https://api.infinisynapse.cn/api
API 基础地址(海外)https://api.infinisynapse.com/api
鉴权方式请求头 X-Client-Id + X-Client-Secret
内容类型application/json

所有接口返回统一信封结构:

{
  "code": 200,
  "message": "success",
  "data": { }
}

code === 200 表示成功,业务数据在 data 中;失败时 message 为错误说明。下文示例统一以 .cn 域名书写,海外环境替换为 .com 即可。

4. 核心接口详解

4.1 开通/获取子账号与 API Key(幂等)

首次用到某个用户时调用一次,之后把返回的 apiKey 缓存到你的用户表即可,不需要每次都调。

POST /api/auth/partner/users/provision
X-Client-Id: partner_xxxxxxxx
X-Client-Secret: psk_xxxxxxxx
Content-Type: application/json

请求体:

字段必填说明
externalUserId你系统里该用户的唯一 ID(≤128 字符),是子账号的映射键,一经使用请勿变更
withApiKey默认 true,同时签发/复用专属 API Key;传 false 则只建号不发 Key
profile用户建档展示信息,均可选:emailnicknameavatarphone

响应示例:

{
  "code": 200,
  "message": "success",
  "data": {
    "infiniUserId": "68d21916d6802ec254b46975",
    "externalUserId": "your-user-123",
    "apiKey": "sk-xxxxxxxxxxxxxxxxxxxxxxxx",
    "created": true
  }
}
  • infiniUserId:子账号在 InfiniSynapse 的唯一 ID,建议与 externalUserId 一起存入你的用户表;
  • createdtrue 表示本次新建了账号,false 表示账号已存在(幂等复用);
  • 同一 (clientId, externalUserId) 重复调用返回同一个子账号和同一把有效 Key;Key 被删除或失效时会自动重签,所以「重新调一次 provision」永远是安全的兜底手段。

4.2 轮换 API Key(应对泄露)

POST /api/auth/partner/users/apikey/rotate
Body: { "externalUserId": "your-user-123" }

响应 data{ "infiniUserId": "...", "apiKey": "sk-新key" }。旧 Key 立即失效,请用新 Key 覆盖你缓存的旧值。

4.3 停用子账号

POST /api/auth/partner/users/revoke
Body: { "externalUserId": "your-user-123" }

响应 data{ "infiniUserId": "...", "status": "disabled" }。停用后:

  • 该子账号的 API Key 被删除,立即无法再调用任何接口;
  • 子账号被打上停用标识,之后对它调用 provision / rotate 都会被拒绝;
  • 停用只影响该子账号的调用能力,不影响主账号余额与其他子账号。

4.4 查询子账号状态

GET /api/auth/partner/users/{externalUserId}

响应 data

{
  "infiniUserId": "...",
  "externalUserId": "your-user-123",
  "status": "active",
  "hasApiKey": true,
  "created": 1751443200000,
  "lastProvisionAt": 1751443200000,
  "disabledAt": null
}

4.5 查询余额(对账)

由于子账号共用主账号资金,该接口返回的是主账号当前可用的余额(你名下所有子账号共享的资金池)。

GET /api/auth/partner/users/{externalUserId}/balance

响应 data

{
  "infiniUserId": "...",
  "billingUserId": "主账号 userId",
  "shared": true,
  "orderBalance": 128.5,
  "totalBalance": 128.5
}
  • billingUserId:实际计费账号,即你的主账号;
  • orderBalance / totalBalance:主账号可用余额(充值 + 未过期赠送余额之和,不含订阅每日配额);
  • 无论用哪个 externalUserId 查询,orderBalance 都指向同一个主账号余额。

4.6 列出你名下的所有子账号(分页)

GET /api/auth/partner/users?page=1&pageSize=50&status=active
参数说明
page页码,默认 1
pageSize每页条数,默认 50,最大 100
status可选,active / disabled

响应 data

{
  "list": [
    {
      "externalUserId": "your-user-123",
      "infiniUserId": "...",
      "status": "active",
      "hasApiKey": true,
      "createTime": 1751443200000,
      "lastProvisionAt": 1751443200000,
      "disabledAt": null
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 50
}

4.7 查询积分消耗(按子账号 / 按任务对账)

虽然扣款统一落到主账号,但用量记录仍按子账号维度保存,因此你可以精确查到「哪个用户、哪个任务消耗了多少积分」,用于内部分摊、计量或风控。共提供三个查询接口。

时间参数 startTime / endTime 均为毫秒时间戳,可只传其一或都不传(不传则查全部)。

4.7.1 子账号消耗明细 / 按任务聚合

GET /api/auth/partner/users/{externalUserId}/costs?page=1&pageSize=20&startTime=&endTime=&groupByTask=false
参数说明
page页码,默认 1
pageSize每页条数,默认 20,最大 200
startTime / endTime可选,毫秒时间戳范围
groupByTask可选,true 时按任务聚合(父任务自动合并其子代理消耗),默认返回逐条明细

默认(groupByTask=false)返回逐条明细:

{
  "infiniUserId": "...",
  "externalUserId": "your-user-123",
  "groupByTask": false,
  "list": [
    { "taskId": "c3a2f9d0-...", "chatId": "...", "cost": 1.2, "model": "gpt-x", "createTime": 1751443200000 }
  ],
  "total": 37,
  "page": 1,
  "pageSize": 20
}

groupByTask=true 时按任务汇总,每行是一个任务的总消耗:

{
  "groupByTask": true,
  "list": [
    { "taskId": "c3a2f9d0-...", "totalCost": 5.8, "count": 6, "models": ["gpt-x"], "firstTime": 1751443200000, "lastTime": 1751443800000 }
  ],
  "total": 12,
  "page": 1,
  "pageSize": 20
}

4.7.2 子账号消耗汇总(总额 + 分模型)

GET /api/auth/partner/users/{externalUserId}/cost-stats?startTime=&endTime=

响应 data

{
  "infiniUserId": "...",
  "externalUserId": "your-user-123",
  "totalCost": 42.6,
  "recordCount": 37,
  "modelStats": [
    { "model": "gpt-x", "cost": 30.1, "count": 20 },
    { "model": "gpt-y", "cost": 12.5, "count": 17 }
  ]
}

4.7.3 client 级用量汇总(名下所有子账号)

一次性查看你名下所有子账号的消耗排行,便于整体对账:

GET /api/auth/partner/costs?page=1&pageSize=50&startTime=&endTime=
参数说明
page页码,默认 1
pageSize每页条数,默认 50,最大 200
startTime / endTime可选,毫秒时间戳范围

响应 data(按 totalCost 倒序):

{
  "clientId": "partner_xxxxxxxx",
  "grandTotalCost": 128.9,
  "subAccountCount": 25,
  "list": [
    { "externalUserId": "your-user-123", "infiniUserId": "...", "totalCost": 42.6, "recordCount": 37 },
    { "externalUserId": "your-user-456", "infiniUserId": "...", "totalCost": 30.2, "recordCount": 21 }
  ],
  "total": 18,
  "page": 1,
  "pageSize": 50
}
  • grandTotalCost:时间范围内你名下所有子账号的消耗总额(与主账号被扣的金额一致);
  • subAccountCount:你名下子账号总数;
  • total有消耗的子账号数量(无消耗的不计入分页列表)。

5. 用 API Key 调用 InfiniSynapse 开放 API

拿到子账号的 sk- Key 后,即可在你的服务端代用户调用开放 API。任务等开放 API 在 App 服务域名下(注意与上面 M2M 接口的 api. 域名不同):国内 https://app.infinisynapse.cn,海外 https://app.infinisynapse.com

示例:代用户发起一个数据分析任务

POST https://app.infinisynapse.cn/api/ai/message
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "type": "newTask",
  "taskId": "c3a2f9d0-你生成的UUID-用于幂等",
  "text": "分析最近 7 天的销售数据,输出图表报告",
  "images": []
}

taskId 由你的服务端生成(建议 UUID),重复提交同一 taskId 不会重复建任务。该任务归属这个子账号(数据/任务隔离),产生的用量则从你的主账号余额扣除。

提示:建议在你的服务端对主账号余额做低水位告警(用 4.5 的接口定期查询),余额耗尽会导致所有子账号调用受限。

6. 安全须知

  1. clientSecret 与所有 sk- Key 只放服务端。它们等同于长期凭证,绝不能下发到浏览器、App 客户端或公开仓库。
  2. 一把 Key 只对应一个子账号,泄露的爆炸半径仅限该子账号自己的数据;发现异常第一时间调用 rotate 轮换,或 revoke 停用。
  3. 主账号余额是共享资金池:你名下所有子账号共用它。请自行做好用量监控与配额控制,避免个别用户异常消耗拖垮整体余额。
  4. externalUserId 一经使用请勿变更,它是子账号的唯一映射键;换 ID 等于开新号。
  5. 静默开通意味着你替用户做了开号决定:你需要对你用户的数据授权与合规负责,profile 建议最小化采集。
  6. 开通接口有频率限制和单应用子账号数量上限;正常业务量不会触达,如有批量导入需求请提前联系我们。
  7. 密钥疑似泄露时,第一时间在 设置 → 第三方接入 页面重置 clientSecret(旧密钥立即失效)。

7. 接口速查表

接口方法用途
/api/auth/partner/users/provisionPOST开通/获取子账号与 API Key(幂等)
/api/auth/partner/users/apikey/rotatePOST轮换子账号 API Key(旧 Key 立即失效)
/api/auth/partner/users/revokePOST停用子账号(删 Key + 打停用标识)
/api/auth/partner/users/{externalUserId}GET查询子账号状态
/api/auth/partner/users/{externalUserId}/balanceGET查询主账号可用余额(对账)
/api/auth/partner/usersGET分页列出名下子账号
/api/auth/partner/users/{externalUserId}/costsGET查询子账号消耗明细(可按任务聚合)
/api/auth/partner/users/{externalUserId}/cost-statsGET查询子账号消耗汇总(总额 + 分模型)
/api/auth/partner/costsGETclient 级用量汇总(名下所有子账号排行)

以上接口鉴权方式均为请求头 X-Client-Id + X-Client-Secret

8. 完整示例(Node.js)

下面是一个最小可运行示例,覆盖「开通 → 代用户发任务」的完整链路(资金由主账号余额自动承担):

const PROXY_API = 'https://api.infinisynapse.cn/api'
const APP_API = 'https://app.infinisynapse.cn/api'
const partnerHeaders = {
  'Content-Type': 'application/json',
  'X-Client-Id': process.env.INFINI_CLIENT_ID,
  'X-Client-Secret': process.env.INFINI_CLIENT_SECRET,
}

async function callPartner(path, options = {}) {
  const resp = await fetch(`${PROXY_API}${path}`, { headers: partnerHeaders, ...options })
  const json = await resp.json()
  if (json.code !== 200) throw new Error(`${path} 失败: ${json.message}`)
  return json.data
}

// 1. 首次用到某用户时:开通子账号并缓存 apiKey(幂等,可安全重试)
async function ensureInfiniAccount(user) {
  const data = await callPartner('/auth/partner/users/provision', {
    method: 'POST',
    body: JSON.stringify({
      externalUserId: user.id,
      profile: { nickname: user.nickname, email: user.email },
    }),
  })
  // 把 data.infiniUserId / data.apiKey 存入你的用户表
  return data
}

// 2. 代用户发起一个分析任务(消耗从主账号余额扣除)
async function createTask(apiKey, text) {
  const resp = await fetch(`${APP_API}/ai/message`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${apiKey}`,
    },
    body: JSON.stringify({ type: 'newTask', taskId: crypto.randomUUID(), text, images: [] }),
  })
  return resp.json()
}

// 串起来
const { apiKey } = await ensureInfiniAccount({ id: 'your-user-123', nickname: '小明' })
await createTask(apiKey, '分析最近 7 天的销售数据,输出图表报告')

9. 与「使用 InfiniSynapse 登录」的关系

两条接入路线并存互补,共用同一套 clientId / clientSecret

Partner SSO 登录静默开通(本文)
用户是否需要登录 InfiniSynapse需要(一次授权码登录)不需要,全程无感
账号归属用户自己的 InfiniSynapse 账号由你托管的独立子账号
计费用户自己的余额/订阅统一从你的主账号余额扣除
适用场景用户已有/愿意注册 InfiniSynapse 账号你想把 InfiniSynapse 能力打包进自己的产品,用户无需感知

10. 常见问题

问:子账号的消耗到底从谁的账户扣? 从你的主账号(创建接入应用时用的那个 InfiniSynapse 账号)余额扣。你名下所有子账号共用主账号这一个资金池,你只需给主账号正常充值。

问:需要给每个子账号单独充值吗? 不需要。子账号没有独立钱包、也不能单独充值,资金全部来自主账号余额。

问:重复调用 provision 会重复建号或产生多把 Key 吗? 不会。同一 externalUserId 永远对应同一个子账号和同一把有效 Key。接口是幂等的,可以放心重试;本地缓存丢了 Key,重新调一次 provision 即可找回。

问:子账号能登录 InfiniSynapse App 吗? 默认不能(不设密码),它是纯服务端托管的账号。API Key 调用完全不受影响。

问:主账号余额扣完了会怎样? 你名下所有子账号的调用都会受余额/配额限制。建议结合 4.5 的余额查询接口做低水位监控,及时给主账号充值。

问:怎么知道是哪个用户消耗了多少? 用量记录按子账号(infiniUserId)维度保存,扣款则统一落到主账号。你可以用 4.7 的用量查询接口精确对账:按子账号查明细/按任务聚合(4.7.1)、查某子账号汇总(4.7.2),或一次性查名下所有子账号的消耗排行(4.7.3)。

问:externalUserId 用什么值合适? 用你系统里稳定不变的用户主键(如数据库 ID),不要用邮箱、手机号等可能变化的字段。

InfiniSynapse Partner Silent Provisioning Guide | InfiniSynapse