fix: responder a partir dos livros com embeddings em português
Usa o modelo multilingual, ignora trechos curtos e o template do Llama 3.2 para a resposta sair em uma frase completa. O chat deixa a API livre durante a geração, o upload indexa o PDF e os agendamentos não são gravados duas vezes.
This commit is contained in:
1 parent
7af7ba530d
commit
8eeb6b89f4
11 files changed
+185
-90
No files matched your search
+23
-10
@@ -1,5 +1,7 @@
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
import uuid
|
||||
from typing import List
|
||||
|
||||
from fastapi import FastAPI, File, HTTPException, UploadFile
|
||||
@@ -69,12 +71,30 @@ def load_schedules():
|
||||
return []
|
||||
|
||||
|
||||
def index_pdf(file_path: str, filename: str):
|
||||
from app.services.pdf_processor import PDFProcessor
|
||||
from app.utils.embeddings import EmbeddingService
|
||||
|
||||
title = os.path.splitext(os.path.basename(filename))[0].replace("-", " ").replace("_", " ")
|
||||
processor = PDFProcessor(EmbeddingService())
|
||||
chunks = processor.embed_chunks(
|
||||
processor.load_and_split(
|
||||
file_path,
|
||||
{"title": title, "author": "Desconhecido", "type": "book"},
|
||||
)
|
||||
)
|
||||
for chunk in chunks:
|
||||
chunk["id"] = str(uuid.uuid4())
|
||||
get_qdrant().add_chunks(chunks)
|
||||
|
||||
|
||||
def save_schedules(schedules: list):
|
||||
parent = os.path.dirname(SCHEDULES_PATH)
|
||||
if parent:
|
||||
os.makedirs(parent, exist_ok=True)
|
||||
with open(SCHEDULES_PATH, "w", encoding="utf-8") as handle:
|
||||
json.dump(schedules, handle, indent=2)
|
||||
handle.write("\n")
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
@@ -96,7 +116,7 @@ async def get_books():
|
||||
|
||||
|
||||
@app.post("/api/chat", response_model=ChatResponse)
|
||||
async def chat(request: ChatRequest):
|
||||
def chat(request: ChatRequest):
|
||||
try:
|
||||
return get_rag().query(request.message, request.top_k)
|
||||
except Exception as exc:
|
||||
@@ -114,7 +134,8 @@ async def upload_pdf(file: UploadFile = File(...)):
|
||||
content = await file.read()
|
||||
with open(file_path, "wb") as handle:
|
||||
handle.write(content)
|
||||
return UploadResponse(message="File uploaded successfully", filename=file.filename)
|
||||
await asyncio.to_thread(index_pdf, file_path, file.filename)
|
||||
return UploadResponse(message="File uploaded and indexed", filename=file.filename)
|
||||
except Exception as exc:
|
||||
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
||||
|
||||
@@ -126,15 +147,7 @@ async def get_schedules():
|
||||
|
||||
@app.post("/api/schedules", response_model=ScheduleInfo)
|
||||
async def create_schedule(request: ScheduleRequest):
|
||||
schedules = load_schedules()
|
||||
new_schedule = schedule_manager.add_schedule(request.model_dump())
|
||||
if not any(item.get("id") == new_schedule["id"] for item in schedules):
|
||||
schedules.append(new_schedule)
|
||||
save_schedules(schedules)
|
||||
try:
|
||||
bot_service.add_schedule(new_schedule)
|
||||
except Exception as exc:
|
||||
print(f"Warning: Could not add schedule to bot: {exc}")
|
||||
return ScheduleInfo(**new_schedule)
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user