generated from Java-2025Fall/final-vibevault-template
完成作业
This commit is contained in:
parent
15255acda2
commit
ba051a1b97
44
autograde/README.md
Normal file
44
autograde/README.md
Normal file
@ -0,0 +1,44 @@
|
||||
# VibeVault 自动评分配置
|
||||
|
||||
本目录包含 VibeVault 项目的自动评分配置和脚本,用于指导自动评分工具识别和执行评分流程。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
autograde/
|
||||
├── run.sh # 主评分脚本,包含核心评分逻辑
|
||||
├── config.yml # 评分配置文件,定义评分步骤和关键文件
|
||||
└── README.md # 本说明文件
|
||||
```
|
||||
|
||||
## 评分流程
|
||||
|
||||
自动评分流程主要包括以下步骤:
|
||||
|
||||
1. **运行编程测试**:使用 Gradle 运行项目中的测试用例
|
||||
2. **编程测试评分**:使用 `grade_grouped.py` 对编程测试结果进行评分
|
||||
3. **报告评分**:使用 `llm_grade.py` 对 REPORT.md 进行评分
|
||||
4. **前端报告评分**:使用 `llm_grade.py` 对 FRONTEND.md 进行评分
|
||||
5. **聚合最终成绩**:使用 `aggregate_final_grade.py` 聚合各部分成绩
|
||||
6. **生成 PDF 报告**:使用 `generate_pdf_report.py` 生成最终评分报告
|
||||
|
||||
## 关键文件
|
||||
|
||||
- **run.sh**:主评分脚本,执行所有评分步骤
|
||||
- **config.yml**:评分配置文件,定义评分流程和关键文件
|
||||
- **test_groups.json**:测试分组配置(项目根目录)
|
||||
- **REPORT.md**:后端与系统设计报告(项目根目录)
|
||||
- **FRONTEND.md**:前端界面与交互设计报告(项目根目录)
|
||||
- **.llm_rubrics/**:LLM 评分标准目录(项目根目录)
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 确保项目已通过 Gradle 构建并运行测试
|
||||
2. 执行 `./autograde/run.sh` 启动评分流程
|
||||
3. 查看生成的评分文件和报告
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 本目录的配置与 `.gitea/workflows/autograde.yml` 保持一致
|
||||
- 评分脚本依赖外部获取的评分工具(在 CI 流程中自动下载)
|
||||
- 确保 Python 3 和 Gradle 已正确安装
|
||||
69
autograde/config.yml
Normal file
69
autograde/config.yml
Normal file
@ -0,0 +1,69 @@
|
||||
# VibeVault 自动评分配置文件
|
||||
# 该配置用于指导自动评分工具识别评分流程和关键文件
|
||||
|
||||
# 评分流程配置
|
||||
grading:
|
||||
# 主评分脚本
|
||||
main_script: run.sh
|
||||
|
||||
# 评分步骤
|
||||
steps:
|
||||
- name: 运行编程测试
|
||||
command: ./gradlew test --no-daemon
|
||||
output: build/test-results/test
|
||||
|
||||
- name: 编程测试评分
|
||||
command: python3 ./.autograde/grade_grouped.py
|
||||
inputs:
|
||||
- build/test-results/test
|
||||
- test_groups.json
|
||||
outputs:
|
||||
- grade.json
|
||||
- summary.md
|
||||
|
||||
- name: 报告评分
|
||||
command: python3 ./.autograde/llm_grade.py
|
||||
inputs:
|
||||
- REPORT.md
|
||||
- .llm_rubrics/rubric_report.json
|
||||
outputs:
|
||||
- report_grade.json
|
||||
- report_summary.md
|
||||
|
||||
- name: 前端报告评分
|
||||
command: python3 ./.autograde/llm_grade.py
|
||||
inputs:
|
||||
- FRONTEND.md
|
||||
- .llm_rubrics/rubric_frontend.json
|
||||
outputs:
|
||||
- frontend_grade.json
|
||||
- frontend_summary.md
|
||||
|
||||
- name: 聚合最终成绩
|
||||
command: python3 ./.autograde/aggregate_final_grade.py
|
||||
inputs:
|
||||
- grade.json
|
||||
- report_grade.json
|
||||
- frontend_grade.json
|
||||
outputs:
|
||||
- final_grade.json
|
||||
- final_summary.md
|
||||
|
||||
# 关键文件配置
|
||||
files:
|
||||
# 测试相关文件
|
||||
test_groups: test_groups.json
|
||||
|
||||
# 报告文件
|
||||
backend_report: REPORT.md
|
||||
frontend_report: FRONTEND.md
|
||||
|
||||
# 评分结果文件
|
||||
final_grade: final_grade.json
|
||||
grade_report: grade_report.pdf
|
||||
|
||||
# 依赖配置
|
||||
dependencies:
|
||||
- gradle
|
||||
- python3
|
||||
- pip3 install python-dotenv requests markdown weasyprint
|
||||
100
autograde/run.sh
Normal file
100
autograde/run.sh
Normal file
@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 核心评分脚本 - 从 autograde.yml 中提取的关键评分命令
|
||||
|
||||
echo "=== VibeVault 自动评分流程 ==="
|
||||
|
||||
# 1. 运行 Gradle 测试
|
||||
echo "\n1. 运行 Gradle 测试..."
|
||||
./gradlew test --no-daemon || true
|
||||
|
||||
# 2. 运行编程测试评分
|
||||
echo "\n2. 运行编程测试评分..."
|
||||
python3 ./.autograde/grade_grouped.py \
|
||||
--junit-dir build/test-results/test \
|
||||
--groups test_groups.json \
|
||||
--out grade.json \
|
||||
--summary summary.md
|
||||
|
||||
# 3. 评分 REPORT.md
|
||||
echo "\n3. 评分 REPORT.md..."
|
||||
if [ -f REPORT.md ] && [ -f .llm_rubrics/rubric_report.json ]; then
|
||||
python3 ./.autograde/llm_grade.py \
|
||||
--question "请评估这份后端与系统设计报告" \
|
||||
--answer REPORT.md \
|
||||
--rubric .llm_rubrics/rubric_report.json \
|
||||
--out report_grade.json \
|
||||
--summary report_summary.md
|
||||
echo "✅ REPORT.md graded"
|
||||
else
|
||||
echo '{"total": 0, "flags": ["missing_file"]}' > report_grade.json
|
||||
echo "⚠️ REPORT.md or rubric not found"
|
||||
fi
|
||||
|
||||
# 4. 评分 FRONTEND.md
|
||||
echo "\n4. 评分 FRONTEND.md..."
|
||||
if [ -f FRONTEND.md ] && [ -f .llm_rubrics/rubric_frontend.json ]; then
|
||||
python3 ./.autograde/llm_grade.py \
|
||||
--question "请评估这份前端界面与交互设计报告" \
|
||||
--answer FRONTEND.md \
|
||||
--rubric .llm_rubrics/rubric_frontend.json \
|
||||
--out frontend_grade.json \
|
||||
--summary frontend_summary.md
|
||||
echo "✅ FRONTEND.md graded"
|
||||
else
|
||||
echo '{"total": 0, "flags": ["missing_file"]}' > frontend_grade.json
|
||||
echo "⚠️ FRONTEND.md or rubric not found"
|
||||
fi
|
||||
|
||||
# 5. 聚合最终成绩
|
||||
echo "\n5. 聚合最终成绩..."
|
||||
python3 ./.autograde/aggregate_final_grade.py \
|
||||
--programming grade.json \
|
||||
--report report_grade.json \
|
||||
--frontend frontend_grade.json \
|
||||
--out final_grade.json \
|
||||
--summary final_summary.md
|
||||
|
||||
# 6. 生成 PDF 报告
|
||||
echo "\n6. 生成 PDF 报告..."
|
||||
if [ -f final_grade.json ]; then
|
||||
# 读取学生信息文件(如果存在)
|
||||
STUDENT_ID=""
|
||||
STUDENT_NAME=""
|
||||
CLASS_NAME=""
|
||||
|
||||
if [ -f .student_info.json ]; then
|
||||
STUDENT_ID=$(python3 -c "import json; d=json.load(open('.student_info.json')); print(d.get('student_id',''))" 2>/dev/null || echo "")
|
||||
STUDENT_NAME=$(python3 -c "import json; d=json.load(open('.student_info.json')); print(d.get('name',''))" 2>/dev/null || echo "")
|
||||
CLASS_NAME=$(python3 -c "import json; d=json.load(open('.student_info.json')); print(d.get('class_name',''))" 2>/dev/null || echo "")
|
||||
fi
|
||||
|
||||
# 如果没有学生信息文件,从仓库名提取学号
|
||||
if [ -z "$STUDENT_ID" ]; then
|
||||
REPO="$(basename "$PWD")"
|
||||
STUDENT_ID=$(echo "$REPO" | sed -n 's/.*-stu[_-]\?\(st\)\?\([0-9]*\)$/\2/p')
|
||||
fi
|
||||
|
||||
python3 ./.autograde/generate_pdf_report.py \
|
||||
--report REPORT.md \
|
||||
--frontend FRONTEND.md \
|
||||
--grade final_grade.json \
|
||||
--images images \
|
||||
--out grade_report.pdf \
|
||||
--student-id "$STUDENT_ID" \
|
||||
--student-name "$STUDENT_NAME" \
|
||||
--class-name "$CLASS_NAME" \
|
||||
--commit-sha "$(git rev-parse HEAD 2>/dev/null || echo "unknown")"
|
||||
fi
|
||||
|
||||
echo "\n=== 评分完成 ==="
|
||||
|
||||
# 显示最终成绩
|
||||
if [ -f final_grade.json ]; then
|
||||
echo "\n最终成绩:"
|
||||
python3 -c "import json; print(json.dumps(json.load(open('final_grade.json')), indent=2, ensure_ascii=False))"
|
||||
else
|
||||
echo "\n❌ 评分失败,未生成最终成绩文件"
|
||||
exit 1
|
||||
fi
|
||||
Loading…
Reference in New Issue
Block a user