90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from review_agent.models import Conversation, FileAttachment
|
|
|
|
|
|
TRIGGER_KEYWORDS = ("自动汇总", "文件目录", "页数", "目录与页数", "文件清单")
|
|
ATTACHMENT_READER_KEYWORDS = (
|
|
"阅读附件",
|
|
"读取附件",
|
|
"解析附件",
|
|
"分析附件",
|
|
"查看附件",
|
|
"附件详情",
|
|
"文件详情",
|
|
"文件内容",
|
|
"附件内容",
|
|
"简历文件",
|
|
"提供的文件",
|
|
"提供的简历",
|
|
"上传的文件",
|
|
"上传文件",
|
|
"这个文件",
|
|
"该文件",
|
|
"总结附件",
|
|
"总结文件",
|
|
"分析这个文件",
|
|
"阅读这个文件",
|
|
)
|
|
ATTACHMENT_REFERENCE_KEYWORDS = ("附件", "文件", "简历", "上传")
|
|
ATTACHMENT_READ_INTENT_KEYWORDS = (
|
|
"阅读",
|
|
"读取",
|
|
"读",
|
|
"解析",
|
|
"分析",
|
|
"查看",
|
|
"提取",
|
|
"整理",
|
|
"总结",
|
|
"介绍",
|
|
"项目经历",
|
|
"工作经历",
|
|
"经历",
|
|
"信息",
|
|
"内容",
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TriggerResult:
|
|
should_start: bool
|
|
workflow_type: str = ""
|
|
reason: str = ""
|
|
|
|
|
|
def evaluate_file_summary_trigger(conversation: Conversation, content: str) -> TriggerResult:
|
|
text = (content or "").strip()
|
|
if not any(keyword in text for keyword in TRIGGER_KEYWORDS):
|
|
return TriggerResult(should_start=False, reason="not_matched")
|
|
|
|
has_attachment = FileAttachment.objects.filter(
|
|
conversation=conversation,
|
|
is_active=True,
|
|
).exclude(upload_status=FileAttachment.UploadStatus.DELETED).exists()
|
|
if not has_attachment:
|
|
return TriggerResult(should_start=False, reason="missing_attachment")
|
|
|
|
return TriggerResult(should_start=True, workflow_type="file_summary")
|
|
|
|
|
|
def evaluate_attachment_reader_trigger(conversation: Conversation, content: str) -> TriggerResult:
|
|
text = (content or "").strip()
|
|
matched = any(keyword in text for keyword in ATTACHMENT_READER_KEYWORDS) or (
|
|
any(keyword in text for keyword in ATTACHMENT_REFERENCE_KEYWORDS)
|
|
and any(keyword in text for keyword in ATTACHMENT_READ_INTENT_KEYWORDS)
|
|
)
|
|
if not matched:
|
|
return TriggerResult(should_start=False, reason="not_matched")
|
|
|
|
has_attachment = FileAttachment.objects.filter(
|
|
conversation=conversation,
|
|
is_active=True,
|
|
).exclude(upload_status=FileAttachment.UploadStatus.DELETED).exists()
|
|
if not has_attachment:
|
|
return TriggerResult(should_start=False, reason="missing_attachment")
|
|
|
|
return TriggerResult(should_start=True, workflow_type="attachment_reader")
|