broadfield-dev commited on
Commit
5b0362a
Β·
verified Β·
1 Parent(s): d17fb14

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -26
app.py CHANGED
@@ -398,60 +398,143 @@ def ui_upload_memories_action_fn(uploaded_file_obj, progress=gr.Progress()):
398
  msg = f"Memories Upload: Processed {total_to_process}. Added: {added_count}, Format Errors: {format_error_count}, Save Errors: {save_error_count}."
399
  logger.info(msg); return msg
400
 
 
 
 
401
  custom_theme = gr.themes.Base(primary_hue="teal", secondary_hue="purple", neutral_hue="zinc", text_size="sm", spacing_size="md", radius_size="sm", font=["System UI", "sans-serif"])
402
  custom_css = """
403
  body { background: linear-gradient(to bottom right, #2c3e50, #34495e); color: #ecf0f1; min-height: 100vh; margin:0; padding:0; font-family: 'System UI', 'sans-serif';}
404
  .gradio-container { background: transparent !important; max-width: 100% !important; padding: 1rem !important; box-sizing: border-box;}
405
- .gr-block { /* Applied to Sidebar, Column, Group */ background-color: rgba(44, 62, 80, 0.8) !important; border: 1px solid rgba(189, 195, 199, 0.2) !important; border-radius: 8px !important; box-shadow: 0 2px 4px rgba(0,0,0,0.2); margin-bottom: 1rem;}
406
- .gr-tabs { background-color: rgba(44, 62, 80, 0.8) !important; border-radius: 8px !important; }
407
- .gr-tabitem { background-color: rgba(52, 73, 94, 0.75) !important; border-radius: 6px !important; padding: 1em !important; border: 1px solid rgba(189, 195, 199, 0.1) !important;}
408
- .gr-accordion { background-color: rgba(52, 73, 94, 0.7) !important; border-radius: 6px !important; border: 1px solid rgba(189, 195, 199, 0.15) !important; }
409
- .gr-textbox, .gr-dropdown, .gr-button, .gr-code, .gr-chat-message, .gr-json, .gr-file input[type="file"] { border: 1px solid rgba(189, 195, 199, 0.3) !important; background-color: rgba(52, 73, 94, 0.9) !important; color: #ecf0f1 !important; border-radius: 6px !important;}
410
- .gr-file { background-color: rgba(52, 73, 94, 0.9) !important; border-radius: 6px !important; padding: 0.5em;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  .gr-file > .label-text { color: #bdc3c7 !important;}
412
  .gr-textarea textarea, .gr-textbox input { color: #ecf0f1 !important; }
 
413
  .gr-button.gr-button-primary { background-color: #1abc9c !important; color: white !important; border-color: #16a085 !important; }
414
  .gr-button.gr-button-secondary { background-color: #9b59b6 !important; color: white !important; border-color: #8e44ad !important; }
415
  .gr-button.gr-button-stop { background-color: #e74c3c !important; color: white !important; border-color: #c0392b !important; }
 
416
  .gr-markdown { padding: 5px; /* Reduced padding for markdown within styled boxes */ }
417
- .gr-markdown h1, .gr-markdown h2, .gr-markdown h3 { color: #1abc9c !important; border-bottom: 1px solid rgba(189, 195, 199, 0.2) !important; padding-bottom: 0.3em; margin-top:0.5em; margin-bottom: 0.5em; }
 
 
 
 
 
418
  .gr-markdown p, .gr-markdown li { color: #ecf0f1 !important; }
419
- .gr-markdown pre code { background-color: rgba(30, 40, 50, 0.95) !important; border: 1px solid rgba(189, 195, 199, 0.3) !important; color: #ecf0f1; border-radius: 4px; padding: 0.8em; }
420
- .gr-chatbot { background-color: rgba(44, 62, 80, 0.7) !important; border: 1px solid rgba(189, 195, 199, 0.2) !important; }
421
- .gr-chatbot .message { background-color: rgba(52, 73, 94, 0.9) !important; color: #ecf0f1 !important; border: 1px solid rgba(189, 195, 199, 0.2) !important; box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important; }
422
- .gr-chatbot .message.user { background-color: rgba(46, 204, 113, 0.8) !important; color: #2c3e50 !important; }
423
- .gr-input-label > .label-text, .gr-dropdown-label > .label-text, .gr-checkbox-label > .label-text { color: #bdc3c7 !important; font-size: 0.9rem !important; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424
  .gr-info { color: #bdc3c7 !important; font-size: 0.85rem !important; }
425
- .status-bar { background-color: rgba(44, 62, 80, 0.8) !important; padding: 8px; border-radius: 6px; margin-bottom: 1rem; }
426
- .tabnav button { background-color: rgba(52, 73, 94, 0.8) !important; color: #ecf0f1 !important; border-bottom: 2px solid transparent !important; border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; margin-right: 2px !important; }
427
- .tabnav button.selected { background-color: rgba(44, 62, 80, 0.95) !important; color: #1abc9c !important; border-bottom: 2px solid #1abc9c !important;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
  """
429
 
430
- with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent v5.3") as demo:
431
- gr.Markdown("# πŸ€– AI Research Dashboard") # Main title
432
 
433
  avail_provs = get_available_providers()
434
  def_prov = avail_provs[0] if avail_provs else None
435
  def_models = get_model_display_names_for_provider(def_prov) if def_prov else []
436
  def_model_disp = get_default_model_display_name_for_provider(def_prov) if def_prov else None
437
 
438
- with gr.Row(elem_classes="status-bar"): # Use elem_classes for styling
439
  with gr.Column(scale=3): agent_stat_tb = gr.Textbox(label="Agent Status", interactive=False, lines=1, value="Initializing systems...")
440
  with gr.Column(scale=1): memory_backend_info_tb = gr.Textbox(label="Memory Backend", value=f"{MEMORY_STORAGE_BACKEND}", interactive=False)
441
  if MEMORY_STORAGE_BACKEND == "SQLITE":
442
  with gr.Column(scale=2): gr.Textbox(label="SQLite Path", value=f"{MEMORY_SQLITE_PATH}", interactive=False)
443
  elif MEMORY_STORAGE_BACKEND == "HF_DATASET":
444
  with gr.Column(scale=2): gr.Textbox(label="HF Repos", value=f"M: {MEMORY_HF_MEM_REPO}, R: {MEMORY_HF_RULES_REPO}", interactive=False)
445
-
446
  with gr.Row(equal_height=False): # Main layout row for sidebar and tabs
447
  with gr.Column(scale=1, min_width=350): # Sidebar for configuration
448
  gr.Markdown("## βš™οΈ Configuration")
449
- with gr.Group():
450
  gr.Markdown("### API & Model")
451
  api_key_tb = gr.Textbox(label="AI Provider API Key (Optional Override)", type="password", placeholder="Paste key here or set env var")
452
  prov_sel_dd = gr.Dropdown(label="AI Provider", choices=avail_provs, value=def_prov, interactive=True)
453
  model_sel_dd = gr.Dropdown(label="AI Model", choices=def_models, value=def_model_disp, interactive=True)
454
- with gr.Group():
455
  gr.Markdown("### System Prompt")
456
  sys_prompt_tb = gr.Textbox(label="System Prompt Base", lines=10, value=DEFAULT_SYSTEM_PROMPT, interactive=True)
457
 
@@ -472,7 +555,7 @@ with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent
472
  gr.Markdown("## Manage Stored Knowledge")
473
  with gr.Row(equal_height=False):
474
  with gr.Column(scale=1):
475
- with gr.Box():
476
  gr.Markdown("### πŸ“œ Rules (Learned Insights)")
477
  rules_disp_ta = gr.TextArea(label="View/Edit Rules", lines=15, interactive=True, placeholder="Load or type rules here (one per line or '---' separated for multiple).")
478
  with gr.Row():
@@ -484,14 +567,15 @@ with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent
484
  save_faiss_ram_btn_kb = gr.Button("Save FAISS Indices", visible=(MEMORY_STORAGE_BACKEND == "RAM"))
485
 
486
  with gr.Column(scale=1):
487
- with gr.Box():
488
  gr.Markdown("### πŸ“š Memories (Past Interactions)")
489
- mems_disp_json = gr.JSON(label="View Memories (JSON format)", scale=2)
490
  with gr.Row(): view_mems_btn = gr.Button("πŸ”„ Load/Refresh Memories")
491
  upload_mems_fobj = gr.File(label="Upload Memories File (.jsonl)", file_types=[".jsonl"])
492
  mems_stat_tb = gr.Textbox(label="Memories Operation Status", interactive=False, lines=2, placeholder="Status...")
493
  clear_mems_btn = gr.Button("⚠️ Clear All Memories", variant="stop")
494
 
 
495
  def dyn_upd_model_dd(sel_prov_dyn:str): models_dyn, def_model_dyn = get_model_display_names_for_provider(sel_prov_dyn), get_default_model_display_name_for_provider(sel_prov_dyn); return gr.Dropdown(choices=models_dyn, value=def_model_dyn, interactive=True)
496
  prov_sel_dd.change(fn=dyn_upd_model_dd, inputs=prov_sel_dd, outputs=model_sel_dd)
497
  chat_ins = [user_msg_tb, main_chat_disp, prov_sel_dd, model_sel_dd, api_key_tb, sys_prompt_tb]
@@ -519,7 +603,7 @@ with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent
519
  upload_rules_fobj.upload(fn=ui_upload_rules_action_fn, inputs=[upload_rules_fobj], outputs=[rules_stat_tb], show_progress="full").then(fn=ui_view_rules_action_fn, outputs=rules_disp_ta)
520
  clear_rules_btn.click(fn=lambda: "All rules cleared." if clear_all_rules_data_backend() else "Error clearing rules.", outputs=rules_stat_tb).then(fn=ui_view_rules_action_fn, outputs=rules_disp_ta)
521
 
522
- if MEMORY_STORAGE_BACKEND == "RAM" and 'save_faiss_ram_btn_kb' in locals() and save_faiss_ram_btn_kb is not None : # Check if button was created
523
  def save_faiss_action_with_feedback_fn_kb(): save_faiss_indices_to_disk(); gr.Info("Attempted to save FAISS indices to disk.")
524
  save_faiss_ram_btn_kb.click(fn=save_faiss_action_with_feedback_fn_kb, inputs=None, outputs=None)
525
 
@@ -537,8 +621,9 @@ with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent
537
 
538
  demo.load(fn=app_load_fn, inputs=None, outputs=[agent_stat_tb, rules_disp_ta, mems_disp_json])
539
 
 
540
  if __name__ == "__main__":
541
- logger.info(f"Starting Gradio AI Research Mega Agent (v5.3 - Styled Dashboard, Memory: {MEMORY_STORAGE_BACKEND})...")
542
  app_port, app_server = int(os.getenv("GRADIO_PORT", 7860)), os.getenv("GRADIO_SERVER_NAME", "127.0.0.1")
543
  app_debug, app_share = os.getenv("GRADIO_DEBUG", "False").lower()=="true", os.getenv("GRADIO_SHARE", "False").lower()=="true"
544
  logger.info(f"Launching Gradio server: http://{app_server}:{app_port}. Debug: {app_debug}, Share: {app_share}")
 
398
  msg = f"Memories Upload: Processed {total_to_process}. Added: {added_count}, Format Errors: {format_error_count}, Save Errors: {save_error_count}."
399
  logger.info(msg); return msg
400
 
401
+ # app.py
402
+ # ... (all other Python code: imports, helper functions, logic functions remain the same) ...
403
+
404
  custom_theme = gr.themes.Base(primary_hue="teal", secondary_hue="purple", neutral_hue="zinc", text_size="sm", spacing_size="md", radius_size="sm", font=["System UI", "sans-serif"])
405
  custom_css = """
406
  body { background: linear-gradient(to bottom right, #2c3e50, #34495e); color: #ecf0f1; min-height: 100vh; margin:0; padding:0; font-family: 'System UI', 'sans-serif';}
407
  .gradio-container { background: transparent !important; max-width: 100% !important; padding: 1rem !important; box-sizing: border-box;}
408
+
409
+ /* Styling for gr.Group which replaces gr.Box */
410
+ .gr-group {
411
+ background-color: rgba(44, 62, 80, 0.8) !important; /* Matched to your .gr-box style */
412
+ border: 1px solid rgba(189, 195, 199, 0.2) !important;
413
+ border-radius: 8px !important;
414
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
415
+ padding: 1em; /* Add padding inside the group */
416
+ margin-bottom: 1rem; /* Space below groups */
417
+ }
418
+
419
+ .gr-panel, .gr-tabs, .gr-accordion { /* .gr-panel might be an older class, but keep if it targets something */
420
+ background-color: rgba(44, 62, 80, 0.85) !important;
421
+ border: 1px solid rgba(189, 195, 199, 0.2) !important;
422
+ border-radius: 8px !important;
423
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
424
+ }
425
+ .gr-tabitem {
426
+ background-color: rgba(52, 73, 94, 0.75) !important;
427
+ border-radius: 6px !important;
428
+ padding: 1em !important;
429
+ border: 1px solid rgba(189, 195, 199, 0.1) !important;
430
+ margin-bottom: 5px !important; /* Added from previous for consistency */
431
+ }
432
+ .gr-accordion {
433
+ background-color: rgba(52, 73, 94, 0.7) !important;
434
+ border-radius: 6px !important;
435
+ border: 1px solid rgba(189, 195, 199, 0.15) !important;
436
+ }
437
+
438
+ .gr-textbox, .gr-dropdown, .gr-button, .gr-code, .gr-chat-message, .gr-json, .gr-file input[type="file"] {
439
+ border: 1px solid rgba(189, 195, 199, 0.3) !important;
440
+ background-color: rgba(52, 73, 94, 0.9) !important;
441
+ color: #ecf0f1 !important;
442
+ border-radius: 6px !important;
443
+ }
444
+ .gr-file {
445
+ background-color: rgba(52, 73, 94, 0.9) !important;
446
+ border-radius: 6px !important; padding: 0.5em;
447
+ }
448
  .gr-file > .label-text { color: #bdc3c7 !important;}
449
  .gr-textarea textarea, .gr-textbox input { color: #ecf0f1 !important; }
450
+
451
  .gr-button.gr-button-primary { background-color: #1abc9c !important; color: white !important; border-color: #16a085 !important; }
452
  .gr-button.gr-button-secondary { background-color: #9b59b6 !important; color: white !important; border-color: #8e44ad !important; }
453
  .gr-button.gr-button-stop { background-color: #e74c3c !important; color: white !important; border-color: #c0392b !important; }
454
+
455
  .gr-markdown { padding: 5px; /* Reduced padding for markdown within styled boxes */ }
456
+ .gr-markdown h1, .gr-markdown h2, .gr-markdown h3 {
457
+ color: #1abc9c !important;
458
+ border-bottom: 1px solid rgba(189, 195, 199, 0.2) !important;
459
+ padding-bottom: 0.3em;
460
+ margin-top:0.5em; margin-bottom: 0.5em;
461
+ }
462
  .gr-markdown p, .gr-markdown li { color: #ecf0f1 !important; }
463
+ .gr-markdown pre code {
464
+ background-color: rgba(30, 40, 50, 0.95) !important;
465
+ border: 1px solid rgba(189, 195, 199, 0.3) !important;
466
+ color: #ecf0f1;
467
+ border-radius: 4px; padding: 0.8em;
468
+ }
469
+
470
+ .gr-chatbot {
471
+ background-color: rgba(44, 62, 80, 0.7) !important;
472
+ border: 1px solid rgba(189, 195, 199, 0.2) !important;
473
+ }
474
+ .gr-chatbot .message {
475
+ background-color: rgba(52, 73, 94, 0.9) !important;
476
+ color: #ecf0f1 !important;
477
+ border: 1px solid rgba(189, 195, 199, 0.2) !important;
478
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important;
479
+ }
480
+ .gr-chatbot .message.user {
481
+ background-color: rgba(46, 204, 113, 0.8) !important;
482
+ color: #2c3e50 !important;
483
+ }
484
+
485
+ .gr-input-label > .label-text, .gr-dropdown-label > .label-text, .gr-checkbox-label > .label-text {
486
+ color: #bdc3c7 !important;
487
+ font-size: 0.9rem !important;
488
+ }
489
  .gr-info { color: #bdc3c7 !important; font-size: 0.85rem !important; }
490
+
491
+ .status-bar { /* Used with elem_classes="status-bar" on the gr.Row */
492
+ background-color: rgba(44, 62, 80, 0.8) !important;
493
+ padding: 8px;
494
+ border-radius: 6px;
495
+ margin-bottom: 1rem;
496
+ }
497
+
498
+ .tabnav button { /* Style for tab buttons */
499
+ background-color: rgba(52, 73, 94, 0.8) !important;
500
+ color: #ecf0f1 !important;
501
+ border-bottom: 2px solid transparent !important;
502
+ border-top-left-radius: 6px !important;
503
+ border-top-right-radius: 6px !important;
504
+ margin-right: 2px !important;
505
+ }
506
+ .tabnav button.selected {
507
+ background-color: rgba(44, 62, 80, 0.95) !important;
508
+ color: #1abc9c !important;
509
+ border-bottom: 2px solid #1abc9c !important;
510
+ }
511
  """
512
 
513
+ with gr.Blocks(theme=custom_theme, css=custom_css, title="AI Research Mega Agent v5.4") as demo:
514
+ gr.Markdown("# πŸš€ AI Research Mega Agent Dashboard")
515
 
516
  avail_provs = get_available_providers()
517
  def_prov = avail_provs[0] if avail_provs else None
518
  def_models = get_model_display_names_for_provider(def_prov) if def_prov else []
519
  def_model_disp = get_default_model_display_name_for_provider(def_prov) if def_prov else None
520
 
521
+ with gr.Row(elem_classes="status-bar"):
522
  with gr.Column(scale=3): agent_stat_tb = gr.Textbox(label="Agent Status", interactive=False, lines=1, value="Initializing systems...")
523
  with gr.Column(scale=1): memory_backend_info_tb = gr.Textbox(label="Memory Backend", value=f"{MEMORY_STORAGE_BACKEND}", interactive=False)
524
  if MEMORY_STORAGE_BACKEND == "SQLITE":
525
  with gr.Column(scale=2): gr.Textbox(label="SQLite Path", value=f"{MEMORY_SQLITE_PATH}", interactive=False)
526
  elif MEMORY_STORAGE_BACKEND == "HF_DATASET":
527
  with gr.Column(scale=2): gr.Textbox(label="HF Repos", value=f"M: {MEMORY_HF_MEM_REPO}, R: {MEMORY_HF_RULES_REPO}", interactive=False)
528
+
529
  with gr.Row(equal_height=False): # Main layout row for sidebar and tabs
530
  with gr.Column(scale=1, min_width=350): # Sidebar for configuration
531
  gr.Markdown("## βš™οΈ Configuration")
532
+ with gr.Group(): # This gr.Group now acts like the old gr.Box
533
  gr.Markdown("### API & Model")
534
  api_key_tb = gr.Textbox(label="AI Provider API Key (Optional Override)", type="password", placeholder="Paste key here or set env var")
535
  prov_sel_dd = gr.Dropdown(label="AI Provider", choices=avail_provs, value=def_prov, interactive=True)
536
  model_sel_dd = gr.Dropdown(label="AI Model", choices=def_models, value=def_model_disp, interactive=True)
537
+ with gr.Group(): # This gr.Group now acts like the old gr.Box
538
  gr.Markdown("### System Prompt")
539
  sys_prompt_tb = gr.Textbox(label="System Prompt Base", lines=10, value=DEFAULT_SYSTEM_PROMPT, interactive=True)
540
 
 
555
  gr.Markdown("## Manage Stored Knowledge")
556
  with gr.Row(equal_height=False):
557
  with gr.Column(scale=1):
558
+ with gr.Group(): # Replaced gr.Box with gr.Group
559
  gr.Markdown("### πŸ“œ Rules (Learned Insights)")
560
  rules_disp_ta = gr.TextArea(label="View/Edit Rules", lines=15, interactive=True, placeholder="Load or type rules here (one per line or '---' separated for multiple).")
561
  with gr.Row():
 
567
  save_faiss_ram_btn_kb = gr.Button("Save FAISS Indices", visible=(MEMORY_STORAGE_BACKEND == "RAM"))
568
 
569
  with gr.Column(scale=1):
570
+ with gr.Group(): # Replaced gr.Box with gr.Group
571
  gr.Markdown("### πŸ“š Memories (Past Interactions)")
572
+ mems_disp_json = gr.JSON(label="View Memories (JSON format)") # Removed scale=2, as it's not a standard gr.JSON param
573
  with gr.Row(): view_mems_btn = gr.Button("πŸ”„ Load/Refresh Memories")
574
  upload_mems_fobj = gr.File(label="Upload Memories File (.jsonl)", file_types=[".jsonl"])
575
  mems_stat_tb = gr.Textbox(label="Memories Operation Status", interactive=False, lines=2, placeholder="Status...")
576
  clear_mems_btn = gr.Button("⚠️ Clear All Memories", variant="stop")
577
 
578
+ # --- Event Handlers (remain the same as your last correct version) ---
579
  def dyn_upd_model_dd(sel_prov_dyn:str): models_dyn, def_model_dyn = get_model_display_names_for_provider(sel_prov_dyn), get_default_model_display_name_for_provider(sel_prov_dyn); return gr.Dropdown(choices=models_dyn, value=def_model_dyn, interactive=True)
580
  prov_sel_dd.change(fn=dyn_upd_model_dd, inputs=prov_sel_dd, outputs=model_sel_dd)
581
  chat_ins = [user_msg_tb, main_chat_disp, prov_sel_dd, model_sel_dd, api_key_tb, sys_prompt_tb]
 
603
  upload_rules_fobj.upload(fn=ui_upload_rules_action_fn, inputs=[upload_rules_fobj], outputs=[rules_stat_tb], show_progress="full").then(fn=ui_view_rules_action_fn, outputs=rules_disp_ta)
604
  clear_rules_btn.click(fn=lambda: "All rules cleared." if clear_all_rules_data_backend() else "Error clearing rules.", outputs=rules_stat_tb).then(fn=ui_view_rules_action_fn, outputs=rules_disp_ta)
605
 
606
+ if MEMORY_STORAGE_BACKEND == "RAM" and 'save_faiss_ram_btn_kb' in locals() and save_faiss_ram_btn_kb is not None :
607
  def save_faiss_action_with_feedback_fn_kb(): save_faiss_indices_to_disk(); gr.Info("Attempted to save FAISS indices to disk.")
608
  save_faiss_ram_btn_kb.click(fn=save_faiss_action_with_feedback_fn_kb, inputs=None, outputs=None)
609
 
 
621
 
622
  demo.load(fn=app_load_fn, inputs=None, outputs=[agent_stat_tb, rules_disp_ta, mems_disp_json])
623
 
624
+
625
  if __name__ == "__main__":
626
+ logger.info(f"Starting Gradio AI Research Mega Agent (v5.4 - UI Fixes, Memory: {MEMORY_STORAGE_BACKEND})...")
627
  app_port, app_server = int(os.getenv("GRADIO_PORT", 7860)), os.getenv("GRADIO_SERVER_NAME", "127.0.0.1")
628
  app_debug, app_share = os.getenv("GRADIO_DEBUG", "False").lower()=="true", os.getenv("GRADIO_SHARE", "False").lower()=="true"
629
  logger.info(f"Launching Gradio server: http://{app_server}:{app_port}. Debug: {app_debug}, Share: {app_share}")