myrmidon / python /src /server /services /librarian /file_archiver.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
3.15 kB
import uuid
from ...config.logfire_config import get_logger
from ...repositories.knowledge_repository import KnowledgeRepository
from ...services.source_management_service import extract_source_summary, update_source_info
from ...utils import get_supabase_client
from ..knowledge.chunking_service import KnowledgeChunkingService
from ..shared_constants import AgentUUIDs
logger = get_logger(__name__)
class FileArchiver:
def __init__(self, supabase=None, repo=None, chunker=None):
self.supabase = supabase or get_supabase_client()
self.repo = repo or KnowledgeRepository(self.supabase)
self.chunker = chunker or KnowledgeChunkingService()
async def archive_file(
self,
file_name: str,
content: str,
file_path: str,
knowledge_type: str = "technical",
authority_level: str = "normal",
) -> str:
"""
Archives a local file into the knowledge base.
"""
try:
# 1. Generate Source ID
safe_name = "".join(c for c in file_name if c.isalnum()).lower()
unique_suffix = str(uuid.uuid4())[:8]
source_id = f"file-{safe_name}-{unique_suffix}"
# 2. Metadata
title = file_name
word_count = len(content.split())
tags = ["file_upload", "seeded_knowledge"]
if authority_level == "high":
tags.append("policy")
summary = await extract_source_summary(source_id, content)
logger.info(f"Librarian: Archiving file | source_id={source_id} | file={file_name}")
# 3. Source Info
await update_source_info(
client=self.supabase,
source_id=source_id,
summary=summary,
word_count=word_count,
content=content,
knowledge_type=knowledge_type,
tags=tags,
source_display_name=title,
original_url=f"file://{file_path}",
)
# 4. Content & Embedding
page_data_list = await self.chunker.process_document_into_pages(
source_id=source_id,
content=content,
base_url=f"file://{file_path}",
metadata={
"knowledge_type": knowledge_type,
"tags": tags,
"file_path": file_path,
},
title_prefix=title,
)
if page_data_list:
self.repo.insert_crawled_page(page_data_list)
# 5. Record version
self.repo.insert_document_version(
document_id=source_id,
field_name="knowledge_file",
change_summary=f"Indexed local file: {file_name}",
content={"source_id": source_id, "file": file_name, "path": file_path},
created_by=AgentUUIDs.LIBRARIAN,
)
return source_id
except Exception as e:
logger.error(f"Librarian: Failed to archive file {file_name} | error={str(e)}")
return ""