import os from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse, StreamingResponse from pydantic import BaseModel from openai import OpenAI from dotenv import load_dotenv load_dotenv() client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=os.getenv("OPENROUTER_API_KEY"), ) app = FastAPI(title="Simple Chatbot") class Message(BaseModel): role: str content: str class ChatRequest(BaseModel): messages: list[Message] @app.post("/api/chat") async def chat(request: ChatRequest): """Stream a chat completion from OpenRouter.""" def generate(): stream = client.chat.completions.create( model="openrouter/free", messages=[m.model_dump() for m in request.messages], stream=True, ) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: yield chunk.choices[0].delta.content return StreamingResponse(generate(), media_type="text/plain") # Serve the frontend app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/") async def root(): return FileResponse("static/index.html")