Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| import logging | |
| import os | |
| from collections.abc import Iterator | |
| import gradio as gr | |
| from cohere import ClientV2 | |
| logger = logging.getLogger(__name__) | |
| model_id = "tiny-aya-global" | |
| # Initialize Cohere client | |
| api_key = os.getenv("COHERE_API_KEY") | |
| if not api_key: | |
| raise ValueError("COHERE_API_KEY environment variable is required") | |
| client = ClientV2(api_key=api_key, client_name="hf-tiny-aya-global") | |
| def _extract_text(content: object) -> str: | |
| """Extract plain text from any Cohere content shape. | |
| Handles plain strings, objects with a `.text` attribute, | |
| and lists of content blocks (e.g. [{'text': '...', 'type': 'text'}]). | |
| """ | |
| if content is None: | |
| return "" | |
| if isinstance(content, str): | |
| return content | |
| if isinstance(content, list): | |
| parts = [_extract_text(block) for block in content] | |
| return "".join(parts) | |
| text = getattr(content, "text", None) | |
| if text is not None: | |
| return str(text) | |
| if isinstance(content, dict): | |
| return str(content.get("text", "")) | |
| return "" | |
| def generate( | |
| message: str, | |
| history: list[dict], | |
| system_prompt: str = "", | |
| temperature: float = 0.3, | |
| max_new_tokens: int = 700, | |
| ) -> Iterator[str]: | |
| """Stream a response from the Cohere API for the given message and conversation history.""" | |
| messages: list[dict[str, str]] = [] | |
| system_prompt = (system_prompt or "").strip() | |
| if system_prompt: | |
| messages.append({"role": "system", "content": system_prompt}) | |
| for item in history: | |
| role = item.get("role") | |
| content = _extract_text(item.get("content")) | |
| if role in ("assistant", "user") and content: | |
| messages.append({"role": role, "content": content}) | |
| current_text = str(message or "").strip() | |
| if not current_text: | |
| yield "" | |
| return | |
| messages.append({"role": "user", "content": current_text}) | |
| try: | |
| response = client.chat_stream( | |
| model=model_id, | |
| messages=messages, | |
| temperature=temperature, | |
| max_tokens=max_new_tokens, | |
| ) | |
| output = "" | |
| for event in response: | |
| if getattr(event, "type", None) in ("content-delta", "content-start"): | |
| delta = getattr(event, "delta", None) | |
| if delta is None: | |
| continue | |
| msg = getattr(delta, "message", None) | |
| if msg is None: | |
| continue | |
| text = _extract_text(getattr(msg, "content", None)) | |
| if text: | |
| output += text | |
| yield output | |
| except Exception: | |
| logger.exception("Cohere API error") | |
| gr.Warning("Something went wrong generating a response. Please try again.") | |
| yield "" | |
| examples = [ | |
| ["Explica en español qué significa la palabra japonesa 'ikigai' y da un ejemplo práctico."], | |
| ["اكتب فقرة قصيرة تصف غروب الشمس في الصحراء"], | |
| ["Kwa nini ni muhimu kujifunza lugha zaidi ya moja? Toa sababu tatu."], | |
| ["一个从未见过大海的山村孩子,第一次来到海边。用三到五句话描述他的感受。"], | |
| [ | |
| "Translate the following sentence from Basque to French: " | |
| "'Hizkuntza-eredu handiek milioika testu erabiltzen dituzte ikasteko, " | |
| "baina hizkuntza txikientzat datu gutxiago dago.'" | |
| ], | |
| [ | |
| "ਜੇਕਰ ਕੋਈ ਵਿਅਕਤੀ ਪਹਿਲੀ ਵਾਰ ਵਿਦੇਸ਼ ਜਾ ਰਿਹਾ ਹੈ, ਤਾਂ ਉਸ ਨੂੰ ਕਿਹੜੀਆਂ ਗੱਲਾਂ ਦਾ " | |
| "ਧਿਆਨ ਰੱਖਣਾ ਚਾਹੀਦਾ ਹੈ? ਪੰਜ ਸੁਝਾਅ ਦਿਓ।" | |
| ], | |
| [ | |
| "Eglurwch mewn tair brawddeg pam mae bioamrywiaeth yn bwysig i ecosystemau." | |
| ], | |
| [ | |
| "ถ้าคุณต้องการเริ่มต้นออกกำลังกายเป็นประจำ ควรเริ่มต้นอย่างไร? ให้คำแนะนำสามข้อ" | |
| ] | |
| ] | |
| example_labels = [ | |
| "Spanish — Explain 'ikigai'", | |
| "Arabic — Describe a desert sunset", | |
| "Swahili — Why learn multiple languages?", | |
| "Chinese — A child sees the ocean", | |
| "English — Basque to French translation", | |
| "Punjabi — Travel tips for first-timers", | |
| "Welsh — Why biodiversity is important to ecosystems", | |
| "Thai — How to start exercising regularly", | |
| ] | |
| DESCRIPTION = ( | |
| "**[Tiny Aya](https://huggingface.co/CohereLabs/tiny-aya-global)** is a lightweight " | |
| "multilingual language model by [Cohere Labs](https://cohere.com/research). " | |
| "Try chatting in any of 70+ supported languages!" | |
| ) | |
| demo = gr.ChatInterface( | |
| fn=generate, | |
| chatbot=gr.Chatbot(min_height=600), | |
| textbox=gr.Textbox( | |
| autofocus=True, | |
| placeholder="Type a message in any language... / Escribe en cualquier idioma... / أكتب بأي لغة...", | |
| ), | |
| additional_inputs=[ | |
| gr.Textbox( | |
| label="System Prompt (optional)", | |
| placeholder="e.g. You are a helpful multilingual assistant. Always respond in the user's language.", | |
| lines=3, | |
| ), | |
| gr.Slider(label="Temperature", minimum=0.0, maximum=1.0, step=0.05, value=0.3), | |
| gr.Slider(label="Max New Tokens", minimum=100, maximum=2000, step=10, value=700), | |
| ], | |
| stop_btn=False, | |
| title="Tiny Aya", | |
| description=DESCRIPTION, | |
| examples=examples, | |
| example_labels=example_labels, | |
| run_examples_on_click=True, | |
| cache_examples=False, | |
| delete_cache=(1800, 1800), | |
| save_history=True, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch( | |
| theme=gr.themes.Soft( | |
| primary_hue="green", | |
| font=[gr.themes.GoogleFont("Inter"), "system-ui", "sans-serif"], | |
| ), | |
| css_paths="style.css", | |
| ) | |