| import gradio as gr
|
| from huggingface_hub import InferenceClient
|
| import base64
|
| from PIL import Image
|
| import io
|
|
|
|
|
| model_id = "ServiceNow-AI/Apriel-1.6-15b-Thinker"
|
| client = InferenceClient(model=model_id)
|
|
|
| def encode_image_to_base64(image):
|
| """Encode l'image en base64 pour l'API"""
|
| if image is None:
|
| return None
|
| buffered = io.BytesIO()
|
| image.save(buffered, format="PNG")
|
| img_str = base64.b64encode(buffered.getvalue()).decode()
|
| return f"data:image/png;base64,{img_str}"
|
|
|
| def chat_with_apriel(message, history, image=None, temperature=0.6, max_tokens=1024):
|
| """Fonction de chatbot avec support texte et image"""
|
| if not message:
|
| return ""
|
| try:
|
| messages = []
|
| for user_msg, assistant_msg in history:
|
| messages.append({"role": "user", "content": user_msg})
|
| messages.append({"role": "assistant", "content": assistant_msg})
|
| if image is not None:
|
| img_b64 = encode_image_to_base64(image)
|
| messages.append({"role": "user", "content": [{"type": "text", "text": message}, {"type": "image_url", "image_url": {"url": img_b64}}]})
|
| else:
|
| messages.append({"role": "user", "content": message})
|
| response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, stream=False)
|
| return response.choices[0].message.content
|
| except Exception as e:
|
| return f"⚠️ Erreur: {str(e)}\n\nLe modèle peut prendre ~30s au premier démarrage."
|
|
|
| def generate_text(prompt, temperature=0.6, max_tokens=1024):
|
| """Fonction de génération de texte"""
|
| if not prompt:
|
| return ""
|
| try:
|
| messages = [{"role": "user", "content": prompt}]
|
| response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, stream=False)
|
| return response.choices[0].message.content
|
| except Exception as e:
|
| return f"⚠️ Erreur: {str(e)}\n\nLe modèle peut prendre ~30s au premier démarrage."
|
|
|
| with gr.Blocks(title="Apriel Chatbot Complete") as demo:
|
| gr.Markdown("""
|
| # 🤖 Apriel-1.6-15B-Thinker - Interface Complète
|
| Modèle multimodal 15B paramètres - ServiceNow AI
|
| 🚀 **Utilise l'API Inference HuggingFace** - Rapide & performant!
|
| """)
|
| with gr.Tabs():
|
| with gr.Tab("💬 Chatbot"):
|
| gr.Markdown("### Chat interactif avec Apriel")
|
| with gr.Row():
|
| with gr.Column(scale=2):
|
| chatbot = gr.Chatbot(label="Conversation", height=500)
|
| with gr.Row():
|
| msg = gr.Textbox(label="Message", placeholder="Votre message...", scale=4)
|
| with gr.Row():
|
| image_input = gr.Image(label="Image (optionnelle)", type="pil", height=200)
|
| with gr.Row():
|
| clear = gr.Button("🗑️ Effacer")
|
| submit = gr.Button("📤 Envoyer", variant="primary")
|
| with gr.Column(scale=1):
|
| gr.Markdown("### ⚙️ Paramètres")
|
| temperature_chat = gr.Slider(0.1, 1.0, 0.6, 0.1, label="Température")
|
| max_tokens_chat = gr.Slider(128, 2048, 1024, 128, label="Tokens max")
|
| gr.Markdown("""
|
| ### 📚 Capacités
|
| - Raisonnement complexe
|
| - Images & texte
|
| - Code & math
|
| - Conversations
|
|
|
| **Note:** 1ère réponse ~30s
|
| """)
|
| def respond(message, chat_history, image, temp, max_tok):
|
| if not message:
|
| return "", chat_history, None
|
| bot_message = chat_with_apriel(message, chat_history, image, temp, max_tok)
|
| chat_history.append((message, bot_message))
|
| return "", chat_history, None
|
| submit.click(respond, [msg, chatbot, image_input, temperature_chat, max_tokens_chat], [msg, chatbot, image_input])
|
| msg.submit(respond, [msg, chatbot, image_input, temperature_chat, max_tokens_chat], [msg, chatbot, image_input])
|
| clear.click(lambda: (None, None), None, [chatbot, image_input], queue=False)
|
| with gr.Tab("✨ Génération"):
|
| gr.Markdown("### Génération de texte")
|
| with gr.Row():
|
| with gr.Column(scale=2):
|
| prompt_input = gr.Textbox(label="Prompt", placeholder="Entrez votre prompt...", lines=5)
|
| generate_btn = gr.Button("🚀 Générer", variant="primary")
|
| output_text = gr.Textbox(label="Réponse", lines=15)
|
| with gr.Column(scale=1):
|
| gr.Markdown("### ⚙️ Paramètres")
|
| temperature_gen = gr.Slider(0.1, 1.0, 0.6, 0.1, label="Température")
|
| max_tokens_gen = gr.Slider(128, 2048, 1024, 128, label="Tokens max")
|
| gr.Markdown("""
|
| ### 💡 Exemples
|
| - "Explique le concept de..."
|
| - "Écris une fonction Python..."
|
| - "Résous ce problème math..."
|
| """)
|
| generate_btn.click(generate_text, inputs=[prompt_input, temperature_gen, max_tokens_gen], outputs=output_text)
|
| with gr.Tab("ℹ️ À propos"):
|
| gr.Markdown("""
|
| ## Apriel-1.6-15B-Thinker
|
|
|
| ### 🎯 Caractéristiques
|
| - **15B paramètres** - Compact mais puissant
|
| - **Multimodal** - Texte + Images
|
| - **Raisonnement avancé**
|
| - **30% plus efficace** que v1.5
|
| - **Score 57** sur Artificial Analysis
|
|
|
| ### 📊 Performance
|
| - MMMU: 72% | MathVista: 79.9%
|
| - AIME 25: 88% | IFBench: 69%
|
|
|
| ### 🚀 Architecture
|
| Utilise **l'API Inference HuggingFace**:
|
| - 💨 Réponses rapides
|
| - ⚙️ Infrastructure GPU optimisée
|
| - 🌐 Disponibilité maximale
|
|
|
| ### 🔗 Liens
|
| - [Modèle HF](https://huggingface.co/ServiceNow-AI/Apriel-1.6-15b-Thinker)
|
| - [Blog Post](https://huggingface.co/blog/ServiceNow-AI/apriel-1p6-15b-thinker)
|
|
|
| MIT License - ServiceNow AI
|
| """)
|
|
|
| if __name__ == "__main__":
|
| demo.launch(theme=gr.themes.Soft()) |