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 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)