# Implementation Plan: Intent Classification System

**Branch**: `224-intent-classification` | **Date**: 2026-05-19 | **Spec**: [spec.md](./spec.md)
**Input**: ADR-024 Intent Classification Strategy + CONTEXT.md AI Runtime Layer

---

## Summary

สร้าง Intent Classification System สำหรับ AI Runtime Layer ตามกลยุทธ์ Hybrid (Pattern First → LLM Fallback) ที่กำหนดใน ADR-024 ระบบจะแปลงคำถามธรรมชาติ (ภาษาไทย/อังกฤษปน) จาก User เป็น Server-side Intent enum ก่อน Route ไปยัง AI Tool Layer (ADR-025)

**แนวทางเทคนิค**:
- Backend: NestJS Module (IntentClassifierModule) พร้อม Service สำหรับ Pattern Matching และ LLM Fallback
- Database: ตาราง `ai_intent_definitions` และ `ai_intent_patterns` (SQL Delta ตาม ADR-009)
- Caching: Redis (TTL 5 นาที) สำหรับ Patterns
- AI: Ollama gemma4:e2b บน Admin Desktop (Desk-5439) สำหรับ LLM Fallback
- Frontend: Admin UI สำหรับจัดการ Intent และ Patterns + Test Console

---

## Technical Context

**Language/Version**: TypeScript 5.x (NestJS 11) + Next.js 16
**Primary Dependencies**:
- Backend: NestJS, TypeORM, ioredis (Redis), axios (Ollama HTTP)
- Frontend: React, TanStack Query, shadcn/ui components
**Storage**: MariaDB 11.8 (Intent Definitions/Patterns), Redis (Cache), Ollama (LLM)
**Testing**: Jest (Backend Unit/Integration), Vitest (Frontend Unit), Playwright (E2E)
**Target Platform**: QNAP NAS (Docker), Admin Desktop (Ollama)
**Project Type**: Web application (Backend + Frontend)
**Performance Goals**:
- Pattern Match: < 10ms (cache hit), < 50ms (cache miss)
- LLM Fallback: < 2000ms (รวม Pattern Check)
**Constraints**:
- GPU Budget: RTX 2060 Super 8GB (ใช้ร่วมกับ RAG, OCR, Embedding)
- LLM Semaphore: Max 3 concurrent calls
- Bilingual Input: ไทย/อังกฤษปน + typo tolerance
**Scale/Scope**:
- 12 Intent Definitions (v1)
- 50+ concurrent users
- 70-80% Pattern Hit Rate target

---

## Constitution Check

_GATE: Must pass before Phase 0 research. Re-check after Phase 1 design._

| Rule | Status | Notes |
|------|--------|-------|
| ADR-019 UUID | ✅ | ใช้ `publicId` (UUIDv7 string) ทุก API — ไม่มี `parseInt` |
| ADR-009 Schema | ✅ | SQL Delta file สำหรับตารางใหม่ — ไม่ใช้ TypeORM migration |
| ADR-016 Security | ✅ | CASL Guard บน Admin API, JWT Auth, Rate Limiting |
| ADR-023A AI Boundary | ✅ | Ollama บน Admin Desktop — AI ไม่เข้า DB โดยตรง |
| ADR-007 Error Handling | ✅ | Layered error classification — user-friendly messages |
| TypeScript Strict | ✅ | Zero `any`, zero `console.log` (ใช้ NestJS Logger) |
| i18n | ✅ | ใช้ i18n keys — ไม่ hardcode ภาษาไทย/อังกฤษ |

**ผ่าน Gate ทั้งหมด** — พร้อมดำเนินการ Phase 0

---

## Project Structure

### Documentation (this feature)

```text
specs/200-fullstacks/224-intent-classification/
├── plan.md              # This file
├── research.md          # Phase 0 output
├── data-model.md        # Phase 1 output
├── quickstart.md        # Phase 1 output
├── contracts/           # Phase 1 output (OpenAPI specs)
├── tasks.md             # Phase 2 output (speckit-tasks)
└── checklists/          # Quality checklists
```

### Source Code (repository root)

```text
backend/
├── src/
│   ├── modules/
│   │   └── ai/
│   │       ├── intent-classifier/          # NEW: Intent Classification Module
│   │       │   ├── intent-classifier.module.ts
│   │       │   ├── intent-classifier.service.ts
│   │       │   ├── intent-classifier.controller.ts
│   │       │   ├── entities/
│   │       │   │   ├── intent-definition.entity.ts
│   │       │   │   └── intent-pattern.entity.ts
│   │       │   ├── dto/
│   │       │   │   ├── classify-query.dto.ts
│   │       │   │   ├── classification-result.dto.ts
│   │       │   │   ├── create-intent-definition.dto.ts
│   │       │   │   └── create-intent-pattern.dto.ts
│   │       │   └── interfaces/
│   │       │       ├── classification-result.interface.ts
│   │       │       └── intent-category.enum.ts
│   │       └── ai.module.ts                # UPDATE: Add IntentClassifierModule
│   └── database/
│       └── seeds/
│           └── ai-intent.seed.ts           # Seed 12 Intent Definitions

frontend/
├── app/
│   └── (admin)/
│       └── admin/
│           └── ai/
│               └── intent-classification/  # NEW: Admin UI
│                   ├── page.tsx            # Intent Definitions List
│                   ├── [intentCode]/
│                   │   ├── page.tsx        # Intent Detail + Patterns
│                   │   └── patterns/
│                   │       └── page.tsx    # Pattern Management
│                   └── test-console/
│                       └── page.tsx        # Test Console
├── components/
│   └── ai/
│       └── intent-classification/          # NEW: Reusable Components
│           ├── intent-form.tsx
│           ├── pattern-form.tsx
│           ├── test-console-panel.tsx
│           └── classification-result-card.tsx
├── hooks/
│   └── ai/
│       └── use-intent-classification.ts    # TanStack Query hooks
└── lib/
    └── services/
        └── ai-intent.service.ts            # API client
```

**Structure Decision**: Web application (NestJS Backend + Next.js Frontend) — ตามโครงสร้างที่มีอยู่แล้วใน LCBP3

---

## Complexity Tracking

ไม่มี Constitution Violations ที่ต้องอธิบายเพิ่มเติม — ทุกอย่างสอดคล้องกับ ADRs ที่มีอยู่

---

## Phase 0: Research

ดูรายละเอียดใน [research.md](./research.md)

**หัวข้อที่ต้อง Research**:
1. Redis Cache Strategy สำหรับ Patterns (TTL + Invalidation)
2. Ollama HTTP API Integration (gemma4:e2b)
3. Semaphore Pattern ใน NestJS (p-limit หรือ RxJS)
4. Regex Validation ใน TypeORM/Class-Validator

---

## Phase 1: Design Artifacts

### Data Model
ดูรายละเอียดใน [data-model.md](./data-model.md)

### API Contracts
ดูรายละเอียดใน [contracts/](./contracts/)

### Quick Start
ดูรายละเอียดใน [quickstart.md](./quickstart.md)

---

## Next Steps

1. ✅ **Phase 0 Complete** — Research ใน [research.md](./research.md)
2. ✅ **Phase 1 Complete** — Design artifacts: data-model.md, contracts/, quickstart.md
3. ⏳ **Phase 2** — รอ `/speckit-tasks` สร้าง tasks.md
4. ⏳ **Phase 3** — รอ `/speckit-analyze` ตรวจสอบความสอดคล้อง
