| # 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"]] | |
| ``` |