Skip to content

Commit d35c290

Browse files
Adding more docs for using components in chatbot (#8593)
* adding more docs for components in chatbot * add changeset * add changeset * add simple demo * simple demo * notebook --------- Co-authored-by: gradio-pr-bot <[email protected]>
1 parent 7fc7455 commit d35c290

File tree

10 files changed

+143
-1
lines changed

10 files changed

+143
-1
lines changed

.changeset/evil-heads-take.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"gradio": patch
3+
"website": patch
4+
---
5+
6+
feat:Adding more docs for using components in chatbot
Binary file not shown.
Loading
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hello friends
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: chatbot_core_components_simple"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "os.mkdir('files')\n", "!wget -q -O files/audio.wav https://github.com/gradio-app/gradio/raw/main/demo/chatbot_core_components_simple/files/audio.wav\n", "!wget -q -O files/avatar.png https://github.com/gradio-app/gradio/raw/main/demo/chatbot_core_components_simple/files/avatar.png\n", "!wget -q -O files/sample.txt https://github.com/gradio-app/gradio/raw/main/demo/chatbot_core_components_simple/files/sample.txt\n", "!wget -q -O files/world.mp4 https://github.com/gradio-app/gradio/raw/main/demo/chatbot_core_components_simple/files/world.mp4"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import os\n", "import random\n", "\n", "# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.\n", "\n", "\n", "color_map = {\n", " \"harmful\": \"crimson\",\n", " \"neutral\": \"gray\",\n", " \"beneficial\": \"green\",\n", "}\n", "\n", "def html_src(harm_level):\n", " return f\"\"\"\n", "<div style=\"display: flex; gap: 5px;padding: 2px 4px;margin-top: -40px\">\n", " <div style=\"background-color: {color_map[harm_level]}; padding: 2px; border-radius: 5px;\">\n", " {harm_level}\n", " </div>\n", "</div>\n", "\"\"\"\n", "\n", "def print_like_dislike(x: gr.LikeData):\n", " print(x.index, x.value, x.liked)\n", "\n", "def add_message(history, message):\n", " for x in message[\"files\"]:\n", " history.append(((x,), None))\n", " if message[\"text\"] is not None:\n", " history.append((message[\"text\"], None))\n", " return history, gr.MultimodalTextbox(value=None, interactive=False)\n", "\n", "def bot(history, response_type):\n", " if response_type == \"gallery\":\n", " history[-1][1] = gr.Gallery(\n", " [\"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png\",\n", " \"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png\"]\n", " )\n", " elif response_type == \"image\":\n", " history[-1][1] = gr.Image(\"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png\")\n", " elif response_type == \"video\":\n", " history[-1][1] = gr.Video(\"https://github.com/gradio-app/gradio/raw/main/demo/video_component/files/world.mp4\")\n", " elif response_type == \"audio\":\n", " history[-1][1] = gr.Audio(\"https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav\")\n", " elif response_type == \"html\":\n", " history[-1][1] = gr.HTML(\n", " html_src(random.choice([\"harmful\", \"neutral\", \"beneficial\"]))\n", " )\n", " else:\n", " history[-1][1] = \"Cool!\"\n", " return history\n", "\n", "\n", "with gr.Blocks(fill_height=True) as demo:\n", " chatbot = gr.Chatbot(\n", " elem_id=\"chatbot\",\n", " bubble_full_width=False,\n", " scale=1,\n", " )\n", " response_type = gr.Radio(\n", " [\n", " \"image\",\n", " \"text\",\n", " \"gallery\",\n", " \"video\",\n", " \"audio\",\n", " \"html\",\n", " ],\n", " value=\"text\",\n", " label=\"Response Type\",\n", " )\n", "\n", " chat_input = gr.MultimodalTextbox(\n", " interactive=True,\n", " placeholder=\"Enter message or upload file...\",\n", " show_label=False,\n", " )\n", "\n", " chat_msg = chat_input.submit(\n", " add_message, [chatbot, chat_input], [chatbot, chat_input]\n", " )\n", " bot_msg = chat_msg.then(\n", " bot, [chatbot, response_type], chatbot, api_name=\"bot_response\"\n", " )\n", " bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])\n", "\n", " chatbot.like(print_like_dislike, None, None)\n", "\n", "demo.queue()\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import gradio as gr
2+
import os
3+
import random
4+
5+
# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.
6+
7+
8+
color_map = {
9+
"harmful": "crimson",
10+
"neutral": "gray",
11+
"beneficial": "green",
12+
}
13+
14+
def html_src(harm_level):
15+
return f"""
16+
<div style="display: flex; gap: 5px;padding: 2px 4px;margin-top: -40px">
17+
<div style="background-color: {color_map[harm_level]}; padding: 2px; border-radius: 5px;">
18+
{harm_level}
19+
</div>
20+
</div>
21+
"""
22+
23+
def print_like_dislike(x: gr.LikeData):
24+
print(x.index, x.value, x.liked)
25+
26+
def add_message(history, message):
27+
for x in message["files"]:
28+
history.append(((x,), None))
29+
if message["text"] is not None:
30+
history.append((message["text"], None))
31+
return history, gr.MultimodalTextbox(value=None, interactive=False)
32+
33+
def bot(history, response_type):
34+
if response_type == "gallery":
35+
history[-1][1] = gr.Gallery(
36+
["https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png",
37+
"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"]
38+
)
39+
elif response_type == "image":
40+
history[-1][1] = gr.Image("https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png")
41+
elif response_type == "video":
42+
history[-1][1] = gr.Video("https://github.com/gradio-app/gradio/raw/main/demo/video_component/files/world.mp4")
43+
elif response_type == "audio":
44+
history[-1][1] = gr.Audio("https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav")
45+
elif response_type == "html":
46+
history[-1][1] = gr.HTML(
47+
html_src(random.choice(["harmful", "neutral", "beneficial"]))
48+
)
49+
else:
50+
history[-1][1] = "Cool!"
51+
return history
52+
53+
54+
with gr.Blocks(fill_height=True) as demo:
55+
chatbot = gr.Chatbot(
56+
elem_id="chatbot",
57+
bubble_full_width=False,
58+
scale=1,
59+
)
60+
response_type = gr.Radio(
61+
[
62+
"image",
63+
"text",
64+
"gallery",
65+
"video",
66+
"audio",
67+
"html",
68+
],
69+
value="text",
70+
label="Response Type",
71+
)
72+
73+
chat_input = gr.MultimodalTextbox(
74+
interactive=True,
75+
placeholder="Enter message or upload file...",
76+
show_label=False,
77+
)
78+
79+
chat_msg = chat_input.submit(
80+
add_message, [chatbot, chat_input], [chatbot, chat_input]
81+
)
82+
bot_msg = chat_msg.then(
83+
bot, [chatbot, response_type], chatbot, api_name="bot_response"
84+
)
85+
bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])
86+
87+
chatbot.like(print_like_dislike, None, None)
88+
89+
demo.queue()
90+
if __name__ == "__main__":
91+
demo.launch()

gradio/components/chatbot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class Chatbot(Component):
6262
Also supports audio/video/image files, which are displayed in the Chatbot, and other kinds of files which are displayed as links. This
6363
component is usually used as an output component.
6464
65-
Demos: chatbot_simple, chatbot_multimodal
65+
Demos: chatbot_simple, chatbot_multimodal, chatbot_core_components_simple
6666
Guides: creating-a-chatbot
6767
"""
6868

guides/05_chatbots/01_creating-a-chatbot-fast.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,26 @@ demo.launch()
193193

194194
If you need to create something even more custom, then its best to construct the chatbot UI using the low-level `gr.Blocks()` API. We have [a dedicated guide for that here](/guides/creating-a-custom-chatbot-with-blocks).
195195

196+
## Using Gradio Components inside the Chatbot
197+
198+
The `Chatbot` component supports using many of the core Gradio components (such as `gr.Image`, `gr.Plot`, `gr.Audio`, and `gr.HTML`) inside of the chatbot. Simply return one of these components from your function to use it with `gr.ChatInterface`. Here's an example:
199+
200+
```py
201+
import gradio as gr
202+
203+
def fake(message, history):
204+
if message.strip():
205+
return gr.Audio("https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav")
206+
else:
207+
return "Please provide the name of an artist"
208+
209+
gr.ChatInterface(
210+
fake,
211+
textbox=gr.Textbox(placeholder="Which artist's music do you want to listen to?", scale=7),
212+
chatbot=gr.Chatbot(placeholder="Play music by any artist!"),
213+
).launch()
214+
```
215+
196216
## Using your chatbot via an API
197217

198218
Once you've built your Gradio chatbot and are hosting it on [Hugging Face Spaces](https://hf.space) or somewhere else, then you can query it with a simple API at the `/chat` endpoint. The endpoint just expects the user's message (and potentially additional inputs if you have set any using the `additional_inputs` parameter), and will return the response, internally keeping track of the messages sent so far.

js/_website/src/lib/templates/gradio/03_components/chatbot.svx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,29 @@ def predict(···) -> list[list[str | tuple[str] | tuple[str, str] | None] | tu
6969
<ShortcutTable shortcuts={obj.string_shortcuts} />
7070
{/if}
7171

72+
### Examples
73+
74+
**Using Gradio Components Inside `gr.Chatbot`**
75+
76+
The `Chatbot` component supports using many of the core Gradio components (such as `gr.Image`, `gr.Plot`, `gr.Audio`, and `gr.HTML`) inside of the chatbot. Simply include one of these components in your list of tuples. Here's an example:
77+
78+
```py
79+
import gradio as gr
80+
81+
def load():
82+
return [
83+
("Here's an audio", gr.Audio("https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav")),
84+
("Here's an video", gr.Video("https://github.com/gradio-app/gradio/raw/main/demo/video_component/files/world.mp4"))
85+
]
86+
87+
with gr.Blocks() as demo:
88+
chatbot = gr.Chatbot()
89+
button = gr.Button("Load audio and video")
90+
button.click(load, None, chatbot)
91+
92+
demo.launch()
93+
```
94+
7295
{#if obj.demos && obj.demos.length > 0}
7396
<!--- Demos -->
7497
### Demos

0 commit comments

Comments
 (0)