import gradio as gr import torch import os from classifier_app import ClassifierApp, config from typing import Dict def create_interface(app: ClassifierApp) -> gr.Blocks: """Створення веб-інтерфейсу""" # Синхронізуємо інформацію перед створенням інтерфейсу initial_info = app.sync_system_info() with gr.Blocks() as demo: gr.Markdown("# SDC Classifier") with gr.Tabs(): # Вкладка 1: Тестування одного тексту with gr.TabItem("Тестування одного тексту"): with gr.Row(): with gr.Column(): text_input = gr.Textbox( label="Введіть текст для аналізу", lines=5, placeholder="Введіть текст..." ) threshold_slider = gr.Slider( minimum=0.0, maximum=1.0, value=0.3, step=0.05, label="Поріг впевненості" ) single_process_btn = gr.Button("Проаналізувати") with gr.Column(): result_text = gr.JSON(label="Результати аналізу") with gr.Accordion("Налаштування моделі", open=False): with gr.Row(): model_type = gr.Radio( choices=["OpenAI", "Local"], value="OpenAI", label="Тип моделі" ) model_choice = gr.Dropdown( choices=config.DEFAULT_OPENAI_MODELS, value=config.DEFAULT_OPENAI_MODELS[0], label="OpenAI model", visible=True ) local_model_path = gr.Textbox( value=config.DEFAULT_LOCAL_MODEL, label="Шлях до локальної моделі", visible=False ) device_choice = gr.Radio( choices=["cuda", "cpu"], value="cuda" if torch.cuda.is_available() else "cpu", label="Пристрій для локальної моделі", visible=False ) with gr.Row(): json_file = gr.File( label="Завантажити новий JSON з класами", file_types=[".json"] ) force_rebuild = gr.Checkbox( label="Примусово перебудувати signatures", value=False ) with gr.Row(): build_btn = gr.Button("Оновити signatures") build_out = gr.Label(label="Статус signatures") cache_stats = gr.JSON(label="Статистика кешу", value={}) # Вкладка 2: Інформація про систему with gr.TabItem("Інформація про систему"): system_info = gr.JSON( value=app.initial_info, label="Статус системи" ) system_md = gr.Markdown() system_md.value = app.update_system_markdown(app.initial_info) # Вкладка 3: Пакетна обробка with gr.TabItem("Пакетна обробка"): gr.Markdown("## Оцінка класифікації") with gr.Row(): csv_input = gr.File( label="CSV файл з колонками Category та Question", file_types=[".csv"] ) threshold_slider_batch = gr.Slider( minimum=0.0, maximum=1.0, value=0.3, step=0.05, label="Поріг впевненості" ) evaluate_btn = gr.Button("Оцінити класифікацію") results_df = gr.DataFrame( label="Результати класифікації" ) stats_md = gr.Markdown("### Статистика класифікації") save_results_btn = gr.Button("Завантажити результати") download_file = gr.File(label="Завантажити файл з результатами") save_status = gr.Markdown() # Підключення обробників подій model_type.change( fn=app.update_model_inputs, inputs=[ model_type, model_choice, local_model_path, device_choice ], outputs=[ model_choice, local_model_path, device_choice, system_info, system_md, build_out, cache_stats ] ) build_btn.click( fn=app.update_classifier_settings, inputs=[ json_file, model_type, model_choice, local_model_path, device_choice, force_rebuild ], outputs=[build_out, cache_stats, system_info, system_md] ) single_process_btn.click( fn=app.process_single_text, inputs=[text_input, threshold_slider], outputs=result_text ) evaluate_btn.click( fn=app.evaluate_batch, inputs=[csv_input, threshold_slider_batch], outputs=[results_df, stats_md] ) save_results_btn.click( fn=app.save_evaluation_results, outputs=[download_file, save_status] ) return demo def main(): try: print("\nЗапуск програми...") app = ClassifierApp() print("\nПочаток ініціалізації середовища...") init_result, classifier = app.initialize_environment() print("\nРезультат ініціалізації:") print(f"Статус: {init_result['status']}") if init_result.get('errors'): print("Помилки:", init_result['errors']) if classifier is None or init_result["status"] != "success": print("\nНе вдалося ініціалізувати середовище") return print(f"\nІнформація про систему:") print(f"Кількість завантажених класів: {len(init_result['classes_info']['classes_list'])}") print(f"Сигнатури: {'Завантажено' if os.path.exists(config.DEFAULT_SIGNATURES_FILE) else 'Створюються'}") demo = create_interface(app) demo.launch(server_name="0.0.0.0", server_port=7860, share=True) except Exception as e: print(f"\nКритична помилка в main(): {str(e)}") import traceback print("\nДетальний traceback:") print(traceback.format_exc()) if __name__ == "__main__": main()