周倬孚 commited on
Commit
cf0da09
·
1 Parent(s): 7f4fb86
Files changed (2) hide show
  1. app.py +81 -76
  2. save_data.py +43 -19
app.py CHANGED
@@ -4,6 +4,8 @@ from save_data import add_new_data, get_sheet_service
4
  from instructions import *
5
  from user_groups import user_data
6
 
 
 
7
  class SessionManager:
8
  def __init__(self):
9
  self.sessions = []
@@ -58,19 +60,26 @@ def handle_create_sequential(task, human_input, session_manager, api_key, identi
58
  cooperate_style = "sequential"
59
  session_index = session_manager.add_session(task=task, cooperate_style=cooperate_style)
60
  session_manager.update(session_index, human_input, 'human_initial_answer')
61
- output = merge_texts_sequential(task, human_input, api_key)
62
- session_manager.update(session_index, output, 'ai_modificated_output')
63
  session_manager.update(session_index, identification_code, 'user_identification_code')
 
 
 
 
 
64
  return output, session_index
65
 
66
 
67
  def handle_create_parallel(task, human_input, session_manager, api_key, identification_code):
68
  cooperate_style = "parallel"
69
  session_index = session_manager.add_session(task=task, cooperate_style=cooperate_style)
70
- ai_initial_answer = generate_ai_initial_answer(task, api_key)
 
 
 
 
 
71
  session_manager.update(session_index, human_input, 'human_initial_answer')
72
  session_manager.update(session_index, ai_initial_answer, 'ai_initial_answer')
73
- final_answer = merge_texts_parallel(task, human_input, ai_initial_answer, api_key)
74
  session_manager.update(session_index, final_answer, 'merged_final_answer')
75
  session_manager.update(session_index, identification_code, 'user_identification_code')
76
  return ai_initial_answer, final_answer, session_index
@@ -87,7 +96,10 @@ def handle_create_reverse_sequential(task, session_manager, api_key, identificat
87
  def handle_modify_reverse_sequential(session_index, modification_suggestions, session_manager, api_key):
88
  session = session_manager.get_session(session_index)
89
  session_manager.update(session_index, modification_suggestions, 'human_modifications')
90
- final_answer = modify_with_suggestion(session['task'], modification_suggestions, api_key)
 
 
 
91
  session_manager.update(session_index, final_answer, 'final_answer')
92
  return final_answer, session_index
93
 
@@ -114,37 +126,26 @@ def login(identification_code):
114
  return update_content(user_info["group"])
115
  else:
116
  return update_content(None)
117
-
118
 
119
  def word_limit_validation(human_input):
120
  words = human_input.split()
121
  if len(words) < 50:
122
- return "Error: Your input is less than 50 words."
123
- return None # No error
124
-
125
- def handle_create_with_limit(task, human_input, session_manager, api_key, id):
126
- validation_error = word_limit_validation(human_input)
127
- if validation_error:
128
- return validation_error, None # Return the error to ai_output and keep session_index None
129
- # If valid, proceed with task handling
130
- if group_a_content:
131
- return handle_create_sequential(task, human_input, session_manager, api_key, id)
132
- elif group_b_content:
133
- return handle_create_parallel(task, human_input, session_manager, api_key, id)
134
- else:
135
- return "Error: Invalid group", None
136
 
 
 
137
 
138
  if __name__ == "__main__":
139
- api_key = get_api_key(local=False)
140
- service, SHEET_IDs = get_sheet_service(local=False)
141
  SHEET_ID1, SHEET_ID2, SHEET_ID3 = SHEET_IDs
142
 
143
  session_manager = SessionManager()
144
 
145
  with gr.Blocks() as app:
146
  with gr.Row():
147
- identification_code = gr.Textbox(label="Enter your identification code")
148
  login_button = gr.Button("Login")
149
  login_status = gr.Textbox(label="Next Tasks", interactive=False)
150
  group = gr.State()
@@ -173,11 +174,10 @@ if __name__ == "__main__":
173
  login_button.click(login, inputs=identification_code, outputs=[task, group_a_content, group_b_content, group_c_content, login_status])
174
 
175
 
176
- sheet_id = None
177
  with group_a_content:
178
- sheet_id = SHEET_ID1
179
  with gr.Row():
180
- human_input = gr.Textbox(label="Human Input (preperably between 100 and 150 words)")
181
  with gr.Row():
182
  submit_btn = gr.Button("Create")
183
  with gr.Row():
@@ -185,11 +185,16 @@ if __name__ == "__main__":
185
  session_index = gr.Number(label="Session Index", visible=False)
186
 
187
  submit_btn.click(
188
- fn=lambda task, human_input, id: handle_create_with_limit(task, human_input, session_manager, api_key, id),
189
  inputs=[task, human_input, identification_code],
190
  outputs=[ai_output, session_index]
191
  )
192
 
 
 
 
 
 
193
  # evaluate same for every group
194
  evaluate_btn = gr.Button("Evaluate")
195
  evaluation_result = gr.Textbox(label="Evaluation Result")
@@ -200,19 +205,24 @@ if __name__ == "__main__":
200
  outputs=[evaluation_result]
201
  )
202
 
203
- save_btn = gr.Button("Save Data")
 
 
 
 
 
204
  save_result = gr.Label()
205
 
 
206
  save_btn.click(
207
- fn=lambda session_index, sheet_id: save_data(session_index, session_manager, service, sheet_id),
208
- inputs=[session_index, sheet_id],
209
  outputs=[save_result]
210
  )
211
 
212
  with group_b_content:
213
- sheet_id = SHEET_ID2
214
  with gr.Row():
215
- human_input = gr.Textbox(label="Human Input (preperably between 100 and 150 words)")
216
  with gr.Row():
217
  create_btn = gr.Button("Create")
218
  with gr.Row():
@@ -221,12 +231,15 @@ if __name__ == "__main__":
221
  session_index = gr.Number(label="Session Index", visible=False)
222
 
223
  create_btn.click(
224
- fn=lambda task, human_input, id: handle_create_with_limit(task, human_input, session_manager, api_key, id),
225
  inputs=[task, human_input, identification_code],
226
  outputs=[ai_initial_output, final_output, session_index]
227
  )
228
 
229
-
 
 
 
230
 
231
 
232
  evaluate_btn = gr.Button("Evaluate")
@@ -238,24 +251,30 @@ if __name__ == "__main__":
238
  outputs=[evaluation_result]
239
  )
240
 
241
- save_btn = gr.Button("Save Data")
 
 
 
 
 
242
  save_result = gr.Label()
243
 
244
  save_btn.click(
245
- fn=lambda session_index, sheet_id: save_data(session_index, session_manager, service, sheet_id),
246
- inputs=[session_index, sheet_id],
247
  outputs=[save_result]
248
  )
249
 
 
 
250
  with group_c_content:
251
- sheet_id = SHEET_ID3
252
  with gr.Row():
253
  create_initial_btn = gr.Button("Create")
254
  with gr.Row():
255
  initial_answer = gr.Textbox(label="AI Initial Answer")
256
  modification_suggestions = gr.Textbox(label="Modification Suggestions")
257
  with gr.Row():
258
- create_final_btn = gr.Button("Modify")
259
  with gr.Row():
260
  final_answer = gr.Textbox(label="Final Answer")
261
  session_index = gr.Number(label="Session Index", visible=False)
@@ -267,12 +286,21 @@ if __name__ == "__main__":
267
  outputs=[initial_answer, session_index]
268
  )
269
 
 
 
 
 
 
270
  create_final_btn.click(
271
  fn=lambda session_index, modification_suggestions: handle_modify_reverse_sequential(session_index, modification_suggestions, session_manager, api_key),
272
  inputs=[session_index, modification_suggestions],
273
  outputs=[final_answer, session_index]
274
  )
275
 
 
 
 
 
276
 
277
  evaluate_btn = gr.Button("Evaluate")
278
  evaluation_result = gr.Textbox(label="Evaluation Result")
@@ -283,48 +311,25 @@ if __name__ == "__main__":
283
  outputs=[evaluation_result]
284
  )
285
 
286
- save_btn = gr.Button("Save Data")
 
 
 
 
 
287
  save_result = gr.Label()
288
 
289
  save_btn.click(
290
- fn=lambda session_index, sheet_id: save_data(session_index, session_manager, service, sheet_id),
291
- inputs=[session_index, sheet_id],
292
  outputs=[save_result]
293
  )
294
 
295
-
296
- # Add auto-save button
297
-
298
- with gr.Row():
299
- auto_save_btn = gr.Button("Auto Save", visible=False)
300
- auto_save_result = gr.Label(visible=False)
301
-
302
- def auto_save(session_index, sheet_id):
303
- return save_data(session_index, session_manager, service, sheet_id)
304
-
305
- auto_save_btn.click(
306
- fn=lambda session_index: auto_save(session_index, sheet_id),
307
- inputs=[session_index, sheet_id],
308
- outputs=[auto_save_result]
309
- )
310
-
311
- # Inject JavaScript to trigger the hidden save button every 30 seconds
312
- auto_save_js = """
313
  <script>
314
- // Function to trigger the hidden save button
315
- function triggerAutoSave() {
316
- const saveButton = document.querySelector('button[title="Auto Save"]');
317
- if (saveButton) {
318
- saveButton.click();
319
- }
320
- }
321
-
322
- // Trigger auto-save every 30 seconds
323
- setInterval(triggerAutoSave, 30000); // 30000 milliseconds = 30 seconds
324
  </script>
325
- """
326
-
327
- gr.HTML(auto_save_js)
328
-
329
-
330
- app.launch(share=True)
 
4
  from instructions import *
5
  from user_groups import user_data
6
 
7
+
8
+
9
  class SessionManager:
10
  def __init__(self):
11
  self.sessions = []
 
60
  cooperate_style = "sequential"
61
  session_index = session_manager.add_session(task=task, cooperate_style=cooperate_style)
62
  session_manager.update(session_index, human_input, 'human_initial_answer')
 
 
63
  session_manager.update(session_index, identification_code, 'user_identification_code')
64
+ if word_limit_validation(human_input):
65
+ output = word_limit_validation(human_input)
66
+ else:
67
+ output = merge_texts_sequential(task, human_input, api_key)
68
+ session_manager.update(session_index, output, 'ai_modificated_output')
69
  return output, session_index
70
 
71
 
72
  def handle_create_parallel(task, human_input, session_manager, api_key, identification_code):
73
  cooperate_style = "parallel"
74
  session_index = session_manager.add_session(task=task, cooperate_style=cooperate_style)
75
+ if word_limit_validation(human_input):
76
+ ai_initial_answer = word_limit_validation(human_input)
77
+ final_answer = word_limit_validation(human_input)
78
+ else:
79
+ ai_initial_answer = generate_ai_initial_answer(task, api_key)
80
+ final_answer = merge_texts_parallel(task, human_input, ai_initial_answer, api_key)
81
  session_manager.update(session_index, human_input, 'human_initial_answer')
82
  session_manager.update(session_index, ai_initial_answer, 'ai_initial_answer')
 
83
  session_manager.update(session_index, final_answer, 'merged_final_answer')
84
  session_manager.update(session_index, identification_code, 'user_identification_code')
85
  return ai_initial_answer, final_answer, session_index
 
96
  def handle_modify_reverse_sequential(session_index, modification_suggestions, session_manager, api_key):
97
  session = session_manager.get_session(session_index)
98
  session_manager.update(session_index, modification_suggestions, 'human_modifications')
99
+ if word_limit_validation(modification_suggestions):
100
+ final_answer = word_limit_validation(modification_suggestions)
101
+ else:
102
+ final_answer = modify_with_suggestion(session['task'], modification_suggestions, api_key)
103
  session_manager.update(session_index, final_answer, 'final_answer')
104
  return final_answer, session_index
105
 
 
126
  return update_content(user_info["group"])
127
  else:
128
  return update_content(None)
 
129
 
130
  def word_limit_validation(human_input):
131
  words = human_input.split()
132
  if len(words) < 50:
133
+ return f"Error: Your input '{human_input}'is less than 50 words. Please enter at least 50 words."
134
+ return None
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
+ def on_textbox_change(session_index, session_manager, service, SHEET_ID):
137
+ return save_data(session_index, session_manager, service, SHEET_ID)
138
 
139
  if __name__ == "__main__":
140
+ api_key = get_api_key(local=True)
141
+ service, SHEET_IDs = get_sheet_service(local=True)
142
  SHEET_ID1, SHEET_ID2, SHEET_ID3 = SHEET_IDs
143
 
144
  session_manager = SessionManager()
145
 
146
  with gr.Blocks() as app:
147
  with gr.Row():
148
+ identification_code = gr.Textbox(label="Enter your identification")
149
  login_button = gr.Button("Login")
150
  login_status = gr.Textbox(label="Next Tasks", interactive=False)
151
  group = gr.State()
 
174
  login_button.click(login, inputs=identification_code, outputs=[task, group_a_content, group_b_content, group_c_content, login_status])
175
 
176
 
177
+
178
  with group_a_content:
 
179
  with gr.Row():
180
+ human_input = gr.Textbox(label="Human Input (At least 50 words)")
181
  with gr.Row():
182
  submit_btn = gr.Button("Create")
183
  with gr.Row():
 
185
  session_index = gr.Number(label="Session Index", visible=False)
186
 
187
  submit_btn.click(
188
+ fn=lambda task, human_input, id: handle_create_sequential(task, human_input, session_manager, api_key, id),
189
  inputs=[task, human_input, identification_code],
190
  outputs=[ai_output, session_index]
191
  )
192
 
193
+ ai_output.change(
194
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID1),
195
+ inputs = [session_index]
196
+ )
197
+
198
  # evaluate same for every group
199
  evaluate_btn = gr.Button("Evaluate")
200
  evaluation_result = gr.Textbox(label="Evaluation Result")
 
205
  outputs=[evaluation_result]
206
  )
207
 
208
+ evaluation_result.change(
209
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID1),
210
+ inputs = [session_index]
211
+ )
212
+
213
+ save_btn = gr.Button("Save Data", elem_id="save_btn")
214
  save_result = gr.Label()
215
 
216
+
217
  save_btn.click(
218
+ fn=lambda session_index: save_data(session_index, session_manager, service, SHEET_ID1),
219
+ inputs=[session_index],
220
  outputs=[save_result]
221
  )
222
 
223
  with group_b_content:
 
224
  with gr.Row():
225
+ human_input = gr.Textbox(label="Human Input(At least 50 words)")
226
  with gr.Row():
227
  create_btn = gr.Button("Create")
228
  with gr.Row():
 
231
  session_index = gr.Number(label="Session Index", visible=False)
232
 
233
  create_btn.click(
234
+ fn=lambda task, human_input, id: handle_create_parallel(task, human_input, session_manager, api_key, id),
235
  inputs=[task, human_input, identification_code],
236
  outputs=[ai_initial_output, final_output, session_index]
237
  )
238
 
239
+ ai_initial_output.change(
240
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID2),
241
+ inputs = [session_index]
242
+ )
243
 
244
 
245
  evaluate_btn = gr.Button("Evaluate")
 
251
  outputs=[evaluation_result]
252
  )
253
 
254
+ evaluation_result.change(
255
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID2),
256
+ inputs = [session_index]
257
+ )
258
+
259
+ save_btn = gr.Button("Save Data",elem_id="save_btn")
260
  save_result = gr.Label()
261
 
262
  save_btn.click(
263
+ fn=lambda session_index: save_data(session_index, session_manager, service, SHEET_ID2),
264
+ inputs=[session_index],
265
  outputs=[save_result]
266
  )
267
 
268
+
269
+
270
  with group_c_content:
 
271
  with gr.Row():
272
  create_initial_btn = gr.Button("Create")
273
  with gr.Row():
274
  initial_answer = gr.Textbox(label="AI Initial Answer")
275
  modification_suggestions = gr.Textbox(label="Modification Suggestions")
276
  with gr.Row():
277
+ create_final_btn = gr.Button("Modify(At least 50 words)")
278
  with gr.Row():
279
  final_answer = gr.Textbox(label="Final Answer")
280
  session_index = gr.Number(label="Session Index", visible=False)
 
286
  outputs=[initial_answer, session_index]
287
  )
288
 
289
+ initial_answer.change(
290
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID3),
291
+ inputs = [session_index]
292
+ )
293
+
294
  create_final_btn.click(
295
  fn=lambda session_index, modification_suggestions: handle_modify_reverse_sequential(session_index, modification_suggestions, session_manager, api_key),
296
  inputs=[session_index, modification_suggestions],
297
  outputs=[final_answer, session_index]
298
  )
299
 
300
+ final_answer.change(
301
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID3),
302
+ inputs = [session_index]
303
+ )
304
 
305
  evaluate_btn = gr.Button("Evaluate")
306
  evaluation_result = gr.Textbox(label="Evaluation Result")
 
311
  outputs=[evaluation_result]
312
  )
313
 
314
+ evaluation_result.change(
315
+ fn = lambda session_index: on_textbox_change(session_index, session_manager, service, SHEET_ID3),
316
+ inputs = [session_index]
317
+ )
318
+
319
+ save_btn = gr.Button("Save Data", elem_id="save_btn")
320
  save_result = gr.Label()
321
 
322
  save_btn.click(
323
+ fn=lambda session_index: save_data(session_index, session_manager, service, SHEET_ID3),
324
+ inputs=[session_index],
325
  outputs=[save_result]
326
  )
327
 
328
+ gr.HTML("""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  <script>
330
+ setInterval(function() {
331
+ document.getElementById('save_btn').click();
332
+ }, 5000); // Auto-clicks every 30 seconds
 
 
 
 
 
 
 
333
  </script>
334
+ """)
335
+ app.launch()
 
 
 
 
save_data.py CHANGED
@@ -19,7 +19,6 @@ def load_envs(local=False):
19
  return service_account_info, SHEET_IDs
20
 
21
 
22
-
23
  def get_sheet_service(local=False):
24
  """Get the google sheet service object."""
25
  service_account_info, SHEET_ID = load_envs(local=local)
@@ -41,8 +40,13 @@ def col_letter(col_num):
41
  letter = chr(65 + remainder) + letter
42
  return letter
43
 
44
- def is_redudant_data(new_row, last_row):
45
- return new_row[0] == last_row[0] #compare vertification id
 
 
 
 
 
46
 
47
  def add_new_data(new_row, service, SPREADSHEET_ID, num_of_columns = 5):
48
  """Add new data to the spreadsheet.
@@ -54,29 +58,49 @@ def add_new_data(new_row, service, SPREADSHEET_ID, num_of_columns = 5):
54
  spreadsheetId=SPREADSHEET_ID,
55
  range=range_to_read
56
  ).execute()
57
- values = result.get('values', [])
58
-
59
- if values:
60
- last_row = values[-1]
61
- if is_redudant_data(new_row, last_row):
62
- return
 
 
 
 
 
63
 
 
64
  number_of_rows = len(values)
65
  new_row = [new_row]
66
- range_to_write = f'Sheet1!A{number_of_rows + 1}'
 
67
 
68
  request_body = {
69
  'values': new_row
70
  }
71
- response = service.spreadsheets().values().append(
72
- spreadsheetId=SPREADSHEET_ID,
73
- range=range_to_write,
74
- valueInputOption='RAW',
75
- insertDataOption='INSERT_ROWS',
76
- body=request_body
77
- ).execute()
78
-
79
- print(f"Added new row at position {number_of_rows + 1}")
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
 
82
 
 
19
  return service_account_info, SHEET_IDs
20
 
21
 
 
22
  def get_sheet_service(local=False):
23
  """Get the google sheet service object."""
24
  service_account_info, SHEET_ID = load_envs(local=local)
 
40
  letter = chr(65 + remainder) + letter
41
  return letter
42
 
43
+ def col_letter(col_num):
44
+ """Convert a column number to its corresponding Excel-style letter."""
45
+ letter = ''
46
+ while col_num > 0:
47
+ col_num, remainder = divmod(col_num - 1, 26)
48
+ letter = chr(65 + remainder) + letter
49
+ return letter
50
 
51
  def add_new_data(new_row, service, SPREADSHEET_ID, num_of_columns = 5):
52
  """Add new data to the spreadsheet.
 
58
  spreadsheetId=SPREADSHEET_ID,
59
  range=range_to_read
60
  ).execute()
61
+
62
+
63
+ # search for first columns match
64
+ match_found = False
65
+ update_idx = None
66
+ for idx, row in enumerate(result.get('values', [])):
67
+ if row[0] == new_row[0]:
68
+ match_found = True
69
+ range_to_write = f'Sheet1!A{idx + 1}:{col_letter(num_of_columns)}{idx + 1}'
70
+ update_idx = idx + 1
71
+ break
72
 
73
+ values = result.get('values', [])
74
  number_of_rows = len(values)
75
  new_row = [new_row]
76
+ if not match_found:
77
+ range_to_write = f'Sheet1!A{number_of_rows + 1}'
78
 
79
  request_body = {
80
  'values': new_row
81
  }
82
+ if match_found:
83
+ service.spreadsheets().values().clear(
84
+ spreadsheetId=SPREADSHEET_ID,
85
+ range=range_to_write,
86
+ body={},
87
+ ).execute()
88
+ response = service.spreadsheets().values().update(
89
+ spreadsheetId=SPREADSHEET_ID,
90
+ range=range_to_write,
91
+ valueInputOption='RAW',
92
+ body=request_body
93
+ ).execute()
94
+ print(f"Updated row at position {update_idx}")
95
+ else:
96
+ response = service.spreadsheets().values().append(
97
+ spreadsheetId=SPREADSHEET_ID,
98
+ range=range_to_write,
99
+ valueInputOption='RAW',
100
+ insertDataOption='INSERT_ROWS',
101
+ body=request_body
102
+ ).execute()
103
+ print(f"Added new row at position {number_of_rows + 1}")
104
 
105
 
106