| import gradio as gr |
| from huggingface_hub import InferenceClient |
| import requests |
| from deep_translator import GoogleTranslator |
|
|
| client = InferenceClient("mistralai/Mistral-Nemo-Instruct-2407") |
|
|
| def translate_to_english(text: str) -> str: |
| try: |
| return GoogleTranslator(source='auto', target='en').translate(text) |
| except Exception: |
| return text |
|
|
| def translate_to_bisaya(text: str) -> str: |
| try: |
| return GoogleTranslator(source='auto', target='ceb').translate(text) |
| except Exception: |
| return text |
|
|
| def get_internet_data(query: str) -> str: |
| """ |
| Uses Qwant's free search API to fetch a snippet based on the query. |
| """ |
| url = "https://api.qwant.com/v3/search/web" |
| params = { |
| "q": query, |
| "count": 10, |
| "offset": 0, |
| "t": "web", |
| "safesearch": 1, |
| "locale": "en_US", |
| "uiv": 4, |
| } |
| try: |
| response = requests.get(url, params=params, timeout=5) |
| response.raise_for_status() |
| data = response.json() |
| items = data.get("data", {}).get("result", {}).get("items", []) |
| if items: |
| snippet = items[0].get("desc", "") |
| if not snippet: |
| snippet = items[0].get("title", "") |
| else: |
| snippet = "Wala koy nakuha nga impormasyon gikan sa Qwant search." |
| except Exception: |
| snippet = "Naay problema sa pagkuha sa impormasyon gikan sa Qwant search." |
| return snippet |
|
|
| def respond(message, history: list[tuple[str, str]]): |
| |
| english_query = translate_to_english(message) |
| |
| |
| search_result = get_internet_data(english_query) |
| |
| |
| bisaya_search_result = translate_to_bisaya(search_result) |
| |
| |
| enriched_message = ( |
| f"{message}\n\nMga resulta gikan sa internet (isinalin sa bisaya): {bisaya_search_result}" |
| ) |
| |
| system_message = ( |
| "Ikaw usa ka buotan nga Chatbot. Tubaga lang sa binisaya. " |
| "Gamiton ang bag-ong kasayuran nga nakuha gikan sa internet. " |
| "Ayaw og gamit ug English nga pinulungan." |
| ) |
| max_tokens = 4096 |
| temperature = 0.6 |
| top_p = 0.95 |
|
|
| messages = [{"role": "system", "content": system_message}] |
| for user_text, assistant_text in history: |
| if user_text: |
| messages.append({"role": "user", "content": user_text}) |
| if assistant_text: |
| messages.append({"role": "assistant", "content": assistant_text}) |
| messages.append({"role": "user", "content": enriched_message}) |
| |
| |
| full_response = "" |
| for token_message in client.chat_completion( |
| messages, |
| max_tokens=max_tokens, |
| stream=True, |
| temperature=temperature, |
| top_p=top_p, |
| ): |
| token = token_message.choices[0].delta.get("content", "") |
| if not token: |
| break |
| full_response += token |
| if len(full_response) > 3000: |
| break |
|
|
| |
| final_response = translate_to_bisaya(full_response) |
| yield final_response |
|
|
| demo = gr.ChatInterface(respond) |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|