Quy trình update và sử dụng prompt diễn ra như sau:

1. **UI Edit:** Admin sửa prompt trên giao diện và gọi API (ví dụ: `POST /api/agent/system-prompt`).
2. **File Override & Cache Invalidation:** Hệ thống ghi đè file `.txt` tương ứng và gọi hàm `force_refresh_prompts()` để xóa in-memory cache trong `prompt_utils.py`.
3. **MD5 Hash Check:** Ở request tiếp theo, `graph.py` lấy template mới. Nó tính mã băm MD5 của template. Nếu khác với `_cached_prompt_hash` trước đó, chuỗi (chain) LangChain sẽ được compile lại.
4. **LLM Factory Execution:** Chain sử dụng instance LLM được lấy từ `LLMFactory` (đã được cache để không khởi tạo lại network client liên tục) để thực thi.

### Sequence Diagram

```mermaid
sequenceDiagram
    participant Admin
    participant API (prompt_route.py)
    participant utils (prompt_utils.py)
    participant FileSystem
    participant graph.py
    participant LLMFactory

    Admin->>API (prompt_route.py): POST /api/agent/system-prompt
    API (prompt_route.py)->>FileSystem: Write to system_prompt.txt
    API (prompt_route.py)->>utils (prompt_utils.py): force_refresh_prompts()
    utils (prompt_utils.py)-->>API (prompt_route.py): Clear in-memory caches
    API (prompt_route.py)-->>Admin: Success Response

    Note over graph.py: On next user chat message
    graph.py->>utils (prompt_utils.py): get_system_prompt_template()
    utils (prompt_utils.py)->>FileSystem: Read system_prompt.txt (cache miss)
    utils (prompt_utils.py)-->>graph.py: Return injected template
    graph.py->>graph.py: Compute MD5 of prompt
    
    alt MD5 Hash Changed
        graph.py->>LLMFactory: get_model()
        LLMFactory-->>graph.py: Cached LLM Instance
        graph.py->>graph.py: Rebuild ChatPromptTemplate & Chain
    end
    
    graph.py->>LLMFactory (LLM): invoke()
```