1- from fastapi import FastAPI , Request , Form , Response
1+ from fastapi import FastAPI , Request , Form
22from fastapi .responses import HTMLResponse , RedirectResponse
33from fastapi .templating import Jinja2Templates
44from fastapi .staticfiles import StaticFiles
55from starlette .middleware .sessions import SessionMiddleware
66from deepseek_wrapper import DeepSeekClient , DeepSeekConfig
7- import asyncio
87import os
8+ from datetime import datetime
99
1010app = FastAPI ()
1111app .add_middleware (SessionMiddleware , secret_key = os .getenv ("SESSION_SECRET_KEY" , "supersecret" ))
1414
1515client = DeepSeekClient ()
1616
17+ def now_str ():
18+ return datetime .now ().strftime ("%H:%M:%S" )
19+
1720@app .get ("/" , response_class = HTMLResponse )
18- def home (request : Request ):
21+ async def home (request : Request ):
1922 history = request .session .get ("history" , [])
20- return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history })
23+ return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history , "error" : None , "loading" : False })
2124
2225@app .post ("/chat" , response_class = HTMLResponse )
23- def chat (request : Request , user_message : str = Form (...)):
26+ async def chat (request : Request , user_message : str = Form (...)):
2427 history = request .session .get ("history" , [])
25- history .append ({"role" : "user" , "content" : user_message })
28+ history .append ({"role" : "user" , "content" : user_message , "timestamp" : now_str ()})
29+ error = None
30+ loading = True
2631 try :
27- response = client .chat_completion (history )
32+ response = await client .async_chat_completion (history )
33+ loading = False
2834 except Exception as e :
2935 response = f"Error: { e } "
30- history .append ({"role" : "assistant" , "content" : response })
36+ error = str (e )
37+ loading = False
38+ history .append ({"role" : "assistant" , "content" : response , "timestamp" : now_str ()})
3139 request .session ["history" ] = history
32- return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history })
40+ return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history , "error" : error , "loading" : loading })
3341
3442@app .post ("/completions" , response_class = HTMLResponse )
35- def completions (request : Request , prompt : str = Form (...)):
43+ async def completions (request : Request , prompt : str = Form (...)):
3644 history = request .session .get ("history" , [])
45+ error = None
46+ loading = True
3747 try :
38- response = client .generate_text (prompt )
48+ response = await client .async_generate_text (prompt )
49+ loading = False
3950 except Exception as e :
4051 response = f"Error: { e } "
41- history .append ({"role" : "user" , "content" : prompt })
42- history .append ({"role" : "assistant" , "content" : response })
52+ error = str (e )
53+ loading = False
54+ history .append ({"role" : "user" , "content" : prompt , "timestamp" : now_str ()})
55+ history .append ({"role" : "assistant" , "content" : response , "timestamp" : now_str ()})
4356 request .session ["history" ] = history
44- return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history })
57+ return templates .TemplateResponse ("chat.html" , {"request" : request , "messages" : history , "error" : error , "loading" : loading })
4558
4659@app .post ("/reset" , response_class = HTMLResponse )
47- def reset (request : Request ):
60+ async def reset (request : Request ):
4861 request .session ["history" ] = []
4962 return RedirectResponse ("/" , status_code = 303 )
0 commit comments