# Execution Log: Task 3 - Agentic

**Tanggal Eksekusi:** Rabu, 6 Mei 2026
**Fase:** Agentic (PRAL Orchestrator & Context Reranker)

## Aktivitas yang Dilakukan

1. **Context Reranker (Task 3A):**
   - Membuat file `app/services/chatbot/reranker.py`.
   - Mengimplementasikan class `ContextReranker` menggunakan model `gemini-1.5-flash-8b`.
   - Membuat metode `score_chunks(query, chunks_list, top_k)` yang menugaskan LLM untuk memberikan skor 0-10 pada setiap chunk berdasarkan relevansinya terhadap pertanyaan.
   - Metode ini mengurutkan chunk dari skor tertinggi ke terendah dan membuang *noise* (skor < 3).

2. **Perceive & Reason Logic (Task 3B):**
   - Membuat metode `_perceive_and_reason` di dalam orchestrator.
   - Menggunakan LLM ringan untuk menganalisis intent pengguna dan mengklasifikasikannya ke dalam salah satu dari tiga Layer (1: Spesifik, 2: Komparatif, 3: General). Outputnya diformat menggunakan JSON strict.

3. **PRAL Orchestrator (Task 3C):**
   - Membuat file `app/services/chatbot/agent_orchestrator.py`.
   - Mengimplementasikan class `PRALOrchestrator` yang mengikat semua modul: `GraphRetriever`, `VectorRetriever`, `ContextReranker`, `ChatHistoryManager`, dan `ResearchPolicy`.
   - Mengimplementasikan siklus penuh dalam `process_chat`:
     - **P & R:** Penentuan layer konteks.
     - **A (Retrieve):** Pengambilan data dari Graf (jika Layer 2) dan Vektor.
     - **A (Rerank):** Penyaringan data melalui Reranker.
     - **A (Generate):** Penyusunan *Prompt Payload* final (Policy + History + Graph Context + Vector Context) dan pemanggilan LLM `gemini-2.5-flash` dengan `generate_content_stream`. Menggunakan `AsyncGenerator` untuk *StreamingResponse*.
     - **L (Learn):** Pencatatan metrik kinerja secara lokal dan pemeliharaan *Chat History*.

## Status Task
- [x] Task 3A: Context Reranker
- [x] Task 3B: Perceive & Reason
- [x] Task 3C: PRAL Orchestrator

## Keputusan & Asumsi
- *Orchestrator* tidak menggunakan framework tambahan seperti LangGraph; logika dipertahankan dalam Python murni yang asinkron demi performa maksimal dalam FastAPI.
- Ekstraksi JSON *intent* diandalkan pada kemampuan model dengan flag `response_mime_type="application/json"`.
- Kegagalan LLM internal atau parsing intent secara *graceful* akan di-fallback ke "Layer 1".

**Selanjutnya:** Menunggu validasi sebelum melanjutkan ke Task 4 (Testing).
