Merge pull request #6 from huggingface/feat/language-selection-within-app
Browse files- app/app.py +70 -20
- requirements.txt +1 -0
app/app.py
CHANGED
@@ -13,6 +13,8 @@ from gradio.components.chatbot import Option
|
|
13 |
from huggingface_hub import InferenceClient
|
14 |
from pandas import DataFrame
|
15 |
|
|
|
|
|
16 |
client = InferenceClient(
|
17 |
token=os.getenv("HF_TOKEN"),
|
18 |
model=(
|
@@ -32,6 +34,31 @@ def add_user_message(history, message):
|
|
32 |
return history, gr.MultimodalTextbox(value=None, interactive=False)
|
33 |
|
34 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
def format_history_as_messages(history: list):
|
36 |
messages = []
|
37 |
current_role = None
|
@@ -86,16 +113,18 @@ def _process_content(content) -> str | list[str]:
|
|
86 |
return content
|
87 |
|
88 |
|
89 |
-
def add_fake_like_data(
|
|
|
|
|
90 |
data = {
|
91 |
"index": len(history) - 1,
|
92 |
"value": history[-1],
|
93 |
-
"liked":
|
94 |
}
|
95 |
_, dataframe = wrangle_like_data(
|
96 |
gr.LikeData(target=None, data=data), history.copy()
|
97 |
)
|
98 |
-
submit_conversation(dataframe, session_id)
|
99 |
|
100 |
|
101 |
def respond_system_message(
|
@@ -178,7 +207,7 @@ def wrangle_like_data(x: gr.LikeData, history) -> DataFrame:
|
|
178 |
|
179 |
|
180 |
def wrangle_edit_data(
|
181 |
-
x: gr.EditData, history: list, dataframe: DataFrame, session_id: str
|
182 |
) -> list:
|
183 |
"""Edit the conversation and add negative feedback if assistant message is edited, otherwise regenerate the message
|
184 |
|
@@ -194,8 +223,10 @@ def wrangle_edit_data(
|
|
194 |
|
195 |
if history[index]["role"] == "user":
|
196 |
# Add feedback on original and corrected message
|
197 |
-
add_fake_like_data(history[: index + 2], session_id, liked=True)
|
198 |
-
add_fake_like_data(
|
|
|
|
|
199 |
history = respond_system_message(
|
200 |
history[: index + 1],
|
201 |
temperature=random.randint(1, 100) / 100,
|
@@ -204,8 +235,8 @@ def wrangle_edit_data(
|
|
204 |
return history
|
205 |
else:
|
206 |
# Add feedback on original and corrected message
|
207 |
-
add_fake_like_data(history[: index + 1], session_id, liked=True)
|
208 |
-
add_fake_like_data(history[:index] + [original_message], session_id)
|
209 |
history = history[: index + 1]
|
210 |
# add chosen and rejected options
|
211 |
history[-1]["options"] = [
|
@@ -216,12 +247,12 @@ def wrangle_edit_data(
|
|
216 |
|
217 |
|
218 |
def wrangle_retry_data(
|
219 |
-
x: gr.RetryData, history: list, dataframe: DataFrame, session_id: str
|
220 |
) -> list:
|
221 |
"""Respond to the user message with a system message and add negative feedback on the original message
|
222 |
|
223 |
Return the history with the new message"""
|
224 |
-
add_fake_like_data(history, session_id)
|
225 |
|
226 |
# Return the history without a new message
|
227 |
history = respond_system_message(
|
@@ -232,31 +263,36 @@ def wrangle_retry_data(
|
|
232 |
return history, update_dataframe(dataframe, history)
|
233 |
|
234 |
|
235 |
-
def submit_conversation(dataframe, session_id):
|
236 |
""" "Submit the conversation to dataset repo"""
|
237 |
-
if dataframe.empty:
|
238 |
-
gr.Info("No
|
239 |
return (gr.Dataframe(value=None, interactive=False), [])
|
240 |
|
241 |
dataframe["content"] = dataframe["content"].apply(_process_content)
|
|
|
|
|
242 |
conversation_data = {
|
243 |
-
"conversation":
|
244 |
"timestamp": datetime.now().isoformat(),
|
245 |
"session_id": session_id,
|
246 |
"conversation_id": str(uuid.uuid4()),
|
|
|
247 |
}
|
248 |
save_feedback(input_object=conversation_data)
|
249 |
-
gr.Info(
|
250 |
return (gr.Dataframe(value=None, interactive=False), [])
|
251 |
|
252 |
|
253 |
css = """
|
254 |
-
.options {
|
|
|
|
|
|
|
255 |
display: none !important;
|
256 |
}
|
257 |
"""
|
258 |
|
259 |
-
|
260 |
with gr.Blocks(css=css) as demo:
|
261 |
##############################
|
262 |
# Chatbot
|
@@ -267,10 +303,18 @@ with gr.Blocks(css=css) as demo:
|
|
267 |
visible=False,
|
268 |
)
|
269 |
|
|
|
|
|
270 |
chatbot = gr.Chatbot(
|
271 |
elem_id="chatbot",
|
272 |
editable="all",
|
273 |
bubble_full_width=False,
|
|
|
|
|
|
|
|
|
|
|
|
|
274 |
type="messages",
|
275 |
feedback_options=["Like", "Dislike"],
|
276 |
)
|
@@ -293,6 +337,12 @@ with gr.Blocks(css=css) as demo:
|
|
293 |
# Deal with feedback
|
294 |
##############################
|
295 |
|
|
|
|
|
|
|
|
|
|
|
|
|
296 |
chat_input.submit(
|
297 |
fn=add_user_message,
|
298 |
inputs=[chatbot, chat_input],
|
@@ -310,19 +360,19 @@ with gr.Blocks(css=css) as demo:
|
|
310 |
|
311 |
chatbot.retry(
|
312 |
fn=wrangle_retry_data,
|
313 |
-
inputs=[chatbot, dataframe, session_id],
|
314 |
outputs=[chatbot, dataframe],
|
315 |
)
|
316 |
|
317 |
chatbot.edit(
|
318 |
fn=wrangle_edit_data,
|
319 |
-
inputs=[chatbot, dataframe, session_id],
|
320 |
outputs=[chatbot],
|
321 |
).then(update_dataframe, inputs=[dataframe, chatbot], outputs=[dataframe])
|
322 |
|
323 |
submit_btn.click(
|
324 |
fn=submit_conversation,
|
325 |
-
inputs=[dataframe, session_id],
|
326 |
outputs=[dataframe, chatbot],
|
327 |
)
|
328 |
demo.load(
|
|
|
13 |
from huggingface_hub import InferenceClient
|
14 |
from pandas import DataFrame
|
15 |
|
16 |
+
LANGUAGES: list[str] = ["English", "Spanish", "Hebrew", "Dutch"]
|
17 |
+
|
18 |
client = InferenceClient(
|
19 |
token=os.getenv("HF_TOKEN"),
|
20 |
model=(
|
|
|
34 |
return history, gr.MultimodalTextbox(value=None, interactive=False)
|
35 |
|
36 |
|
37 |
+
def get_system_message(language: str) -> str:
|
38 |
+
if language == "English":
|
39 |
+
return "You are a helpful assistant that speaks English."
|
40 |
+
elif language == "Spanish":
|
41 |
+
return "Tu eres un asistente 煤til que habla espa帽ol."
|
42 |
+
elif language == "Hebrew":
|
43 |
+
return "讗转讛 注讜讝专 讟讜讘 砖诪驻讙砖 讘注讘专讬转."
|
44 |
+
elif language == "Dutch":
|
45 |
+
return "Je bent een handige assistent die Nederlands spreekt."
|
46 |
+
|
47 |
+
|
48 |
+
def format_system_message(language: str, history: list):
|
49 |
+
if history:
|
50 |
+
if history[0]["role"] == "system":
|
51 |
+
history = history[1:]
|
52 |
+
system_message = [
|
53 |
+
{
|
54 |
+
"role": "system",
|
55 |
+
"content": get_system_message(language),
|
56 |
+
}
|
57 |
+
]
|
58 |
+
history = system_message + history
|
59 |
+
return history
|
60 |
+
|
61 |
+
|
62 |
def format_history_as_messages(history: list):
|
63 |
messages = []
|
64 |
current_role = None
|
|
|
113 |
return content
|
114 |
|
115 |
|
116 |
+
def add_fake_like_data(
|
117 |
+
history: list, session_id: str, language: str, liked: bool = False
|
118 |
+
) -> None:
|
119 |
data = {
|
120 |
"index": len(history) - 1,
|
121 |
"value": history[-1],
|
122 |
+
"liked": liked,
|
123 |
}
|
124 |
_, dataframe = wrangle_like_data(
|
125 |
gr.LikeData(target=None, data=data), history.copy()
|
126 |
)
|
127 |
+
submit_conversation(dataframe, session_id, language)
|
128 |
|
129 |
|
130 |
def respond_system_message(
|
|
|
207 |
|
208 |
|
209 |
def wrangle_edit_data(
|
210 |
+
x: gr.EditData, history: list, dataframe: DataFrame, session_id: str, language: str
|
211 |
) -> list:
|
212 |
"""Edit the conversation and add negative feedback if assistant message is edited, otherwise regenerate the message
|
213 |
|
|
|
223 |
|
224 |
if history[index]["role"] == "user":
|
225 |
# Add feedback on original and corrected message
|
226 |
+
add_fake_like_data(history[: index + 2], session_id, language, liked=True)
|
227 |
+
add_fake_like_data(
|
228 |
+
history[: index + 1] + [original_message], session_id, language
|
229 |
+
)
|
230 |
history = respond_system_message(
|
231 |
history[: index + 1],
|
232 |
temperature=random.randint(1, 100) / 100,
|
|
|
235 |
return history
|
236 |
else:
|
237 |
# Add feedback on original and corrected message
|
238 |
+
add_fake_like_data(history[: index + 1], session_id, language, liked=True)
|
239 |
+
add_fake_like_data(history[:index] + [original_message], session_id, language)
|
240 |
history = history[: index + 1]
|
241 |
# add chosen and rejected options
|
242 |
history[-1]["options"] = [
|
|
|
247 |
|
248 |
|
249 |
def wrangle_retry_data(
|
250 |
+
x: gr.RetryData, history: list, dataframe: DataFrame, session_id: str, language: str
|
251 |
) -> list:
|
252 |
"""Respond to the user message with a system message and add negative feedback on the original message
|
253 |
|
254 |
Return the history with the new message"""
|
255 |
+
add_fake_like_data(history, session_id, language)
|
256 |
|
257 |
# Return the history without a new message
|
258 |
history = respond_system_message(
|
|
|
263 |
return history, update_dataframe(dataframe, history)
|
264 |
|
265 |
|
266 |
+
def submit_conversation(dataframe, session_id, language):
|
267 |
""" "Submit the conversation to dataset repo"""
|
268 |
+
if dataframe.empty or len(dataframe) < 2:
|
269 |
+
gr.Info("No feedback to submit.")
|
270 |
return (gr.Dataframe(value=None, interactive=False), [])
|
271 |
|
272 |
dataframe["content"] = dataframe["content"].apply(_process_content)
|
273 |
+
conversation = dataframe.to_dict(orient="records")
|
274 |
+
conversation = conversation[1:] # remove system message
|
275 |
conversation_data = {
|
276 |
+
"conversation": conversation,
|
277 |
"timestamp": datetime.now().isoformat(),
|
278 |
"session_id": session_id,
|
279 |
"conversation_id": str(uuid.uuid4()),
|
280 |
+
"language": language,
|
281 |
}
|
282 |
save_feedback(input_object=conversation_data)
|
283 |
+
gr.Info("Submitted your feedback!")
|
284 |
return (gr.Dataframe(value=None, interactive=False), [])
|
285 |
|
286 |
|
287 |
css = """
|
288 |
+
.options.svelte-pcaovb {
|
289 |
+
display: none !important;
|
290 |
+
}
|
291 |
+
.option.svelte-pcaovb {
|
292 |
display: none !important;
|
293 |
}
|
294 |
"""
|
295 |
|
|
|
296 |
with gr.Blocks(css=css) as demo:
|
297 |
##############################
|
298 |
# Chatbot
|
|
|
303 |
visible=False,
|
304 |
)
|
305 |
|
306 |
+
language = gr.Dropdown(choices=LANGUAGES, label="Language", interactive=True)
|
307 |
+
|
308 |
chatbot = gr.Chatbot(
|
309 |
elem_id="chatbot",
|
310 |
editable="all",
|
311 |
bubble_full_width=False,
|
312 |
+
value=[
|
313 |
+
{
|
314 |
+
"role": "system",
|
315 |
+
"content": get_system_message(language.value),
|
316 |
+
}
|
317 |
+
],
|
318 |
type="messages",
|
319 |
feedback_options=["Like", "Dislike"],
|
320 |
)
|
|
|
337 |
# Deal with feedback
|
338 |
##############################
|
339 |
|
340 |
+
language.change(
|
341 |
+
fn=format_system_message,
|
342 |
+
inputs=[language, chatbot],
|
343 |
+
outputs=[chatbot],
|
344 |
+
)
|
345 |
+
|
346 |
chat_input.submit(
|
347 |
fn=add_user_message,
|
348 |
inputs=[chatbot, chat_input],
|
|
|
360 |
|
361 |
chatbot.retry(
|
362 |
fn=wrangle_retry_data,
|
363 |
+
inputs=[chatbot, dataframe, session_id, language],
|
364 |
outputs=[chatbot, dataframe],
|
365 |
)
|
366 |
|
367 |
chatbot.edit(
|
368 |
fn=wrangle_edit_data,
|
369 |
+
inputs=[chatbot, dataframe, session_id, language],
|
370 |
outputs=[chatbot],
|
371 |
).then(update_dataframe, inputs=[dataframe, chatbot], outputs=[dataframe])
|
372 |
|
373 |
submit_btn.click(
|
374 |
fn=submit_conversation,
|
375 |
+
inputs=[dataframe, session_id, language],
|
376 |
outputs=[dataframe, chatbot],
|
377 |
)
|
378 |
demo.load(
|
requirements.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
git+https://github.com/huggingface/feel.git@main
|