Spaces:
Sleeping
Sleeping
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)
} |