feat(knowledge-base): 增加全局知识库管理
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user