davidberenstein1957 HF staff commited on
Commit
28cf05b
unverified
2 Parent(s): a8cff7e 16f921a

Merge pull request #6 from huggingface/feat/language-selection-within-app

Browse files
Files changed (2) hide show
  1. app/app.py +70 -20
  2. 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(history: list, session_id: str, liked: bool = False) -> None:
 
 
90
  data = {
91
  "index": len(history) - 1,
92
  "value": history[-1],
93
- "liked": True,
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(history[: index + 1] + [original_message], session_id)
 
 
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 messages to submit because the conversation was empty")
239
  return (gr.Dataframe(value=None, interactive=False), [])
240
 
241
  dataframe["content"] = dataframe["content"].apply(_process_content)
 
 
242
  conversation_data = {
243
- "conversation": dataframe.to_dict(orient="records"),
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(f"Submitted {len(dataframe)} messages to the dataset")
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