96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
from ninja import Router
|
|
|
|
from apps.accounts.api import require_permission
|
|
from apps.knowledge.models import KnowledgeBase, KnowledgeItem
|
|
from apps.knowledge.schemas import (
|
|
KnowledgeBaseIn,
|
|
KnowledgeBaseOut,
|
|
KnowledgeDocumentIn,
|
|
KnowledgeDocumentOut,
|
|
KnowledgeItemIn,
|
|
KnowledgeItemOut,
|
|
KnowledgeSearchIn,
|
|
KnowledgeSearchResultOut,
|
|
)
|
|
from apps.knowledge.services import ingest_document_text, rebuild_item_chunks, retrieve_knowledge
|
|
|
|
router = Router(tags=["knowledge"])
|
|
|
|
|
|
@router.post("/bases", response=KnowledgeBaseOut)
|
|
def create_knowledge_base(request, payload: KnowledgeBaseIn):
|
|
require_permission(request, "knowledge.manage")
|
|
return KnowledgeBase.objects.create(
|
|
name=payload.name,
|
|
description=payload.description,
|
|
scope=payload.scope,
|
|
enabled=payload.enabled,
|
|
created_by=request.user if request.user.is_authenticated else None,
|
|
)
|
|
|
|
|
|
@router.get("/bases", response=list[KnowledgeBaseOut])
|
|
def list_knowledge_bases(request, enabled: bool | None = None):
|
|
require_permission(request, "knowledge.view")
|
|
queryset = KnowledgeBase.objects.all()
|
|
if enabled is not None:
|
|
queryset = queryset.filter(enabled=enabled)
|
|
return queryset[:100]
|
|
|
|
|
|
@router.post("/items", response=KnowledgeItemOut)
|
|
def create_knowledge_item(request, payload: KnowledgeItemIn):
|
|
require_permission(request, "knowledge.manage")
|
|
item = KnowledgeItem.objects.create(
|
|
knowledge_base_id=payload.knowledge_base_id,
|
|
title=payload.title,
|
|
problem=payload.problem,
|
|
applicable_scope=payload.applicable_scope,
|
|
error_code=payload.error_code,
|
|
root_cause=payload.root_cause,
|
|
troubleshooting_steps=payload.troubleshooting_steps,
|
|
solution=payload.solution,
|
|
risk_note=payload.risk_note,
|
|
status=payload.status,
|
|
created_by=request.user if request.user.is_authenticated else None,
|
|
)
|
|
rebuild_item_chunks(item)
|
|
return item
|
|
|
|
|
|
@router.get("/items", response=list[KnowledgeItemOut])
|
|
def list_knowledge_items(
|
|
request,
|
|
knowledge_base_id: int | None = None,
|
|
status: str | None = None,
|
|
):
|
|
require_permission(request, "knowledge.view")
|
|
queryset = KnowledgeItem.objects.all()
|
|
if knowledge_base_id:
|
|
queryset = queryset.filter(knowledge_base_id=knowledge_base_id)
|
|
if status:
|
|
queryset = queryset.filter(status=status)
|
|
return queryset[:100]
|
|
|
|
|
|
@router.post("/documents", response=KnowledgeDocumentOut)
|
|
def create_knowledge_document(request, payload: KnowledgeDocumentIn):
|
|
require_permission(request, "knowledge.manage")
|
|
return ingest_document_text(
|
|
knowledge_base_id=payload.knowledge_base_id,
|
|
file_name=payload.file_name,
|
|
file_type=payload.file_type,
|
|
content=payload.content,
|
|
operator=request.user if request.user.is_authenticated else None,
|
|
)
|
|
|
|
|
|
@router.post("/search", response=list[KnowledgeSearchResultOut])
|
|
def search_knowledge(request, payload: KnowledgeSearchIn):
|
|
require_permission(request, "knowledge.view")
|
|
return retrieve_knowledge(
|
|
query=payload.query,
|
|
knowledge_base_id=payload.knowledge_base_id,
|
|
limit=min(max(payload.limit, 1), 20),
|
|
)
|