Jaba AI 提供 RESTful API 和 WebSocket (Socket.IO) 兩種介面。
- RESTful API:用於資料查詢和操作
- Socket.IO:用於即時訊息推送
使用 Token 認證,登入後取得 token,之後的請求需在 Header 中帶入:
Authorization: Bearer <token>
使用群組代碼認證,登入後取得可管理的群組列表。
部分 API 不需要認證:
/api/public/*- 菜單查詢/api/line-admin/applications- 提交申請/api/board/*- 看板資料
驗證超級管理員帳號密碼。
Request:
{
"username": "admin",
"password": "password123"
}Response:
{
"success": true,
"token": "xxxxx",
"username": "admin"
}取得所有店家。
Query Parameters:
scope(optional): 篩選global或groupgroup_code(optional): 篩選指定群組代碼
Response:
[
{
"id": "uuid",
"name": "好吃便當",
"phone": "02-1234-5678",
"address": "台北市...",
"description": "...",
"note": "...",
"is_active": true,
"scope": "global",
"group_code": null,
"created_by_type": "admin"
}
]建立店家。
Request:
{
"name": "好吃便當",
"phone": "02-1234-5678",
"address": "台北市...",
"scope": "global",
"group_code": null
}更新店家。
Request:
{
"name": "新名稱",
"is_active": false
}刪除店家。
辨識菜單圖片(不指定店家)。
Request: multipart/form-data
file: 圖片檔案
Response:
{
"categories": [
{
"name": "便當類",
"items": [
{
"name": "雞腿便當",
"price": 85,
"variants": [],
"description": ""
}
]
}
]
}辨識菜單圖片並與現有菜單比對。
Response:
{
"recognized_menu": { ... },
"existing_menu": { ... },
"diff": {
"added": [...],
"removed": [...],
"modified": [...]
}
}儲存菜單(完整覆蓋)。
Request:
{
"categories": [
{
"name": "便當類",
"items": [
{
"name": "雞腿便當",
"price": 85
}
]
}
]
}儲存菜單(差異模式)。
Request:
{
"diff_mode": true,
"apply_items": [
{"name": "雞腿便當", "price": 90, "category": "便當類"}
],
"remove_items": ["舊品項名稱"]
}取得所有群組。
Response:
[
{
"id": "uuid",
"line_group_id": "Cxxx",
"name": "公司午餐群",
"status": "active",
"activated_at": "2024-01-01T00:00:00Z"
}
]取得群組詳情(含管理員列表)。
啟用群組。
停用群組。
取得申請列表。
Query Parameters:
status(optional):pending|approved|rejected
Response:
[
{
"id": "uuid",
"line_group_id": "Cxxx",
"group_name": "公司午餐群",
"contact_info": "小明 0912-345-678",
"group_code": "abc123",
"status": "pending",
"created_at": "2024-01-01T00:00:00Z",
"reviewed_at": null
}
]審核申請。
Request:
{
"status": "approved",
"note": "審核通過"
}取得群組訂單。
Query Parameters:
all_sessions(optional):true取得今日所有 session
Response:
[
{
"session_id": "uuid",
"status": "ordering",
"started_at": "2024-01-01T12:00:00Z",
"orders": [
{
"id": "uuid",
"user_id": "uuid",
"display_name": "小明",
"total": 85,
"payment_status": "unpaid",
"items": [
{
"name": "雞腿便當",
"quantity": 1,
"subtotal": 85
}
]
}
]
}
]標記訂單已付款。
刪除訂單。
代理建立訂單。
Request:
{
"user_id": "uuid",
"items": [
{
"name": "雞腿便當",
"quantity": 1,
"note": "不要辣"
}
]
}代理修改訂單。
取得所有提示詞。
Response:
[
{
"id": "uuid",
"name": "group_ordering",
"content": "你是呷爸...",
"updated_at": "2024-01-01T00:00:00Z"
}
]更新提示詞。
Request:
{
"content": "新的提示詞內容..."
}取得 AI 對話日誌。
Query Parameters:
limit(optional): 筆數限制(預設 100)offset(optional): 偏移量(預設 0)
Response:
[
{
"id": "uuid",
"user_id": "uuid",
"group_id": "uuid",
"model": "haiku",
"input_prompt": "...",
"raw_response": "...",
"parsed_message": "AI 回應的訊息",
"parsed_actions": [],
"success": true,
"duration_ms": 1234,
"created_at": "2024-01-01T12:00:00Z"
}
]與 AI 助手對話(需認證)。
Request:
{
"message": "今天吃什麼",
"username": "admin",
"is_manager": true,
"group_id": "uuid",
"history": [
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}
]
}Response:
{
"message": "AI 回應訊息",
"actions": [
{"type": "set_today_store", "data": {"store_id": "...", "group_id": "..."}}
]
}LINE 管理員登入。
Request:
{
"password": "群組代碼"
}Response:
{
"success": true,
"groups": [
{
"group_id": "uuid",
"group_name": "公司午餐群"
}
]
}提交群組申請。
Request:
{
"line_group_id": "Cxxx",
"group_name": "公司午餐群",
"contact_info": "小明 0912-345-678",
"group_code": "mycode123"
}查詢申請狀態(以 LINE 群組 ID)。
查詢申請狀態(以群組代碼)。
取得群組資訊。
取得群組訂單。
取得今日店家。
設定今日店家。
Request:
{
"store_ids": ["uuid1", "uuid2"]
}取得群組可用店家(全局 + 群組專屬)。
建立群組專屬店家。
Request:
{
"name": "隔壁便當店",
"phone": "02-9999-9999"
}更新群組店家(僅能更新 scope=group 的店家)。
刪除群組店家。
取得店家菜單。
辨識菜單圖片。
儲存菜單(完整覆蓋)。
儲存菜單(差異模式)。
取得店家菜單(公開)。
取得群組點餐狀態。
Response:
{
"is_ordering": true,
"session_id": "uuid",
"today_stores": [
{
"store_id": "uuid",
"store_name": "好吃便當"
}
]
}取得群組當前訂單。
LINE Webhook 接收端點。
由 LINE Platform 自動呼叫,處理:
- 文字訊息
- 加入/離開群組事件
- Postback 事件
const socket = io('http://localhost:8089');
// 加入群組房間(看板)
socket.emit('join_board', { group_id: 'uuid' });
// 加入所有群組房間(看板選擇 "全部")
socket.emit('join_board', { group_id: 'all' });
// 加入超管房間
socket.emit('join_admin');
// 離開群組房間
socket.emit('leave_board', { group_id: 'uuid' });訂單更新事件。
socket.on('order_update', (data) => {
// data: { group_id, action, user_id, display_name }
// action: 'created' | 'updated' | 'cancelled'
});聊天訊息事件。
socket.on('chat_message', (data) => {
// data: { group_id, user_id, display_name, role, content }
// role: 'user' | 'assistant'
});點餐狀態變更事件。
socket.on('session_status', (data) => {
// data: { group_id, session_id, status, started_by/ended_by }
// status: 'ordering' | 'ended'
});付款狀態變更事件。
socket.on('payment_update', (data) => {
// data: { group_id, order_id, payment_status }
});今日店家變更事件。
socket.on('store_change', (data) => {
// data: { group_id, action, store_name }
// action: 'set' | 'add' | 'remove' | 'clear'
});群組申請狀態變更事件(超管房間)。
socket.on('application_update', (data) => {
// data: { application_id, status, group_name }
// status: 'pending' | 'approved' | 'rejected'
});群組成員變更事件(超管房間)。
socket.on('group_update', (data) => {
// data: { group_id, action }
// action: 'member_added'
});所有 API 錯誤回應格式:
{
"detail": "錯誤訊息"
}常見 HTTP 狀態碼:
400- 請求參數錯誤401- 未認證或 Token 無效403- 權限不足404- 資源不存在500- 伺服器錯誤