Spaces:
Running
Running
import os | |
import gradio as gr | |
from dotenv import load_dotenv | |
from openai import OpenAI | |
from fastapi import FastAPI | |
import threading | |
import uvicorn | |
from prompts.initial_prompt import INITIAL_PROMPT | |
from prompts.main_prompt import MAIN_PROMPT | |
# β Load OpenAI API Key | |
if os.path.exists(".env"): | |
load_dotenv(".env") | |
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") | |
client = OpenAI(api_key=OPENAI_API_KEY) | |
# β FastAPI App for Serving Prompts | |
fastapi_app = FastAPI() | |
async def get_initial_prompt(): | |
return {"prompt": INITIAL_PROMPT} | |
async def get_main_prompt(): | |
return {"prompt": MAIN_PROMPT} | |
# β Chatbot Function | |
def gpt_call(history, user_message, | |
model="gpt-4o-mini", | |
max_tokens=512, | |
temperature=0.7, | |
top_p=0.95): | |
""" | |
OpenAI ChatCompletion API call | |
""" | |
messages = [{"role": "system", "content": MAIN_PROMPT}] | |
for user_text, assistant_text in history: | |
if user_text: | |
messages.append({"role": "user", "content": user_text}) | |
if assistant_text: | |
messages.append({"role": "assistant", "content": assistant_text}) | |
messages.append({"role": "user", "content": user_message}) | |
completion = client.chat.completions.create( | |
model=model, | |
messages=messages, | |
max_tokens=max_tokens, | |
temperature=temperature, | |
top_p=top_p | |
) | |
return completion.choices[0].message.content | |
# β Gradio Chatbot UI | |
def respond(user_message, history): | |
if not user_message: | |
return "", history | |
assistant_reply = gpt_call(history, user_message) | |
history.append((user_message, assistant_reply)) | |
return "", history | |
# β Gradio UI | |
def launch_gradio(): | |
with gr.Blocks() as gradio_app: | |
gr.Markdown("## Simple Chat Interface") | |
chatbot = gr.Chatbot( | |
value=[{"role": "assistant", "content": INITIAL_PROMPT}], | |
height=500, | |
type="messages" | |
) | |
state_history = gr.State([("", INITIAL_PROMPT)]) | |
user_input = gr.Textbox( | |
placeholder="Type your message here...", | |
label="Your Input" | |
) | |
user_input.submit( | |
respond, | |
inputs=[user_input, state_history], | |
outputs=[user_input, chatbot] | |
).then( | |
fn=lambda _, h: h, | |
inputs=[user_input, chatbot], | |
outputs=[state_history] | |
) | |
gradio_app.launch(server_name="0.0.0.0", server_port=7860, show_error=True, enable_queue=True) | |
# β Run FastAPI and Gradio Separately | |
if __name__ == "__main__": | |
threading.Thread(target=launch_gradio, daemon=True).start() | |
uvicorn.run(fastapi_app, host="0.0.0.0", port=8000) | |