File size: 3,743 Bytes
62a3701
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Export handler for comparison results."""

import csv
import json
from datetime import datetime
from io import StringIO
from typing import Any, Dict, List


class ExportHandler:
    """Handles exporting comparison results to various formats."""

    @staticmethod
    def export_to_json(
        prompt: str,
        tools_enabled: List[str],
        comparisons: List[Dict[str, Any]],
    ) -> str:
        """Export comparison results to JSON format.

        Args:
            prompt: User prompt
            tools_enabled: List of enabled tool names
            comparisons: List of comparison results

        Returns:
            JSON string
        """
        export_data = {
            "timestamp": datetime.now().isoformat(),
            "prompt": prompt,
            "tools_enabled": tools_enabled,
            "comparisons": [],
        }

        for comp in comparisons:
            metrics = comp.get("metrics")
            export_data["comparisons"].append(
                {
                    "model": comp.get("model_name", "Unknown"),
                    "output": comp.get("output", ""),
                    "tools_called": comp.get("tools_used", []),
                    "metrics": metrics.to_dict() if hasattr(metrics, "to_dict") else {},
                }
            )

        return json.dumps(export_data, indent=2)

    @staticmethod
    def export_to_csv(
        prompt: str,
        tools_enabled: List[str],
        comparisons: List[Dict[str, Any]],
    ) -> str:
        """Export comparison results to CSV format.

        Args:
            prompt: User prompt
            tools_enabled: List of enabled tool names
            comparisons: List of comparison results

        Returns:
            CSV string
        """
        output = StringIO()
        writer = csv.writer(output)

        # Write header
        writer.writerow(
            [
                "Timestamp",
                "Prompt",
                "Tools Enabled",
                "Model",
                "Total Time (s)",
                "Tokens/sec",
                "Tokens Generated",
                "Tool Calls",
                "Tool Exec Time (s)",
                "Success",
                "Output Preview",
            ]
        )

        # Write data rows
        timestamp = datetime.now().isoformat()
        tools_str = ", ".join(tools_enabled)

        for comp in comparisons:
            metrics = comp.get("metrics")
            if hasattr(metrics, "to_dict"):
                metrics_dict = metrics.to_dict()
            else:
                metrics_dict = {}

            output_preview = comp.get("output", "")[:100] + "..." if len(comp.get("output", "")) > 100 else comp.get("output", "")

            writer.writerow(
                [
                    timestamp,
                    prompt,
                    tools_str,
                    comp.get("model_name", "Unknown"),
                    metrics_dict.get("total_time", 0),
                    metrics_dict.get("tokens_per_second", 0),
                    metrics_dict.get("tokens_generated", 0),
                    metrics_dict.get("tool_calls_count", 0),
                    metrics_dict.get("tool_execution_time", 0),
                    metrics_dict.get("success", False),
                    output_preview,
                ]
            )

        return output.getvalue()

    @staticmethod
    def create_download_filename(format_type: str) -> str:
        """Create filename for download.

        Args:
            format_type: 'json' or 'csv'

        Returns:
            Filename with timestamp
        """
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        return f"model_comparison_{timestamp}.{format_type}"