- RESTful API
- 11組
- 官方 SDK
- 7種
- 即時串流回覆
- SSE
- 完成第一版串接
- 60分鐘
本頁內容開發者文件
快速開始
四個請求 看懂第一段回覆如何送達
先完成部署環境要求的身分驗證,再取得 CSRF Token、建立助理與對話,最後用 SSE 接收回覆
- 01
取得 CSRF Token
GET
/v1/csrf-token - 輸入
- Base URL
- 取得
- XSRF-TOKEN,寫入 Cookie
- 02
建立 AI 助理
POST
/v1/agents - 輸入
- ownerId 與回答策略
- 取得
- agentId
- 03
建立對話 Channel
POST
/v1/agents /{agentId} /channels - 輸入
- agentId
- 取得
- agentChannelId
- 04
串流回覆
POST
/v1/agents /{agentId} /chat - 輸入
- channelId 與 message
- 取得
- SSE 串流回覆
下方程式碼示意 API 呼叫順序。實際執行前,請先依部署環境完成登入或向管理員取得 API 授權,並在每次請求帶上有效的會話或 Bearer token;CSRF Token 只用於防護修改性請求,不能取代登入。
// 流程示意:先依部署環境完成登入或取得有效 API 授權;CSRF Token 不能取代身分驗證。
const BASE_URL = 'https://<您的 AI 沙盒主機>/api';
const OWNER_ID = 'YOUR_OWNER_ID';
const visitorId = 'visitor-001';
// 1. 取得 CSRF Token:寫入 XSRF-TOKEN Cookie
const handshake = await fetch(`${BASE_URL}/v1/csrf-token`);
const xsrfToken = handshake.headers
.getSetCookie()
.map((cookie) => cookie.split(';')[0])
.find((pair) => pair.startsWith('XSRF-TOKEN='))
?.slice('XSRF-TOKEN='.length);
if (!xsrfToken) throw new Error('XSRF-TOKEN cookie missing');
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: 'Bearer <ACCESS_TOKEN>', // 改用部署環境提供的有效授權
'X-XSRF-TOKEN': xsrfToken,
Cookie: `XSRF-TOKEN=${xsrfToken}; vid=${visitorId}`,
};
async function post<T>(path: string, body: unknown): Promise<T> {
const res = await fetch(`${BASE_URL}${path}`, {
method: 'POST',
headers,
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`${res.status} ${path}`);
return (await res.json()) as T;
}
// 2. 建立 AI 助理
const { agentId } = await post<{ agentId: number }>('/v1/agents', {
agentDisplayName: 'Customer Support',
agentToneStyle: 'PROFESSIONAL',
agentAnswerStrategy: 'BALANCED',
ownerId: OWNER_ID,
});
// 3. 建立對話 Channel
const { agentChannelId } = await post<{ agentChannelId: string }>(
`/v1/agents/${agentId}/channels`,
{ title: 'Support Session', visitorId },
);
// 4. 發送訊息,逐段讀取 SSE
const stream = await fetch(`${BASE_URL}/v1/agents/${agentId}/chat`, {
method: 'POST',
headers: { ...headers, Accept: 'text/event-stream' },
body: JSON.stringify({
channelId: agentChannelId,
message: '這張訂單的交期是哪天?',
stream: true,
parameters: { temperature: 0.2 },
}),
});
if (!stream.ok || !stream.body) throw new Error(`${stream.status} chat`);
const decoder = new TextDecoder();
let buffer = '';
let done = false;
for await (const chunk of stream.body) {
buffer += decoder.decode(chunk, { stream: true });
const events = buffer.split(/\r?\n/);
buffer = events.pop() ?? '';
for (const line of events) {
if (!line.startsWith('data: ')) continue;
const data = line.slice('data: '.length);
if (data === '[DONE]') {
done = true;
break;
}
const event = JSON.parse(data) as { type: string; content?: string };
if (event.type === 'chunk') process.stdout.write(event.content ?? '');
}
if (done) break;
}# 流程示意:先依部署環境完成登入或取得有效 API 授權;CSRF Token 不能取代身分驗證。
import json
import requests
BASE_URL = "https://<您的 AI 沙盒主機>/api"
OWNER_ID = "YOUR_OWNER_ID"
VISITOR_ID = "visitor-001"
session = requests.Session()
session.cookies.set("vid", VISITOR_ID)
# 1. 取得 CSRF Token:寫入 XSRF-TOKEN Cookie
session.get(f"{BASE_URL}/v1/csrf-token").raise_for_status()
session.headers.update({
"Accept": "application/json",
"Authorization": "Bearer <ACCESS_TOKEN>", # 改用部署環境提供的有效授權
"X-XSRF-TOKEN": session.cookies["XSRF-TOKEN"],
})
# 2. 建立 AI 助理
agent = session.post(f"{BASE_URL}/v1/agents", json={
"agentDisplayName": "Customer Support",
"agentToneStyle": "PROFESSIONAL",
"agentAnswerStrategy": "BALANCED",
"ownerId": OWNER_ID,
})
agent.raise_for_status()
agent_id = agent.json()["agentId"]
# 3. 建立對話 Channel
channel = session.post(
f"{BASE_URL}/v1/agents/{agent_id}/channels",
json={"title": "Support Session", "visitorId": VISITOR_ID},
)
channel.raise_for_status()
channel_id = channel.json()["agentChannelId"]
# 4. 發送訊息,逐段讀取 SSE
with session.post(
f"{BASE_URL}/v1/agents/{agent_id}/chat",
headers={"Accept": "text/event-stream"},
json={
"channelId": channel_id,
"message": "這張訂單的交期是哪天?",
"stream": True,
"parameters": {"temperature": 0.2},
},
stream=True,
) as response:
response.raise_for_status()
response.encoding = "utf-8"
for line in response.iter_lines(decode_unicode=True):
if not line.startswith("data: "):
continue
data = line.removeprefix("data: ")
if data == "[DONE]":
break
event = json.loads(data)
if event.get("type") == "chunk":
print(event["content"], end="", flush=True)# 流程示意:先依部署環境完成登入或取得有效 API 授權;CSRF Token 不能取代身分驗證。
BASE_URL="https://<您的 AI 沙盒主機>/api"
VISITOR_ID="visitor-001"
# 1. 取得 CSRF Token:寫入 cookies.txt
curl -s -c cookies.txt -o /dev/null "$BASE_URL/v1/csrf-token"
XSRF_TOKEN=$(awk '$6 == "XSRF-TOKEN" { print $7 }' cookies.txt)
AUTH=(
-H "Authorization: Bearer <ACCESS_TOKEN>" # 改用部署環境提供的有效授權
-H "X-XSRF-TOKEN: $XSRF_TOKEN"
-H "Cookie: XSRF-TOKEN=$XSRF_TOKEN; vid=$VISITOR_ID"
-H "Content-Type: application/json"
)
# 2. 建立 AI 助理,回傳 agentId(範例 101)
curl -s "${AUTH[@]}" -H "Accept: application/json" "$BASE_URL/v1/agents" \
-d '{"agentDisplayName":"Customer Support","agentToneStyle":"PROFESSIONAL","agentAnswerStrategy":"BALANCED","ownerId":"YOUR_OWNER_ID"}'
# 3. 建立對話 Channel,回傳 agentChannelId
curl -s "${AUTH[@]}" -H "Accept: application/json" "$BASE_URL/v1/agents/101/channels" \
-d '{"title":"Support Session","visitorId":"visitor-001"}'
# 4. 發送訊息,逐段讀取 SSE
curl -sN "${AUTH[@]}" -H "Accept: text/event-stream" "$BASE_URL/v1/agents/101/chat" \
-d '{"channelId":"7d1b8e4aa6af4a0194f4f3bf45f2f4c8","message":"這張訂單的交期是哪天?","stream":true}'官方 SDK
七種語言 同一組 API
七個官方 GitHub 專案均提供 v1.0.1 release;安裝方式請以各專案 README 為準
- 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-typescript
TypeScript
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-python
Python
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-java
Java
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-csharp
C#
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-go
Go
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-php
PHP
GitHub v1.0.1 - 查看 GitHub releasev1.0.1查看 GitHub README:eGroupAI/ai-sandbox-sdk-ruby
Ruby
GitHub v1.0.1
驗證
先取得授權 再處理 CSRF
身分驗證方式依部署環境而定;需要登入的環境須帶上有效會話或 Bearer token,CSRF Token 不能取代登入
- 1
取得存取授權
依部署環境完成登入,或向管理員取得 API 授權;確認所用帳號有助理與知識庫的操作權限。
- 2
握手
GET /v1/csrf-token,回應把XSRF-TOKEN寫入 Cookie。 - 3
帶上 Token
同一個值放進
X-XSRF-TOKENheader,也留在XSRF-TOKENCookie。 - 4
帶上訪客 ID
vidCookie 放訪客 ID,同一位使用者跨請求都認得。
POST /api/v1/agents HTTP/1.1
Host: <您的 AI 沙盒主機>
Accept: application/json
Content-Type: application/json
Authorization: Bearer <ACCESS_TOKEN>
X-XSRF-TOKEN: <token>
Cookie: XSRF-TOKEN=<token>; vid=<visitor id>
{"agentDisplayName":"Customer Support"}| Header | 值 | 用途 |
|---|---|---|
Accept | application/json | 回應格式;串流用 text/event-stream |
Content-Type | application/json | 請求本文格式 |
X-XSRF-TOKEN | <token> | CSRF 驗證 |
Authorization | Bearer <access token> | 需要登入的環境,帶上實際取得的存取授權 |
Cookie | XSRF-TOKEN=<token>; vid=<visitor id> | CSRF 配對與訪客追蹤;不是登入憑證 |
串流回覆
回覆一段一段到 不必等整段
stream 設為 true,Chat API 以 SSE(text/event-stream)逐段回傳;設為 false,一次回傳完整 JSON
- 請求帶
Accept: text/event-stream。 - 逐行讀取
data:開頭的內容,事件之間以空行分隔。 - 讀到
[DONE]就結束。
event: message
data: {"type":"chunk","content":"交期是"}
event: message
data: {"type":"chunk","content":" 10 月 8 日。"}
event: done
data: [DONE]| event | data | 意思 |
|---|---|---|
message | {"type":"chunk","content":"…"} | 一段回覆文字,依序接起來 |
done | [DONE] | 回覆結束,可以關閉連線 |
API 參考
11 組 API 三個領域
AI 助理 4 組、對話 3 組、知識庫 4 組,路徑都接在 Base URL 之後
Base URLhttps://<您的 AI 沙盒主機>/api
握手
每個工作階段的第一個請求。
GET/v1
取得 CSRF Token
回應把 XSRF-TOKEN 寫入 Cookie,之後每個請求都帶上。
不需要參數。
請求與回應範例200 OK
回應
HTTP/1.1 200 OK
Set-Cookie: XSRF-TOKEN=<token>AI 助理
建立、更新、列出與查詢助理。
POST/v1
建立 AI 助理
建立助理,回傳 agentId。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentDisplayName | string | 必填 | 助理名稱,最多 255 字元。 |
agentDescription | string | 選填 | 助理說明。 |
agentToneStyle | enum | 選填 | 回答語氣。
|
agentAnswerStrategy | enum | 選填 | 回答策略。
|
ownerId | string | 選填 | 租戶 ID,32 碼。 |
請求與回應範例201 Created
請求
{
"agentDisplayName": "Customer Support",
"agentDescription": "Handles order and refund inquiries",
"agentToneStyle": "PROFESSIONAL",
"agentAnswerStrategy": "BALANCED",
"ownerId": "YOUR_OWNER_ID"
}回應
{
"agentId": 101,
"agentDisplayName": "Customer Support",
"agentStatus": "ACTIVE",
"agentCreateDate": "2026-04-01T09:00:00Z"
}PUT/v1
更新 AI 助理
局部更新,只送要改的欄位。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentDisplayName | string | 選填 | 助理名稱,最多 255 字元。 |
agentDescription | string | 選填 | 助理說明。 |
agentToneStyle | enum | 選填 | 回答語氣。
|
agentAnswerStrategy | enum | 選填 | 回答策略。
|
請求與回應範例200 OK
請求
{
"agentDisplayName": "Customer Support v2",
"agentAnswerStrategy": "PRECISE"
}回應
{
"agentId": 101,
"agentDisplayName": "Customer Support v2",
"agentUpdateDate": "2026-04-01T10:00:00Z"
}GET/v1
列出 AI 助理
分頁列出,可依狀態與關鍵字篩選。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
status | enum | 選填 | 助理狀態。
|
keyword | string | 選填 | 關鍵字篩選。 |
page | integer | 選填 | 頁碼,從 0 起算。預設 0 |
size | integer | 選填 | 每頁筆數。預設 20 |
sortBy | enum | 選填 | 排序欄位。預設 agentCreateDate
|
sortDir | enum | 選填 | 排序方向。預設 DESC
|
請求與回應範例200 OK
請求
GET /api/v1/agents?status=ACTIVE&keyword=Support&page=0&size=20&sortBy=agentCreateDate&sortDir=DESC回應
{
"agents": [
{
"agentId": 101,
"agentDisplayName": "Customer Support",
"agentStatus": "ACTIVE"
}
],
"page": 0,
"size": 20,
"totalElements": 1,
"totalPages": 1
}GET/v1
取得 AI 助理詳情
完整設定與資源統計。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
請求與回應範例200 OK
回應
{
"agentId": 101,
"agentDisplayName": "Customer Support",
"agentDescription": "Handles order and refund inquiries",
"agentStatus": "ACTIVE",
"collectionCount": 2,
"promptCount": 1
}對話
開啟對話、送出訊息、讀取歷史。
POST/v1
建立對話 Channel
開啟一段對話,回傳 agentChannelId。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
title | string | 選填 | 對話標題。 |
visitorId | string | 選填 | 訪客 ID,跨請求追蹤同一位使用者。 |
請求與回應範例201 Created
請求
{
"title": "Support Session",
"visitorId": "visitor-001"
}回應
{
"agentChannelId": "7d1b8e4aa6af4a0194f4f3bf45f2f4c8",
"agentId": 101,
"agentChannelTitle": "Support Session",
"visitorId": "visitor-001",
"messageCount": 0,
"agentChannelCreateDate": "2026-04-01T10:05:00Z"
}POST/v1
發送聊天訊息(SSE)
送出訊息,回覆以 SSE 逐段傳回。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
message | string | 必填 | 使用者訊息。 |
channelId | string | 選填 | 對話 Channel ID,帶上就保留上下文。 |
stream | boolean | 選填 | 回覆方式。
|
parameters.temperature | number | 選填 | 回答的發散程度,0.1–1.0。 |
parameters.maxTokens | integer | 選填 | 回覆的 token 上限。 |
請求與回應範例200 OK · text/event-stream
請求
{
"channelId": "7d1b8e4aa6af4a0194f4f3bf45f2f4c8",
"message": "這張訂單的交期是哪天?",
"stream": true,
"parameters": {
"temperature": 0.2,
"maxTokens": 1024
}
}回應
event: message
data: {"type":"chunk","content":"交期是"}
event: message
data: {"type":"chunk","content":" 10 月 8 日。"}
event: done
data: [DONE]GET/v1
取得聊天歷史
依 Channel 分頁讀取訊息。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
channelId | string | 必填 | 對話 Channel ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
limit | integer | 選填 | 筆數,最多 200。預設 100 |
page | integer | 選填 | 頁碼,從 0 起算。預設 0 |
請求與回應範例200 OK
請求
GET /api/v1/agents/101/channels/7d1b8e4aa6af4a0194f4f3bf45f2f4c8/messages?limit=100&page=0回應
[
{
"agentChannelMessageId": "5b5a2c7e9f1d4e3a8b6c0d2e4f6a8b1c",
"messageType": "AI",
"messageContent": "交期是 10 月 8 日。",
"tokenCount": 226,
"agentChannelMessageCreateDate": "2026-04-01T10:06:22Z"
}
]知識庫
綁定、啟用與查詢知識庫。
GET/v1
列出知識庫
列出助理綁定的知識庫。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
activeOnly | boolean | 選填 | 篩選啟用狀態。
|
請求與回應範例200 OK
請求
GET /api/v1/agents/101/collections?activeOnly=true回應
[
{
"agentCollectionId": 6101,
"collectionId": 500,
"collectionName": "Support FAQ",
"isActive": true
}
]POST/v1
建立知識庫並綁定
建立知識庫,綁定到助理。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
collectionName | string | 必填 | 知識庫名稱。 |
collectionDescription | string | 選填 | 知識庫說明。 |
ownerId | string | 選填 | 租戶 ID,32 碼。 |
請求與回應範例201 Created
請求
{
"collectionName": "Support FAQ",
"collectionDescription": "Order and refund answers",
"ownerId": "YOUR_OWNER_ID"
}回應
{
"agentCollectionId": 6101,
"agentId": 101,
"collectionId": 500,
"collectionName": "Support FAQ",
"isActive": true
}PATCH/v1
啟用/停用知識庫
停用後資料保留,不參與回答。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentCollectionId | integer | 必填 | 助理與知識庫的綁定 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
isActive | boolean | 必填 | 知識庫狀態。
|
請求與回應範例200 OK
請求
{
"isActive": false
}回應
{
"agentCollectionId": 6101,
"agentId": 101,
"collectionId": 500,
"collectionName": "Support FAQ",
"isActive": false
}GET/v1
取得知識庫內容
搜尋知識庫裡的文章與處理狀態。
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | integer | 必填 | AI 助理 ID。 |
collectionId | integer | 必填 | 知識庫 ID。 |
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
query | string | 選填 | 比對標題與內容的關鍵字。 |
startIndex | integer | 選填 | 起始位置,10 的倍數。預設 0 |
請求與回應範例200 OK
請求
GET /api/v1/agents/101/collections/500/articles?query=return&startIndex=0回應
{
"articles": [
{
"articleId": 9001,
"collectionId": 500,
"collectionName": "Support FAQ",
"articleTitle": "Return Policy",
"embeddingStatus": "COMPLETED",
"chunkCount": 8,
"createDate": "2026-04-01T08:00:00Z"
}
],
"page": 0,
"size": 10,
"totalElements": 1,
"totalPages": 1
}60 分鐘串接旅程
三步完成第一版串接
先確認連線,再做對話,最後讓知識庫參與回答
60分鐘
013–5 分鐘
驗證連線可用
建立 AI 助理、建立 Channel、發送第一則訊息。
- POST
/v1/agents - POST
/v1/agents /{agentId} /channels - POST
/v1/agents /{agentId} /chat
- POST
0215–30 分鐘
實作對話流程
用 Chat API 做多輪上下文,並查詢對話歷史。
- POST
/v1/agents /{agentId} /chat - GET
/v1/agents /{agentId} /channels /{channelId} /messages
- POST
0310–20 分鐘
加入知識庫回答
啟用知識庫,確認知識庫參與回覆。
- POST
/v1/agents /{agentId} /collections - PATCH
/v1/agent-collections /{agentCollectionId} /status
- POST
驗收建議
先跑通再擴充
先用快速開始確認收到回覆,再擴充到完整 API
握手成功
GET /v1/csrf-token取得XSRF-TOKEN,之後的請求都通過驗證。串流完整
回覆逐段出現,最後收到
[DONE]。上下文接得上
同一個
channelId追問,回答接著前文。知識庫有參與
啟用後回答用上知識庫;停用後不再引用。
變更後重跑
每次調整回答策略或知識來源,重跑一次快速開始。