feat(knowledge-base): 增加全局知识库管理

This commit is contained in:
2026-06-08 21:37:32 +08:00
parent e6fa738fd5
commit 5ecf78c5d6
12 changed files with 1425 additions and 2 deletions

View File

@@ -1,5 +1,7 @@
from django.contrib.auth.decorators import login_required
from django.db.models import Count, Q
import json
from django.http import HttpRequest, HttpResponse, JsonResponse, StreamingHttpResponse
from django.shortcuts import redirect, render
from django.views.decorators.http import require_http_methods
@@ -12,6 +14,17 @@ from .services import (
stream_message,
)
from .models import ApplicationFormFillBatch, Conversation, FileAttachment, FileSummaryBatch, RegulatoryReviewBatch, WorkflowNodeRun
from .knowledge_base import build_knowledge_base_context, search_knowledge_base
from .knowledge_base import (
build_knowledge_base_context_for_user,
create_document_from_upload,
delete_document,
index_managed_document,
list_documents_for_user,
serialize_document,
update_document,
)
from .models import KnowledgeBaseDocument
from .regulatory_review.services.info_extract import ensure_regulatory_condition_candidates
@@ -94,6 +107,101 @@ def attachment_manager(request: HttpRequest) -> HttpResponse:
)
@login_required
@require_http_methods(["GET"])
def knowledge_base_manager(request: HttpRequest) -> HttpResponse:
context = build_knowledge_base_context_for_user(request.user)
return render(
request,
"knowledge_base.html",
{
"page_title": "知识库管理",
"knowledge_base": context,
},
)
@login_required
@require_http_methods(["GET"])
def knowledge_base_status(request: HttpRequest) -> JsonResponse:
return JsonResponse(build_knowledge_base_context_for_user(request.user))
@login_required
@require_http_methods(["POST"])
def knowledge_base_search(request: HttpRequest) -> JsonResponse:
if request.content_type == "application/json":
try:
payload = json.loads(request.body.decode("utf-8") or "{}")
except json.JSONDecodeError:
payload = {}
query = payload.get("query", "")
else:
query = request.POST.get("query", "")
return JsonResponse(search_knowledge_base(str(query)))
@login_required
@require_http_methods(["GET", "POST"])
def knowledge_base_documents(request: HttpRequest) -> JsonResponse:
if request.method == "GET":
return JsonResponse({"documents": list_documents_for_user(request.user)})
uploaded_file = request.FILES.get("file")
if uploaded_file is None:
return JsonResponse({"error": "请上传知识库材料。"}, status=400)
is_active = str(request.POST.get("is_active", "true")).lower() not in {"0", "false", "off"}
document = create_document_from_upload(
user=request.user,
uploaded_file=uploaded_file,
display_name=request.POST.get("display_name", ""),
description=request.POST.get("description", ""),
is_active=is_active,
)
return JsonResponse({"document": serialize_document(document)})
@login_required
@require_http_methods(["GET", "PATCH", "DELETE"])
def knowledge_base_document_detail(request: HttpRequest, document_id: int) -> JsonResponse:
try:
document = KnowledgeBaseDocument.objects.get(
pk=document_id,
user=request.user,
)
except KnowledgeBaseDocument.DoesNotExist:
return JsonResponse({"error": "知识库材料不存在。"}, status=404)
if document.status == KnowledgeBaseDocument.Status.DELETED:
return JsonResponse({"error": "知识库材料不存在。"}, status=404)
if request.method == "GET":
return JsonResponse({"document": serialize_document(document)})
if request.method == "DELETE":
delete_document(document)
return JsonResponse({"document": serialize_document(document)})
try:
payload = json.loads(request.body.decode("utf-8") or "{}")
except json.JSONDecodeError:
payload = {}
update_document(document, payload)
return JsonResponse({"document": serialize_document(document)})
@login_required
@require_http_methods(["POST"])
def knowledge_base_document_index(request: HttpRequest, document_id: int) -> JsonResponse:
try:
document = KnowledgeBaseDocument.objects.get(
pk=document_id,
user=request.user,
)
except KnowledgeBaseDocument.DoesNotExist:
return JsonResponse({"error": "知识库材料不存在。"}, status=404)
if document.status == KnowledgeBaseDocument.Status.DELETED:
return JsonResponse({"error": "知识库材料不存在。"}, status=404)
chunk_count = index_managed_document(document)
document.refresh_from_db()
return JsonResponse({"document": serialize_document(document), "chunk_count": chunk_count})
@login_required
@require_http_methods(["POST"])
def stream_chat(request: HttpRequest) -> HttpResponse: