import gradio as gr from gradio_client.utils import encode_url_or_file_to_base64 from huggingface_hub import InferenceClient def chat_1(history, prompt, image, oauth_token: gr.OAuthToken | None, request: gr.Request): if oauth_token is None: raise ValueError("Please log in to use this Space.") if history is None: history = [] client = InferenceClient( provider="nebius", api_key=oauth_token.token, ) user_messages = [{"role": "user", "content": prompt}] content = [ { "type": "text", "text": prompt } ] if image is not None: file_url = "https://abidlabs-smol-arena.hf.space/gradio_api/file=" + image print(">>>>>>>>>>>>>", file_url) content.append({ "type": "image_url", "image_url": { "url": file_url } }) yield history + user_messages messages = [ { "role": "user", "content": content } ] stream = client.chat.completions.create( model="google/gemma-3-27b-it", messages=messages, max_tokens=500, stream=True, ) response = "" for chunk in stream: if chunk.choices: response += chunk.choices[0].delta.content yield history + user_messages + [{"role": "assistant", "content": response}] def chat_2(history, prompt, image, oauth_token: gr.OAuthToken | None, request: gr.Request): if oauth_token is None: raise ValueError("Please log in to use this Space.") if history is None: history = [] client = InferenceClient( provider="together", api_key=oauth_token.token, ) user_messages = [{"role": "user", "content": prompt}] content = [ { "type": "text", "text": prompt } ] if image is not None: file_url = "https://abidlabs-smol-arena.hf.space/gradio_api/file=" + image print(">>>>>>>>>>>>>", file_url) content.append({ "type": "image_url", "image_url": { "url": file_url } }) yield history + user_messages messages = [ { "role": "user", "content": content } ] stream = client.chat.completions.create( model="meta-llama/Llama-4-Scout-17B-16E-Instruct", messages=messages, max_tokens=500, stream=True, ) response = "" for chunk in stream: if chunk.choices: response += chunk.choices[0].delta.content yield history + user_messages + [{"role": "assistant", "content": response}] def chat_labels(models): names = [] models = models or [] if len(models) > 0: names.append(models[0]) else: names.append("Chatbot 1") if len(models) > 1: names.append(models[1]) else: names.append("Chatbot 2") return gr.Chatbot(label=names[0], type="messages"), gr.Chatbot(label=names[1], type="messages") with gr.Blocks() as demo: with gr.Sidebar(): gr.Markdown("## Smol Arena") gr.Markdown("Welcome to Smol Arena! This is a Space that allows you to test LLMs / VLMs that have less than 30B active parameters. \n\nInference is provided by [Hugging Face Inference API](https://huggingface.co/inference-api) so please log in to use this Space.") gr.LoginButton() dropdown = gr.Dropdown(multiselect=True, choices=["Gemma 3 (27b)", "Llama 4 (scout)"], value=["Gemma 3 (27b)", "Llama 4 (scout)"], max_choices=2, label="Select 2 models to compare.", interactive=False) with gr.Row(): with gr.Column(): gr.Markdown("Optional image to ask the model about") image = gr.Image(type="filepath", label="Optional Image") chatbot_1 = gr.Chatbot(type="messages") chatbot_2 = gr.Chatbot(type="messages") textbox = gr.Textbox(label="Prompt") gr.on( [dropdown.change, demo.load], fn=chat_labels, inputs=[dropdown], outputs=[chatbot_1, chatbot_2], ) textbox.submit(fn=chat_1, inputs=[chatbot_1, textbox, image], outputs=[chatbot_1]) textbox.submit(fn=chat_2, inputs=[chatbot_2, textbox, image], outputs=[chatbot_2]) textbox.submit(lambda: "", inputs=[], outputs=[textbox]) demo.launch()