File size: 4,661 Bytes
0847744
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import plotly.express as px
import plotly.graph_objects as go

def create_radar_chart(metrics_data, title):
    """
    Create a Plotly radar chart for a set of metrics
    
    Args:
        metrics_data (dict): Dictionary of metric names and values
        title (str): Chart title
        
    Returns:
        plotly.graph_objects.Figure: Radar chart
    """
    categories = list(metrics_data.keys())
    values = list(metrics_data.values())
    
    fig = go.Figure()
    
    fig.add_trace(go.Scatterpolar(
        r=values,
        theta=categories,
        fill='toself',
        name=title
    ))
    
    fig.update_layout(
        polar=dict(
            radialaxis=dict(
                visible=True,
                range=[0, 5]  # Assuming metrics are on a 1-5 scale
            )
        ),
        title=title,
        showlegend=True
    )
    
    return fig

def create_bar_chart(metrics_data, title):
    """
    Create a Plotly bar chart for a set of metrics
    
    Args:
        metrics_data (dict): Dictionary of metric names and values
        title (str): Chart title
        
    Returns:
        plotly.express.Figure: Bar chart
    """
    fig = px.bar(
        x=list(metrics_data.keys()),
        y=list(metrics_data.values()),
        labels={'x': 'Metric', 'y': 'Score'},
        title=title
    )
    
    fig.update_layout(
        xaxis_title="Metric",
        yaxis_title="Score",
        yaxis=dict(range=[0, 5]),  # Assuming metrics are on a 1-5 scale
        xaxis_tickangle=-45
    )
    
    return fig

def visualize_eval_data(eval_results, chart_type='radar'):
    """
    Generate Plotly visualizations for evaluation results
    
    Args:
        eval_results (dict): Evaluation results
        chart_type (str): Type of chart to create ('radar' or 'bar')
        
    Returns:
        list: List of tuples (title, chart)
    """
    charts = []
    
    if not eval_results or "message" in eval_results:
        return []
    
    # Handle different result structures
    if "journeyEvals" in eval_results and "aiScriptEvals" in eval_results:
        # Query 1 or ungrouped Query 2 result
        for eval_name, metrics in eval_results["journeyEvals"].items():
            if chart_type == 'radar':
                chart = create_radar_chart(metrics, f"Journey Eval: {eval_name}")
            else:
                chart = create_bar_chart(metrics, f"Journey Eval: {eval_name}")
            charts.append((f"Journey Eval: {eval_name}", chart))
        
        for eval_name, metrics in eval_results["aiScriptEvals"].items():
            if chart_type == 'radar':
                chart = create_radar_chart(metrics, f"AI Script Eval: {eval_name}")
            else:
                chart = create_bar_chart(metrics, f"AI Script Eval: {eval_name}")
            charts.append((f"AI Script Eval: {eval_name}", chart))
    
    elif isinstance(eval_results, dict):
        # Query 2 with group_by_plots=True or Query 3 with group_by_plots=True
        for plot_name, plot_data in eval_results.items():
            
            if isinstance(plot_data, dict) and "journeyEvals" in plot_data and "aiScriptEvals" in plot_data:
                # Query 2 result grouped by plots
                for eval_name, metrics in plot_data["journeyEvals"].items():
                    if chart_type == 'radar':
                        chart = create_radar_chart(metrics, f"{plot_name} - Journey Eval: {eval_name}")
                    else:
                        chart = create_bar_chart(metrics, f"{plot_name} - Journey Eval: {eval_name}")
                    charts.append((f"{plot_name} - Journey Eval: {eval_name}", chart))
                
                for eval_name, metrics in plot_data["aiScriptEvals"].items():
                    if chart_type == 'radar':
                        chart = create_radar_chart(metrics, f"{plot_name} - AI Script Eval: {eval_name}")
                    else:
                        chart = create_bar_chart(metrics, f"{plot_name} - AI Script Eval: {eval_name}")
                    charts.append((f"{plot_name} - AI Script Eval: {eval_name}", chart))
            
            elif isinstance(plot_data, dict):
                # Query 3 result grouped by plots
                for eval_name, metrics in plot_data.items():
                    if chart_type == 'radar':
                        chart = create_radar_chart(metrics, f"{plot_name} - Eval: {eval_name}")
                    else:
                        chart = create_bar_chart(metrics, f"{plot_name} - Eval: {eval_name}")
                    charts.append((f"{plot_name} - Eval: {eval_name}", chart))
    
    return charts