import os import gradio as gr from typing import Iterator from dialog import get_dialog_box from gateway import check_server_health, request_generation # CONSTANTS MAX_NEW_TOKENS: int = 2048 # GET ENVIRONMENT VARIABLES CLOUD_GATEWAY_API = os.getenv("API_ENDPOINT") def toggle_ui(): """ Function to toggle the visibility of the UI based on the server health Returns: hide/show main ui/dialog """ health = check_server_health(cloud_gateway_api=CLOUD_GATEWAY_API) if health: return gr.update(visible=True), gr.update(visible=False) # Show main UI, hide dialog else: return gr.update(visible=False), gr.update(visible=True) # Hide main UI, show dialog def generate( message: str, chat_history: list, system_prompt: str, max_new_tokens: int = 1024, temperature: float = 0.6, top_p: float = 0.9, top_k: int = 50, repetition_penalty: float = 1.2, ) -> Iterator[str]: """Send a request to backend, fetch the streaming responses and emit to the UI. Args: message (str): input message from the user chat_history (list[tuple[str, str]]): entire chat history of the session system_prompt (str): system prompt max_new_tokens (int, optional): maximum number of tokens to generate, ignoring the number of tokens in the prompt. Defaults to 1024. temperature (float, optional): the value used to module the next token probabilities. Defaults to 0.6. top_p (float, optional): if set to float<1, only the smallest set of most probable tokens with probabilities that add up to top_p or higher are kept for generation. Defaults to 0.9. top_k (int, optional): the number of highest probability vocabulary tokens to keep for top-k-filtering. Defaults to 50. repetition_penalty (float, optional): the parameter for repetition penalty. 1.0 means no penalty. Defaults to 1.2. Yields: Iterator[str]: Streaming responses to the UI """ # sample method to yield responses from the llm model outputs = [] for text in request_generation(message=message, system_prompt=system_prompt, max_new_tokens=max_new_tokens, temperature=temperature, top_p=top_p, top_k=top_k, repetition_penalty=repetition_penalty, cloud_gateway_api=CLOUD_GATEWAY_API): outputs.append(text) yield "".join(outputs) chat_interface = gr.ChatInterface( fn=generate, additional_inputs=[ gr.Textbox(label="System prompt", lines=6), gr.Slider( label="Max New Tokens", minimum=1, maximum=MAX_NEW_TOKENS, step=1, value=1024, ), gr.Slider( label="Temperature", minimum=0.1, maximum=4.0, step=0.1, value=0.1, ), gr.Slider( label="Top-p (nucleus sampling)", minimum=0.05, maximum=1.0, step=0.05, value=0.95, ), gr.Slider( label="Top-k", minimum=1, maximum=1000, step=1, value=50, ), gr.Slider( label="Repetition penalty", minimum=1.0, maximum=2.0, step=0.05, value=1.2, ), ], stop_btn=None, examples=[ ["Hello there! How are you doing?"], ["Can you explain briefly to me what is the Python programming language?"], ["Explain the plot of Cinderella in a sentence."], ["How many hours does it take a man to eat a Helicopter?"], ["Write a 100-word article on 'Benefits of Open-Source in AI research'."], ], cache_examples=False, chatbot=gr.Chatbot( height=600) ) with gr.Blocks(css="style.css", theme=gr.themes.Default()) as demo: # Get the server status before displaying UI visibility = check_server_health(CLOUD_GATEWAY_API) # Container for the main interface with gr.Column(visible=visibility, elem_id="main_ui") as main_ui: gr.Markdown(f""" # Llama-3 8B Chat This Space is an Alpha release that demonstrates model [Llama-3-8b-chat](https://huggingface.co/meta-llama/Meta-Llama-3-8B) by Meta, a Llama 3 model with 8B parameters fine-tuned for chat instructions, running on AMD MI210 infrastructure. Feel free to play with it! """) chat_interface.render() # Dialog box using Markdown for the error message with gr.Row(visible=(not visibility), elem_id="dialog_box") as dialog_box: # Add spinner and message get_dialog_box() # Timer to check server health every 5 seconds and update UI timer = gr.Timer(value=10) timer.tick(fn=toggle_ui, outputs=[main_ui, dialog_box]) if __name__ == "__main__": demo.queue(max_size=int(os.getenv("QUEUE"))).launch()