69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
import io
|
|
|
|
import pandas as pd
|
|
from api import companies, investors
|
|
from db.db import db_dependency, init_database
|
|
from fastapi import FastAPI, File, UploadFile
|
|
from py_schemas import InvestorList
|
|
from pydantic import BaseModel
|
|
from services.openrouter_v2 import InvestorProcessor
|
|
from services.querying import QueryProcessor
|
|
|
|
app = FastAPI()
|
|
init_database()
|
|
|
|
|
|
# Request models
|
|
class QueryRequest(BaseModel):
|
|
question: str
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"question": "Show me growth stage fintech investors in the US with check sizes over $1 million"
|
|
}
|
|
}
|
|
|
|
|
|
@app.get("/")
|
|
def health():
|
|
return {"Hello": "World"}
|
|
|
|
|
|
@app.post("/parse-csv", tags=["CSV Upload"], response_model=list[dict])
|
|
async def parse_csv(db: db_dependency, file: UploadFile = File(...)):
|
|
# Read uploaded CSV with pandas
|
|
content = await file.read()
|
|
df = pd.read_csv(io.StringIO(content.decode("utf-8")))
|
|
|
|
# Process the dataframe
|
|
processor = InvestorProcessor(sql_session=db)
|
|
results = await processor.process_csv(df)
|
|
|
|
# Convert Pydantic objects to dictionaries
|
|
return [r.model_dump() for r in results]
|
|
|
|
|
|
@app.post("/query", response_model=InvestorList, tags=["Querying"])
|
|
async def query_investors(db: db_dependency, request: QueryRequest):
|
|
"""
|
|
Query investors using natural language.
|
|
|
|
Supports queries like:
|
|
- "Show me seed stage investors"
|
|
- "Find fintech investors in Silicon Valley"
|
|
- "Growth stage investors with $5M+ check sizes"
|
|
- "Healthcare investors in Europe"
|
|
"""
|
|
processor = QueryProcessor(sql_session=db)
|
|
results = processor.process_query(request.question)
|
|
return results
|
|
|
|
|
|
app.include_router(investors.router)
|
|
app.include_router(companies.router)
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
|
|
uvicorn.run(app="main:app", host="localhost", port=8000, reload=True)
|