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), )