使用 AceDataCloud AI Chat v2 建置 Agentic 應用程式
聊天端點可以回傳文字。一個 agent 端點可以檢查檔案、搜尋網頁、呼叫已授權的工具、詢問缺少的資訊,並將每個步驟串流回傳到您的介面。
這就是 AceDataCloud AI Chat v2 背後的實際差異。位於 POST https://api.acedata.cloud/aichat2/conversations 的端點保留了原始對話 API 的簡單請求風格,同時新增了多模態內容區塊、自主多輪工具使用、MCP 連線、結構化串流事件、可恢復的對話,以及對話 CRUD 操作。

本指南著重於從基本聊天機器人轉向正式環境 agent 體驗時重要的整合決策。
¶ AI Chat v2 有哪些改變?
AI Chat v2 是對原始 /aichat/conversations 介面的全面升級。其主要能力包括:
- **多模態輸入:**在一個
message陣列中傳送有序的text、image_url與file_url區塊。 - **自主工具使用:**模型可以跨多個回合呼叫內建工具與使用者授權的 MCP 伺服器。
- **具型別的串流:**將文字、工具活動、引用、卡片、成品、錯誤與完成資料呈現為獨立事件。
- **暫停與恢復:**處理
ask_user_question事件,並透過工具結果繼續相同的對話。 - **對話管理:**透過相同端點上的操作進行擷取、批次擷取、更新與刪除。
- **向後相容的請求:**現有的
model+question用戶端可以透過變更端點路徑來遷移。
重要的架構轉變是,您的前端不再必須將回應視為單一不透明字串。它可以成為一個由事件驅動的工作區。
¶ 從向後相容的路徑開始
風險最低的遷移刻意保持很小。保留現有的請求主體,並且只變更端點:
curl -X POST 'https://api.acedata.cloud/aichat2/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer YOUR_API_TOKEN' \
-H 'content-type: application/json' \
-d '{
"model": "YOUR_SUPPORTED_MODEL",
"question": "Summarize the three most important points in this request.",
"stateful": true
}'
在 JSON 模式中,回應會保留熟悉的結構:
{
"answer": "...",
"id": "conversation-uuid"
}
保留回傳的 id。在下一個請求中傳送它,即可繼續受管理的對話,而不需要您的用戶端重新傳送完整訊息歷程。
stateful預設為true。當某個回合不應被儲存時,請明確將其設為false。
這第一個遷移步驟可讓您在引入工具或新的串流 UI 前,驗證驗證機制、模型可用性、延遲與應用程式行為。
¶ 當順序與模態很重要時使用 message
較舊的 question 欄位適合純文字提示。對於混合文字與圖片或檔案的內容,請使用有序的 message 陣列:
{
"model": "YOUR_SUPPORTED_MODEL",
"stateful": true,
"message": [
{
"type": "text",
"text": "Read the attached report and compare its chart with this screenshot. Return five findings."
},
{
"type": "file_url",
"file_url": {
"url": "https://example.com/report.pdf"
}
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/dashboard.png"
}
}
]
}
支援的內容區塊如下:
| 區塊 | 必要值 | 最適合的用途 |
|---|---|---|
text |
text |
指示、背景資訊與問題 |
image_url |
image_url.url |
螢幕截圖、圖表、產品圖片 |
file_url |
file_url.url |
PDF、CSV、TXT 與其他檔案 |
AI Chat v2 仍然識別較舊的 references 陣列。圖片副檔名會被轉換為圖片區塊,而其他 URL 則會成為檔案區塊。這種相容性在遷移期間很有用,但當內容順序重要時,message 是更好的長期契約。
¶ 圍繞事件設計用戶端,而不只是 token
使用 accept 標頭選擇回應格式:
| 用戶端 | 標頭 | 格式 |
|---|---|---|
| 瀏覽器 UI | text/event-stream |
Server-Sent Events |
| Node、Python、CLI、worker | application/x-ndjson |
每行一個 JSON 事件 |
| 簡單後端請求 | application/json |
最終 {answer, id} 物件 |
最小化的 Python NDJSON 消費者可以在保留其他事件類型的同時組合文字:
import json
import os
import requests
url = "https://api.acedata.cloud/aichat2/conversations"
headers = {
"accept": "application/x-ndjson",
"authorization": f"Bearer {os.environ['ACEDATA_API_TOKEN']}",
"content-type": "application/json",
}
payload = {
"model": os.environ["ACEDATA_CHAT_MODEL"],
"question": "Research the topic, cite sources, and return a concise brief.",
"stateful": True,
}
with requests.post(url, json=payload, headers=headers, stream=True, timeout=120) as response:
response.raise_for_status()
answer = []
for raw_line in response.iter_lines():
if not raw_line:
continue
event = json.loads(raw_line)
event_type = event.get("type")
if event_type == "text_delta":
answer.append(event.get("content", ""))
elif event_type == "tool_use":
print("tool started:", event.get("tool_name"))
elif event_type == "tool_result":
print("tool finished; error =", event.get("is_error"))
elif event_type == "citation":
print("source:", event)
elif event_type == "artifact":
print("artifact:", event)
elif event_type == "error":
raise RuntimeError(event.get("message", "unknown agent error"))
elif event_type == "done":
print("usage:", event.get("usage"))
print("terminal reason:", event.get("terminal_reason"))
print("".join(answer))
正式環境介面應為每個事件系列定義轉譯器或處理程式:
text_delta更新答案區域。tool_use與tool_result驅動活動狀態與稽核檢視。citation將來源附加到相關輸出。card呈現結構化預覽。artifact公開獨立產生的交付成果。- 僅應在所選模型公開
thinking時處理它。 error終止或恢復目前回合。done關閉串流,並記錄 token 使用量與終止原因。
如果您的介面只需要最終答案,請串接每個 text_delta 中的 content。這等同於 JSON 模式中回傳的 answer。
¶ 讓 agent 使用工具——但要讓活動可見
工具呼叫預設為啟用。AI Chat v2 可以使用內建能力,例如網頁搜尋、頁面擷取與檔案讀取。它也可以掛載使用者授權的 MCP 連線,例如 Google Drive、Notion、Slack 或 GitHub。
串流會清楚公開這個邊界:
{"type":"tool_use","tool_id":"toolu_01","tool_name":"web_search","input":{"query":"topic"}}
{"type":"tool_result","tool_id":"toolu_01","output":"...","is_error":false}
透過 tool_id 配對 tool_use 與 tool_result。這支援進度指示器、延遲測量、錯誤處理,以及供操作人員閱讀的稽核軌跡。
使用 max_turns 限制單一請求中可發生的自主工具回合數。可接受的範圍為 1–500;文件記載的預設值為 500。較低的值可減少開放式執行。設定 max_turns: 1 會強制單一回應並防止工具呼叫。
實用的部署模式是:
- 在產品 UI 中,以沒有工具的 JSON 模式開始。
- 新增 NDJSON 或 SSE,並呈現
text_delta加上done。 - 將工具活動顯示為摺疊式時間軸。
- 新增引用與成品呈現。
- 根據任務複雜度與成本容忍度,設定明確的
max_turns。 - 僅在檢閱其確認模型後,才啟用具寫入能力的連線。
¶ 將問題處理為可恢復的狀態機
agent 有時需要釐清資訊。在這種情況下,串流可以發出 ask_user_question,而對話會進入 awaiting_user_input 狀態。
您的用戶端應該:
- 儲存對話
id與tool_id。 - 呈現問題及其選項。
- 收集使用者的回應。
- 使用相同的對話
id傳送另一個請求。 - 透過
tool_results回傳待處理工具呼叫的答案。 這比假裝代理程式可以在資訊缺失的情況下完成任務更穩健。它也讓敏感操作的核准閘門成為可能。
¶ 分離互動式與無人值守執行
對於 Webhook、CI/CD 工作與監控系統,async: true 會在工作持續進行時傳回任務識別碼。結果可於稍後擷取,或傳送至 HTTP(S) 回呼 URL。
無人值守的寫入存取應明確指定。AI Chat v2 支援 allowed_skills、allowed_mcp_servers 或等效的 unattended_policy 物件。空白清單不授權任何能力。預先授權不會略過連接器本身的安全機制;不支援無人值守確認的技能仍應進行試跑或拒絕寫入。
此區別很重要:連線可用性不等於可以在沒有人在場時採取行動的權限。
¶ 正式環境檢查清單
在推出代理式介面之前,請確認:
- API 憑證儲存在伺服器端,絕不放在瀏覽器程式碼中。
- 模型名稱來自目前支援的模型清單,而非硬式編碼的假設。
- 串流剖析器可容忍部分網路區塊與未知事件類型。
- 工具事件依
tool_id配對,並記錄錯誤。 - 有意識地設定
max_turns。 - 引用與成品 URL 均安全地呈現。
-
ask_user_question保留足夠的狀態以便稍後恢復。 - 具備寫入能力的連線保留確認機制或範圍嚴格限定的無人值守授權。
-
done.usage與terminal_reason用於可觀測性。 - 對話刪除與保留政策符合您的產品需求。
¶ 從聊天機器人到代理程式的最短路徑
AI Chat v2 不強制要求全面重寫。先變更端點並保留您目前的請求本文。接著改用多模態 message 區塊、採用結構化串流、顯示工具進度,並加入暫停與恢復處理。
結果是一個可從簡單回答成長為可稽核代理程式工作流程的用戶端——無需為檔案、工具、引用、成品或使用者澄清另外設計通訊協定。

