czrrr commited on
Commit
b09ef8c
·
verified ·
1 Parent(s): 10e95a2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +271 -14
app.py CHANGED
@@ -13,6 +13,7 @@ from smolagents import (
13
  LiteLLMModel,
14
  Tool,
15
  VisitWebpageTool,
 
16
  )
17
 
18
 
@@ -184,6 +185,10 @@ class BasicAgent:
184
  tools=[
185
  DuckDuckGoSearchTool(max_results=8, rate_limit=1.0),
186
  VisitWebpageTool(max_output_length=30_000),
 
 
 
 
187
  InspectGaiaAttachmentTool(),
188
  ],
189
  model=self.model,
@@ -302,6 +307,174 @@ def readiness_summary(results_table) -> str:
302
  return f"Não foi possível calcular o índice de prontidão: {exc}"
303
 
304
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  def fetch_random_question():
306
  """Busca somente uma questão oficial aleatória, sem executar ou enviar."""
307
  try:
@@ -558,13 +731,46 @@ with gr.Blocks(theme=gr.themes.Soft(), title="GAIA Agent Evaluation") as demo:
558
 
559
  with gr.Tab("2. Executar e revisar"):
560
  gr.Markdown(
561
- "Gere as respostas das 20 questões. Você pode editar a coluna "
562
- "'Submitted Answer' antes do envio."
 
 
 
 
 
 
 
563
  )
564
- run_button = gr.Button(
565
- "Executar avaliação sem enviar", variant="secondary"
 
 
 
 
 
 
 
566
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  run_status = gr.Textbox(label="Status", lines=4, interactive=False)
 
 
 
 
 
568
  evaluation_readiness = gr.Textbox(
569
  label="Avaliação antes do envio",
570
  lines=4,
@@ -577,19 +783,70 @@ with gr.Blocks(theme=gr.themes.Soft(), title="GAIA Agent Evaluation") as demo:
577
  value=empty_results(),
578
  label="Respostas para revisão",
579
  wrap=True,
580
- interactive=True,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  )
582
- recalculate_button = gr.Button(
583
- "Recalcular índice após editar respostas"
 
 
 
 
 
 
 
 
 
 
 
584
  )
585
- run_button.click(
586
- fn=run_agent_only,
587
- outputs=[run_status, results_table, evaluation_readiness],
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  )
589
- recalculate_button.click(
590
- fn=readiness_summary,
591
- inputs=[results_table],
592
- outputs=[evaluation_readiness],
 
 
 
 
 
 
 
 
 
 
 
593
  )
594
 
595
  with gr.Tab("3. Enviar resultado"):
 
13
  LiteLLMModel,
14
  Tool,
15
  VisitWebpageTool,
16
+ WikipediaSearchTool,
17
  )
18
 
19
 
 
185
  tools=[
186
  DuckDuckGoSearchTool(max_results=8, rate_limit=1.0),
187
  VisitWebpageTool(max_output_length=30_000),
188
+ WikipediaSearchTool(
189
+ user_agent="GAIA-Course-Agent/1.0 (educational project)",
190
+ language="en",
191
+ ),
192
  InspectGaiaAttachmentTool(),
193
  ],
194
  model=self.model,
 
307
  return f"Não foi possível calcular o índice de prontidão: {exc}"
308
 
309
 
310
+ def review_dataframe(questions: list, answers: dict) -> pd.DataFrame:
311
+ rows = []
312
+ for item in questions or []:
313
+ task_id = str(item.get("task_id", "")).strip()
314
+ rows.append(
315
+ {
316
+ "Task ID": task_id,
317
+ "Question": str(item.get("question", "")),
318
+ "Submitted Answer": str((answers or {}).get(task_id, "")),
319
+ }
320
+ )
321
+ return pd.DataFrame(rows, columns=RESULT_COLUMNS)
322
+
323
+
324
+ def progress_summary(questions: list, answers: dict) -> str:
325
+ total = len(questions or [])
326
+ answered = sum(
327
+ bool(str((answers or {}).get(str(item.get("task_id", "")), "")).strip())
328
+ for item in (questions or [])
329
+ )
330
+ return f"Progresso: {answered}/{total} questões respondidas."
331
+
332
+
333
+ def load_evaluation_questions(profile: gr.OAuthProfile | None):
334
+ """Carrega as 20 questões, mas não executa o agente."""
335
+ if not profile:
336
+ return (
337
+ "Faça login no Hugging Face primeiro.",
338
+ [],
339
+ {},
340
+ gr.update(choices=[], value=None),
341
+ "",
342
+ "",
343
+ "",
344
+ "Progresso: 0/20 questões respondidas.",
345
+ "Índice de prontidão: 0%.",
346
+ empty_results(),
347
+ )
348
+
349
+ try:
350
+ response = requests.get(
351
+ f"{DEFAULT_API_URL}/questions", timeout=HTTP_TIMEOUT
352
+ )
353
+ response.raise_for_status()
354
+ questions = response.json()
355
+ questions = [
356
+ item
357
+ for item in questions
358
+ if item.get("task_id") and item.get("question") is not None
359
+ ]
360
+ if not questions:
361
+ raise ValueError("A API retornou uma lista vazia.")
362
+
363
+ answers = {}
364
+ choices = [
365
+ (
366
+ f"{index + 1:02d}. {str(item['question'])[:90]}",
367
+ str(item["task_id"]),
368
+ )
369
+ for index, item in enumerate(questions)
370
+ ]
371
+ first = questions[0]
372
+ dataframe = review_dataframe(questions, answers)
373
+ return (
374
+ f"{len(questions)} questões carregadas. Nenhuma foi executada ainda.",
375
+ questions,
376
+ answers,
377
+ gr.update(choices=choices, value=str(first["task_id"])),
378
+ str(first["question"]),
379
+ str(first["task_id"]),
380
+ "",
381
+ progress_summary(questions, answers),
382
+ readiness_summary(dataframe),
383
+ dataframe,
384
+ )
385
+ except Exception as exc:
386
+ return (
387
+ f"Erro ao carregar questões: {exc}",
388
+ [],
389
+ {},
390
+ gr.update(choices=[], value=None),
391
+ "",
392
+ "",
393
+ "",
394
+ "Progresso: 0/20 questões respondidas.",
395
+ "Índice de prontidão: 0%.",
396
+ empty_results(),
397
+ )
398
+
399
+
400
+ def select_evaluation_question(task_id: str, questions: list, answers: dict):
401
+ for item in questions or []:
402
+ if str(item.get("task_id")) == str(task_id):
403
+ return (
404
+ str(item.get("question", "")),
405
+ str(item.get("task_id", "")),
406
+ str((answers or {}).get(str(task_id), "")),
407
+ "Questão selecionada. Execute o agente ou edite e salve a resposta.",
408
+ )
409
+ return "", "", "", "Questão não encontrada na sessão."
410
+
411
+
412
+ def save_reviewed_answer(
413
+ task_id: str, answer: str, questions: list, answers: dict
414
+ ):
415
+ task_id = str(task_id or "").strip()
416
+ if not task_id:
417
+ dataframe = review_dataframe(questions, answers)
418
+ return (
419
+ answers or {},
420
+ "Nenhuma questão selecionada.",
421
+ progress_summary(questions, answers),
422
+ readiness_summary(dataframe),
423
+ dataframe,
424
+ )
425
+
426
+ updated = dict(answers or {})
427
+ updated[task_id] = str(answer or "").strip()
428
+ dataframe = review_dataframe(questions, updated)
429
+ return (
430
+ updated,
431
+ "Resposta revisada e salva nesta sessão.",
432
+ progress_summary(questions, updated),
433
+ readiness_summary(dataframe),
434
+ dataframe,
435
+ )
436
+
437
+
438
+ def run_current_evaluation_question(
439
+ question: str, task_id: str, questions: list, answers: dict
440
+ ):
441
+ """Executa somente a questão atualmente selecionada."""
442
+ if not question or not task_id:
443
+ dataframe = review_dataframe(questions, answers)
444
+ return (
445
+ "",
446
+ answers or {},
447
+ "Carregue e selecione uma questão primeiro.",
448
+ progress_summary(questions, answers),
449
+ readiness_summary(dataframe),
450
+ dataframe,
451
+ )
452
+
453
+ try:
454
+ answer = BasicAgent()(question, task_id)
455
+ updated = dict(answers or {})
456
+ updated[str(task_id)] = answer
457
+ dataframe = review_dataframe(questions, updated)
458
+ return (
459
+ answer,
460
+ updated,
461
+ "Questão executada e resposta salva. Revise o conteúdo antes de avançar.",
462
+ progress_summary(questions, updated),
463
+ readiness_summary(dataframe),
464
+ dataframe,
465
+ )
466
+ except Exception as exc:
467
+ dataframe = review_dataframe(questions, answers)
468
+ return (
469
+ f"ERROR: {exc}",
470
+ answers or {},
471
+ f"Erro ao executar esta questão: {exc}",
472
+ progress_summary(questions, answers),
473
+ readiness_summary(dataframe),
474
+ dataframe,
475
+ )
476
+
477
+
478
  def fetch_random_question():
479
  """Busca somente uma questão oficial aleatória, sem executar ou enviar."""
480
  try:
 
731
 
732
  with gr.Tab("2. Executar e revisar"):
733
  gr.Markdown(
734
+ "Carregue as 20 questões e execute apenas a questão selecionada. "
735
+ "As respostas ficam reunidas para uma única submissão final."
736
+ )
737
+ evaluation_questions = gr.State([])
738
+ evaluation_answers = gr.State({})
739
+ current_task_id = gr.State("")
740
+
741
+ load_questions_button = gr.Button(
742
+ "Carregar as 20 questões", variant="secondary"
743
  )
744
+ question_selector = gr.Dropdown(
745
+ label="Escolha a questão",
746
+ choices=[],
747
+ interactive=True,
748
+ )
749
+ current_question = gr.Textbox(
750
+ label="Questão selecionada",
751
+ lines=6,
752
+ interactive=False,
753
  )
754
+ current_answer = gr.Textbox(
755
+ label="Resposta da questão selecionada",
756
+ lines=4,
757
+ interactive=True,
758
+ placeholder=(
759
+ "Execute o agente ou digite/corrija a resposta e clique em salvar."
760
+ ),
761
+ )
762
+ with gr.Row():
763
+ run_current_button = gr.Button(
764
+ "Executar somente esta questão", variant="primary"
765
+ )
766
+ save_answer_button = gr.Button("Salvar resposta revisada")
767
+
768
  run_status = gr.Textbox(label="Status", lines=4, interactive=False)
769
+ evaluation_progress = gr.Textbox(
770
+ label="Progresso",
771
+ value="Progresso: 0/20 questões respondidas.",
772
+ interactive=False,
773
+ )
774
  evaluation_readiness = gr.Textbox(
775
  label="Avaliação antes do envio",
776
  lines=4,
 
783
  value=empty_results(),
784
  label="Respostas para revisão",
785
  wrap=True,
786
+ interactive=False,
787
+ )
788
+
789
+ load_questions_button.click(
790
+ fn=load_evaluation_questions,
791
+ outputs=[
792
+ run_status,
793
+ evaluation_questions,
794
+ evaluation_answers,
795
+ question_selector,
796
+ current_question,
797
+ current_task_id,
798
+ current_answer,
799
+ evaluation_progress,
800
+ evaluation_readiness,
801
+ results_table,
802
+ ],
803
  )
804
+ question_selector.change(
805
+ fn=select_evaluation_question,
806
+ inputs=[
807
+ question_selector,
808
+ evaluation_questions,
809
+ evaluation_answers,
810
+ ],
811
+ outputs=[
812
+ current_question,
813
+ current_task_id,
814
+ current_answer,
815
+ run_status,
816
+ ],
817
  )
818
+ run_current_button.click(
819
+ fn=run_current_evaluation_question,
820
+ inputs=[
821
+ current_question,
822
+ current_task_id,
823
+ evaluation_questions,
824
+ evaluation_answers,
825
+ ],
826
+ outputs=[
827
+ current_answer,
828
+ evaluation_answers,
829
+ run_status,
830
+ evaluation_progress,
831
+ evaluation_readiness,
832
+ results_table,
833
+ ],
834
  )
835
+ save_answer_button.click(
836
+ fn=save_reviewed_answer,
837
+ inputs=[
838
+ current_task_id,
839
+ current_answer,
840
+ evaluation_questions,
841
+ evaluation_answers,
842
+ ],
843
+ outputs=[
844
+ evaluation_answers,
845
+ run_status,
846
+ evaluation_progress,
847
+ evaluation_readiness,
848
+ results_table,
849
+ ],
850
  )
851
 
852
  with gr.Tab("3. Enviar resultado"):