Tamal321 commited on
Commit
edb4516
·
1 Parent(s): c9975dd

feat: initialize project with FastAPI backend and OpenRouter chat integration

Browse files
Files changed (2) hide show
  1. .gitignore +0 -1
  2. main.py +51 -0
.gitignore CHANGED
@@ -8,5 +8,4 @@ wheels/
8
 
9
  # Virtual environments
10
  .venv
11
- main.py
12
  .env
 
8
 
9
  # Virtual environments
10
  .venv
 
11
  .env
main.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from fastapi import FastAPI
3
+ from fastapi.staticfiles import StaticFiles
4
+ from fastapi.responses import FileResponse, StreamingResponse
5
+ from pydantic import BaseModel
6
+ from openai import OpenAI
7
+ from dotenv import load_dotenv
8
+
9
+ load_dotenv()
10
+
11
+ client = OpenAI(
12
+ base_url="https://openrouter.ai/api/v1",
13
+ api_key=os.getenv("OPENROUTER_API_KEY"),
14
+ )
15
+
16
+ app = FastAPI(title="Simple Chatbot")
17
+
18
+
19
+ class Message(BaseModel):
20
+ role: str
21
+ content: str
22
+
23
+
24
+ class ChatRequest(BaseModel):
25
+ messages: list[Message]
26
+
27
+
28
+ @app.post("/api/chat")
29
+ async def chat(request: ChatRequest):
30
+ """Stream a chat completion from OpenRouter."""
31
+
32
+ def generate():
33
+ stream = client.chat.completions.create(
34
+ model="openrouter/free",
35
+ messages=[m.model_dump() for m in request.messages],
36
+ stream=True,
37
+ )
38
+ for chunk in stream:
39
+ if chunk.choices and chunk.choices[0].delta.content:
40
+ yield chunk.choices[0].delta.content
41
+
42
+ return StreamingResponse(generate(), media_type="text/plain")
43
+
44
+
45
+ # Serve the frontend
46
+ app.mount("/static", StaticFiles(directory="static"), name="static")
47
+
48
+
49
+ @app.get("/")
50
+ async def root():
51
+ return FileResponse("static/index.html")