Files
MushroomEmpire/api/routers/chatbot.py
2025-11-07 23:37:42 +05:30

62 lines
1.8 KiB
Python

import ollama
import chromadb
from pypdf import PdfReader
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn
client = chromadb.Client()
collection = client.create_collection(name="docs")
reader = PdfReader('../../GDPRArticles.pdf')
chunks = [page.extract_text().strip() for page in reader.pages if page.extract_text().strip()]
print("Done reading pages!")
for i, chunk in enumerate(chunks):
response = ollama.embed(model="nomic-embed-text", input=chunk)
embedding = response["embeddings"][0]
collection.add(
ids=[str(i)],
embeddings=[embedding],
documents=[chunk]
)
print("Embeddings done!")
app = FastAPI()
# Allow browser calls from the frontend
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ChatRequest(BaseModel):
prompt: str
@app.post("/chat")
async def chat_bot(prompt: str | None = None, body: ChatRequest | None = None):
# Accept prompt from either query (?prompt=) or JSON body {"prompt": "..."}
query = prompt or (body.prompt if body else None)
if not query:
raise HTTPException(status_code=400, detail="Missing prompt")
response = ollama.embed(model="nomic-embed-text", input=query)
query_embedding = response["embeddings"][0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=1
)
data = results['documents'][0][0]
output = ollama.generate(
model="llama3.2",
prompt=f"Context: {data}\n\nQuestion: {query}\n\nAnswer:"
)
return {"response": output["response"]}
if __name__ == '__main__':
uvicorn.run(app, port=8080, host='0.0.0.0')