Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 75 additions & 25 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,17 @@ TZ=Asia/Ho_Chi_Minh
# ─── Ollama ───────────────────────────────────────────────────────────────────
OLLAMA_HOST=0.0.0.0
OLLAMA_ORIGINS=http://localhost,https://localhost,http://127.0.0.1,https://127.0.0.1,http://0.0.0.0,https://0.0.0.0
OLLAMA_MAX_LOADED_MODELS=2
# OLLAMA_MAX_LOADED_MODELS ← được đặt trong SDLC Agent Models section bên dưới
OLLAMA_NUM_PARALLEL=2
OLLAMA_KEEP_ALIVE=5m
OLLAMA_CONTEXT_LENGTH=32768
# OLLAMA_CONTEXT_LENGTH ← được đặt trong SDLC Agent Models section bên dưới
OLLAMA_REQUEST_TIMEOUT=1200

# ─── RAG API ──────────────────────────────────────────────────────────────────
RAG_LOG_LEVEL=INFO
RAW_DATA_DIR=/data/raw
COLLECTION_NAME=yan_raw_docs
CHAT_MODEL=qwen3.6:35b
# CHAT_MODEL=granite4.1:3b
# CHAT_MODEL ← được đặt trong SDLC Agent Models section bên dưới
CHUNK_SIZE=1000
CHUNK_OVERLAP=150
UPSERT_BATCH_SIZE=32
Expand Down Expand Up @@ -57,28 +56,31 @@ NEO4J_DATABASE=neo4j
GRAPH_ENABLED=true
GRAPH_ENTITY_EXTRACTION=false

# ─── SDLC Agent Models ────────────────────────────
# Thay đổi model ở đây rồi restart agent-api, không cần rebuild image.
# Lưu ý: nếu đổi EMBEDDING_MODEL thì phải chạy lại POST /reset-ingest.

EMBEDDING_MODEL=qwen3-embedding:8b
CODING_PLANNER_MODEL=qwen3.6:35b
BA_MODEL=qwen3.6:35b
PM_MODEL=qwen3.6:35b
SA_MODEL=qwen3.6:35b
TA_MODEL=qwen3.6:35b
DESIGNER_MODEL=gemma4:31b
FE_MODEL=devstral:24b
MOBILE_MODEL=devstral:24b
BE_MODEL=devstral:24b
DBA_MODEL=devstral:24b
DA_MODEL=qwen3.6:35b
TL_MODEL=devstral:24b
TECH_LEAD_MODEL=devstral:24b
TESTER_MODEL=mistral-small3.2:24b
DEVSECOPS_MODEL=devstral:24b
# ─── SDLC Agent Models ────────────────────────────────────────────────────────
# Chọn đúng một option theo phần cứng — chỉ bỏ comment MỘT block tại một thời điểm.
# Sau khi đổi option: restart agent-api + rag-api (không cần rebuild image).
# Nếu đổi EMBEDDING_MODEL → chạy lại POST /reset-ingest để rebuild vector index.
#
# ┌──────────────────────────────┬───────────────────────┬───────────────────────┬────────────────────────┐
# │ │ LOW │ MEDIUM │ HIGH │
# ├──────────────────────────────┼───────────────────────┼───────────────────────┼────────────────────────┤
# │ CPU cores │ 20 │ 44 │ 8 │
# │ RAM │ 32 GB │ 256 GB │ 64 GB │
# │ VRAM │ — (CPU only) │ 3 GB │ 48 GB │
# │ Inference backend │ CPU RAM │ CPU RAM + min GPU │ GPU VRAM │
# │ OLLAMA_MAX_LOADED_MODELS │ 1 │ 2 │ 2 │
# │ OLLAMA_CONTEXT_LENGTH │ 8192 │ 16384 │ 32768 │
# │ CHAT_MODEL (RAG /ask) │ granite4.1:3b │ mistral-small3.2:24b │ qwen3.6:35b │
# │ EMBEDDING_MODEL │ bge-m3 │ bge-m3 │ qwen3-embedding:8b │
# │ Reasoning agents │ granite4.1:3b / phi4 │ mistral-small3.2:24b │ qwen3.6:35b │
# │ Code agents │ codegemma:2b │ devstral:24b │ devstral:24b │
# │ Designer / Tester │ gemma4:e2b │ mistral-small3.2:24b │ gemma4:31b / mistral │
# └──────────────────────────────┴───────────────────────┴───────────────────────┴────────────────────────┘

# ─── CPU fallback ──
# ── Option 1 · LOW · CPU only · 20 cores · 32 GB RAM ─────────────────────────
# OLLAMA_MAX_LOADED_MODELS=1
# OLLAMA_CONTEXT_LENGTH=8192
# CHAT_MODEL=granite4.1:3b
# EMBEDDING_MODEL=bge-m3
# CODING_PLANNER_MODEL=granite4.1:3b
# BA_MODEL=granite4.1:3b
Expand All @@ -91,6 +93,54 @@ DEVSECOPS_MODEL=devstral:24b
# BE_MODEL=codegemma:2b
# DBA_MODEL=codegemma:2b
# DA_MODEL=granite4.1:3b
# TL_MODEL=phi4-mini
# TECH_LEAD_MODEL=codegemma:2b
# TESTER_MODEL=gemma4:e2b
# DEVSECOPS_MODEL=codegemma:2b
# CLARIFIER_MODEL=phi4-mini

# ── Option 2 · MEDIUM · CPU heavy · 44 cores · 256 GB RAM · 3 GB VRAM ─────────
# Embedding chạy trên GPU (3 GB VRAM), các model reasoning/code chạy trên CPU RAM.
OLLAMA_MAX_LOADED_MODELS=2
OLLAMA_CONTEXT_LENGTH=16384
CHAT_MODEL=mistral-small3.2:24b
EMBEDDING_MODEL=bge-m3
CODING_PLANNER_MODEL=mistral-small3.2:24b
BA_MODEL=mistral-small3.2:24b
PM_MODEL=mistral-small3.2:24b
SA_MODEL=mistral-small3.2:24b
TA_MODEL=mistral-small3.2:24b
DESIGNER_MODEL=mistral-small3.2:24b
FE_MODEL=devstral:24b
MOBILE_MODEL=devstral:24b
BE_MODEL=devstral:24b
DBA_MODEL=devstral:24b
DA_MODEL=mistral-small3.2:24b
TL_MODEL=devstral:24b
TECH_LEAD_MODEL=devstral:24b
TESTER_MODEL=mistral-small3.2:24b
DEVSECOPS_MODEL=devstral:24b
CLARIFIER_MODEL=mistral-small3.2:24b

# ── Option 3 · HIGH · GPU · 8 cores · 64 GB RAM · 48 GB VRAM ─────────────────
# Toàn bộ model chạy trên VRAM: embedding ~5 GB + 2 model lớn ~15–22 GB mỗi cái.
# OLLAMA_MAX_LOADED_MODELS=2
# OLLAMA_CONTEXT_LENGTH=32768
# CHAT_MODEL=qwen3.6:35b
# EMBEDDING_MODEL=qwen3-embedding:8b
# CODING_PLANNER_MODEL=qwen3.6:35b
# BA_MODEL=qwen3.6:35b
# PM_MODEL=qwen3.6:35b
# SA_MODEL=qwen3.6:35b
# TA_MODEL=qwen3.6:35b
# DESIGNER_MODEL=gemma4:31b
# FE_MODEL=devstral:24b
# MOBILE_MODEL=devstral:24b
# BE_MODEL=devstral:24b
# DBA_MODEL=devstral:24b
# DA_MODEL=qwen3.6:35b
# TL_MODEL=devstral:24b
# TECH_LEAD_MODEL=devstral:24b
# TESTER_MODEL=mistral-small3.2:24b
# DEVSECOPS_MODEL=devstral:24b
# CLARIFIER_MODEL=qwen3.6:35b
29 changes: 16 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Nền tảng AI cục bộ vận hành hoàn toàn offline: **Ollama** (suy lu
| `qdrant` | `qdrant/qdrant:latest` | 6333 / 6334 | Vector database (REST / gRPC) |
| `neo4j` | `neo4j:5-community` | 7474 / 7687 | Knowledge graph (Neo4j Browser / Bolt) |
| `rag-api` | build `./rag-api` | 8090 | FastAPI RAG service (ingest + ask) |
| `agent-api` | build `./agent-api` | 8091 | FastAPI SDLC Agent Orchestrator (14-step SDLC workflow) |
| `agent-api` | build `./agent-api` | 8091 | FastAPI SDLC Agent Orchestrator (15-step SDLC workflow) |
| `open-webui` | `ghcr.io/open-webui/open-webui` | 8085 | Chat UI kết nối Ollama & Qdrant |
| `watchtower` | `containrrr/watchtower` | — | Tự động pull & restart image mới nhất |
| `deunhealth` | `qmcgaw/deunhealth` | 9999 | Khởi động lại container khi healthcheck thất bại |
Expand All @@ -27,6 +27,7 @@ Nền tảng AI cục bộ vận hành hoàn toàn offline: **Ollama** (suy lu
| Team Lead planning agent | `TL_MODEL` | Lấy từ `.env` |
| Coding agents (FE / Mobile / BE / DBA / Tech Lead / DevSecOps) | `FE_MODEL` `MOBILE_MODEL` `BE_MODEL` `DBA_MODEL` `TECH_LEAD_MODEL` `DEVSECOPS_MODEL` | Lấy từ `.env` |
| Creative agents (Tester / Designer) | `TESTER_MODEL` `DESIGNER_MODEL` | Lấy từ `.env` |
| Clarifier (cross-role gap analysis) | `CLARIFIER_MODEL` | Lấy từ `.env` |

> **Lưu ý:** Đổi `EMBEDDING_MODEL` yêu cầu re-ingest toàn bộ documents (`POST /ingest {"reset": true}`).

Expand All @@ -43,14 +44,14 @@ User → Open WebUI (8085)
│ └── Ollama (embedding + chat)
└── yan_agent_workflow.py → Agent API (8091)
├── LangGraph SDLC Workflow (14 bước)
├── LangGraph SDLC Workflow (15 bước)
│ BA → PM → SA → TA → Designer → Team Lead
│ → FE → Mobile → DBA → BE → DA
│ → Tech Lead → Tester → DevSecOps
│ → Tech Lead → Tester → DevSecOps → Clarifier
└── Ollama (per-role models)
```

### SDLC Workflow (14 bước)
### SDLC Workflow (15 bước)

| Bước | Role | Tên | Model | Phụ thuộc |
|------|-----------------|----------------------------------------------|-------------------|----------------------------------------|
Expand All @@ -68,6 +69,7 @@ User → Open WebUI (8085)
| 12 | `tech_lead` | Tech Lead — Review code & Tiêu chuẩn | TECH_LEAD_MODEL | sa, fe, mobile, be, dba |
| 13 | `tester` | Tester — Kiểm thử & Đảm bảo chất lượng | TESTER_MODEL | be, fe, mobile, tech_lead, designer |
| 14 | `devsecops` | DevSecOps — Hạ tầng, CI/CD & Bảo mật | DEVSECOPS_MODEL | sa, ta, tech_lead, tester |
| 15 | `clarifier` | Clarifier — Kiểm tra Assumption & Gap | CLARIFIER_MODEL | ba, pm, sa, ta, designer, tl, fe, mobile, dba, be, da, tech_lead, tester, devsecops |

Mỗi bước nhận output đã rút gọn từ các bước phụ thuộc và có thể bổ sung context từ RAG knowledge base.

Expand Down Expand Up @@ -131,8 +133,8 @@ Mỗi dòng là một JSON object:
"workflow_id": "a1b2c3d4-...",
"project": "yanlib",
"user_input": "Xây dựng checkout flow...",
"completed_steps": ["ba","pm","sa","ta","designer","tl","fe","mobile","dba","be","da","tech_lead","tester","devsecops"],
"steps_count": 14,
"completed_steps": ["ba","pm","sa","ta","designer","tl","fe","mobile","dba","be","da","tech_lead","tester","devsecops","clarifier"],
"steps_count": 15,
"status": "completed",
"error": null,
"duration_seconds": 842.5,
Expand Down Expand Up @@ -186,8 +188,8 @@ Ollama-Stack/
│ └── Dockerfile
├── agent-api/
│ ├── app.py # FastAPI SDLC Agent Orchestrator API
│ ├── agents.py # 14 cấu hình agent (model, system prompt, deps, rag_query_hint)
│ ├── workflow.py # LangGraph StateGraph — 14-bước SDLC workflow
│ ├── agents.py # 15 cấu hình agent (model, system prompt, deps, rag_query_hint)
│ ├── workflow.py # LangGraph StateGraph — 15-bước SDLC workflow
│ ├── requirements.txt
│ └── Dockerfile
└── open-webui-tools/
Expand Down Expand Up @@ -241,6 +243,7 @@ BE_MODEL=<be_model>
DBA_MODEL=<dba_model>
TECH_LEAD_MODEL=<tech_lead_model>
DEVSECOPS_MODEL=<devsecops_model>
CLARIFIER_MODEL=<clarifier_model>

# Creative/Test agents
DESIGNER_MODEL=<designer_model>
Expand Down Expand Up @@ -286,7 +289,7 @@ docker compose logs -f

```bash
# Pull tất cả model đang khai báo trong .env (loại trùng tự động)
grep -E '^(EMBEDDING_MODEL|CHAT_MODEL|CODING_PLANNER_MODEL|BA_MODEL|PM_MODEL|SA_MODEL|TA_MODEL|DA_MODEL|TL_MODEL|FE_MODEL|MOBILE_MODEL|BE_MODEL|DBA_MODEL|TECH_LEAD_MODEL|DEVSECOPS_MODEL|TESTER_MODEL|DESIGNER_MODEL)=' .env \
grep -E '^(EMBEDDING_MODEL|CHAT_MODEL|CODING_PLANNER_MODEL|BA_MODEL|PM_MODEL|SA_MODEL|TA_MODEL|DA_MODEL|TL_MODEL|FE_MODEL|MOBILE_MODEL|BE_MODEL|DBA_MODEL|TECH_LEAD_MODEL|DEVSECOPS_MODEL|TESTER_MODEL|DESIGNER_MODEL|CLARIFIER_MODEL)=' .env \
| cut -d= -f2 \
| sort -u \
| xargs -I {} docker exec ollama ollama pull "{}"
Expand Down Expand Up @@ -383,8 +386,8 @@ curl -s http://localhost:8091/health | jq
"status": "ok",
"ollama_base_url": "http://ollama:11434",
"rag_api_url": "http://rag-api:8090",
"agents": 14,
"workflow_steps": ["ba","pm","sa","ta","designer","tl","fe","mobile","dba","be","da","tech_lead","tester","devsecops"]
"agents": 15,
"workflow_steps": ["ba","pm","sa","ta","designer","tl","fe","mobile","dba","be","da","tech_lead","tester","devsecops","clarifier"]
}
```

Expand Down Expand Up @@ -478,7 +481,7 @@ curl -s http://localhost:8091/workflows | jq
|-------------|---------------------------------------------------|
| `pending` | Đã vào hàng đợi, chưa bắt đầu |
| `running` | LangGraph đang thực thi các bước |
| `completed` | Hoàn tất toàn bộ 14 bước |
| `completed` | Hoàn tất toàn bộ 15 bước |
| `failed` | Có lỗi không xử lý được; kiểm tra trường `error` |

> **Lưu ý:** Nếu một bước gặp lỗi LLM (timeout, model chưa pull, v.v.), hệ thống sẽ ghi `[LỖI trong <role>] ...` vào `step_outputs` và trường `error`, nhưng workflow vẫn tiếp tục các bước kế tiếp (lỗi không dừng toàn pipeline).
Expand Down Expand Up @@ -725,7 +728,7 @@ Chạy toàn bộ SDLC workflow hoặc chạy từng agent độc lập.

| Function | Mô tả |
|-----------------------|------------------------------------------------------------|
| `run_sdlc_workflow` | Chạy đầy đủ 14 bước, poll đến khi hoàn tất, trả về summary |
| `run_sdlc_workflow` | Chạy đầy đủ 15 bước, poll đến khi hoàn tất, trả về summary |
| `run_agent_step` | Chạy 1 agent role đơn lẻ (sync) |
| `get_workflow_result` | Lấy kết quả workflow theo ID, filter theo role |
| `list_agent_roles` | Liệt kê tất cả roles, models, thứ tự chạy |
Expand Down
Loading
Loading