File size: 2,922 Bytes
789270d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290270b
789270d
 
 
 
 
 
 
 
 
e18459f
a8ad89a
 
 
 
 
e18459f
789270d
 
 
 
61b63ce
e18459f
 
 
61b63ce
 
789270d
 
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
from smolagents import Tool
from typing import Any, Optional

class SimpleTool(Tool):
    name = "convert_unit"
    description = "Convert a value from one unit to another."
    inputs = {'value': {'type': 'number', 'description': 'The numerical value to be converted.'}, 'from_unit': {'type': 'string', 'description': 'The unit of the input value (e.g., "cm", "kg").'}, 'to_unit': {'type': 'string', 'description': 'The target unit for conversion (e.g., "km", "lb").'}}
    output_type = "number"

    def forward(self, value: float, from_unit: str, to_unit: str) -> float:
        """
        Convert a value from one unit to another.

        Args:
            value: The numerical value to be converted.
            from_unit: The unit of the input value (e.g., "cm", "kg").
            to_unit: The target unit for conversion (e.g., "km", "lb").

        Returns:
            The converted value in the target unit.

        Raises:
            ValueError: If the conversion between the specified units is not supported.
        """

        # Define conversion rates
        conversion_rates = {
            # Length
            'mm': {'cm': 0.1, 'm': 0.001, 'km': 0.000001, 'in': 0.0393701, 'ft': 0.00328084},
            'cm': {'mm': 10, 'm': 0.01, 'km': 0.00001, 'in': 0.393701, 'ft': 0.0328084},
            'm': {'mm': 1000, 'cm': 100, 'km': 0.001, 'in': 39.3701, 'ft': 3.28084,},
            'km': {'mm': 1000000, 'cm': 100000, 'm': 1000, 'in': 39370.1, 'ft': 3280.84},
            'in': {'mm': 25.4, 'cm': 2.54, 'm': 0.0254, 'km': 0.0000254, 'ft': 0.0833333},
            'ft': {'mm': 304.8, 'cm': 30.48, 'm': 0.3048, 'km': 0.0003048, 'in': 12,},

            # Weight
            'mg': {'g': 0.001, 'kg': 0.000001, 'lb': 0.00000220462, 'oz': 0.000035274},
            'g': {'mg': 1000, 'kg': 0.001, 'lb': 0.00220462, 'oz': 0.035274},
            'kg': {'mg': 1000000, 'g': 1000, 'lb': 2.20462, 'oz': 35.274},
            'lb': {'mg': 453592, 'g': 453.592, 'kg': 0.453592, 'oz': 16},
            'oz': {'mg': 28349.5, 'g': 28.3495, 'kg': 0.0283495, 'lb': 0.0625},
        }

        # Convert `value` to float if it's a string
        if isinstance(value, str):
            try:
                value = float(value)
            except ValueError:
                raise ValueError("Value must be a number")
        
        # Check if the units are valid
        if from_unit not in conversion_rates or to_unit not in conversion_rates[from_unit]:
            raise ValueError(f"Conversion from {from_unit} to {to_unit} is not supported")

        # Debug error
        # print(f"Value: {value}, Type: {type(value)}")
        # print(f"From unit: {from_unit}, To unit: {to_unit}")
        # print(f"Conversion rate: {conversion_rates[from_unit][to_unit]}, Type: {type(conversion_rates[from_unit][to_unit])}")

        
        # Perform the conversion
        return value * conversion_rates[from_unit][to_unit]