File size: 3,325 Bytes
25d91b2
 
 
 
 
 
 
 
 
 
 
 
8d74186
25d91b2
 
14fdbf2
25d91b2
 
14fdbf2
 
 
 
 
25d91b2
 
14fdbf2
25d91b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14fdbf2
25d91b2
 
 
 
 
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
import requests
import os
import smolagents
from smolagents.tools import Tool
# y obtener tu clave API para usar este código.
API_KEY = os.getenv("EXCHANGE_RATE_API_KEY") # Read from environment variable
BASE_URL = "https://api.currencyfreaks.com/v2.0/rates/latest" 


class ExchangeRatesTool(Tool):
    name = "exchange_rates"
    description = "Converts an amount from one currency to another using the latest exchange rates."
    inputs = {'amount': {'type': 'number', 'description': 'The amount to convert.'},
              'from_currency': {'type': 'string', 'description': 'The currency to convert from.'},
              'to_currency': {'type': 'string', 'description': 'The currency to convert to.'}}
    output_type = "number"

    def forward(self, amount: float, from_currency: str, to_currency: str) -> float:
        result = currency_converter(amount, from_currency, to_currency)
        if isinstance(result, float):
            return result
        else:
            raise Exception(result)


def currency_converter(amount: float, from_currency: str, to_currency: str) -> float | str:
    """Convierte un monto dado de una divisa a otra usando tipos de cambio en tiempo real.
    
    Args:
        amount: La cantidad de dinero a convertir (e.g., 100.0).
        from_currency: El código de la divisa de origen (e.g., "USD").
        to_currency: El código de la divisa de destino (e.g., "EUR").
    """
    try:
        # CurrencyFreaks API provides rates relative to USD by default.
        url = f"{BASE_URL}?apikey={API_KEY}"
        response = requests.get(url)
        response.raise_for_status()  # Lanza un error para códigos de estado HTTP malos

        data = response.json()
        rates = data.get("rates")
        
        from_currency_upper = from_currency.upper()
        to_currency_upper = to_currency.upper()
        
        # Validate if API_KEY is missing or rates are not found
        if not API_KEY:
            return "Error: La clave API no está configurada. Por favor, asegúrate de que EXCHANGE_RATE_API_KEY esté en tus variables de entorno."
        if not rates:
            return "Error: No se pudieron obtener las tasas de cambio de la API."

        # Handle USD as a special case, as it's the base
        if from_currency_upper == "USD":
            from_usd_rate = 1.0
        elif from_currency_upper in rates:
            from_usd_rate = float(rates[from_currency_upper])
        else:
            return f"Error: No se encontró la tasa de conversión para la divisa de origen '{from_currency_upper}'."

        if to_currency_upper == "USD":
            to_usd_rate = 1.0
        elif to_currency_upper in rates:
            to_usd_rate = float(rates[to_currency_upper])
        else:
            return f"Error: No se encontró la tasa de conversión para la divisa de destino '{to_currency_upper}'."
            
        # Convert 'amount' from 'from_currency' to USD
        amount_in_usd = amount / from_usd_rate
        
        # Convert amount in USD to 'to_currency'
        converted_amount = amount_in_usd * to_usd_rate
        
        return converted_amount
    
    except requests.exceptions.HTTPError as e:
        return f"Error HTTP al obtener tasas: {e}"
    except Exception as e:
        return f"Ocurrió un error inesperado: {str(e)}"