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 ▶│ 用量自动从你的主账号余额扣除
│ ◀────────── 结果 ───────────────│
- 开通:你首次需要代某个用户使用 InfiniSynapse 时,用你系统里该用户的唯一 ID(
externalUserId)调用一次开通接口。InfiniSynapse 会为其创建一个独立子账号并签发专属 API Key。同一个externalUserId重复调用是幂等的,永远返回同一个子账号和同一把有效的 Key,所以不用担心重复调用。 - 调用:拿到
sk-Key 后,在你的服务端用它调用 InfiniSynapse 开放 API。所有子账号的用量都会统一从你的主账号余额中扣除——你只需在 InfiniSynapse 里给主账号正常充值即可,主账号的资金池就是全部子账号共用的资金来源。
子账号默认不能登录 InfiniSynapse App(不设密码),它是一个纯粹由你的服务端托管的账号,也没有独立钱包、不能单独充值。API Key 调用不受影响。
资金模型:子账号共用主账号余额
- 主账号 = 你(开发者)登录 InfiniSynapse、创建接入应用(
clientId)时所用的那个账号。 - 你名下所有子账号的调用消耗,都从主账号的余额里扣(扣费顺序与主账号自己使用时一致:赠送余额 → 订阅配额 → 充值余额)。
- 你不需要给子账号单独充值,也没有独立预付池;只要保证主账号余额充足即可。
- 用量记录仍按子账号维度保存,方便你区分是哪个用户产生的消耗(见 4.6 对账)。
2. 准备工作:申请接入凭证
本方案与 Partner SSO 登录共用同一套接入凭证:clientId + clientSecret。如果你已经接入过「使用 InfiniSynapse 登录」,直接复用现有凭证即可,无需重新申请。
还没有凭证的话:
- 用你的 InfiniSynapse 账号登录 https://app.infinisynapse.cn/tasks(这个账号就是后续所有子账号消耗的付费主账号,请给它保持充足余额);
- 点击左下角「设置」齿轮图标,在菜单中选择 第三方接入;
- 点击 创建接入应用,填写应用名称(回调域名白名单仅登录场景使用,本方案可随意填写);
- 创建成功后弹窗展示
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 | 否 | 用户建档展示信息,均可选:email、nickname、avatar、phone |
响应示例:
{
"code": 200,
"message": "success",
"data": {
"infiniUserId": "68d21916d6802ec254b46975",
"externalUserId": "your-user-123",
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxxxxxx",
"created": true
}
}
infiniUserId:子账号在 InfiniSynapse 的唯一 ID,建议与externalUserId一起存入你的用户表;created:true表示本次新建了账号,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. 安全须知
clientSecret与所有sk-Key 只放服务端。它们等同于长期凭证,绝不能下发到浏览器、App 客户端或公开仓库。- 一把 Key 只对应一个子账号,泄露的爆炸半径仅限该子账号自己的数据;发现异常第一时间调用
rotate轮换,或revoke停用。 - 主账号余额是共享资金池:你名下所有子账号共用它。请自行做好用量监控与配额控制,避免个别用户异常消耗拖垮整体余额。
externalUserId一经使用请勿变更,它是子账号的唯一映射键;换 ID 等于开新号。- 静默开通意味着你替用户做了开号决定:你需要对你用户的数据授权与合规负责,
profile建议最小化采集。 - 开通接口有频率限制和单应用子账号数量上限;正常业务量不会触达,如有批量导入需求请提前联系我们。
- 密钥疑似泄露时,第一时间在 设置 → 第三方接入 页面重置
clientSecret(旧密钥立即失效)。
7. 接口速查表
| 接口 | 方法 | 用途 |
|---|---|---|
/api/auth/partner/users/provision | POST | 开通/获取子账号与 API Key(幂等) |
/api/auth/partner/users/apikey/rotate | POST | 轮换子账号 API Key(旧 Key 立即失效) |
/api/auth/partner/users/revoke | POST | 停用子账号(删 Key + 打停用标识) |
/api/auth/partner/users/{externalUserId} | GET | 查询子账号状态 |
/api/auth/partner/users/{externalUserId}/balance | GET | 查询主账号可用余额(对账) |
/api/auth/partner/users | GET | 分页列出名下子账号 |
/api/auth/partner/users/{externalUserId}/costs | GET | 查询子账号消耗明细(可按任务聚合) |
/api/auth/partner/users/{externalUserId}/cost-stats | GET | 查询子账号消耗汇总(总额 + 分模型) |
/api/auth/partner/costs | GET | client 级用量汇总(名下所有子账号排行) |
以上接口鉴权方式均为请求头 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),不要用邮箱、手机号等可能变化的字段。