ข้ามไปยังเนื้อหา

รับคำตอบ AI แบบ Async

ต้องการให้ AI ของ DealDroid ช่วยคิดคำตอบ แต่ไม่ต้องการให้ระบบของคุณเปิด connect รอ เรามีประมวลผล AI แบบ background? Async Answer API ช่วยให้คุณส่ง request แล้วรับคำตอบจาก AI ผ่าน Webhook ภายหลัง — ไม่ต้องเปิด connection ค้างไว้ขณะที่ AI กำลังคิด!


Async Answer API เหมาะสำหรับกรณีเหล่านี้:

  • ⏱️ ระบบที่ต้องการกำหนด timeout สั้นๆ — Webhook receivers, Serverless functions, หรือ API ที่มี timeout limit
  • 📬 ระบบที่ต้องการ queue request — สำหรับจัดการ load และ rate limiting
  • 🚀 Integration แบบ fire-and-forget — ส่ง request แล้วรอรับผลทาง webhook
  • 🔄 Background processing — ประมวลผล AI โดยไม่ block หรือรอ response

FeatureSyncAsync (หน้านี้)
Response time2-180 วินาที (รอ AI ตอบ)< 100ms (acknowledge ทันที)
AI Responseอยู่ใน HTTP responseส่งผ่าน Webhook
ต้อง config Webhook❌ ไม่ต้อง✅ ต้องตั้งค่า
Use caseReal-time chat, ต้องการคำตอบทันทีBackground processing, queuing
Timeout handlingต้องรอจนกว่า AI จะตอบเสร็จReturn ทันที ไม่มีปัญหา timeout

เลือกใช้แบบไหนดี? ถ้าระบบของคุณรอได้ 2-180 วินาที ใช้ Sync version จะง่ายกว่า แต่ถ้ามี timeout limit หรือต้องการ queue ระบบ ให้ใช้ Async version


เพื่อให้เข้าใจความแตกต่างระหว่าง Sync และ Async มาดูการทำงานของทั้งสองแบบ:

Third Party → DealDroid API
⏳ รอ AI คิด (2-180 วินาที)
✅ ได้คำตอบกลับมาทันที
Third Party ← คำตอบจาก AI

ขั้นตอน:

  1. Third Party ส่ง request พร้อมคำถาม
  2. รอ ให้ AI ประมวลผล (2-180 วินาที)
  3. ได้คำตอบกลับมาในทันทีพร้อม HTTP response

ข้อดี: ง่าย ได้คำตอบทันทีใน response เดียว
ข้อเสีย: ถ้าตั้ง timeout น้อยกว่า 180 วินาที request อาจ timeout ได้


Third Party → DealDroid API
✅ ได้ requestId ทันที (< 100ms)
Third Party ← requestId
... AI ประมวลผลใน background (2-180 วินาที) ...
Third Party ← Webhook: คำตอบพร้อม requestId
Webhook

ขั้นตอน:

  1. Third Party ส่ง request พร้อมคำถาม
  2. ได้ requestId กลับมาทันที (ไม่ต้องรอ AI)
  3. AI ประมวลผลใน background
  4. เมื่อเสร็จ ระบบส่ง webhook พร้อมคำตอบและ requestId กลับไป
  5. Third Party match requestId เพื่อรู้ว่าเป็นคำตอบของ request ไหน

ข้อดี: ไม่มีปัญหา timeout, รองรับ queue ได้
ข้อเสีย: ต้องตั้งค่า webhook endpoint และจัดการ async flow


การตั้งค่า Integration แสดงส่วน When AI Answer Ready

ไปที่หน้าการตั้งค่าการเชื่อมต่อ:

  1. เข้าสู่ระบบแดชบอร์ด DealDroid ของคุณ
  2. ไปที่ Settings > เชื่อมต่อระบบภายนอก (Integrations)

ในส่วน “When AI Answer Ready” คุณจะพบฟิลด์สำหรับตั้งค่า webhook:

URL ที่ระบบจะส่ง AI response ไปให้เมื่อประมวลผลเสร็จ

ตัวอย่าง:

https://your-server.com/answer-webhook

ข้อกำหนด:

  • ต้องเป็น HTTPS URL (สำหรับ production)
  • ต้องสามารถรับ HTTP POST request
  • ต้อง return HTTP 2xx เพื่อ acknowledge (แนะนำ 200 OK)
  • ควรตอบกลับภายใน 5 วินาที

เคล็ดลับ:

  • ใช้ webhook.site สำหรับทดสอบครั้งแรก
  • ตรวจสอบว่า URL เข้าถึงได้จากอินเทอร์เน็ต (ไม่ใช่ localhost)
  • สามารถใช้ ngrok สำหรับทดสอบ local development

Secret key สำหรับ verify ว่า request มาจาก DealDroid จริง

ตัวอย่าง: your_secure_secret_key_2026

แนวทางปฏิบัติที่ดีที่สุด:

  • ใช้ random string ที่มีความยาวอย่างน้อย 32 ตัวอักษร
  • เก็บเป็น environment variable บนเซิร์ฟเวอร์ของคุณ
  • อย่า commit ลง version control
  • หมุนเวียนเป็นระยะเพื่อความปลอดภัย

การทำงาน: ระบบจะ append secret เป็น query parameter:

https://your-server.com/answer-webhook?secret=your-secret-here

หมายเหตุ: แม้ secret จะเป็น optional แต่แนะนำให้ตั้งค่าเสมอเพื่อความปลอดภัย


หลังจากกรอก Webhook URL แล้ว คุณสามารถทดสอบได้ทันที:

  1. คลิกปุ่ม “Send Test Answer”
  2. ระบบจะส่ง test payload ไปยัง webhook URL ที่ตั้งค่าไว้
  3. ตรวจสอบว่า webhook ของคุณได้รับ request และ return 200 OK

POST /api/droids/:droidId/endpoint/get-droid-answer-async

แทนที่ :droidId ด้วย Droid ID จริงของคุณ


ใช้ Third Party API Key ใน Authorization header:

Authorization: Bearer {your-api-key}

วิธีหา API Key: ไปที่ Automation Panel > “When Receive message from Third Party” → คัดลอก Bearer token


{
"humanMessage": {
"content": "สินค้าราคาเท่าไหร่ครับ",
"type": "human"
},
"chatHistory": [
{
"content": "สวัสดีครับ",
"type": "human"
},
{
"content": "สวัสดีครับ ยินดีต้อนรับค่ะ มีอะไรให้ช่วยไหมคะ?",
"type": "ai"
}
]
}
FieldTypeRequiredDescription
humanMessageobject✅ Yesข้อความจากผู้ใช้
humanMessage.contentstring✅ Yesเนื้อหาข้อความ
humanMessage.typestring❌ Noประเภทข้อความ (default: “human”)
chatHistoryarray❌ Noประวัติการสนทนาก่อนหน้า เพื่อให้ AI เข้าใจบริบทมากขึ้น

ระบบจะตอบกลับทันทีหลังรับ request (ภายใน 100ms):

{
"success": true,
"requestId": "tpa-cm5xyz123abc456def",
"message": "Answer request queued. Response will be sent to your configured webhook."
}
FieldTypeDescription
successbooleanสถานะการรับ request
requestIdstringID สำหรับ track request (ขึ้นต้นด้วย tpa-)
messagestringคำอธิบาย บอกว่า request ถูก queue แล้วจะส่ง webhook กลับมา

{
"error": "Bad Request",
"message": "thirdPartyAnswerWebhook is not configured. Please set up the webhook URL in Settings > Integrations before using async answer endpoint."
}

แก้ไข: ไปตั้งค่า Webhook URL ในหน้า Settings > Integrations ก่อน


{
"error": "Bad Request",
"message": "Droid Missing Test Customer Id"
}

แก้ไข: ตรวจสอบว่า Droid ของคุณมี Test Customer ที่ตั้งค่าไว้


{
"error": "Bad Request",
"message": "Invalid humanMessage format"
}

แก้ไข: ตรวจสอบว่า humanMessage มี content field และเป็น string


{
"error": "Unauthorized",
"message": "Invalid API key"
}

แก้ไข: ตรวจสอบ Bearer token ใน Authorization header


เมื่อ AI ประมวลผลเสร็จ (ใช้เวลา 2-180 วินาที) ระบบจะส่ง POST request ไปยัง webhook URL ที่กำหนด

{
"requestId": "tpa-cm5xyz123abc456def",
"droidId": 42,
"customerId": 100,
"answer": "สินค้านี้ราคา 599 บาทครับ มีโปรโมชั่นลด 10% ถ้าซื้อ 2 ชิ้นขึ้นไปครับ",
"intents": ["product_inquiry", "pricing"],
"executionTime": 2345,
"timestamp": "2026-02-07T10:30:00.000Z"
}
FieldTypeDescription
requestIdstringID ที่ได้รับตอน submit request (ใช้สำหรับ match)
droidIdnumberID ของ Droid ที่ประมวลผล
customerIdnumberID ของ Customer (Test Customer)
answerstringคำตอบจาก AI
intentsstring[]Intent ที่ตรวจพบในคำตอบ
executionTimenumberเวลาที่ใช้ในการประมวลผล (milliseconds)
timestampstringเวลาที่ส่ง response (ISO 8601 format)

เมื่อเกิดข้อผิดพลาดในการประมวลผล:

{
"requestId": "tpa-cm5xyz123abc456def",
"droidId": 42,
"customerId": 100,
"answer": "",
"error": "Failed to generate AI response: timeout",
"executionTime": 30000,
"timestamp": "2026-02-07T10:30:30.000Z"
}
FieldTypeDescription
errorstringข้อความ error (มีเฉพาะเมื่อเกิดข้อผิดพลาด)
answerstringจะเป็น empty string เมื่อเกิด error

การจัดการ error: ตรวจสอบว่ามี field error หรือไม่ ถ้ามีแสดงว่าเกิดปัญหา ให้ retry หรือ log เพื่อ debug


ถ้าตั้งค่า secret ไว้ ระบบจะ append เป็น query parameter:

POST https://your-server.com/answer-webhook?secret=your-secret-here

วิธี verify:

// Express.js example
app.post("/answer-webhook", (req, res) => {
const { secret } = req.query;
if (secret !== process.env.DEALDROID_WEBHOOK_SECRET) {
return res.status(401).json({ error: "Invalid secret" });
}
// Process webhook...
});

webhook.site เป็นเครื่องมือฟรีสำหรับรับและดู webhook request

  1. เปิด https://webhook.site

    ระบบจะสร้าง unique URL ให้อัตโนมัติ เช่น:

    https://webhook.site/abc12345-1234-5678-abcd-1234567890ab
  2. Copy URL ไปใส่ใน DealDroid

    • ไปที่ Settings > Integrations
    • วาง URL ใน “When AI Answer Ready” > Webhook URL
    • คลิก Save
  3. ทดสอบด้วยปุ่ม “Send Test Answer”

    • คลิกปุ่มบน UI
    • กลับไปดูที่ webhook.site จะเห็น request เข้ามา
    • ตรวจสอบ payload ที่ได้รับ
  4. ทดสอบด้วย API จริง

    Terminal window
    curl -X POST "https://your-domain.com/api/droids/123/endpoint/get-droid-answer-async" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "humanMessage": {
    "content": "สินค้ามีอะไรบ้างครับ"
    }
    }'
  5. รอดู AI response ที่ webhook.site

    • ใช้เวลาประมาณ 2-180 วินาที
    • จะเห็น POST request ใหม่เข้ามา
    • ดู JSON payload ที่มี answer, intents, executionTime

Terminal window
curl -X POST "https://your-domain.com/api/droids/123/endpoint/get-droid-answer-async" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"humanMessage": {
"content": "สวัสดีครับ"
}
}'
Terminal window
curl -X POST "https://your-domain.com/api/droids/123/endpoint/get-droid-answer-async" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"humanMessage": {
"content": "สินค้าราคาเท่าไหร่"
},
"chatHistory": [
{"content": "มีสินค้าอะไรบ้าง", "type": "human"},
{"content": "เรามีสินค้า A, B, C ครับ", "type": "ai"}
]
}'
{
"success": true,
"requestId": "tpa-cm5xyz123abc456def",
"message": "Answer request queued. Response will be sent to your configured webhook."
}

หน้า Debug Webhooks แสดงรายละเอียด webhook ที่ส่งไป

ดูประวัติการส่ง webhook ทั้งหมดได้ที่:

/droids/{droidId}/debug/webhooks

ข้อมูลที่แสดง:

  • ✅ Webhook URL ที่ส่งไป
  • ✅ HTTP Status ที่ได้รับ (200, 404, 500, etc.)
  • ✅ Request payload ที่ส่งไป
  • ✅ Response body ที่ได้รับกลับมา
  • ✅ Response time (เวลาที่ใช้)
  • ✅ Error message (ถ้ามี)
  • ✅ Timestamp ของแต่ละ request

กรณีใช้งาน:

  • Debug เมื่อ webhook ไม่ทำงาน
  • ตรวจสอบ payload ที่ส่งไปจริง
  • ดู error message จากเซิร์ฟเวอร์ของคุณ
  • ติดตามประวัติ webhook ย้อนหลัง

// ✅ ดี - Return ทันที แล้วค่อย process
res.status(200).json({ received: true });
setImmediate(() => processAnswer(data));
// ❌ ไม่ดี - Process ก่อนแล้วค่อย return (ช้า)
await processAnswer(data);
res.status(200).json({ received: true });

ทำไม? ถ้า webhook ของคุณใช้เวลานาน DealDroid อาจ timeout และ retry ส่งซ้ำ

// ✅ ดี - Verify ก่อนทำอะไร
if (secret !== process.env.DEALDROID_WEBHOOK_SECRET) {
return res.status(401).json({ error: "Invalid secret" });
}
// ❌ อันตราย - ไม่ verify (ใครก็เรียกได้)
// ไม่มีการตรวจสอบ secret

ทำไม? เพื่อป้องกันไม่ให้คนอื่นส่ง fake webhook มา

// ✅ ดี - ตรวจสอบว่าเคย process แล้วหรือยัง
const exists = await db.webhooks.findOne({ requestId });
if (exists) {
console.log(`[${requestId}] Already processed, skipping`);
return res.status(200).json({ received: true, duplicate: true });
}
await db.webhooks.create({ requestId, answer, processedAt: new Date() });

ทำไม? ในกรณีที่เกิด retry webhook อาจถูกส่งซ้ำ ต้องป้องกันไม่ให้ process ซ้ำ


  • Webhook logs จะถูกเก็บไว้ 7 วัน
  • หลังจาก 7 วัน logs จะถูกลบอัตโนมัติ
  • ระบบจะ cleanup ด้วย scheduled command

ดู webhook logs ได้ 2 ทาง:

  1. หน้า Debug Webhooks - /droids/{droidId}/debug/webhooks

    • แสดง request/response ทั้งหมด
    • Filter ตาม status, date range
    • ดูรายละเอียดแต่ละ webhook
  2. Server Logs - สำหรับ admin

    • ใช้ command: node ace cleanup:webhook-logs (manual)
    • Cron job รันอัตโนมัติทุกวัน
  • เก็บ log ในฝั่งคุณด้วย - อย่าพึ่ง DealDroid logs อย่างเดียว
  • Export สำคัญ - ถ้ามี webhook สำคัญให้ export เก็บไว้
  • Track requestId - ใช้ requestId เพื่อ match ระหว่างสองระบบ

A: ใช้ Async เมื่อ:

  • ระบบของคุณมี timeout น้อยกว่า 180 วินาที (เช่น Serverless functions)
  • ต้องการ queue requests เพื่อจัดการ load
  • ต้องการ fire-and-forget pattern (ส่งแล้วทำงานอื่นต่อ)

ถ้าระบบของคุณรอได้และต้องการคำตอบทันที ใช้ Sync version จะง่ายกว่า


A: ใช่ สำหรับ production ต้องเป็น HTTPS เพื่อความปลอดภัย อย่างไรก็ตาม สำหรับการทดสอบใน development คุณสามารถใช้:

  • webhook.site (HTTPS โดยอัตโนมัติ)
  • ngrok สำหรับ tunnel localhost (ให้ HTTPS URL)

A: DealDroid จะ retry ส่ง webhook อีกครั้ง (ตาม retry policy) ถ้ายังไม่สำเร็จจะบันทึกเป็น failed log คุณสามารถดูได้ในหน้า Debug Webhooks

Tips: ให้ webhook ของคุณ return 200 OK เร็วที่สุด (ภายใน 1-2 วินาที) แล้วค่อย process ใน background


A: ใช้ Webhook Secret ที่ตั้งค่าไว้ ระบบจะส่งมาเป็น query parameter ?secret=your-secret ตรวจสอบ secret นี้บนเซิร์ฟเวอร์ของคุณเสอ:

if (req.query.secret !== process.env.DEALDROID_WEBHOOK_SECRET) {
return res.status(401).json({ error: "Invalid secret" });
}

A: ได้ ในกรณีที่:

  • Webhook ของคุณไม่ return 200 OK
  • เกิด network timeout
  • DealDroid retry เนื่องจาก error

แก้ไข: ใช้ requestId เพื่อ deduplicate - ตรวจสอบว่า requestId นี้เคย process แล้วหรือยัง ถ้าเคย process แล้วให้ skip


A: โดยปกติจะใช้เวลา 10-180 วินาที ขึ้นอยู่กับ:

  • ความซับซ้อนของคำถาม
  • ขนาดของ chat history
  • Load ของระบบ AI ขณะนั้น

คุณสามารถดูเวลาจริงได้จาก field executionTime ใน webhook response (หน่วยเป็น milliseconds)


Q: ผมสามารถทดสอบโดยไม่ต้องมี webhook endpoint จริงได้ไหม?

หัวข้อที่มีชื่อว่า “Q: ผมสามารถทดสอบโดยไม่ต้องมี webhook endpoint จริงได้ไหม?”

A: ได้! ใช้ webhook.site:

  1. เปิด webhook.site -> ได้ unique URL
  2. Copy URL ไปใส่ใน Settings > Integrations
  3. ส่ง request ไปที่ API
  4. กลับไปดู webhook.site จะเห็น payload ที่ส่งมา

A: มี 2 วิธี:

1. จากหน้า Integrations (ทางลัด)

Link ไปหน้า Debug Webhooks ในหน้า Integration

คลิกที่ link “ดูประวัติการส่ง webhook” ในหน้า Settings > Integrations ส่วน “When AI Answer Ready”

2. เข้าหน้า Debug Webhooks โดยตรง

ไปที่ /droids/{droidId}/debug/webhooks

ข้อมูลที่จะเห็น:

  • ทุก webhook ที่ส่งไป (7 วันล่าสุด)
  • HTTP status ที่ได้รับ
  • Request/Response payload
  • Error message (ถ้ามี)
  • Response time

A: ได้ ไปที่ Settings > Integrations แล้วแก้ไข Webhook URL แต่ควร:

  1. ทดสอบ URL ใหม่ด้วยปุ่ม “Send Test Answer” ก่อน
  2. ตรวจสอบว่า URL เข้าถึงได้จากอินเทอร์เน็ต
  3. อัปเดต secret (ถ้ามีการเปลี่ยนแปลง)

A: สร้าง API Key ใหม่ทันทีที่:

  1. เปิด Automation Panel
  2. ไปที่ “When Receive message from Third Party”
  3. คลิก Regenerate เพื่อสร้าง token ใหม่
  4. อัปเดตแอปพลิเคชันของคุณด้วย token ใหม่

⚠️ คำเตือน: Token เก่าจะใช้งานไม่ได้ทันทีหลังสร้างใหม่


คุณพร้อมใช้ Async Answer API แล้ว!

ด้วย Async Answer API คุณสามารถ:

  • ✅ ใช้ AI ของ DealDroid แม้ระบบมี timeout สั้น
  • ✅ Queue requests เพื่อจัดการ load ได้ดีขึ้น
  • ✅ ประมวลผล AI แบบ background ไม่ block system
  • ✅ Track และ debug ผ่านหน้า Debug Webhooks

ขั้นตอนถัดไป:

  1. ตั้งค่า Webhook URL ใน Settings > Integrations
  2. ทดสอบด้วย webhook.site
  3. สร้าง webhook receiver ตามแนวทาง Best Practices
  4. เริ่มส่ง request และรอรับ AI response!

ต้องการความช่วยเหลือหรือไม่? เรายินดีสนับสนุนคุณ! 😊