Tăng độ bền vững cho lời gọi công cụ API
Trong môi trường production, công cụ convert_currency() của currency server không được treo nếu API tỷ giá phản hồi chậm hoặc không truy cập được. Để giảm rủi ro này, bạn sẽ thêm timeout cho yêu cầu và đảm bảo mọi lỗi đều trả về thông báo ngắn gọn, rõ ràng cho người dùng thay vì ném ra exception thô.
Một MCP server đã được khởi tạo và lưu trong biến mcp.
Bài tập này là một phần của khóa học
Giới thiệu về Model Context Protocol (MCP)
Hướng dẫn bài tập
- Triển khai logic try-except để thử gửi yêu cầu API và nếu có lỗi, bắt ngoại lệ để thất bại một cách êm đẹp.
- Thêm timeout 10 giây vào lệnh gọi
requests.get()để yêu cầu không bị treo vô thời hạn.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
@mcp.tool()
def convert_currency(amount: float, from_currency: str, to_currency: str) -> str:
"""
Convert an amount from one currency to another using current exchange rates.
Args:
amount: The amount to convert
from_currency: Source currency code (e.g., 'USD', 'EUR', 'GBP')
to_currency: Target currency code (e.g., 'USD', 'EUR', 'GBP')
Returns:
A string with the conversion result and exchange rate
"""
url = f"https://api.frankfurter.dev/v1/latest?base={from_currency}&symbols={to_currency}"
# Implement try-except to gracefully handle errors
____:
# Add a 10-second timeout so the request does not hang
r = requests.get(url, ____=____)
r.raise_for_status()
data = r.json()
rate = data["rates"].get(to_currency)
if rate is None:
return f"Could not find exchange rate for {from_currency} to {to_currency}"
return f"{amount} {from_currency} = {amount * rate:.2f} {to_currency} (Rate: {rate})"
____ requests.exceptions.RequestException as e:
return f"Error converting currency: {e}"
print(convert_currency(10, "USD", "EUR"))