|
from typing import Any, Optional |
|
from smolagents.tools import Tool |
|
import os |
|
import requests |
|
|
|
class TranslatePhraseTool(Tool): |
|
name = "translate_phrase" |
|
description = "Translates common travel phrases to a local language." |
|
inputs = { |
|
'text': {'type': 'string', 'description': 'Text to translate (e.g., "Hello", "Thank you", "Where is the bathroom?")'}, |
|
'language': {'type': 'string', 'description': 'Target language (e.g., "Spanish", "Japanese", "French")'} |
|
} |
|
output_type = "string" |
|
|
|
def __init__(self, api_key=None): |
|
super().__init__() |
|
|
|
self.api_key = api_key or os.environ.get("TRANSLATION_API_KEY") |
|
|
|
|
|
self.phrase_translations = { |
|
"hello": { |
|
"spanish": {"text": "Hola", "pronunciation": "oh-lah"}, |
|
"french": {"text": "Bonjour", "pronunciation": "bohn-zhoor"}, |
|
"italian": {"text": "Ciao", "pronunciation": "chow"}, |
|
"german": {"text": "Hallo", "pronunciation": "hah-loh"}, |
|
"japanese": {"text": "こんにちは (Konnichiwa)", "pronunciation": "kohn-nee-chee-wah"}, |
|
"mandarin": {"text": "你好 (Nǐ hǎo)", "pronunciation": "nee how"}, |
|
"arabic": {"text": "مرحبا (Marhaba)", "pronunciation": "mar-ha-ba"}, |
|
"russian": {"text": "Здравствуйте (Zdravstvuyte)", "pronunciation": "zdrah-stvooy-tye"}, |
|
"portuguese": {"text": "Olá", "pronunciation": "oh-lah"}, |
|
"thai": {"text": "สวัสดี (Sawatdee)", "pronunciation": "sa-wat-dee"} |
|
}, |
|
"thank you": { |
|
"spanish": {"text": "Gracias", "pronunciation": "grah-see-ahs"}, |
|
"french": {"text": "Merci", "pronunciation": "mair-see"}, |
|
"italian": {"text": "Grazie", "pronunciation": "graht-see-eh"}, |
|
"german": {"text": "Danke", "pronunciation": "dahn-kuh"}, |
|
"japanese": {"text": "ありがとう (Arigatou)", "pronunciation": "ah-ree-gah-toh"}, |
|
"mandarin": {"text": "谢谢 (Xièxiè)", "pronunciation": "shyeh-shyeh"}, |
|
"arabic": {"text": "شكرا (Shukran)", "pronunciation": "shoo-kran"}, |
|
"russian": {"text": "Спасибо (Spasibo)", "pronunciation": "spah-see-boh"}, |
|
"portuguese": {"text": "Obrigado/a", "pronunciation": "oh-bree-gah-doo/dah"}, |
|
"thai": {"text": "ขอบคุณ (Khop khun)", "pronunciation": "kop-koon"} |
|
}, |
|
"excuse me": { |
|
"spanish": {"text": "Disculpe", "pronunciation": "dees-kool-peh"}, |
|
"french": {"text": "Excusez-moi", "pronunciation": "ex-koo-zay mwah"}, |
|
"italian": {"text": "Scusi", "pronunciation": "skoo-zee"}, |
|
"german": {"text": "Entschuldigung", "pronunciation": "ent-shool-di-goong"}, |
|
"japanese": {"text": "すみません (Sumimasen)", "pronunciation": "soo-mee-mah-sen"}, |
|
"mandarin": {"text": "对不起 (Duìbùqǐ)", "pronunciation": "dway-boo-chee"}, |
|
"arabic": {"text": "عفوا (Afwan)", "pronunciation": "af-wan"}, |
|
"russian": {"text": "Извините (Izvinite)", "pronunciation": "eez-vee-nee-tye"}, |
|
"portuguese": {"text": "Com licença", "pronunciation": "com lee-sen-sah"}, |
|
"thai": {"text": "ขอโทษ (Kho thot)", "pronunciation": "kor-toht"} |
|
}, |
|
"where is the bathroom": { |
|
"spanish": {"text": "¿Dónde está el baño?", "pronunciation": "don-deh es-tah el ban-yo"}, |
|
"french": {"text": "Où sont les toilettes?", "pronunciation": "oo son lay twa-let"}, |
|
"italian": {"text": "Dov'è il bagno?", "pronunciation": "doh-veh eel ban-yo"}, |
|
"german": {"text": "Wo ist die Toilette?", "pronunciation": "vo ist dee twa-let-te"}, |
|
"japanese": {"text": "トイレはどこですか (Toire wa doko desu ka)", "pronunciation": "toy-reh wah doh-koh des-kah"}, |
|
"mandarin": {"text": "厕所在哪里 (Cèsuǒ zài nǎlǐ)", "pronunciation": "tsuh-swor dzeye nah-lee"}, |
|
"arabic": {"text": "أين الحمام (Ayna al-hammam)", "pronunciation": "eye-nah al-ham-mam"}, |
|
"russian": {"text": "Где туалет (Gde tualet)", "pronunciation": "g-dyeh too-ah-lyet"}, |
|
"portuguese": {"text": "Onde fica o banheiro?", "pronunciation": "on-jee fee-ka oo ban-yay-roo"}, |
|
"thai": {"text": "ห้องน้ำอยู่ที่ไหน (Hong nam yu tee nai)", "pronunciation": "hong nam yoo tee nai"} |
|
}, |
|
"how much": { |
|
"spanish": {"text": "¿Cuánto cuesta?", "pronunciation": "kwan-toh kwes-tah"}, |
|
"french": {"text": "Combien ça coûte?", "pronunciation": "kom-bee-en sa koot"}, |
|
"italian": {"text": "Quanto costa?", "pronunciation": "kwan-toh kos-tah"}, |
|
"german": {"text": "Wie viel kostet das?", "pronunciation": "vee feel kos-tet das"}, |
|
"japanese": {"text": "いくらですか (Ikura desu ka)", "pronunciation": "ee-koo-rah des-kah"}, |
|
"mandarin": {"text": "多少钱 (Duōshǎo qián)", "pronunciation": "dwor-shaow chyen"}, |
|
"arabic": {"text": "كم الثمن (Kam althaman)", "pronunciation": "kam al-tha-man"}, |
|
"russian": {"text": "Сколько это стоит (Skol'ko eto stoit)", "pronunciation": "skol-ka eh-ta stoh-eet"}, |
|
"portuguese": {"text": "Quanto custa?", "pronunciation": "kwan-too koos-tah"}, |
|
"thai": {"text": "ราคาเท่าไหร่ (Raka tao rai)", "pronunciation": "ra-ka tao-rai"} |
|
} |
|
} |
|
|
|
def forward(self, text: str, language: str) -> str: |
|
try: |
|
|
|
if self.api_key: |
|
try: |
|
url = "https://libretranslate.de/translate" |
|
payload = { |
|
"q": text, |
|
"source": "auto", |
|
"target": language.lower()[:2], |
|
"format": "text" |
|
} |
|
|
|
response = requests.post(url, data=payload) |
|
data = response.json() |
|
|
|
if 'translatedText' in data: |
|
return f"🗣️ '{text}' in {language.capitalize()}:\n\n{data['translatedText']}" |
|
else: |
|
|
|
return self._translate_with_stored_phrases(text, language) |
|
|
|
except Exception: |
|
|
|
return self._translate_with_stored_phrases(text, language) |
|
|
|
|
|
return self._translate_with_stored_phrases(text, language) |
|
|
|
except Exception as e: |
|
return f"Error translating text: {str(e)}" |
|
|
|
def _translate_with_stored_phrases(self, text: str, language: str) -> str: |
|
|
|
text_lower = text.lower().strip() |
|
language = language.lower().strip() |
|
|
|
|
|
matched_phrase = None |
|
for phrase in self.phrase_translations: |
|
if phrase in text_lower or text_lower in phrase: |
|
matched_phrase = phrase |
|
break |
|
|
|
if not matched_phrase: |
|
return f"I don't have a translation for '{text}'. Try common travel phrases like 'hello', 'thank you', 'excuse me', etc." |
|
|
|
|
|
matched_language = None |
|
for lang in self.phrase_translations[matched_phrase]: |
|
if lang in language or language in lang: |
|
matched_language = lang |
|
break |
|
|
|
if not matched_language: |
|
return f"I don't have translations for {language}. Try languages like Spanish, French, Italian, German, Japanese, etc." |
|
|
|
|
|
translation = self.phrase_translations[matched_phrase][matched_language] |
|
|
|
return f"🗣️ '{text}' in {matched_language.capitalize()}:\n\n{translation['text']}\n\nPronunciation: {translation['pronunciation']}" |