ตั้งค่า AI และสร้าง Flex ด้วย AI
ภาพรวม
โมดูล AI ทำหน้าที่สองอย่าง คือเก็บการตั้งค่า AI provider ต่อ LINE OA หรือต่อองค์กรไว้ในตาราง ai_config และให้บริการสร้างเนื้อหาด้วย AI จุดที่ใช้งานจริงในปัจจุบันคือการ สร้าง Flex Message จากคำสั่งภาษาคน เพื่อลดเวลาที่ทีมงานต้องใช้ประกอบการ์ดข้อความด้วยมือ
ปัจจุบัน provider ที่ implement แล้วมีเพียง Gemini แต่โครงสร้างโค้ดเปิดช่องไว้ให้เพิ่ม provider อื่นได้ ส่วนโมดูล เวิร์กโฟลว์ ก็เรียกใช้ AI เพื่อร่าง flow เช่นกัน แต่ผ่านเส้นทางของตัวเองที่ workflow/ai.go
ทุก route ของโมดูลนี้อยู่บน group public และใช้ JwtLoginAuth จึงเรียกได้ทันทีหลังล็อกอินโดยไม่ต้องเลือก LINE OA ก่อน
Business Flow
- ตั้งค่า AI — ผู้ดูแลเรียก
PUT /api/ai-configพร้อมCreateOrUpdateAiConfigDtoซึ่งประกอบด้วย provider, model, API key และพารามิเตอร์ของการ generate การทำงานเป็นแบบ upsert คือสร้างใหม่ถ้ายังไม่มี และอัปเดตถ้ามีอยู่แล้ว - อ่านค่าที่ตั้งไว้ —
GET /api/ai-configใช้แสดงค่าปัจจุบันในหน้าตั้งค่า - ขอให้ AI สร้างการ์ด — ตอนสร้าง rich message ผู้ใช้พิมพ์คำอธิบายว่าต้องการการ์ดแบบไหน แล้วระบบเรียก
POST /api/ai-config/generate-flexด้วย body รูปแบบ{"prompt": "..."} - ประมวลผลใน service — ฟังก์ชัน
generate()ทำงานตามลำดับนี้- โหลด
ai_configที่ active อยู่ของ LINE OA หรือองค์กรปัจจุบัน - ถ้า provider เป็น Gemini จะยิง HTTP ไปยัง Gemini API
- provider อื่นยังไม่ได้ implement
- option ที่ผู้เรียกไม่ส่งมาจะใช้ค่า default โดยฝั่ง Go ใช้ pointer field เพื่อแยกกรณี "ไม่ส่งค่า" ออกจาก "ส่งค่าศูนย์" ให้พฤติกรรมตรงกับตัวดำเนินการ
??และ||ของ TypeScript เดิม
- โหลด
- ส่งผลลัพธ์กลับ — คืน Flex Message ในรูป JSON ให้ cms-web นำไปวางต่อในตัวแก้ไข rich message
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/ai/ ประกอบด้วย controller.go, service.go และ dto.go
| Method | Route | Handler | Guard / Policy |
|---|---|---|---|
| GET | /api/ai-config | ct.getConfig | JwtLoginAuth + read line-oa |
| PUT | /api/ai-config | ct.upsertConfig | JwtLoginAuth + update line-oa |
| POST | /api/ai-config/generate-flex | ct.generateFlex | JwtLoginAuth + read line-oa |
ทั้งสาม route ลงทะเบียนบน group public โดยบรรทัด _ = authed ในโค้ดยืนยันว่าไม่ได้ใช้ group authed
โครงสร้างที่ควรรู้จัก ได้แก่ AiGenerateOptions ซึ่งใช้ pointer field แทน optional field ของ TypeScript และ Service.generate() ที่เป็นจุดรวมตรรกะการเรียก provider
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — ต้องผ่าน
JwtLoginAuthเท่านั้น ไม่ต้องมีlineOaIdใน token และไม่มีModuleGateครอบ ส่วน policy metadata ใช้PolicyModuleLineOaซึ่งยังไม่ได้บังคับใช้ - ตารางที่เกี่ยวข้อง —
ai_configและline_oa - บริการภายนอก — Gemini API เรียกผ่าน HTTP
- โมดูลที่เกี่ยวข้อง — Rich Message (ปลายทางของ Flex ที่ generate ออกมา), เวิร์กโฟลว์ (ใช้ AI ร่าง flow) และ คลังความรู้ (แหล่งความรู้ของบอต)