|
import gradio as gr |
|
import pandas as pd |
|
|
|
|
|
def add_model_responses_tab(block, data_manager, available_models): |
|
with gr.Tab("Model Cevapları"): |
|
gr.Markdown("### Model Cevaplarını Göz At") |
|
gr.Markdown("**6.200 soruyu ve model cevaplarını model ve kategoriye göre filtreleyin.**") |
|
|
|
|
|
categories = ["Tümü"] |
|
if not data_manager.responses_data.empty: |
|
|
|
category_col = None |
|
for col in data_manager.responses_data.columns: |
|
if 'kategori' in col.lower() or 'category' in col.lower() or 'bolum' in col.lower(): |
|
category_col = col |
|
break |
|
|
|
if category_col: |
|
categories += sorted(data_manager.responses_data[category_col].dropna().unique().tolist()) |
|
|
|
with gr.Row(): |
|
model_filter = gr.Dropdown( |
|
choices=["Tümü"] + available_models, |
|
label="Model Filtresi", |
|
value="Tümü" |
|
) |
|
category_filter = gr.Dropdown( |
|
choices=categories, |
|
label="Kategori Filtresi", |
|
value="Tümü" |
|
) |
|
filter_btn = gr.Button("Filtrele", variant="primary") |
|
clear_btn = gr.Button("Temizle") |
|
|
|
with gr.Row(): |
|
page_size = gr.Slider( |
|
minimum=10, |
|
maximum=100, |
|
value=20, |
|
step=10, |
|
label="Sayfa Başına Gösterim" |
|
) |
|
page_info = gr.HTML(value="<div style='text-align: center; padding: 10px;'>Sayfa 1</div>") |
|
|
|
responses_table = gr.DataFrame( |
|
headers=["Soru", "Doğru Cevap", "Model Cevabı", "Kategori"], |
|
datatype=["str", "str", "str", "str"], |
|
col_count=(4, "fixed"), |
|
interactive=False, |
|
wrap=True |
|
) |
|
|
|
with gr.Row(): |
|
prev_btn = gr.Button("← Önceki", variant="secondary") |
|
next_btn = gr.Button("Sonraki →", variant="secondary") |
|
|
|
|
|
current_page = gr.State(1) |
|
|
|
def filter_responses(model, category, page_size_val, page): |
|
try: |
|
df = data_manager.responses_data.copy() |
|
if df.empty: |
|
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Veri bulunamadı</div>" |
|
|
|
|
|
question_col = None |
|
answer_col = None |
|
category_col = None |
|
|
|
|
|
for col in df.columns: |
|
if 'soru' in col.lower() or 'question' in col.lower(): |
|
question_col = col |
|
break |
|
|
|
|
|
for col in df.columns: |
|
if 'cevap' in col.lower() and not col.endswith('_cevap'): |
|
answer_col = col |
|
break |
|
|
|
|
|
for col in df.columns: |
|
if 'kategori' in col.lower() or 'category' in col.lower() or 'bolum' in col.lower(): |
|
category_col = col |
|
break |
|
|
|
|
|
if not question_col or not answer_col: |
|
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Gerekli sütunlar bulunamadı</div>" |
|
|
|
|
|
if model and model != "Tümü": |
|
model_col = f"{model}_cevap" |
|
if model_col in df.columns: |
|
df = df[df[model_col].notna()] |
|
|
|
|
|
if category and category != "Tümü" and category_col: |
|
df = df[df[category_col] == category] |
|
|
|
|
|
display_cols = [question_col, answer_col] |
|
if category_col: |
|
display_cols.append(category_col) |
|
|
|
if model and model != "Tümü": |
|
model_col = f"{model}_cevap" |
|
if model_col in df.columns: |
|
display_cols.append(model_col) |
|
df_display = df[display_cols].copy() |
|
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı'] |
|
else: |
|
df_display = df[display_cols].copy() |
|
df_display['Model Cevabı'] = 'Cevap yok' |
|
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı'] |
|
else: |
|
|
|
model_cols = [col for col in df.columns if col.endswith('_cevap')] |
|
if model_cols: |
|
display_cols.append(model_cols[0]) |
|
df_display = df[display_cols].copy() |
|
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı'] |
|
else: |
|
df_display = df[display_cols].copy() |
|
df_display['Model Cevabı'] = 'Cevap yok' |
|
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı'] |
|
|
|
|
|
total_rows = len(df_display) |
|
total_pages = (total_rows + page_size_val - 1) // page_size_val |
|
page = max(1, min(page, total_pages)) |
|
start_idx = (page - 1) * page_size_val |
|
end_idx = start_idx + page_size_val |
|
page_data = df_display.iloc[start_idx:end_idx] |
|
page_info_text = f"<div style='text-align: center; padding: 10px;'>Sayfa {page}/{total_pages} ({total_rows} sonuç)</div>" |
|
return page_data, page, page_info_text |
|
|
|
except Exception as e: |
|
print(f"Filter error: {e}") |
|
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Filtreleme hatası</div>" |
|
|
|
def next_page(current_page_val): |
|
return current_page_val + 1 |
|
|
|
def prev_page(current_page_val): |
|
return max(1, current_page_val - 1) |
|
|
|
def clear_filters(): |
|
return "Tümü", "Tümü", 1 |
|
|
|
|
|
filter_btn.click( |
|
filter_responses, |
|
inputs=[model_filter, category_filter, page_size, current_page], |
|
outputs=[responses_table, current_page, page_info] |
|
) |
|
|
|
next_btn.click( |
|
next_page, |
|
inputs=[current_page], |
|
outputs=[current_page] |
|
).then( |
|
filter_responses, |
|
inputs=[model_filter, category_filter, page_size, current_page], |
|
outputs=[responses_table, current_page, page_info] |
|
) |
|
|
|
prev_btn.click( |
|
prev_page, |
|
inputs=[current_page], |
|
outputs=[current_page] |
|
).then( |
|
filter_responses, |
|
inputs=[model_filter, category_filter, page_size, current_page], |
|
outputs=[responses_table, current_page, page_info] |
|
) |
|
|
|
clear_btn.click( |
|
clear_filters, |
|
outputs=[model_filter, category_filter, current_page] |
|
).then( |
|
filter_responses, |
|
inputs=[model_filter, category_filter, page_size, current_page], |
|
outputs=[responses_table, current_page, page_info] |
|
) |