File size: 3,759 Bytes
e62c239
 
 
 
 
 
 
 
 
 
a8853dd
e62c239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from typing import Any, Dict, Union
from smolagents.tools import Tool
import re

class ParseKmReadingTool(Tool):
    name = "parse_km_reading"
    description = "Parses kilometer readings from user input."
    inputs = {
        'input_text': {'type': 'string', 'description': 'Text input from the user that may contain kilometer readings'}
    }
    output_type = "any"

    def __init__(self):
        self.is_initialized = True
        # Store the last valid kilometer reading to use as start_km for future trips
        self.last_reading = None

    def forward(self, input_text: str) -> Dict[str, Any]:
        """
        Parse kilometer readings from user input.
        
        Args:
            input_text: Text input that may contain kilometer readings
            
        Returns:
            A dictionary with parsed kilometer readings
        """
        try:
            # Clean and normalize input
            clean_text = input_text.strip().replace(',', '')
            
            # Find all numbers in the input
            numbers = re.findall(r'\b\d+\b', clean_text)
            numbers = [int(num) for num in numbers]
            
            # Determine what kind of reading this is
            result = {
                "success": True,
                "numbers_found": numbers,
                "reading_type": None
            }
            
            if len(numbers) == 0:
                result["success"] = False
                result["error"] = "No kilometer readings found in input"
                return result
            
            if len(numbers) == 1:
                # Single reading - could be start or end
                km_reading = numbers[0]
                
                if self.last_reading is None:
                    # First reading ever, must be start
                    result["reading_type"] = "start"
                    result["start_km"] = km_reading
                    self.last_reading = km_reading
                else:
                    # We have a previous reading
                    if km_reading > self.last_reading:
                        # This is likely an end reading
                        result["reading_type"] = "end"
                        result["end_km"] = km_reading
                        result["start_km"] = self.last_reading
                        result["km_traveled"] = km_reading - self.last_reading
                        self.last_reading = km_reading
                    else:
                        # This is likely a new start reading
                        result["reading_type"] = "start"
                        result["start_km"] = km_reading
                        self.last_reading = km_reading
            
            elif len(numbers) == 2:
                # Two readings - likely start and end
                start_km = min(numbers)
                end_km = max(numbers)
                
                result["reading_type"] = "complete"
                result["start_km"] = start_km
                result["end_km"] = end_km
                result["km_traveled"] = end_km - start_km
                self.last_reading = end_km
            
            else:
                # More than 2 numbers - take first and last assuming chronological order
                result["reading_type"] = "multiple"
                result["start_km"] = numbers[0]
                result["end_km"] = numbers[-1]
                result["km_traveled"] = numbers[-1] - numbers[0]
                result["all_readings"] = numbers
                self.last_reading = numbers[-1]
            
            return result
        
        except Exception as e:
            return {
                "success": False,
                "error": str(e)
            }