Skip to main content
SDK 是独立的程序接入方式,不依赖 ChatKit。通用服务端接入请参考 开发 SDK;本页保留 SDK 和 ChatKit UI 嵌入相关说明。

接入方式概览

如果你只是从自己的服务端调用 XpertAI API,不需要先换取 client_secret。client_secret 主要用于 ChatKit UI 或其他浏览器侧短期访问场景。

接入前准备

开始前请先准备以下信息:
  • apiUrl
    • 公有云示例:https://api.xpertai.cn/api/ai
    • 私有部署请替换成你自己的 XpertAI AI API 地址
  • apiKey
    • 建议使用服务端安全保存的长期凭据
    • 可通过 x-api-key 或 Authorization: Bearer <apiKey> 传递
  • xpertId
    • 即目标已发布智能体的 ID,取自 client.assistants.search() / get() 或对应 HTTP 接口返回的 assistant_id 字段。xpertId 是示例中的本地变量名。
如果你的 xpert 依赖组织或终端用户上下文,还可以在请求里额外传递:
  • organization-id
  • x-principal-user-id
这两个头建议只在高级场景下使用,不需要混入最小接入示例。

通过 SDK 接入

XpertAI SDK 仓库名是 xpert-sdk-js,但实际安装包名为 @xpert-ai/xpert-sdk。

1. 安装 SDK

2. 初始化 Client

ClientConfig 支持常用参数包括:
  • apiUrl
  • apiKey
  • timeoutMs
  • defaultHeaders
  • onRequest
最小初始化示例如下:
如果你需要在整个会话中固定组织或业务用户上下文,可以在 defaultHeaders 中统一注入:

3. 最小对话示例

下面的示例展示了完整主链路:
  1. 使用 client.assistants 查询 xpert
  2. 使用 client.threads 创建线程
  3. 使用 client.runs 发起一次对话运行
创建线程时传入 assistantId,运行时使用同一个智能体 ID。如果创建成功但运行返回 403,请查看 SDK 接入指南中的权限排查说明。

4. 常用能力

SDK 中最常用的子客户端包括:
  • client.assistants
    • 查询或读取 xpert 信息
  • client.threads
    • 创建和管理线程
  • client.runs
    • 使用 wait() 获取最终结果,或使用 stream() 实时消费 SSE 流
  • client.contexts
    • 上传上下文文件,例如 client.contexts.uploadFile()
  • client.knowledges
    • 创建或管理知识库资源
例如,当你需要上传一个文件再交给 xpert 使用时,可以这样写:

通过 API 直接调用

以下 assistants、threads、runs 接口也是 SDK 使用的底层 HTTP 接口,并未废弃。一般程序接入推荐使用 官方 SDK。旧 AI/v1 OpenAPI 接入与这些接口不同;旧接口及其示例不再维护,不保证可用。
如果你不使用 SDK,也可以直接调用公开的 REST API。

1. 使用 apiKey 鉴权

你可以任选一种方式:
  • x-api-key: sk-x-...
  • Authorization: Bearer sk-x-...
下面示例统一使用 x-api-key。

2. 查询 xpert

如果你已经知道 xpert ID,可以直接调用 GET /api/ai/assistants/{id}。如果你希望先按条件筛选 assistant,可以调用搜索接口:
查询结果是数组。取目标条目的 assistant_id,填入后续创建线程和运行请求中的 <xpert-id>。如果已经拿到该 ID,可以进一步确认详情:

3. 创建 thread

返回结果中会包含 thread_id。后续运行 xpert 时要继续使用这个线程 ID。 HTTP 字段名为 assistant_id,TypeScript SDK 参数名为 assistantId。接口允许创建未绑定的线程,但调用智能体时应在创建阶段绑定目标智能体,并在运行时使用同一个 ID。创建线程成功不代表具备运行权限;403 排查见 SDK 接入指南。

4. 调用 runs/stream

这个接口会以 SSE 形式持续返回事件流,适合实时聊天和前端流式展示。

5. 可选:上传文件后再发起对话

如果你的 xpert 需要读取附件,可以先上传上下文文件:
上传成功后,将返回的文件对象放入 files。下例的 <file-id> 使用上传响应中的 id(FileAsset ID);storageFileId 标识底层存储文件,不要把它填为附件 ID:

鉴权与安全说明

apiKey 与 client_secret 的区别

  • apiKey
    • 长期凭据
    • 适合服务端到服务端调用
    • 不应该暴露给浏览器
  • client_secret
    • 短期凭据
    • 适合 ChatKit UI 或前端侧短时访问
    • 由 POST /api/ai/v1/chatkit/sessions 签发

什么时候需要 client_secret

如果你是:
  • 在自己的服务端使用 SDK 调用 XpertAI
  • 在自己的服务端直接发起 REST 调用
那么通常只需要 apiKey。 如果你是:
  • 在浏览器里嵌入 ChatKit UI
  • 需要把一个短期凭据交给前端侧运行时
那么应该由你自己的后端换取 client_secret,再把它返回给前端。

chatkit/sessions 的正确调用方式

POST /api/ai/v1/chatkit/sessions 用于换取短期 client_secret。下面的示例使用服务端 API Key 鉴权;expires_after 是以秒为单位的可选正整数,省略时使用服务端默认值:
请注意:
  • 此 API Key 兑换方式无需传 assistant 或 user,资源范围由 API Key 决定
  • 使用用户登录凭据而非 API Key 创建会话时,智能体委托模式需要传 assistant.id,属于另一种接入流程
  • 如果需要固定组织或业务用户上下文,请通过请求头传递 organization-id 和 x-principal-user-id

安全建议

  • 永远不要在浏览器中暴露长期 apiKey
  • 前端只持有短期 client_secret
  • 如果使用 xpert 专用 key,请确保它绑定的 xpert 与实际访问目标一致
  • 需要审计终端用户身份时,在服务端换取 client_secret 阶段传入 x-principal-user-id

下一步