Spaces:
Paused
Paused
| from __future__ import annotations | |
| import os | |
| from typing import Any | |
| from fastapi import APIRouter, Header, HTTPException, Query | |
| from pydantic import BaseModel, Field | |
| from knowledge_base.loader import append_entry | |
| from knowledge_base.retriever import rebuild, retrieve | |
| router = APIRouter(prefix="/api/knowledge", tags=["knowledge"]) | |
| class KnowledgeCreateRequest(BaseModel): | |
| title: str = Field(..., min_length=1, max_length=200) | |
| topic: str = Field(..., min_length=1, max_length=100) | |
| content: str = Field(..., min_length=1, max_length=6000) | |
| source: str = Field(..., min_length=1, max_length=200) | |
| tags: list[str] = Field(default_factory=list) | |
| def _require_admin_key(x_admin_key: str | None) -> None: | |
| admin_key = os.getenv("ADMIN_KEY") | |
| if not admin_key or x_admin_key != admin_key: | |
| raise HTTPException(status_code=401, detail="Unauthorized") | |
| async def add_knowledge_item(payload: KnowledgeCreateRequest, x_admin_key: str | None = Header(default=None, alias="X-Admin-Key")): | |
| _require_admin_key(x_admin_key) | |
| entry = append_entry(payload.model_dump()) | |
| rebuild() | |
| return {"status": "ok", "entry": entry} | |
| async def search_knowledge(q: str = Query(..., min_length=1, max_length=500), top_k: int = Query(default=5, ge=1, le=10)): | |
| results = retrieve(q, top_k=top_k) | |
| return {"query": q, "results": results} | |