9.8 KiB
// File: specs/100-Infrastructures/134-ai-model-change/tasks.md // Change Log: // - 2026-06-03: Initial task list for Thai-Optimized AI Model Stack
Tasks: Thai-Optimized AI Model Stack
Input: Design documents from specs/100-Infrastructures/134-ai-model-change/
ADR Reference: ADR-034 (Supersedes ADR-023A Section 2.1)
Prerequisites: plan.md ✅ spec.md ✅ research.md ✅ data-model.md ✅ contracts/ ✅
Format: [ID] [P?] [Story?] Description
- [P]: Can run in parallel (different files, no shared state)
- [Story]: User story label (US1/US2/US3)
Phase 1: Setup (Infrastructure Verification)
Purpose: ยืนยัน Model files และ directory structure พร้อม; ไม่ต้องสร้างใหม่เพราะมีอยู่แล้ว
- T001 [P] ตรวจสอบ
specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/typhoon2.5-np-dms.model.mdว่า content ตรงกับ ADR-034 Section 1 - T002 [P] ตรวจสอบ
specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/typhoon-np-dms-ocr.model.mdว่า content ตรงกับ ADR-034 Section 1 - T003 [P] สร้าง SQL delta
specs/03-Data-and-Storage/deltas/2026-06-03-update-ai-available-models-typhoon.sql— UPDATE main model + INSERT ocr model ในai_available_modelstable (ตรวจสอบ schema ก่อน run) - T003b [P] สร้าง rollback
specs/03-Data-and-Storage/deltas/2026-06-03-update-ai-available-models-typhoon.rollback.sql— revert model_name กลับเป็น gemma4:e2b + DELETE ocr model record (ADR-009: ทุก delta ต้องมี rollback)
Phase 2: Foundational (OllamaService + AiSettingsService)
Purpose: Backend services support model ใหม่ — BLOCKS Phases 3, 4, 5
⚠️ CRITICAL: ต้องเสร็จก่อนเริ่ม US phases
- T004 เพิ่ม method
unloadModel(modelName: string): Promise<void>ในbackend/src/modules/ai/services/ollama.service.ts— POST /api/generate keep_alive:0 + error handling ตาม contract - T005 เพิ่ม method
loadModel(modelName: string, keepAlive?: number | string): Promise<void>ในbackend/src/modules/ai/services/ollama.service.ts— POST /api/generate keep_alive:{keepAlive ?? -1} + timeout 60s + "model not found" error - T006 [P] อัปเดต
DEFAULT_MODEL = 'typhoon2.5-np-dms:latest'และเพิ่มOCR_MODEL = 'typhoon-np-dms-ocr:latest'ในbackend/src/modules/ai/services/ai-settings.service.ts - T007 [P] เขียน unit tests สำหรับ
unloadModel()และloadModel()ในbackend/src/modules/ai/services/ollama.service.spec.ts— mock axios; test timeout, 404, และ success cases
Checkpoint: Foundation พร้อม — processor switching สามารถ implement ได้
Phase 3: User Story 1 — Thai OCR Processing (Priority: P1) 🎯 MVP
Goal: BullMQ processor switch models สำหรับ OCR jobs; ไม่มี VRAM OOM
Independent Test: ส่ง ocr-extract job → ตรวจสอบ log มี ModelSwitch entries + job สำเร็จ
- T008 [US1] เพิ่ม constant
const OCR_JOB_TYPES = ['ocr-extract', 'sandbox-ocr-only'] as constในbackend/src/modules/ai/processors/ai-batch.processor.ts - T009 [US1] Implement model switching block ใน
processJob(): unload main → load OCR (keep_alive:0) → process → reload main (keep_alive:-1) ในbackend/src/modules/ai/processors/ai-batch.processor.ts - T010 [US1] เพิ่ม NestJS
Loggerlog สำหรับ model switch events (model name + timestamp) ในbackend/src/modules/ai/processors/ai-batch.processor.ts - T011 [P] [US1] เขียน unit tests สำหรับ OCR model switching logic ใน
backend/src/modules/ai/processors/ai-batch.processor.spec.ts— mock OllamaService methods; test switching sequence + non-OCR bypass
Checkpoint: OCR job ทำงานกับ Typhoon OCR model; main model reload หลัง OCR สำเร็จ
Phase 4: User Story 2 — Main AI Tasks With New Model (Priority: P2)
Goal: ทุก non-OCR AI job ใช้ typhoon2.5-np-dms:latest
Independent Test: ส่ง ai-extract job → ตรวจสอบ Ollama call ใช้ model ใหม่ (ไม่ใช่ gemma4)
- T012 [US2] ตรวจสอบและอัปเดต
OllamaService.generate()ให้อ้างอิงAiSettingsService.DEFAULT_MODELแทน hardcoded model name ในbackend/src/modules/ai/services/ollama.service.ts - T013 [P] [US2] grep codebase ด้วย pattern
gemma4|OLLAMA_MODEL_MAIN|OLLAMA_RAG_MODELในbackend/src/หา hardcoded model references เก่าทั้งหมด → อัปเดตให้ใช้AiSettingsService.DEFAULT_MODELหรือAiSettingsService.OCR_MODEL - T014 [US2] อัปเดต comment/note ใน
backend/.env.example— อธิบายว่า model names ถูก hardcode ในAiSettingsServiceตาม ADR-034
Checkpoint: ทุก non-OCR AI job ใช้ model ใหม่
Phase 5: User Story 3 — System Health Visibility (Priority: P3)
Goal: Admin Console แสดงชื่อ model ที่ถูกต้อง
Independent Test: GET /api/ai/health → JSON มี mainModel = typhoon2.5-np-dms, ocrModel = typhoon-np-dms-ocr
- T015 [P] [US3] อัปเดต health response structure ใน
backend/src/modules/ai/ai.service.ts— เพิ่มmainModelและocrModelfields ที่อ่านจากAiSettingsService - T016 [P] [US3] ตรวจสอบ
frontend/app/(admin)/admin/ai/page.tsxว่า health card แสดง model names ใหม่ (ถ้า dynamic จาก API ไม่ต้องแก้; ถ้า hardcoded ให้แก้) - T017 [US3] รัน SQL delta
2026-06-03-update-ai-available-models-typhoon.sqlบน production DB (manual step — ผ่าน DB admin tool)
Checkpoint: Admin Console แสดง model stack ใหม่ถูกต้อง
Phase 6: Polish & Cross-Cutting Concerns
Purpose: Documentation update + compliance verification
- T018 [P] อัปเดต
AGENTS.md— Current Decisions D10: เปลี่ยนgemma4:e4b Q8_0เป็นtyphoon2.5-np-dms:latest (main) + typhoon-np-dms-ocr:latest (OCR); อัปเดต version เป็น v1.9.9 และ sync date - T019 [P] อัปเดต
memory/agent-memory.md— Section 2.5 model names + Section 5 D10 + Section 7 Ollama row + Section 8 Recent Rollouts entry - T020 [P] อัปเดต
.agents/rules/11-ai-integration.md— 2-model stack:gemma4:e2b → typhoon2.5-np-dms:latest - T021 [P] รัน type check:
pnpm --filter backend build— ต้องผ่าน 0 errors - T022 [P] รัน lint:
pnpm --filter backend lint— ตรวจสอบ no console.log, no any - T023 [P] รัน unit tests ที่เพิ่มใหม่:
pnpm --filter backend test -- --testPathPattern="ollama.service|ai-batch.processor" - T024 รัน quickstart.md verification บน Desk-5439 + QNAP ตามขั้นตอนใน
quickstart.md— รวมถึงตรวจสอบ BullMQ concurrency=1 ในai-batch.processor.ts(FR-010)
Dependencies & Execution Order
Phase Dependencies
- Phase 1 (Setup): ไม่มี dependency — เริ่มทันที
- Phase 2 (Foundational): ไม่มี dependency — เริ่มทันที; BLOCKS Phase 3, 4, 5
- Phase 3 (US1): ต้องรอ Phase 2 สมบูรณ์
- Phase 4 (US2): ต้องรอ Phase 2; สามารถ parallel กับ Phase 3
- Phase 5 (US3): ต้องรอ Phase 3 + Phase 4
- Phase 6 (Polish): ต้องรอทุก phase
Within Phase 2
- T004 → T005 (sequential — เป็น paired methods)
- T006, T007 → parallel ได้
Parallel Opportunities Per Phase
Phase 1: T001 ∥ T002 ∥ T003
Phase 2: (T004→T005) ∥ T006 ∥ T007
Phase 3: (T008→T009→T010) + T011 parallel กับ T010
Phase 4: T012 → T013 → T014
Phase 5: T015 ∥ T016; T017 manual last
Phase 6: T018 ∥ T019 ∥ T020 ∥ T021 ∥ T022 ∥ T023 → T024 last
Implementation Strategy
MVP First (US1 — OCR Model Switching)
- Phase 1: Verify Modelfiles (T001-T002)
- Phase 2: OllamaService + AiSettings (T004-T007)
- Phase 3: OCR switching (T008-T011)
- Validate: Test OCR job + confirm main reload
Incremental Delivery
- MVP (Phase 1-3) → OCR ทำงานกับ Typhoon
- US2 (Phase 4) → Main model jobs ใช้ model ใหม่
- US3 (Phase 5) → Admin health visibility
- Polish (Phase 6) → Docs + type check + deploy
Notes
- T001-T002: Model files มีอยู่แล้วใน
specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/— เป็น verification task ไม่ใช่ creation - FR-008 (nomic-embed-text) + FR-009 (n8n boundary): Preserved by existing architecture — ไม่มี task เพราะ "do nothing" คือ correct action
- T018: ตรวจสอบ AGENTS.md version จริงก่อน bump เป็น v1.9.9
- T003: ตรวจสอบ
lcbp3-v1.9.0-schema-02-tables.sqlก่อน write delta — ai_available_models schema อาจต่างจากที่คาด - T013: ใช้ grep/code_search เพื่อหา references ทั้งหมด — อย่า hardcode path ไปเอง
- T017: Manual step; ต้องทำผ่าน DBA หรือ migration pipeline
- T024: Real-app verification ตาม
/check-real-appworkflow