9.4 KiB
Full Pipeline Runner
Chạy toàn bộ MiroFish pipeline từ command line, không cần mở UI.
Files
| File | Vai trò |
|---|---|
prepare_input.py |
Đọc config, load & filter articles, ghi combined text ra temp file, in JSON metadata ra stdout |
run.sh |
Gọi prepare_input.py, khởi động backend nếu cần, rồi gọi tuần tự các API |
config_articles.env |
Cấu hình input |
Cấu hình (config_articles.env)
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
article_path |
Có | Đường dẫn thư mục chứa articles.jsonl và thư mục news/ |
full_content |
Không | True = giữ toàn bộ markdown; False (mặc định) = chỉ lấy body bài viết, bỏ YAML frontmatter |
start_time |
Không | Lọc bài viết từ ngày (YYYY-MM-DD), để trống = không lọc |
end_time |
Không | Lọc bài viết đến ngày (YYYY-MM-DD), để trống = không lọc |
simulation_requirement |
Không | Mô tả yêu cầu phân tích/dự báo gửi cho LLM |
project_name |
Không | Tên project |
Cách 1 — Chạy toàn bộ pipeline 1 lệnh (khuyến nghị)
Không cần mở terminal riêng cho backend. run.sh tự kiểm tra và khởi động Flask nếu chưa chạy.
Chạy 7 bước tự động: ontology → graph → create sim → prepare sim → start sim → chờ hoàn thành → generate report.
# Từ project root
cd /home/anman/intern/MiroFish
bash test_code_backend/full_pipeline/run.sh
# Hoặc chỉ định config khác
bash test_code_backend/full_pipeline/run.sh path/to/config.env
Log in ra terminal từng bước. Cuối cùng in ra project_id, graph_id, simulation_id, report_id.
Backend được tự động khởi động trong background — không cần mở terminal riêng. Log đầy đủ nằm ở
backend/logs/YYYY-MM-DD.log.
Muốn kill port
kill $(lsof -ti :5001)
Cách 2 — Chạy từng bước thủ công
Khi cần debug hoặc muốn kiểm tra kết quả từng bước.
Bước 0: Khởi động Flask backend (port 5001)
Mở terminal riêng, giữ nguyên trong suốt quá trình:
cd /home/anman/intern/MiroFish
FLASK_PORT=5001 npm run backend
# hoặc: python backend/run.py
Kiểm tra backend đã sẵn sàng:
curl http://localhost:5001/health
# → {"status": "ok", "service": "MiroFish Backend"}
Bước 1: Chuẩn bị input (Python)
Chạy trong terminal khác:
cd /home/anman/intern/MiroFish
python3 test_code_backend/full_pipeline/prepare_input.py \
test_code_backend/full_pipeline/config_articles.env
Output là JSON, ví dụ:
{
"combined_file": "/tmp/mirofish_articles_abc123.md",
"article_count": 42,
"project_name": "Oil Market Sentiment Pipeline",
"simulation_requirement": "Analyze how ...",
"start_time": null,
"end_time": null
}
Lưu lại đường dẫn combined_file để dùng ở bước tiếp theo.
Bước 2: Generate ontology → lấy project_id
COMBINED_FILE="/home/anman/intern/MiroFish/test_code_backend/full_pipeline/data/articles_combined.md"
COMBINED_FILE="/home/anman/intern/MiroFish/data/news/2026-02/2026-02-03_oil-prices-add-gains-after-report-says_0178c4.md"
curl -s http://localhost:5001/api/graph/ontology/generate \
-F "files=@${COMBINED_FILE};filename=articles.md" \
-F "simulation_requirement=Analyze how these oil and financial market news articles affect investor sentiment and market dynamics. Predict how different market participants (traders, analysts, retail investors) will react and what the overall price trend will be." \
-F "project_name=Oil Market Pipeline" \
| jq '{project_id: .data.project_id, entity_types: [.data.ontology.entity_types[].name]}'
Lưu lại project_id.
Bước 3: Build knowledge graph → lấy task_id
PROJECT_ID="proj_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/graph/build \
-H "Content-Type: application/json" \
-d "{\"project_id\": \"$PROJECT_ID\"}" \
| jq '{task_id: .data.task_id}'
Poll tiến độ build (chạy lặp lại đến khi status=completed):
TASK_ID="task_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/graph/task/$TASK_ID \
| jq '{status: .data.status, progress: .data.progress, graph_id: .data.result.graph_id}'
Khi status=completed, lưu lại graph_id.
Bước 4: Tạo simulation → lấy simulation_id
PROJECT_ID="proj_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/simulation/create \
-H "Content-Type: application/json" \
-d "{\"project_id\": \"$PROJECT_ID\", \"enable_twitter\": true, \"enable_reddit\": true}" \
| jq '{simulation_id: .data.simulation_id}'
Bước 5: Prepare simulation (sinh agent profiles + config)
SIM_ID="sim_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/simulation/prepare \
-H "Content-Type: application/json" \
-d "{\"simulation_id\": \"$SIM_ID\", \"use_llm_for_profiles\": true, \"parallel_profile_count\": 5}" \
| jq '{task_id: .data.task_id, status: .data.status}'
Poll tiến độ (bước này lâu nhất, ~5–15 phút tùy số agents):
TASK_ID="task_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/simulation/prepare/status \
-H "Content-Type: application/json" \
-d "{\"task_id\": \"$TASK_ID\", \"simulation_id\": \"$SIM_ID\"}" \
| jq '{status: .data.status, progress: .data.progress, message: .data.message}'
Bước 6: Start simulation
SIM_ID="sim_xxxxxxxxxxxx"
curl -s http://localhost:5001/api/simulation/start \
-H "Content-Type: application/json" \
-d "{\"simulation_id\": \"$SIM_ID\", \"platform\": \"parallel\"}" \
| jq '{runner_status: .data.runner_status, total_rounds: .data.total_rounds}'
Bước 7: Theo dõi simulation đến khi hoàn thành
Chạy lệnh sau để tự động poll mỗi 30 giây, tự thoát khi simulation kết thúc:
SIM_ID="sim_xxxxxxxxxxxx"
while true; do
RESP=$(curl -s http://localhost:5001/api/simulation/$SIM_ID/run-status)
RS=$(echo "$RESP" | jq -r '.data.runner_status')
CR=$(echo "$RESP" | jq -r '.data.current_round')
TR=$(echo "$RESP" | jq -r '.data.total_rounds')
echo "[$(date '+%H:%M:%S')] $RS round=$CR/$TR"
[[ "$RS" == "completed" || "$RS" == "stopped" || "$RS" == "failed" ]] && break
sleep 30
done
Hoặc kiểm tra thủ công một lần:
# Trạng thái tổng quan (round hiện tại, % tiến độ)
curl -s http://localhost:5001/api/simulation/$SIM_ID/run-status \
| jq '{runner_status: .data.runner_status, current_round: .data.current_round, total_rounds: .data.total_rounds}'
# Hành động của agents (real-time)
curl -s "http://localhost:5001/api/simulation/$SIM_ID/actions?limit=20" | jq .
Bước 8: Generate report
SIM_ID="sim_xxxxxxxxxxxx"
SIM_ID="sim_07ab325b3818"
# 1. Bắt đầu generate → lấy task_id và report_id
RESP=$(curl -s http://localhost:5001/api/report/generate \
-H "Content-Type: application/json" \
-d "{\"simulation_id\": \"$SIM_ID\"}")
TASK_ID=$(echo "$RESP" | jq -r '.data.task_id')
REPORT_ID=$(echo "$RESP" | jq -r '.data.report_id')
echo "task_id=$TASK_ID report_id=$REPORT_ID"
# 2. Poll đến khi completed (chạy lặp lại, ~5–15 phút)
while true; do
R=$(curl -s http://localhost:5001/api/report/generate/status \
-H "Content-Type: application/json" \
-d "{\"task_id\": \"$TASK_ID\"}")
ST=$(echo "$R" | jq -r '.data.status')
PG=$(echo "$R" | jq -r '.data.progress')
echo "$ST ${PG}%"
[[ "$ST" == "completed" ]] && break
[[ "$ST" == "failed" ]] && { echo "FAILED"; break; }
sleep 15
done
# 3. Download file Markdown
curl -s http://localhost:5001/api/report/$REPORT_ID/download -o report.md
echo "Saved to report.md"
Nếu sim đã có report rồi mà muốn chạy lại thì dùng như sau
SIM_ID="sim_xxxxxxxxxxxx"
SIM_ID="sim_07ab325b3818"
# 1. Bắt đầu generate → lấy task_id và report_id
RESP=$(curl -s http://localhost:5001/api/report/generate \
-H "Content-Type: application/json" \
-d "{\"simulation_id\": \"$SIM_ID\", \"force_regenerate\": true}")
TASK_ID=$(echo "$RESP" | jq -r '.data.task_id')
REPORT_ID=$(echo "$RESP" | jq -r '.data.report_id')
echo "task_id=$TASK_ID report_id=$REPORT_ID"
# 2. Poll đến khi completed (chạy lặp lại, ~5–15 phút)
while true; do
R=$(curl -s http://localhost:5001/api/report/generate/status \
-H "Content-Type: application/json" \
-d "{\"task_id\": \"$TASK_ID\"}")
ST=$(echo "$R" | jq -r '.data.status')
PG=$(echo "$R" | jq -r '.data.progress')
echo "$ST ${PG}%"
[[ "$ST" == "completed" ]] && break
[[ "$ST" == "failed" ]] && { echo "FAILED"; break; }
sleep 15
done
# 3. Download file Markdown
curl -s http://localhost:5001/api/report/$REPORT_ID/download -o report.md
echo "Saved to report.md"
Output files
| Loại | Đường dẫn |
|---|---|
| Project metadata + extracted text | backend/uploads/projects/<project_id>/ |
| Agent profiles (Reddit) | backend/uploads/simulations/<sim_id>/reddit_profiles.json |
| Agent profiles (Twitter) | backend/uploads/simulations/<sim_id>/twitter_profiles.csv |
| Simulation config (LLM-generated) | backend/uploads/simulations/<sim_id>/simulation_config.json |
| Run state & action log | backend/uploads/simulations/<sim_id>/run_state.json |
| Report | backend/uploads/reports/<report_id>/ |