import openai
import transformers
import gradio as gr

# Set up the OpenAI API client
openai.api_key = "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"

# Define the chat function for OpenAI API
def openai_chat(api_key, model, message):
    # Check if an API key has been provided
    if api_key is None:
        return "Please enter your OpenAI API key and try again."
    
    # Set up the OpenAI API request
    response = openai.Completion.create(
        engine=model,
        prompt=message,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5,
        api_key=api_key,
    )
    
    # Extract the bot's response from the API request
    bot_response = response.choices[0].text.strip()
    
    return bot_response

# Define the chat function for Hugging Face API
def hf_chat(model_name, message):
    # Load the model and tokenizer
    model = transformers.pipeline("text-generation", model=model_name)
    
    # Generate a response from the model
    bot_response = model(message, max_length=1024, do_sample=True, temperature=0.7)[0]["generated_text"]
    
    return bot_response

# Define the Gradio interface for chatbot
api_key_input = gr.inputs.Textbox(label="OpenAI API Key", default=None, block="sidebar")
model_input = gr.inputs.Dropdown(
    label="Select OpenAI model",
    choices=["davinci", "curie", "babbage"],
    default="davinci",
    block="sidebar"
)
hf_model_input = gr.inputs.Dropdown(
    label="Select Hugging Face model",
    choices=["microsoft/DialoGPT-large", "Salesforce/codegen-2B-multi", "microsoft/DialoGPT-small"],
    default="microsoft/DialoGPT-large",
    block="sidebar"
)
mode_input = gr.inputs.Dropdown(
    label="Select chatbot mode",
    choices=["OpenAI", "Hugging Face"],
    default="OpenAI",
    block="sidebar"
)
message_input = gr.inputs.Textbox(label="Enter your message here", block="input")
output = gr.outputs.Textbox(label="Bot response", block="output")

# Define the chat window
chat_window = []

def chatbot(chat_window, message, mode, model, hf_model, api_key, send_button, clear_button):
    if clear_button:
        chat_window.clear()
        return "Chat history cleared."
    if send_button:
        if message:
            if mode == "Hugging Face":
                bot_response = hf_chat(hf_model, message)
            else:
                bot_response = openai_chat(api_key, model, message)
            chat_window.append(("User", message))
            chat_window.append(("Bot", bot_response))
    return "\n".join([f"{name}: {text}" for name, text in chat_window])

# Define the Gradio interface for chatbot
send_button = gr.inputs.Button(label="Send")
clear_button = gr.inputs.Button(label="Clear Chat History")
chat_interface = gr.Interface(
    fn=chatbot,
    inputs=[
        message_input,
        mode_input,
        model_input,
        hf_model_input,
        api_key_input,
        send_button,
        clear_button
    ],
    outputs=output,
    title="Chatbot",
    description="Enter your message below to chat with an AI",
    theme="compact",
    allow_flagging=False,
    allow_screenshot=False,
    allow_share=False,
    layout="vertical"
)

# Launch the page
chat_interface.launch()