feat: add persistent chat agent and indexed batch workflows

This commit is contained in:
2026-09-26 19:43:23 +08:00
parent 8bebcdb470
commit d61987c86c
17 changed files with 1758 additions and 180 deletions
+62 -1
View File
@@ -193,7 +193,8 @@ class ScoringBatch(Base):
model_config_snapshot = Column(JSON, nullable=False)
embedding_model_name = Column(String(200), nullable=False)
embedding_model_version = Column(String(100), nullable=False)
status = Column(String(40), default="queued")
status = Column(String(40), default="created")
project_ids = Column(JSON, nullable=True) # NULL identifies a legacy batch with unknown original membership.
progress_done = Column(Integer, default=0)
progress_total = Column(Integer, default=0)
error = Column(Text, default="")
@@ -273,3 +274,63 @@ class AuditLog(Base):
entity_id = Column(Integer, nullable=True)
details = Column(JSON, default=dict)
created_at = Column(DateTime(timezone=True), default=now)
class IndexTask(Base):
__tablename__ = "index_tasks"
id = Column(Integer, primary_key=True)
course_version_id = Column(Integer, ForeignKey("course_versions.id"), nullable=False)
submission_file_id = Column(Integer, ForeignKey("submission_files.id"), nullable=True)
kind = Column(String(30), nullable=False)
status = Column(String(30), nullable=False, default="queued")
result = Column(JSON, nullable=False, default=dict)
error = Column(Text, default="")
created_at = Column(DateTime(timezone=True), default=now)
updated_at = Column(DateTime(timezone=True), default=now, onupdate=now)
class Conversation(Base):
__tablename__ = "conversations"
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False, default="新对话")
course_version_id = Column(Integer, ForeignKey("course_versions.id"), nullable=True)
batch_id = Column(Integer, ForeignKey("scoring_batches.id"), nullable=True)
project_id = Column(Integer, ForeignKey("projects.id"), nullable=True)
created_at = Column(DateTime(timezone=True), default=now)
updated_at = Column(DateTime(timezone=True), default=now, onupdate=now)
class ChatMessage(Base):
__tablename__ = "chat_messages"
id = Column(Integer, primary_key=True)
conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False)
role = Column(String(20), nullable=False)
content = Column(Text, nullable=False, default="")
citations = Column(JSON, nullable=False, default=list)
tool_calls = Column(JSON, nullable=False, default=list)
created_at = Column(DateTime(timezone=True), default=now)
class AgentRun(Base):
__tablename__ = "agent_runs"
id = Column(Integer, primary_key=True)
conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False)
status = Column(String(30), nullable=False, default="running")
error = Column(Text, default="")
created_at = Column(DateTime(timezone=True), default=now)
finished_at = Column(DateTime(timezone=True), nullable=True)
class PendingAction(Base):
__tablename__ = "pending_actions"
id = Column(Integer, primary_key=True)
conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False)
kind = Column(String(40), nullable=False)
payload = Column(JSON, nullable=False)
preview = Column(JSON, nullable=False)
expected = Column(JSON, nullable=False)
idempotency_key = Column(String(64), nullable=False, unique=True)
status = Column(String(30), nullable=False, default="pending")
result = Column(JSON, nullable=True)
created_at = Column(DateTime(timezone=True), default=now)
expires_at = Column(DateTime(timezone=True), nullable=False)