Hướng Dẫn Luồng Đầy Đủ
Hướng dẫn này đi qua bốn luồng chính của Imbrace SDK từ đầu đến cuối. Mỗi phần độc lập — có thể theo thứ tự hoặc nhảy thẳng đến phần cần dùng. Chuyển tab ngôn ngữ một lần và phần còn lại của trang sẽ ghi nhớ lựa chọn của bạn.
1. Tạo AI Assistant và Bắt Đầu Chat
-
Khởi tạo client
import { ImbraceClient } from "@imbrace/sdk"const client = new ImbraceClient({baseUrl: "https://app-gatewayv2.imbrace.co",accessToken: "acc_your_token",})from imbrace import ImbraceClientclient = ImbraceClient(base_url="https://app-gatewayv2.imbrace.co",access_token="acc_your_token",)Xem Xác Thực → nên chọn credential nào để biết thêm chi tiết.
-
Tạo assistant
workflow_namephải là duy nhất trong tổ chức.const assistant = await client.chatAi.createAssistant({name: "Support Bot",workflow_name: "support_bot_v1",description: "Xử lý các câu hỏi hỗ trợ khách hàng cấp 1",instructions: "Bạn là trợ lý hỗ trợ. Hãy trả lời ngắn gọn và thân thiện.",provider_id: "system", // dùng provider LLM mặc định của tổ chứcmodel_id: "gpt-4o", // tên model mà system provider hỗ trợ})const assistantId = assistant.id // UUID — dùng cho tất cả các call tiếp theoconsole.log("Assistant created:", assistantId)assistant = client.chat_ai.create_assistant({"name": "Support Bot","workflow_name": "support_bot_v1","description": "Xử lý các câu hỏi hỗ trợ khách hàng cấp 1","instructions": "Bạn là trợ lý hỗ trợ. Hãy trả lời ngắn gọn và thân thiện.","provider_id": "system", # dùng provider LLM mặc định của tổ chức"model_id": "gpt-4o", # tên model mà system provider hỗ trợ})assistant_id = assistant["id"]print("Assistant created:", assistant_id)provider_idvàmodel_idlà bắt buộc. Truyềnprovider_id: "system"để dùng provider LLM mặc định của tổ chức, hoặc truyền UUID của provider tuỳ chỉnh. Vớiprovider_id: "system",model_idnhận tên model (ví dụ"gpt-4o") hoặc giá trị"Default"để dùng model mặc định của hệ thống. -
Stream phản hồi chat từ assistant
const response = await client.aiAgent.streamChat({assistant_id: assistantId,organization_id: "org_your_org_id",messages: [{ role: "user", content: "Làm sao để đặt lại mật khẩu?" }],// id là session UUID — truyền lại để giữ lịch sử hội thoại// Nếu bỏ qua, UUID mới sẽ tự tạo mỗi lần gọi})const reader = response.body!.getReader()const decoder = new TextDecoder()while (true) {const { done, value } = await reader.read()if (done) breakconst text = decoder.decode(value)for (const line of text.split("\n")) {if (line.startsWith("data: ")) {const data = line.slice(6).trim()if (data && data !== "[DONE]") {try {const chunk = JSON.parse(data)process.stdout.write(chunk.delta ?? chunk.content ?? "")} catch {}}}}}response = client.ai_agent.stream_chat({"assistant_id": assistant_id,"organization_id": "org_your_org_id","messages": [{"role": "user", "content": "Làm sao để đặt lại mật khẩu?"}],# id là session UUID — truyền lại để giữ lịch sử hội thoại.# Nếu bỏ qua, UUID mới sẽ tự tạo mỗi lần gọi.})import jsonfor line in response.iter_lines():if isinstance(line, bytes):line = line.decode()if not line.startswith("data: "):continuedata = line[6:].strip()if data and data != "[DONE]":try:chunk = json.loads(data)print(chunk.get("delta") or chunk.get("content") or "", end="")except Exception:pass -
Duy trì lịch sử hội thoại (session ID)
Truyền cùng một
id(phải là UUID) qua các lượt gọi để giữ ngữ cảnh:import { randomUUID } from "crypto"const sessionId = randomUUID()// Tin nhắn đầu tiênawait client.aiAgent.streamChat({assistant_id: assistantId,organization_id: "org_your_org_id",id: sessionId,messages: [{ role: "user", content: "Chính sách hoàn tiền của bạn là gì?" }],})// Tin nhắn tiếp theo — cùng session, assistant nhớ ngữ cảnhawait client.aiAgent.streamChat({assistant_id: assistantId,organization_id: "org_your_org_id",id: sessionId,messages: [{ role: "user", content: "Mất bao lâu để xử lý?" }],})import uuidsession_id = str(uuid.uuid4())# Tin nhắn đầu tiênclient.ai_agent.stream_chat({"assistant_id": assistant_id,"organization_id": "org_your_org_id","id": session_id,"messages": [{"role": "user", "content": "Chính sách hoàn tiền của bạn là gì?"}],})# Tin nhắn tiếp theo — cùng session, assistant nhớ ngữ cảnhclient.ai_agent.stream_chat({"assistant_id": assistant_id,"organization_id": "org_your_org_id","id": session_id,"messages": [{"role": "user", "content": "Mất bao lâu để xử lý?"}],})
2. Tạo Workflow với Activepieces và Liên Kết với Assistant
-
Liệt kê flows hiện có để lấy project ID
const { data: flows } = await client.activepieces.listFlows({ limit: 5 })const projectId = flows[0]?.projectIdconsole.log("Project ID:", projectId)res = client.activepieces.list_flows(limit=5)flows = res.get("data", [])project_id = flows[0]["projectId"] if flows else Noneprint("Project ID:", project_id) -
Tạo flow mới
const flow = await client.activepieces.createFlow({displayName: "Cập Nhật CRM Khi Có Lead Mới",projectId,})console.log("Flow created:", flow.id)flow = client.activepieces.create_flow(display_name="Cập Nhật CRM Khi Có Lead Mới",project_id=project_id,)print("Flow created:", flow["id"]) -
Thêm Webhook trigger và publish flow
Flow vừa tạo đang ở trạng thái DRAFT không có trigger — webhook URL chưa tồn tại nên gọi
triggerFlowsẽ trả 404. Thêm piece Webhook làm trigger rồi publish:// Đặt piece Webhook làm trigger của flowawait client.activepieces.applyFlowOperation(flow.id, {type: "UPDATE_TRIGGER",request: {name: "trigger",type: "PIECE_TRIGGER",valid: true,displayName: "Webhook",settings: {pieceName: "@activepieces/piece-webhook",pieceVersion: "0.1.24",triggerName: "catch_webhook",input: { authType: "none" },propertySettings: {},},},})// Publish — status chuyển DISABLED → ENABLED và webhook URL được kích hoạtawait client.activepieces.applyFlowOperation(flow.id, {type: "LOCK_AND_PUBLISH",request: {},})# Đặt piece Webhook làm trigger của flowclient.activepieces.apply_flow_operation(flow["id"], {"type": "UPDATE_TRIGGER","request": {"name": "trigger","type": "PIECE_TRIGGER","valid": True,"displayName": "Webhook","settings": {"pieceName": "@activepieces/piece-webhook","pieceVersion": "0.1.24","triggerName": "catch_webhook","input": {"authType": "none"},"propertySettings": {},},},})# Publish — DISABLED → ENABLED, webhook URL được kích hoạtclient.activepieces.apply_flow_operation(flow["id"], {"type": "LOCK_AND_PUBLISH","request": {},}) -
Kích hoạt flow thủ công với payload
// Bất đồng bộ (fire and forget)await client.activepieces.triggerFlow(flow.id, {contact_name: "Nguyễn Văn A",email: "nva@example.com",})// Sync trigger — để có dữ liệu trả về thay vì timeout, flow cần// thêm action "Return Response" qua applyFlowOperation ADD_ACTIONconst result = await client.activepieces.triggerFlowSync(flow.id, {contact_name: "Nguyễn Văn A",email: "nva@example.com",})console.log("Flow result:", result)# Bất đồng bộ (fire and forget)client.activepieces.trigger_flow(flow["id"], {"contact_name": "Nguyễn Văn A","email": "nva@example.com",})# Sync trigger — để có dữ liệu trả về thay vì timeout, flow cần# thêm action "Return Response" qua apply_flow_operation ADD_ACTIONresult = client.activepieces.trigger_flow_sync(flow["id"], {"contact_name": "Nguyễn Văn A","email": "nva@example.com",})print("Flow result:", result) -
Liên kết flow với assistant
Mở assistant trong dashboard Imbrace, vào Tools → Workflows và gắn flow vào. Assistant sẽ có thể kích hoạt flow trong quá trình hội thoại khi phù hợp.
Hoặc cập nhật assistant để tham chiếu workflow theo tên:
await client.chatAi.updateAssistant(assistantId, {name: "Support Bot",workflow_name: "support_bot_v1",workflow_function_call: [{ flow_id: flow.id, description: "Cập nhật CRM khi có lead mới" }],})client.chat_ai.update_assistant(assistant_id, {"name": "Support Bot","workflow_name": "support_bot_v1","workflow_function_call": [{"flow_id": flow["id"], "description": "Cập nhật CRM khi có lead mới"}],}) -
Xem lịch sử chạy
const { data: runs } = await client.activepieces.listRuns({flowId: flow.id,limit: 10,})for (const run of runs) {console.log(run.id, run.status, run.startTime)}res = client.activepieces.list_runs(flow_id=flow["id"], limit=10)for run in res.get("data", []):print(run["id"], run.get("status"), run.get("startTime"))
3. Quản Lý Knowledge Hub và Gắn Vào Assistant
Knowledge Hub chứa files và folders trong service data-board (client.boards). _id của folder là giá trị bạn truyền vào assistant làm nguồn tri thức.
-
Tạo folder
const folder = await client.boards.createFolder({name: "Tài Liệu Sản Phẩm",organization_id: "org_your_org_id",parent_folder_id: "root",source_type: "upload",})console.log("Folder ID:", folder._id)folder = client.boards.create_folder({"name": "Tài Liệu Sản Phẩm","organization_id": "org_your_org_id","parent_folder_id": "root","source_type": "upload",})print("Folder ID:", folder["_id"]) -
Upload file vào folder
import { readFileSync } from "fs"const fileBuffer = readFileSync("./docs/faq.pdf")const formData = new FormData()formData.append("file", new Blob([fileBuffer], { type: "application/pdf" }), "faq.pdf")formData.append("folder_id", folder._id)formData.append("organization_id", "org_your_org_id")const uploaded = await client.boards.uploadFile(formData)console.log("File uploaded:", uploaded.file_id)from pathlib import Pathpath = Path("./docs/faq.pdf")files = {"file": (path.name, path.read_bytes(), "application/pdf"),"folder_id": (None, folder["_id"]),"organization_id": (None, "org_your_org_id"),}uploaded = client.boards.upload_file(files)print("File uploaded:", uploaded.get("file_id") or uploaded.get("_id")) -
Gắn folder vào assistant
Truyền
_idcủa folder vàofolder_ids— assistant sẽ truy xuất từ mọi file trong folder đó. Dùngboard_idsđể gắn thêm một CRM data-board (các item của board trở thành nguồn tri thức). Trườngknowledge_hubscũ đã ngừng hỗ trợ.await client.chatAi.updateAssistant(assistantId, {name: "Support Bot",workflow_name: "support_bot_v1",folder_ids: [folder._id],// board_ids: [boardId], // tuỳ chọn: gắn thêm một CRM data-board})client.chat_ai.update_assistant(assistant_id, {"name": "Support Bot","workflow_name": "support_bot_v1","folder_ids": [folder["_id"]],# "board_ids": [board_id], # tuỳ chọn: gắn thêm một CRM data-board}) -
Xem và quản lý folders/files
// Tìm kiếm foldersconst folders = await client.boards.searchFolders({ q: "Sản Phẩm" })// Lấy nội dung folderconst contents = await client.boards.getFolderContents(folder._id)console.log("Files:", contents.files?.length)// Đổi tên folderawait client.boards.updateFolder(folder._id, { name: "Tài Liệu Sản Phẩm v2" })// Tìm kiếm files trong folderconst files = await client.boards.searchFiles({ folderId: folder._id })// Xóa folderawait client.boards.deleteFolders({ ids: [folder._id] })# Tìm kiếm foldersfolders = client.boards.search_folders(q="Sản Phẩm")# Lấy nội dung foldercontents = client.boards.get_folder_contents(folder["_id"])print("Files:", len(contents.get("files") or []))# Đổi tên folderclient.boards.update_folder(folder["_id"], {"name": "Tài Liệu Sản Phẩm v2"})# Tìm kiếm files trong folderfiles = client.boards.search_files(folder_id=folder["_id"])# Xóa folderclient.boards.delete_folders([folder["_id"]])
4. Quản Lý Data Boards và Items (CRM Pipeline)
-
Tạo board
Board là một CRM pipeline — leads, deals, tasks, hoặc bất kỳ dữ liệu có cấu trúc nào.
const board = await client.boards.create({name: "Sales Pipeline",description: "Theo dõi tất cả deals đang hoạt động",})console.log("Board ID:", board._id)board = client.boards.create(name="Sales Pipeline",description="Theo dõi tất cả deals đang hoạt động",)print("Board ID:", board["_id"]) -
Thêm custom field
Các loại field:
ShortText,LongText,Number,Dropdown,Date,Checkbox, v.v.createFieldtrả về board đã cập nhật — field mới nằm trongboard.fields.const updated = await client.boards.createField(board._id, {name: "Công Ty",type: "ShortText",})// Lấy identifier field (tự tạo kèm mỗi board)const identifierField = updated.fields.find(f => f.is_identifier)updated = client.boards.create_field(board["_id"], {"name": "Công Ty","type": "ShortText",})identifier_field = next(f for f in updated["fields"] if f.get("is_identifier")) -
Tạo board items (records)
Items dùng format
{ fields: [{ board_field_id, value }] }:const item = await client.boards.createItem(board._id, {fields: [{ board_field_id: identifierField._id, value: "Acme Corp" },],})console.log("Item ID:", item._id)item = client.boards.create_item(board["_id"], {"fields": [{"board_field_id": identifier_field["_id"], "value": "Acme Corp"},],})print("Item ID:", item["_id"]) -
Liệt kê và tìm kiếm items
// Phân trang itemsconst { data: items } = await client.boards.listItems(board._id, { limit: 20, skip: 0 })// Tìm kiếm full-textconst { data: results } = await client.boards.search(board._id, {q: "Acme",limit: 10,})# Phân trang itemsitems = client.boards.list_items(board["_id"], limit=20, skip=0)# Tìm kiếm full-textresults = client.boards.search(board["_id"], q="Acme", limit=10) -
Cập nhật và xóa items
updateItemdùng format mảng{ data: [{ key: fieldId, value }] }:await client.boards.updateItem(board._id, item._id, {data: [{ key: identifierField._id, value: "Acme Corp — Closed Won" }],})await client.boards.deleteItem(board._id, item._id)client.boards.update_item(board["_id"], item["_id"], {"data": [{"key": identifier_field["_id"], "value": "Acme Corp — Closed Won"}],})client.boards.delete_item(board["_id"], item["_id"]) -
Xuất board ra CSV
const csv = await client.boards.exportCsv(board._id)// csv là string — ghi ra file hoặc gửi dưới dạng downloadcsv = client.boards.export_csv(board["_id"])# csv là str — ghi ra file hoặc gửi dưới dạng download