ADBAgent OpenAPI 使用指南
本文介绍如何通过 ADBAgent RESTful API 以编程方式使用 AI 数据分析能力,包括认证、会话管理、数据分析、数据源和技能管理等操作。
简介
ADBAgent API 通过实例的公网 IP 和端口提供服务,请求和响应均使用 JSON 格式。获取分析结果支持两种交互模式:
轮询模式:发送提问后,通过返回的
roundId轮询分析状态和结果,适合脚本和后端集成场景。SSE 实时事件流:通过 Server-Sent Events 事件流实时接收分析过程和结果,适合构建交互式聊天界面。
准备工作
在调用 API 前,请完成以下准备:
开通 ADBAgent 服务
在 AnalyticDB MySQL 控制台的集群详情页,选择 ADBClaw (AI 助手),单击添加服务创建 ADBClaw 实例。详情请参见ADBAgent。
添加 IP 白名单
在 ADBClaw (AI 助手) 页面,单击目标服务操作列的详情,选择白名单设置页签,单击添加白名单分组,将调用 API 的机器公网 IP 添加到白名单中。
说明可在终端执行
curl ifconfig.me查询本机公网 IP。获取登录凭据
在 ADBClaw (AI 助手) 页面,单击目标服务操作列的凭证,查看默认账号和密码。该凭据用于调用登录接口获取 Token。如需修改密码,可登录 ADBClaw 后在用户管理页面进行修改。
快速入门
按照以下步骤,通过 API 完成一次完整的数据分析流程。
步骤一:获取访问地址
在 ADBAgent 控制台页面获取公网 IP 地址,设置环境变量:
export BASE="http://<公网IP>:3001"请将 <公网IP> 替换为 ADBAgent 控制台中的实际公网 IP 地址。
步骤二:登录获取 Token
调用登录接口获取认证 Token。后续所有 API 请求都需要在 Authorization 请求头中携带该 Token。用户名和密码为 ADBClaw (AI 助手) 页面中目标服务的默认凭据,可单击操作列的凭证查看。
TOKEN=$(curl -s -X POST "$BASE/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"username":"<用户名>", "password":"<密码>", "expiresIn":86400}' | jq -r .token)
echo $TOKEN请求参数:
参数 | 类型 | 必填 | 说明 |
username | string | 是 | 登录用户名。 |
password | string | 是 | 登录密码。 |
expiresIn | number | 否 | Token 过期时间,单位为秒。默认值:14400(4 小时)。 |
响应示例:
{
"token": "owt_xxxxx",
"scope": "collaborator",
"userId": "usr_xxxxx",
"username": "admin",
"expiresIn": 86400,
"expiresAt": "2026-01-02T10:00:00.000Z"
}Token 过期后需重新登录获取。请妥善保管 Token,勿在公开场合暴露。
步骤三:查看支持的大模型
查询可用的大语言模型列表。
curl -s "$BASE/api/v1/models" \
-H "Authorization: Bearer $TOKEN" | jq .响应示例:
{
"models": [
{
"id": "adb-qwen3.5-plus/qwen3.5-plus",
"name": "qwen3.5-plus",
"provider": "adb-qwen3.5-plus"
}
]
}步骤四:创建会话
所有对话都在会话中进行。发送提问前需先创建会话。
SID=$(curl -s -X POST "$BASE/api/v1/sessions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"我的分析任务"}' | jq -r '.sessionId')
echo "Session ID: $SID"请求参数:
参数 | 类型 | 必填 | 说明 |
title | string | 是 | 会话标题。 |
响应示例:
{
"sessionId": "ses_xxxxx",
"title": "我的分析任务",
"createdAt": "2026-01-01T10:00:00.000Z"
}步骤五:发送提问
在会话中提交分析问题。
RID=$(curl -s -X POST "$BASE/api/v1/sessions/$SID/prompt" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"查询本月销量最高的产品"}' | jq -r '.roundId')
echo "Round ID: $RID"请求参数:
参数 | 类型 | 必填 | 说明 |
text | string | 是 | 提问内容或分析请求。 |
model | string | 否 | 模型标识符,格式为 |
响应示例:
{
"roundId": "rnd_msg_xxxxx"
}步骤六:获取回复结果
分析过程是异步的。使用返回的 roundId 轮询结果接口,直到 status 变为 completed。
curl -s "$BASE/api/v1/sessions/$SID/rounds/$RID" \
-H "Authorization: Bearer $TOKEN" | jq .响应示例:
{
"roundId": "rnd_msg_xxxxx",
"status": "completed",
"question": "查询本月销量最高的产品",
"answer": "根据分析结果...",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"duration": 3200
}status 字段取值说明:
取值 | 含义 | 操作 |
| 分析进行中 | 继续轮询(建议间隔 2 秒) |
| 分析完成 | 读取 |
| 分析失败 |
|
步骤七:SSE 实时事件流(可选)
除轮询外,还可以通过 SSE(Server-Sent Events)实时接收分析进度和结果,适合构建交互式聊天界面。
先在一个终端订阅事件流,再在另一个终端发送提问:
# 终端 1:订阅事件流(plain 格式,打字机效果)
curl -N "$BASE/api/v1/sessions/$SID/events?format=plain" \
-H "Authorization: Bearer $TOKEN"
# 终端 2:发送提问(与步骤五相同)
curl -s -X POST "$BASE/api/v1/sessions/$SID/prompt" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"分析最近7天的订单趋势"}'事件流将实时推送分析过程和最终结果。详细的 SSE 格式说明和前端对接示例请参见SSE 实时事件流章节。
API 速查表
方法 | 路径 | 说明 |
认证 | ||
POST |
| 登录获取 Token |
会话 | ||
POST |
| 创建会话 |
GET |
| 查看所有会话 |
DELETE |
| 删除会话 |
GET |
| 查看历史消息 |
POST |
| 中断当前分析 |
对话 | ||
POST |
| 发送提问 |
GET |
| 获取轮次结果(轮询) |
GET |
| SSE 事件流 |
模型 | ||
GET |
| 查看可用模型 |
GET |
| 查看会话默认模型 |
POST |
| 设置会话默认模型 |
数据源 | ||
GET |
| 列出所有数据源 |
GET |
| 获取数据源详情 |
GET |
| 列出数据库 |
GET |
| 列出表 |
POST |
| 创建数据源 |
PUT |
| 更新数据源 |
DELETE |
| 删除数据源 |
技能 | ||
GET |
| 列出已安装技能 |
GET |
| 获取技能详情 |
POST |
| 创建或更新技能 |
DELETE |
| 删除技能 |
PATCH |
| 设置技能权限 |
POST |
| 上传 ZIP 安装技能 |
GET |
| 导出技能为 ZIP |
除登录接口外,所有接口均需在请求头中携带 Authorization: Bearer $TOKEN 进行身份认证。
会话管理
查看所有会话
请求方法:GET
请求路径:/api/v1/sessions
接口说明:获取当前用户的所有会话列表。
请求示例
curl -s "$BASE/api/v1/sessions" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
sessions | array | 会话列表。每个元素包含 |
响应示例:
{
"sessions": [
{
"sessionId": "ses_xxxxx",
"title": "我的分析任务",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"createdAt": "2026-01-01T10:00:00.000Z",
"updatedAt": "2026-01-01T12:00:00.000Z"
}
]
}查看历史消息
请求方法:GET
请求路径:/api/v1/sessions/{sessionId}/messages
接口说明:获取指定会话的消息历史记录。
请求参数
参数 | 类型 | 必填 | 说明 |
limit | number | 否 | 返回消息数量。默认值:50。 |
请求示例
curl -s "$BASE/api/v1/sessions/$SID/messages?limit=50" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
messages | array | 消息列表。每个元素包含 |
响应示例:
{
"messages": [
{
"id": "msg_xxxxx",
"role": "user",
"content": "查询本月销量最高的产品",
"model": null,
"createdAt": "2026-01-01T10:00:00.000Z"
},
{
"id": "msg_yyyyy",
"role": "assistant",
"content": "根据分析结果...",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"createdAt": "2026-01-01T10:00:03.000Z"
}
]
}中断当前分析
请求方法:POST
请求路径:/api/v1/sessions/{sessionId}/abort
接口说明:停止会话中正在进行的分析任务。会话本身不受影响。
请求示例
curl -s -X POST "$BASE/api/v1/sessions/$SID/abort" \
-H "Authorization: Bearer $TOKEN"响应说明
成功时返回 HTTP 204,无响应体。
删除会话
请求方法:DELETE
请求路径:/api/v1/sessions/{sessionId}
接口说明:永久删除会话及其所有消息。该操作不可撤销。
请求示例
curl -s -X DELETE "$BASE/api/v1/sessions/$SID" \
-H "Authorization: Bearer $TOKEN"响应说明
成功时返回 HTTP 204,无响应体。
获取回复结果
ADBAgent 提供两种方式获取分析结果:轮询模式和 SSE 实时事件流。
轮询获取结果
请求方法:GET
请求路径:/api/v1/sessions/{sessionId}/rounds/{roundId}
接口说明:通过 roundId 查询分析任务的状态和结果。轮询直到 status 变为 completed 或 error。
请求示例
curl -s "$BASE/api/v1/sessions/$SID/rounds/$RID" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
roundId | string | 分析轮次 ID。 |
status | string | 分析状态: |
question | string | 用户提问内容。 |
answer | string | 分析回复内容。状态为 |
model | string | 本次使用的模型。 |
duration | number | 分析耗时,单位为毫秒。 |
响应示例:
{
"roundId": "rnd_msg_xxxxx",
"status": "completed",
"question": "查询本月销量最高的产品",
"answer": "根据分析结果...",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"duration": 3200
}轮询示例脚本
以下脚本实现了自动轮询逻辑(建议间隔 2 秒):
poll_round() {
local sid=$1 rid=$2
while true; do
RESP=$(curl -s "$BASE/api/v1/sessions/$sid/rounds/$rid" \
-H "Authorization: Bearer $TOKEN")
STATUS=$(echo "$RESP" | jq -r '.status')
case $STATUS in
completed)
echo "$RESP" | jq '{question, answer, model, duration}'
return 0 ;;
error)
echo "$RESP" | jq '{question, answer, status}'
return 1 ;;
*)
sleep 2 ;;
esac
done
}
# 用法:发送提问并等待结果
RID=$(curl -s -X POST "$BASE/api/v1/sessions/$SID/prompt" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"分析最近7天的用户活跃趋势"}' | jq -r '.roundId')
poll_round "$SID" "$RID"SSE 实时事件流
请求方法:GET
请求路径:/api/v1/sessions/{sessionId}/events
接口说明:通过 SSE(Server-Sent Events)端点实时接收分析进度和结果。
支持三种输出格式:
格式 | Content-Type | 说明 |
| text/event-stream | 完整的 SSE 事件流,包含 |
| text/event-stream | 简化的 SSE 格式,仅包含三种事件: |
| text/plain | 纯文本流(非 SSE 格式),直接输出文本片段,包含思考内容。适合终端调试,呈现打字机效果。 |
使用方式:先订阅事件流,再发送提问。
# 终端中的打字机效果(plain 格式)
curl -N "$BASE/api/v1/sessions/$SID/events?format=plain" \
-H "Authorization: Bearer $TOKEN"使用 SSE 时,先建立事件流连接,再通过 prompt 接口发送提问。事件流将实时推送分析过程和结果。
前端对接示例
以下 JavaScript 示例展示如何使用 text 格式的 SSE 事件流:
async function streamChat(base, token, sessionId, question) {
const controller = new AbortController();
// 1. 订阅事件流
const eventRes = await fetch(
`${base}/api/v1/sessions/${sessionId}/events?format=text`,
{
headers: { 'Authorization': `Bearer ${token}` },
signal: controller.signal
}
);
// 2. 发送提问
await fetch(`${base}/api/v1/sessions/${sessionId}/prompt`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ text: question })
});
// 3. 读取事件流
const reader = eventRes.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
let answer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const chunks = buffer.split('\n\n');
buffer = chunks.pop() ?? '';
for (const chunk of chunks) {
const dataLine = chunk.split('\n')
.find(l => l.startsWith('data:'));
if (!dataLine) continue;
const event = JSON.parse(dataLine.slice(5).trim());
if (event.type === 'delta') {
answer += event.content ?? '';
console.log(event.content); // 实时输出
} else if (event.type === 'done') {
controller.abort();
return answer;
} else if (event.type === 'error') {
throw new Error(event.message);
}
}
}
return answer;
}默认大模型设置
可以为会话设置默认模型。设置后,该会话中的提问将默认使用指定模型。
查看会话模型
请求方法:GET
请求路径:/api/v1/sessions/{sessionId}/model
接口说明:查看会话的模型设置信息。
请求示例
curl -s "$BASE/api/v1/sessions/$SID/model" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
sessionId | string | 会话 ID。 |
model | string | 会话级别设置的默认模型。 |
globalDefault | string | 全局级别默认模型。 |
effective | string | 实际生效的模型(会话级别优先于全局级别)。 |
响应示例:
{
"sessionId": "ses_xxxxx",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"globalDefault": "adb-qwen3.5-plus/qwen3.5-plus",
"effective": "adb-qwen3.5-plus/qwen3.5-plus"
}设置会话模型
请求方法:POST
请求路径:/api/v1/sessions/{sessionId}/model
接口说明:为会话设置默认模型。设置后,该会话中的提问将使用指定模型。
请求参数
参数 | 类型 | 必填 | 说明 |
model | string | 是 | 模型标识符,格式为 |
请求示例
curl -s -X POST "$BASE/api/v1/sessions/$SID/model" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"adb-qwen3.5-plus/qwen3.5-plus"}' | jq .响应说明
响应示例:
{
"sessionId": "ses_xxxxx",
"model": "adb-qwen3.5-plus/qwen3.5-plus",
"message": "Model updated successfully"
}数据源管理
通过数据源 API 管理数据源配置,包括查询、创建、更新和删除操作。支持的数据源类型:adb_mysql、clickhouse、hologres、starrocks。
建议在 ADBAgent 控制台完成数据源的初始配置后,再通过 API 进行管理操作。
列出所有数据源
请求方法:GET
请求路径:/api/v1/datasources
接口说明:获取所有已配置的数据源列表。
请求示例
curl -s "$BASE/api/v1/datasources" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
data_sources | array | 数据源列表。每个元素包含 |
响应示例:
{
"data_sources": [
{
"name": "adb_mysql_default",
"type": "adb_mysql",
"description": "",
"enabled": true,
"configured": true,
"gateway_status": "running",
"connection": {
"host": "xxx",
"port": 3306,
"user": "xxx",
"database": "xxx"
}
}
]
}获取数据源详情
请求方法:GET
请求路径:/api/v1/datasources/{name}
接口说明:获取指定数据源的详细配置信息,包含连接池配置。
请求示例
curl -s "$BASE/api/v1/datasources/adb_mysql_default" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
响应字段与"列出所有数据源"相同,额外包含 pool 对象(含 init_timeout_ms、query_timeout_ms、max_restart_count)。
列出数据库
请求方法:GET
请求路径:/api/v1/datasources/{name}/databases
接口说明:列出指定数据源中的所有数据库。
请求示例
curl -s "$BASE/api/v1/datasources/adb_mysql_default/databases" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
响应示例:
{
"databases": ["INFORMATION_SCHEMA", "my_database", "analytics_db"]
}列出表
请求方法:GET
请求路径:/api/v1/datasources/{name}/{database}/tables
接口说明:列出指定数据源中某个数据库的所有表。
请求示例
curl -s "$BASE/api/v1/datasources/adb_mysql_default/my_database/tables" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
响应示例:
{
"tables": ["orders", "users", "products"]
}创建数据源
请求方法:POST
请求路径:/api/v1/datasources
接口说明:创建新的数据源连接配置。
请求参数
参数 | 类型 | 必填 | 说明 |
name | string | 是 | 数据源名称。 |
type | string | 是 | 数据源类型。取值: |
connection | object | 是 | 连接配置,包含 |
请求示例
curl -s -X POST "$BASE/api/v1/datasources" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my_datasource",
"type": "adb_mysql",
"connection": {
"host": "xxx.xxx.xxx.xxx",
"port": 3306,
"user": "db_user",
"password": "db_password",
"database": "my_database"
}
}' | jq .响应说明
成功时返回创建的数据源对象,结构与"列出所有数据源"中的元素相同。
更新数据源
请求方法:PUT
请求路径:/api/v1/datasources/{name}
接口说明:更新指定数据源的连接配置。
请求示例
curl -s -X PUT "$BASE/api/v1/datasources/my_datasource" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"connection": {
"host": "new-host.xxx.xxx",
"port": 3306,
"user": "new_user",
"password": "new_password",
"database": "new_database"
}
}' | jq .响应说明
成功时返回更新后的数据源对象。
删除数据源
请求方法:DELETE
请求路径:/api/v1/datasources/{name}
接口说明:删除指定数据源。该操作不可撤销。
请求示例
curl -s -X DELETE "$BASE/api/v1/datasources/my_datasource" \
-H "Authorization: Bearer $TOKEN"响应说明
成功时返回 HTTP 204,无响应体。
技能管理
技能(Skill)是可复用的 AI Agent 指令模板,用于增强模型在特定领域的能力。系统内置了一些技能(如 ADB MySQL 数据库助手),您也可以通过 API 创建和管理自定义技能。
技能名称必须使用 kebab-case 格式(例如 adb-sql-review),不允许使用空格和大写字母。
列出已安装技能
请求方法:GET
请求路径:/api/v1/skills
接口说明:获取已安装的技能列表。
请求参数
参数 | 类型 | 必填 | 说明 |
includeGlobal | boolean | 否 | 是否包含全局技能。默认值: |
请求示例
curl -s "$BASE/api/v1/skills?includeGlobal=true" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
返回字段:
字段 | 类型 | 说明 |
name | string | 技能名称(kebab-case 格式)。 |
description | string | 技能描述。 |
scope | string |
|
builtIn | boolean | 是否为内置技能。内置技能不可修改、删除或导出。 |
permission | string | 权限状态: |
响应示例:
{
"skills": [
{
"name": "alibabacloud-analyticdb-mysql-copilot",
"description": "ADB MySQL 数据库 AI 助手",
"scope": "project",
"builtIn": true,
"permission": "allow"
}
]
}获取技能详情
请求方法:GET
请求路径:/api/v1/skills/{name}
接口说明:获取指定技能的完整信息,包括 SKILL.md 内容。
请求示例
curl -s "$BASE/api/v1/skills/my-custom-skill" \
-H "Authorization: Bearer $TOKEN" | jq .响应说明
响应字段与"列出已安装技能"相同,额外包含 content(SKILL.md 完整内容)和 trigger(触发条件)字段。
创建或更新技能
请求方法:POST
请求路径:/api/v1/skills
接口说明:通过 JSON 请求体创建新技能或更新已有技能。如果同名技能已存在,则更新;否则创建。
请求参数
参数 | 类型 | 必填 | 说明 |
name | string | 是 | 技能名称,kebab-case 格式(例如 |
description | string | 否 | 技能描述。 |
content | string | 是 | SKILL.md 的完整 Markdown 内容。 |
请求示例
curl -s -X POST "$BASE/api/v1/skills" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "adb-sql-review",
"description": "ADB MySQL SQL 审查技能",
"content": "# ADB SQL Review\n\n## When to use\n适用于 SQL 性能审查。\n\n## Rules\n1. 检查 SELECT *\n2. 检查缺少 WHERE 子句\n"
}' | jq .响应说明
响应示例:
{
"name": "adb-sql-review",
"action": "added",
"path": "/path/.opencode/skills/adb-sql-review/SKILL.md"
}action 字段值为 added(新建)或 updated(更新)。
设置技能权限
请求方法:PATCH
请求路径:/api/v1/skills/{name}/permission
接口说明:控制技能在 AI 对话中是否自动加载。
请求参数
参数 | 类型 | 必填 | 说明 |
permission | string | 是 | 权限值: |
请求示例
curl -s -X PATCH "$BASE/api/v1/skills/adb-sql-review/permission" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"permission": "deny"}' | jq .响应说明
成功时返回更新后的技能对象。
上传 ZIP 安装技能
请求方法:POST
请求路径:/api/v1/skills/upload
接口说明:通过上传 ZIP 文件安装技能。ZIP 包中须包含 SKILL.md 文件,支持两种目录结构:
SKILL.md位于 ZIP 根目录。SKILL.md位于单个顶层目录下(例如my-skill/SKILL.md)。
请求示例
curl -s -X POST "$BASE/api/v1/skills/upload" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@/tmp/adb-sql-review.zip" | jq .响应说明
成功时返回安装的技能对象。/api/v1/skills/install 与 /api/v1/skills/upload 功能相同,两个端点均可使用。
导出技能为 ZIP
请求方法:GET
请求路径:/api/v1/skills/{name}/download
接口说明:将已安装的自定义技能下载为 ZIP 文件,用于备份或分享。
请求示例
curl -s -o adb-sql-review.zip \
"$BASE/api/v1/skills/adb-sql-review/download" \
-H "Authorization: Bearer $TOKEN"响应说明
成功时返回 HTTP 200,响应体为 ZIP 文件(application/zip)。
内置技能(builtIn: true)不支持导出,会返回 403 错误。
删除技能
请求方法:DELETE
请求路径:/api/v1/skills/{name}
接口说明:永久删除自定义技能及其所有相关文件。该操作不可撤销。
请求示例
curl -s -X DELETE "$BASE/api/v1/skills/adb-sql-review" \
-H "Authorization: Bearer $TOKEN"响应说明
成功时返回 HTTP 204,无响应体。
内置技能(builtIn: true)不支持删除。