feat(ai): add ADR-036 unified OCR architecture and frontend test coverage
CI / CD Pipeline / build (push) Failing after 6m24s
CI / CD Pipeline / deploy (push) Has been skipped

- Add ADR-036 unified OCR architecture (typhoon-ocr via Ollama)
- Extend AI execution profiles for OCR sandbox configuration
- Add comprehensive frontend test coverage (components, hooks, services)
- Add backend test coverage for document-numbering services
- Update OCR sidecar with typhoon-ocr integration
- Add AI policy service and execution profile management
- Update AGENTS.md and architecture documentation
This commit is contained in:
2026-06-14 06:34:07 +07:00
parent e3503b6a77
commit 7e8f4859cd
108 changed files with 33914 additions and 339 deletions
@@ -37,8 +37,8 @@
| Model | Role | Base Model | Size | Keep-Alive |
|-------|------|------------|------|------------|
| `typhoon2.5-np-dms:latest` | Main AI (General + OCR Post-processing + Extraction + RAG Q&A) | `scb10x/typhoon2.5-qwen3-4b:latest` | ~2.5GB | Stand by ตลอด (ไม่ใช่ 0) |
| `typhoon-np-dms-ocr:latest` | OCR ภาษาไทย | `scb10x/typhoon-ocr1.5-3b:latest` | ~3.2GB | `0` (unload ทันที) |
| `np-dms-ai:latest` | Main AI (General + OCR Post-processing + Extraction + RAG Q&A) | `scb10x/typhoon2.5-qwen3-4b:latest` | ~2.5GB | Stand by ตลอด (ไม่ใช่ 0) |
| `np-dms-ocr:latest` | OCR ภาษาไทย | `scb10x/typhoon-ocr1.5-3b:latest` | ~3.2GB | `0` (unload ทันที) |
### Key Parameters (Main Model)
@@ -60,7 +60,7 @@ PARAMETER repeat_penalty 1.15
file: E:\np-dms\lcbp3\specs\04-Infrastructure-OPS\04-00-docker-compose\Desk-5439\typhoon2.5-np-dms.model.md
```t
# ollama create typhoon2.5-np-dms -f ./typhoon2.5-np-dms.model.md
# ollama create np-dms-ai -f ./np-dms-ai.model.md
FROM scb10x/typhoon2.5-qwen3-4b:latest
@@ -92,7 +92,7 @@ Guidelines:
---
file: E:\np-dms\lcbp3\specs\04-Infrastructure-OPS\04-00-docker-compose\Desk-5439\typhoon-np-dms-ocr.model.md
```t
# ollama create typhoon-np-dms-ocr -f ./typhoon-np-dms-ocr.model.md
# ollama create np-dms-ocr -f ./np-dms-ocr.model.md
# ใส่ชื่อ tag โมเดล 3B ที่คุณต้องการจูนตรงนี้ได้เลย
FROM scb10x/typhoon-ocr1.5-3b:latest
@@ -143,18 +143,18 @@ async function processJob(job: Job) {
if (jobType === 'ocr-extract') {
// OCR job: unload main, load OCR, process, unload OCR
await ollama.unloadModel('typhoon2.5-np-dms');
await ollama.loadModel('typhoon-np-dms-ocr', { keep_alive: 0 });
const result = await ollama.generate('typhoon-np-dms-ocr', prompt);
await ollama.unloadModel('np-dms-ai');
await ollama.loadModel('np-dms-ocr', { keep_alive: 0 });
const result = await ollama.generate('np-dms-ocr', prompt);
// keep_alive: 0 จะ unload อัตโนมัติหลังเสร็จ
// โหลด main model กลับเข้า VRAM สำหรับงานถัดไป
await ollama.loadModel('typhoon2.5-np-dms');
await ollama.loadModel('np-dms-ai');
return result;
}
// Main model jobs: extraction, rag-query, ai-suggest
const result = await ollama.generate('typhoon2.5-np-dms', prompt);
const result = await ollama.generate('np-dms-ai', prompt);
return result;
}
```
@@ -173,7 +173,7 @@ async function processJob(job: Job) {
| File | Change |
|------|--------|
| `backend/src/modules/ai/services/ai-settings.service.ts` | Hardcode `DEFAULT_MODEL = 'typhoon2.5-np-dms:latest'` |
| `backend/src/modules/ai/services/ai-settings.service.ts` | Hardcode `DEFAULT_MODEL = 'np-dms-ai:latest'` |
| `backend/src/modules/ai/services/ollama.service.ts` | เพิ่ม method `unloadModel()` และ `loadModel()` สำหรับ switching |
| `backend/src/modules/ai/processors/ai-batch.processor.ts` | Implement switching logic ตาม pseudo-code ด้านบน |
@@ -188,8 +188,8 @@ async function processJob(job: Job) {
1. **Desk-5439:** สร้าง custom models บน Ollama
```bash
cd /path/to/model/files
ollama create typhoon2.5-np-dms -f ./typhoon2.5-np-dms.model.md
ollama create typhoon-np-dms-ocr -f ./typhoon-np-dms-ocr.model.md
ollama create np-dms-ai -f ./np-dms-ai.model.md
ollama create np-dms-ocr -f ./np-dms-ocr.model.md
```
2. **QNAP Backend:** Deploy ด้วย code changes (ADR-033 mechanism ยังคงใช้ได้)
@@ -206,7 +206,7 @@ async function processJob(job: Job) {
หากพบปัญหา:
1. สร้าง custom model ใหม่จาก base model ตัวอื่น (เช่น กลับไป `gemma4:e2b`)
2. หรือแก้ไข `typhoon2.5-np-dms.model.md` แล้วสร้าง version ใหม่ (`:v2`)
2. หรือแก้ไข `np-dms-ai.model.md` แล้วสร้าง version ใหม่ (`:v2`)
3. Update code ให้ชี้ไป model ใหม่ แล้ว redeploy
---
@@ -217,7 +217,7 @@ async function processJob(job: Job) {
|-----|---------|--------|
| **ADR-023A** | Section 2.1 Model Stack | Superseded by ADR-034 — model config ใช้ค่าจากนี้ |
| **ADR-033** | VRAM Monitor + Model Switching | ยังใช้ได้ — mechanism เดิม เปลี่ยนแค่ชื่อ model |
| **ADR-032** | Typhoon OCR Integration | OCR model ถูกแทนที่โดย `typhoon-np-dms-ocr` |
| **ADR-032** | Typhoon OCR Integration | OCR model ถูกแทนที่โดย `np-dms-ocr` |
---