import gradio as gr
from llama_cpp import Llama

# Load the Mistral model
llm = Llama.from_pretrained(
    repo_id="bartowski/Mistral-Small-Instruct-2409-GGUF",
    filename="Mistral-Small-Instruct-2409-Q5_K_L.gguf",
)

def respond(
    message,
    history: list[tuple[str, str]],
    system_message,
    max_tokens,
    temperature,
    top_p,
):
    messages = [{"role": "system", "content": system_message or "You are a friendly Chatbot."}]

    # Add history to messages, ensuring no None values
    for val in history:
        user_message = val[0] if val[0] is not None else ""
        assistant_message = val[1] if val[1] is not None else ""

        if user_message:
            messages.append({"role": "user", "content": user_message})
        if assistant_message:
            messages.append({"role": "assistant", "content": assistant_message})

    # Add the current user message, ensure it's not None
    if message:
        messages.append({"role": "user", "content": message})

    # Generate the response using the Mistral model
    response = llm.create_chat_completion(messages=messages)
    print("response:", response)
    
    return response["choices"][0]["message"]["content"]  # Adjust based on your model's output format

# Set up Gradio Chat Interface
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (nucleus sampling)",
        ),
    ],
)

if __name__ == "__main__":
    demo.launch()