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
+6 -7
View File
@@ -9,6 +9,7 @@ from sqlalchemy import select
from .actions import prepare, require_scope
from .exports import batch_projects, project_result
from .knowledge_pages import page_links
from .models import (Conversation, Course, CourseVersion, IndexTask, KnowledgeDocument,
Project, RubricVersion, ScoringBatch, Student, SubmissionFile)
from .rag import retrieve
@@ -206,12 +207,11 @@ def _search(db, version_id, project_id, query, *, public_only=False):
citations = []
for chunk in chunks:
doc = db.get(KnowledgeDocument, chunk["document_id"])
file_id = doc.submission_file_id if doc else None
links = page_links(db, chunk["document_id"], chunk["page"])
citations.append({"chunk_id": chunk["chunk_id"], "document_id": chunk["document_id"],
"title": doc.title if doc else "资料", "page": chunk["page"],
"quote": chunk["text"][:500], "project_id": chunk["project_id"],
"url": f"/api/knowledge/documents/{chunk['document_id']}/pages/{chunk['page']}",
"image_url": f"/api/assets/{file_id}/{chunk['page']}" if file_id else None})
**links})
return {"citations": citations, "found": bool(citations)}
@@ -283,11 +283,10 @@ def scores(db, convo, args, _user):
for ev in row["evidence"][:2]]} for row in rows]})
for row in rows:
for evidence in row["evidence"][:2]:
links = page_links(db, evidence.get("document_id"), evidence["page"])
citations.append({"title": str(evidence["document"])[:200], "page": evidence["page"],
"quote": evidence["quote"][:320],
"url": url, "image_url": evidence["image_url"],
"text_url": f"/api/knowledge/documents/{evidence['document_id']}/pages/{evidence['page']}"
if evidence.get("document_id") else None})
"quote": evidence["quote"][:320], "document_id": evidence.get("document_id"),
**links, "score_url": url})
next_criterion_offset = args.criterion_offset + 6 if page and args.criterion_offset + 6 < len(page[0][1]["rows"]) else None
next_project_offset = args.project_offset + 1 if args.project_offset + 1 < len(results) else None
return {"batch_id": batch.id, "status_filter": args.status, "count": len(results),