feat(chat): allow knowledge chat before upload
This commit is contained in:
@@ -28,6 +28,23 @@ def create_conversation_for_batch(batch_id: str, product_name: str) -> Conversat
|
||||
return conversation
|
||||
|
||||
|
||||
def create_knowledge_conversation() -> Conversation:
|
||||
"""
|
||||
创建未绑定资料包的知识库问答会话。
|
||||
|
||||
该会话用于用户尚未上传资料时直接向 RAG 知识库提问,
|
||||
因此 batch_id 与 product_name 保持为空,Agent Core 通过空范围执行全局检索。
|
||||
"""
|
||||
return Conversation.objects.create(
|
||||
conversation_id=_generate_conversation_id(),
|
||||
title="知识库问答会话",
|
||||
product_name="",
|
||||
batch_id="",
|
||||
task_status=Conversation.STATUS_PENDING,
|
||||
node_results=_build_knowledge_node_results(),
|
||||
)
|
||||
|
||||
|
||||
def execute_conversation_agent(
|
||||
*,
|
||||
conversation: Conversation,
|
||||
@@ -132,6 +149,14 @@ def _build_initial_node_results() -> list[dict]:
|
||||
]
|
||||
|
||||
|
||||
def _build_knowledge_node_results() -> list[dict]:
|
||||
return [
|
||||
{"code": "knowledge_retrieval", "label": "知识库检索", "status": "待处理"},
|
||||
{"code": "answer_generation", "label": "问答生成", "status": "待处理"},
|
||||
{"code": "risk", "label": "风险预警", "status": "待处理"},
|
||||
]
|
||||
|
||||
|
||||
def _persist_notification_records(result: AgentResult, *, web_detail_url: str = "") -> None:
|
||||
payload = result.notification_payload or {}
|
||||
owners = payload.get("owners") or []
|
||||
|
||||
@@ -9,7 +9,11 @@ from apps.documents.services import append_documents_to_batch
|
||||
|
||||
from .forms import ChatForm, ConversationUploadForm
|
||||
from .models import Conversation
|
||||
from .services import execute_conversation_agent, execute_conversation_export
|
||||
from .services import (
|
||||
create_knowledge_conversation,
|
||||
execute_conversation_agent,
|
||||
execute_conversation_export,
|
||||
)
|
||||
|
||||
RISK_LEVEL_DISPLAY = {
|
||||
"high": "高",
|
||||
@@ -48,19 +52,48 @@ def index(request):
|
||||
conversations = Conversation.objects.all()
|
||||
if conversations.exists():
|
||||
return redirect("chat:detail", conversation_id=conversations.first().conversation_id)
|
||||
documents = UploadedDocument.objects.filter(batch__isnull=True)
|
||||
form = ChatForm(request.POST or None, documents=documents)
|
||||
upload_form = ConversationUploadForm()
|
||||
result = None
|
||||
audit_log = None
|
||||
conversation = None
|
||||
if request.method == "POST" and form.is_valid():
|
||||
conversation = create_knowledge_conversation()
|
||||
result, audit_log = execute_conversation_agent(
|
||||
conversation=conversation,
|
||||
message=form.cleaned_data["message"],
|
||||
document_ids=form.cleaned_data["document_ids"],
|
||||
detail_url_builder=lambda log_id: reverse("audit:detail", args=[log_id]),
|
||||
)
|
||||
conversation.refresh_from_db()
|
||||
documents = UploadedDocument.objects.filter(batch__isnull=True)
|
||||
|
||||
display_node_results = _normalize_node_results(conversation.node_results if conversation else [])
|
||||
workspace_summary = _build_workspace_summary(conversation, None, display_node_results) if conversation else _build_empty_workspace_summary()
|
||||
return render(
|
||||
request,
|
||||
"chat/index.html",
|
||||
{
|
||||
"conversation": None,
|
||||
"conversation": conversation,
|
||||
"conversations": [],
|
||||
"conversation_history": [],
|
||||
"form": ChatForm(),
|
||||
"documents": [],
|
||||
"result": None,
|
||||
"audit_log": None,
|
||||
"node_results": [],
|
||||
"batch": None,
|
||||
"form": form,
|
||||
"documents": documents,
|
||||
"document_count": documents.count(),
|
||||
"result": result,
|
||||
"audit_log": audit_log,
|
||||
"node_results": display_node_results,
|
||||
"active_node": None,
|
||||
"workspace_summary": workspace_summary,
|
||||
"conversation_context": _build_conversation_context(conversation, None, workspace_summary) if conversation else {},
|
||||
"prompt_templates": _build_prompt_templates(),
|
||||
"analysis_card": _build_analysis_card(result, conversation) if conversation else {},
|
||||
"upload_form": upload_form,
|
||||
"export_card": _build_export_card(result, conversation) if conversation else {},
|
||||
"risk_card": _build_risk_card(result, conversation) if conversation else {},
|
||||
"notify_card": _build_notify_card(result, conversation) if conversation else {},
|
||||
},
|
||||
)
|
||||
|
||||
@@ -201,6 +234,18 @@ def _build_workspace_summary(
|
||||
}
|
||||
|
||||
|
||||
def _build_empty_workspace_summary() -> dict:
|
||||
return {
|
||||
"highest_risk_level": "-",
|
||||
"export_allowed": "否",
|
||||
"notify_status": "待处理",
|
||||
"export_status": "待处理",
|
||||
"download_url": "",
|
||||
"file_count": 0,
|
||||
"page_count": 0,
|
||||
}
|
||||
|
||||
|
||||
def _build_conversation_context(
|
||||
conversation: Conversation,
|
||||
batch: SubmissionBatch | None,
|
||||
|
||||
Reference in New Issue
Block a user