Spaces:
Running
Running
| import os | |
| import gradio as gr | |
| from openai import OpenAI | |
| # 1) Ton token Hugging Face (HF_TOKEN doit être défini dans Settings → Secrets) | |
| HF_TOKEN = os.environ.get("HF_TOKEN") | |
| if not HF_TOKEN: | |
| raise RuntimeError( | |
| "La variable d'environnement HF_TOKEN n'est pas définie.\n" | |
| "Va dans Settings → Variables and secrets → Secrets et ajoute HF_TOKEN " | |
| "avec ton token Hugging Face (celui qui a la permission « Inference Providers »)." | |
| ) | |
| # 2) Client OpenAI configuré pour passer par le router Hugging Face | |
| client = OpenAI( | |
| base_url="https://router.huggingface.co/v1", | |
| api_key=HF_TOKEN, | |
| ) | |
| # 3) Modèle supporté par HF Inference (gratuit dans la limite de la free tier) | |
| MODEL_ID = "katanemo/Arch-Router-1.5B:hf-inference" | |
| SYSTEM_PROMPT = """ | |
| Tu es ArtGPT, un assistant spécialisé à 100% dans l'art : | |
| - illustration, dessin, peinture, graphisme, | |
| - composition, couleur, lumière, | |
| - histoire de l'art, mouvements artistiques, | |
| - direction artistique, portfolio, | |
| - conseils logiciels et création visuelle. | |
| Règles : | |
| - Tu réponds uniquement en français. | |
| - Si la question n’est pas liée à l’art ou à la création visuelle, | |
| tu rediriges gentiment vers ces thèmes. | |
| - Tu donnes des réponses claires, structurées, pédagogiques. | |
| - Tu proposes volontiers des exercices pratiques. | |
| """ | |
| def answer(question: str) -> str: | |
| question = (question or "").strip() | |
| if not question: | |
| return "Écris une question sur l’art pour commencer 🙂" | |
| try: | |
| completion = client.chat.completions.create( | |
| model=MODEL_ID, | |
| messages=[ | |
| {"role": "system", "content": SYSTEM_PROMPT}, | |
| {"role": "user", "content": question}, | |
| ], | |
| max_tokens=512, | |
| temperature=0.7, | |
| top_p=0.95, | |
| ) | |
| # Avec la nouvelle lib openai, le contenu est dans .message.content | |
| return completion.choices[0].message.content | |
| except Exception as e: | |
| # On affiche une erreur lisible au lieu du gros JSON | |
| return f"Erreur lors de l'appel au modèle :\n\n{e}" | |
| demo = gr.Interface( | |
| fn=answer, | |
| inputs=gr.Textbox( | |
| label="Pose ta question sur l'art", | |
| placeholder="Ex : Donne-moi un exercice pour progresser en composition d’affiche.", | |
| ), | |
| outputs=gr.Markdown(label="Réponse d’ArtGPT"), | |
| title="🎨 ArtGPT — Assistant IA pour artistes", | |
| description=( | |
| "Pose une question sur l'illustration, le dessin, la couleur, la composition, " | |
| "l'histoire de l'art, le graphisme ou la direction artistique. " | |
| "ArtGPT te répond de manière claire et pédagogique." | |
| ), | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |