# Using the Messages data format In the previous guides, we built chatbots where the conversation history was stored in a list of tuple pairs. It is also possible to use the more flexible [Messages API](https://huggingface.co/docs/text-generation-inference/en/messages_api#messages-api), which is fully compatible with LLM API providers such as Hugging Face Text Generation Inference, Llama.cpp server, and OpenAI's chat completions API. To use this format, set the `type` parameter of `gr.Chatbot` or `gr.ChatInterface` to `'messages'`. This expects a list of dictionaries with content and role keys. The `role` key should be `'assistant'` for the bot/llm and `user` for the human. The `content` key can be one of three things: 1. A string (markdown supported) to display a simple text message 2. A dictionary (or `gr.FileData`) to display a file. At minimum this dictionary should contain a `path` key corresponding to the path to the file. Full documenation of this dictionary is in the appendix of this guide. 3. A gradio component - at present `gr.Plot`, `gr.Image`, `gr.Gallery`, `gr.Video`, `gr.Audio` are supported. For better type hinting and auto-completion in your IDE, you can use the `gr.ChatMessage` dataclass: ```python from gradio import ChatMessage def chat_function(message, history): history.append(ChatMessage(role="user", content=message)) history.append(ChatMessage(role="assistant", content="Hello, how can I help you?")) return history ``` ## Examples The following chatbot will always greet the user with "Hello" ```python import gradio as gr def chat_greeter(msg, history): history.append({"role": "assistant", "content": "Hello!"}) return history with gr.Blocks() as demo: chatbot = gr.Chatbot(type="messages") msg = gr.Textbox() clear = gr.ClearButton([msg, chatbot]) msg.submit(chat_greeter, [msg, chatbot], [chatbot]) demo.launch() ``` The messages format lets us seemlessly stream from the Hugging Face Inference API - ```python import gradio as gr from huggingface_hub import InferenceClient client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") def respond(message, history: list[dict]): messages = history + [{"role": "user", "content": message}] print(messages) response = {"role": "assistant", "content": ""} for message in client.chat_completion( messages, max_tokens=512, stream=True, temperature=0.7, top_p=0.95, ): token = message.choices[0].delta.content response['content'] += token yield response demo = gr.ChatInterface(respond, type="messages") if __name__ == "__main__": demo.launch() ``` ### Appendix The full contents of the dictionary format for files is documented here ```python class FileDataDict(TypedDict): path: str # server filepath url: NotRequired[Optional[str]] # normalised server url size: NotRequired[Optional[int]] # size in bytes orig_name: NotRequired[Optional[str]] # original filename mime_type: NotRequired[Optional[str]] is_stream: NotRequired[bool] meta: dict[Literal["_type"], Literal["gradio.FileData"]] ```