feat: unify scoring and chat evidence pages

This commit is contained in:
2026-09-27 17:47:32 +08:00
parent 039e93d0de
commit 83aa0e84a2
21 changed files with 511 additions and 132 deletions
+42 -1
View File
@@ -1,9 +1,12 @@
from fastapi.testclient import TestClient
from sqlalchemy import select
from wisegrade import agent_tools
from wisegrade.db import get_db
from wisegrade.main import app
from wisegrade.models import CourseVersion, CriterionScore, Project, RubricVersion, Student
from wisegrade.models import (Conversation, CourseVersion, CriterionScore, KnowledgeChunk,
KnowledgePage, Project, RubricVersion, Student)
from wisegrade.rag import ingest
from wisegrade.scoring import run_batch
@@ -15,6 +18,44 @@ def client_for(session_factory):
return TestClient(app)
def test_file_page_has_text_and_image_virtual_page_has_text_only(session_factory, environment, monkeypatch):
image = environment / "processed" / "course-1" / "report" / "page-49.png"
image.parent.mkdir(parents=True)
image.write_bytes(b"\x89PNG\r\n\x1a\n")
vectors = lambda texts: [[0.1] * 1024 for _ in texts]
with session_factory() as db:
document = ingest(db, course_version_id=1, project_id=None, submission_file_id=None,
title="课程报告.pdf", category="course", source_hash="file",
pages=[{"page_number": 49, "text": "第四十九页完整文字", "tables": [{"rows": [["指标", "结果"]]}],
"rendered_image_path": str(image)}], embedder=vectors)
virtual = ingest(db, course_version_id=1, project_id=None, submission_file_id=None,
title="系统生成规则", category="course", source_hash="virtual",
pages=[{"page_number": 1, "text": "规则文字"}], embedder=vectors)
assert db.get(KnowledgePage, (document.id, 49)).image_path == "course-1/report/page-49.png"
chunk = db.scalar(select(KnowledgeChunk).where(KnowledgeChunk.document_id == document.id))
monkeypatch.setattr(agent_tools, "retrieve", lambda *_, **__: [{"chunk_id": chunk.id,
"document_id": document.id, "project_id": None, "page": 49, "text": chunk.text}])
citation = agent_tools.execute(db, Conversation(course_version_id=1), "search_course_material",
{"course_version_id": 1, "query": "完整文字"}, "")["citations"][0]
assert citation["url"] == f"/api/knowledge/documents/{document.id}/pages/49"
assert citation["image_url"] == citation["url"] + "/image"
document_id, virtual_id = document.id, virtual.id
client = client_for(session_factory)
try:
resource = client.get(f"/api/knowledge/documents/{document_id}/pages/49")
assert resource.status_code == 200
assert resource.json()["text"] == "第四十九页完整文字\n表格: [['指标', '结果']]"
image_url = resource.json()["image_url"]
assert image_url == f"/api/knowledge/documents/{document_id}/pages/49/image"
assert client.get(image_url).content.startswith(b"\x89PNG")
virtual_resource = client.get(f"/api/knowledge/documents/{virtual_id}/pages/1")
assert virtual_resource.json()["text"] == "规则文字"
assert virtual_resource.json()["image_url"] is None
assert client.get(f"/api/knowledge/documents/{virtual_id}/pages/1/image").status_code == 404
finally:
app.dependency_overrides.clear()
def test_course_and_rubric_versions_are_immutable(session_factory):
client = client_for(session_factory)
try: