快速入门
本指南带您在五分钟内从零完成一个可用的集成:创建 API 密钥并检查它,向知识库添加文档,找到这个文档,并就它提出问题。每一步都是一个 HTTP 请求。在任意示例中选择一次语言,页面上的所有示例都会随之切换。
带语言切换的示例使用本门户的 API 专用地址:在 Sursa 云中是 https://api.sursa.com,在您自己的部署中是部署的 API 专用地址。示例中出现 https://api.example.com 时,请换成您的 API 专用地址。如果不确定自己使用的是哪个地址,请参见 API 专用地址与环境。
1. 创建 API 密钥
组织管理员在 Sursa 的 Administration → API keys(管理 → API 密钥)中创建密钥。给密钥起一个能说明用途的名称(例如“CRM sync”),选择角色;如果想进一步缩小范围,再选择权限范围。密钥能做具有该角色的用户能做的事,且不超出其权限范围。完成本指南,editor 角色就足够了。
密钥只显示一次。请把它保存在系统的密钥存储中,并通过环境变量传给代码:
export SURSA_API_KEY="kb_…"
每个请求都在 Authorization 头中以 Bearer 令牌的形式传入密钥。API 密钥与权限范围介绍了角色、权限范围、过期和轮换。
2. 设置客户端
不需要任何库:API 就是普通的 HTTPS 和 JSON。本指南的示例在每种语言中使用一个小的辅助函数。复制您所用语言的版本;后续指南也使用同一个辅助函数。官方客户端库列在 SDK 下。
# cURL needs no setup: each example below is a complete command.
export SURSA_API="https://api.sursa.com"3. 检查密钥
GET /v1/me 描述调用方:组织、密钥、密钥的角色和权限范围,以及适用的速率限制。任何有效的密钥都可以调用它,因此它是每个集成最适合发出的第一个请求。
curl https://api.sursa.com/v1/me \
-H "Authorization: Bearer $SURSA_API_KEY"{
"principal": "api_key",
"org": {"id": 1, "slug": "acme", "name": "Acme"},
"key": {"id": 42, "name": "CRM sync", "prefix": "kb_3f9c", "role": "editor"},
"user": null,
"role": "editor",
"scopes": ["cards:read", "cards:write", "search", "ask"],
"data_profile": null,
"expires_at": null,
"rate_limit": {"class": "standard", "requests_per_second": 20, "burst": 100}
}
返回 401 且错误码为 auth.not_authenticated,表示没有密钥、密钥已撤销或输错;错误码 api_keys.expired 表示密钥已过期。
4. 找到合集
卡片存放在合集中。GET /v1/collections 列出密钥能看到的合集:
curl https://api.sursa.com/v1/collections \
-H "Authorization: Bearer $SURSA_API_KEY"记下要使用的合集的 id 和 name。下面的示例使用名为 support 的合集 3。
5. 添加文档
PUT /v1/cards-by-external-id/{external_id} 以您自己的 ID 创建卡片;卡片已存在时则替换它。同一个请求执行两次也是安全的:第二次内容没有变化,返回 skipped,原因为 unchanged。请把记录在您系统中的 ID 用作 external_id。
curl -X PUT https://api.sursa.com/v1/cards-by-external-id/policy-refunds \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"collection_id": 3,
"title": "Refund policy",
"content_type": "markdown",
"body": "# Refund policy\n\nRefunds are processed within 14 days of the request."
}'卡片可以被搜索到时,请求才会返回:新卡片返回 201 和 "status": "ready",被替换的卡片返回 200。HTML 和纯文本的用法相同,分别使用 "content_type": "html" 或 "text"。文件(PDF、Word、Excel 等)以 multipart/form-data 形式通过同一个接口上传;文件、文件夹、元数据和大批量文档的导入参见导入文档。
6. 搜索
POST /v1/search 查找与查询匹配的卡片摘录,最匹配的排在前面:
curl -X POST https://api.sursa.com/v1/search \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "refund policy", "collection": "support"}'collection 接受合集的名称。不传时,搜索范围是名为 default 的合集。
7. 提问
POST /v1/ask 用自然语言回答问题,并返回回答的来源。助手查找相关知识,并且只根据密钥有权读取的卡片作答。
curl -X POST https://api.sursa.com/v1/ask \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "How long does a refund take?", "collection": "support"}'没有找到相关内容时,响应仍然是 200,带有 "empty": "no_hits",answer 中有简短说明。这种情况下向用户显示什么,由您的代码决定。
后续步骤
- 构建问答机器人:在回答生成的同时以流式返回,并恢复中断的流。
- 导入文档或同步您的系统,让知识库保持最新。
- 接收 Webhook,对 Sursa 中的变更作出响应。
- 按错误码处理错误,用 Idempotency-Key 重试写入请求,并遵守速率限制。
- 在 API 参考中浏览所有接口、对象和字段。