You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Web-Dev-For-Beginners/translations/fr/9-chat-project
localizeflow[bot] dd022cce62
chore(i18n): sync translations with latest source changes (chunk 12/21, 100 files)
1 month ago
..
solution chore(i18n): sync translations with latest source changes (chunk 12/21, 100 files) 1 month ago
README.md chore(i18n): sync translations with latest source changes (chunk 12/21, 100 files) 1 month ago

README.md

Construire un assistant de chat avec lIA

Vous souvenez-vous dans Star Trek quand léquipage discutait tranquillement avec lordinateur du vaisseau, lui posant des questions complexes et obtenant des réponses réfléchies ? Ce qui semblait relever de la pure science-fiction dans les années 1960 est désormais quelque chose que vous pouvez construire en utilisant les technologies web que vous connaissez déjà.

Dans cette leçon, nous allons créer un assistant de chat IA en utilisant HTML, CSS, JavaScript et une certaine intégration back-end. Vous découvrirez comment les mêmes compétences que vous apprenez peuvent se connecter à des services IA puissants capables de comprendre le contexte et de générer des réponses significatives.

Pensez à lIA comme à une vaste bibliothèque qui peut non seulement trouver des informations mais aussi les synthétiser en réponses cohérentes, adaptées à vos questions spécifiques. Au lieu de parcourir des milliers de pages, vous obtenez des réponses directes et contextuelles.

Lintégration se fait via des technologies web familières qui collaborent. HTML crée linterface de chat, CSS gère le design visuel, JavaScript gère les interactions utilisateur, et une API back-end connecte tout cela aux services IA. Cest similaire à la façon dont différentes sections dun orchestre jouent ensemble pour créer une symphonie.

Nous construisons essentiellement un pont entre la communication humaine naturelle et le traitement machine. Vous apprendrez à la fois limplémentation technique de lintégration des services IA et les modèles de conception qui rendent les interactions intuitives.

À la fin de cette leçon, lintégration IA vous paraîtra moins mystérieuse et plus comme une autre API avec laquelle vous travaillez. Vous comprendrez les modèles fondamentaux qui alimentent des applications comme ChatGPT et Claude, en utilisant les mêmes principes de développement web que vous apprenez.

Ce que vous pouvez faire dans les 5 prochaines minutes

Parcours de démarrage rapide pour développeurs pressés

flowchart LR
    A[⚡ 5 minutes] --> B[Obtenir un jeton GitHub]
    B --> C[Tester le terrain de jeu AI]
    C --> D[Copier le code Python]
    D --> E[Voir les réponses AI]
  • Minute 1 : Visitez GitHub Models Playground et créez un jeton daccès personnel
  • Minute 2 : Testez les interactions IA directement dans linterface du playground
  • Minute 3 : Cliquez sur longlet « Code » et copiez lextrait Python
  • Minute 4 : Exécutez le code localement avec votre jeton : GITHUB_TOKEN=your_token python test.py
  • Minute 5 : Regardez votre première réponse IA générée depuis votre propre code

Code de test rapide :

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://models.github.ai/inference",
    api_key="your_token_here"
)

response = client.chat.completions.create(
    messages=[{"role": "user", "content": "Hello AI!"}],
    model="openai/gpt-4o-mini"
)

print(response.choices[0].message.content)

Pourquoi cest important : En 5 minutes, vous vivrez la magie de linteraction IA programmée. Cela représente la brique fondamentale qui alimente chaque application IA que vous utilisez.

Voici à quoi ressemblera votre projet final :

Interface de l'application de chat montrant une conversation entre l'utilisateur et l'assistant IA

🗺️ Votre parcours dapprentissage au travers du développement dapplications IA

journey
    title De Développement Web à Intégration IA
    section Comprendre les Fondations de l'IA
      Découvrir les concepts de l'IA générative: 4: You
      Explorer la plateforme GitHub Models: 6: You
      Maîtriser les paramètres et prompts de l'IA: 8: You
    section Intégration Backend
      Construire un serveur API Python: 5: You
      Implémenter des appels de fonctions IA: 7: You
      Gérer les opérations asynchrones: 8: You
    section Développement Frontend
      Créer une interface de chat moderne: 6: You
      Maîtriser les interactions en temps réel: 8: You
      Construire une expérience utilisateur réactive: 9: You
    section Application Professionnelle
      Déployer un système IA complet: 7: You
      Optimiser les modèles de performance: 8: You
      Créer une application prête pour la production: 9: You

Votre destination de parcours : À la fin de cette leçon, vous aurez construit une application complète propulsée par IA en utilisant les mêmes technologies et modèles qui pilotent des assistants IA modernes comme ChatGPT, Claude et Google Bard.

Comprendre lIA : du mystère à la maîtrise

Avant de plonger dans le code, comprenons ce avec quoi nous travaillons. Si vous avez déjà utilisé des API, vous connaissez le schéma de base : envoyer une requête, recevoir une réponse.

Les API IA suivent une structure similaire, mais au lieu de récupérer des données préenregistrées depuis une base de données, elles génèrent des réponses nouvelles basées sur des modèles appris à partir dénormes quantités de texte. Pensez-y comme la différence entre un système de catalogue de bibliothèque et un bibliothécaire savant qui peut synthétiser linformation provenant de multiples sources.

Quest-ce que « lIA générative » exactement ?

Considérez comment la pierre de Rosette a permis aux chercheurs de comprendre les hiéroglyphes égyptiens en trouvant des correspondances entre des langues connues et inconnues. Les modèles IA fonctionnent de la même manière ils identifient des modèles dans dénormes volumes de texte pour comprendre le fonctionnement du langage, puis utilisent ces modèles pour générer des réponses adaptées à de nouvelles questions.

Laissez-moi décomposer cela avec une comparaison simple :

  • Base de données traditionnelle : Comme demander votre acte de naissance vous obtenez toujours le même document exact
  • Moteur de recherche : Comme demander à un bibliothécaire de trouver des livres sur les chats il vous montre ce qui est disponible
  • IA générative : Comme demander à un ami savant sur les chats il vous raconte des choses intéressantes avec ses propres mots, adaptées à ce que vous voulez savoir
graph LR
    A[Votre Question] --> B[Modèle IA]
    B --> C[Reconnaissance de Motifs]
    C --> D[Génération de Contenu]
    D --> E[Réponse Contextuelle]
    
    F[Données d'Entraînement<br/>Livres, Articles, Web] --> B

Comment les modèles IA apprennent (version simple)

Les modèles IA apprennent par exposition à des jeux de données énormes contenant des textes extraits de livres, articles, conversations. Au travers de ce processus, ils identifient des modèles sur :

  • La structure des pensées dans la communication écrite
  • Quels mots apparaissent souvent ensemble
  • Comment les conversations senchaînent typiquement
  • Les différences contextuelles entre la communication formelle et informelle

Cest similaire à la façon dont les archéologues déchiffrent les langues anciennes : ils analysent des milliers dexemples pour comprendre grammaire, vocabulaire et contexte culturel, devenant ensuite capables dinterpréter de nouveaux textes en utilisant ces modèles appris.

Pourquoi GitHub Models ?

Nous utilisons GitHub Models pour une raison pratique cela nous donne accès à une IA de niveau entreprise sans avoir à mettre en place notre propre infrastructure IA (ce que croyez-moi, vous ne voulez pas faire maintenant !). Pensez-y comme utiliser une API météo au lieu dessayer de prédire le temps vous-même en installant des stations météo partout.

Cest en gros de « lIA en tant que service », et le meilleur dans tout ça ? Cest gratuit pour commencer, vous pouvez donc expérimenter sans craindre de vous retrouver avec une grosse facture.

graph LR
    A[Interface de chat frontend] --> B[Votre API backend]
    B --> C[API des modèles GitHub]
    C --> D[Traitement du modèle IA]
    D --> C
    C --> B
    B --> A

Nous utiliserons GitHub Models pour notre intégration back-end, qui fournit un accès à des capacités IA professionnelles via une interface conviviale pour développeurs. Le GitHub Models Playground sert denvironnement de test où vous pouvez expérimenter différents modèles IA et comprendre leurs capacités avant de les implémenter dans le code.

🧠 Écosystème de développement dapplications IA

mindmap
  root((Développement IA))
    Understanding AI
      Generative Models
        Reconnaissance de motifs
        Génération de contenu
        Compréhension du contexte
        Synthèse de réponse
      AI Parameters
        Contrôle de la température
        Limites de jetons
        Filtrage Top-p
        Messages système
    Backend Architecture
      API Integration
        Modèles GitHub
        Authentification
        Gestion des requêtes
        Gestion des erreurs
      Python Infrastructure
        Framework FastAPI
        Opérations asynchrones
        Sécurité de lenvironnement
        Configuration CORS
    Frontend Experience
      Chat Interface
        Mises à jour en temps réel
        Historique des messages
        Retours des utilisateurs
        États de chargement
      Modern Web Tech
        Classes ES6
        Async/Await
        Manipulation du DOM
        Gestion des événements
    Professional Patterns
      Security Best Practices
        Gestion des jetons
        Validation des entrées
        Prévention XSS
        Frontières derreur
      Production Readiness
        Optimisation des performances
        Design adaptatif
        Accessibilité
        Stratégies de test

Principe clé : Le développement dapplications IA combine des compétences traditionnelles de développement web avec lintégration de services IA, créant des applications intelligentes qui paraissent naturelles et réactives pour les utilisateurs.

Interface du GitHub Models AI Playground avec sélection de modèle et zone de test

Voici ce qui rend le playground si utile :

  • Essayez différents modèles IA comme GPT-4o-mini, Claude et dautres (tous gratuits !)
  • Testez vos idées et vos prompts avant décrire du code
  • Obtenez des extraits de code prêts à lemploi dans votre langage de programmation préféré
  • Ajustez des paramètres comme le niveau de créativité ou la longueur de la réponse pour voir comment cela impacte le résultat

Une fois que vous avez joué un peu, cliquez simplement sur longlet « Code » et choisissez votre langage pour obtenir le code dimplémentation dont vous avez besoin.

Choix dans le playground montrant options de génération de code pour différents langages

Mise en place de lintégration back-end Python

Passons maintenant à limplémentation de lintégration IA en utilisant Python. Python est excellent pour les applications IA grâce à sa syntaxe simple et ses bibliothèques puissantes. Nous commencerons avec le code du playground GitHub Models puis le refactoriserons en une fonction réutilisable, prête pour la production.

Comprendre limplémentation de base

Lorsque vous récupérez le code Python du playground, vous obtenez quelque chose qui ressemble à ceci. Ne vous inquiétez pas si cela vous semble beaucoup au début parcourons-le pas à pas :

"""Run this model in Python

> pip install openai
"""
import os
from openai import OpenAI

# Pour vous authentifier avec le modèle, vous devrez générer un jeton d'accès personnel (PAT) dans vos paramètres GitHub.
# Créez votre jeton PAT en suivant les instructions ici : https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
client = OpenAI(
    base_url="https://models.github.ai/inference",
    api_key=os.environ["GITHUB_TOKEN"],
)

response = client.chat.completions.create(
    messages=[
        {
            "role": "system",
            "content": "",
        },
        {
            "role": "user",
            "content": "What is the capital of France?",
        }
    ],
    model="openai/gpt-4o-mini",
    temperature=1,
    max_tokens=4096,
    top_p=1
)

print(response.choices[0].message.content)

Voici ce qui se passe dans ce code :

  • Nous importons les outils nécessaires : os pour lire les variables denvironnement et OpenAI pour communiquer avec lIA
  • Nous configurons le client OpenAI pour quil pointe vers les serveurs IA de GitHub au lieu dOpenAI directement
  • Nous authentifions avec un jeton GitHub spécial (plus dinfos là-dessus dans une minute !)
  • Nous structurons notre conversation avec différents « rôles » pensez-y comme poser la scène pour une pièce de théâtre
  • Nous envoyons notre requête à lIA avec quelques paramètres de réglage fin
  • Nous extrayons le texte de réponse réel à partir de toutes les données retournées

Comprendre les rôles des messages : le cadre de conversation IA

Les conversations IA utilisent une structure spécifique avec différents « rôles » qui servent des buts distincts :

messages=[
    {
        "role": "system",
        "content": "You are a helpful assistant who explains things simply."
    },
    {
        "role": "user", 
        "content": "What is machine learning?"
    }
]

Pensez-y comme diriger une pièce de théâtre :

  • Rôle système : Comme les didascalies pour un acteur indique à lIA comment se comporter, quelle personnalité adopter et comment répondre
  • Rôle utilisateur : La question ou le message réel de la personne utilisant votre application
  • Rôle assistant : La réponse de lIA (vous ne lenvoyez pas, mais elle apparaît dans lhistorique de la conversation)

Analogie dans la vie réelle : Imaginez que vous présentez un ami à quelquun lors dune fête :

  • Message système : « Voici mon amie Sarah, elle est médecin et explique très bien les concepts médicaux simplement »
  • Message utilisateur : « Peux-tu expliquer comment fonctionnent les vaccins ? »
  • Réponse assistant : Sarah répond en tant que médecin aimable, pas en tant quavocat ou chef cuisinier

Comprendre les paramètres IA : ajuster le comportement des réponses

Les paramètres numériques dans les appels API IA contrôlent la manière dont le modèle génère les réponses. Ces réglages vous permettent dajuster le comportement de lIA selon différents cas dusage :

Température (0,0 à 2,0) : le cadran de créativité

Ce que ça fait : Contrôle le niveau de créativité ou de prévisibilité des réponses de lIA.

Pensez-y comme au niveau dimprovisation dun musicien de jazz :

  • Température = 0,1 : Rejoue la même mélodie à chaque fois (très prévisible)
  • Température = 0,7 : Ajoute des variations subtiles tout en restant reconnaissable (créativité équilibrée)
  • Température = 1,5 : Jazz expérimental complet avec des tournures inattendues (très imprévisible)
# Réponses très prévisibles (bon pour les questions factuelles)
response = client.chat.completions.create(
    messages=[{"role": "user", "content": "What is 2+2?"}],
    temperature=0.1  # Dirait presque toujours "4"
)

# Réponses créatives (bon pour le brainstorming)
response = client.chat.completions.create(
    messages=[{"role": "user", "content": "Write a creative story opening"}],
    temperature=1.2  # Générera des histoires uniques et inattendues
)

Max Tokens (1 à 4096+) : le contrôleur de longueur de réponse

Ce que ça fait : Définit une limite à la longueur de la réponse de lIA.

Pensez aux tokens comme approximativement équivalents à des mots (environ 1 token = 0,75 mots en anglais) :

  • max_tokens=50 : Court et concis (comme un SMS)
  • max_tokens=500 : Un paragraphe ou deux agréables
  • max_tokens=2000 : Une explication détaillée avec des exemples
# Réponses courtes et concises
response = client.chat.completions.create(
    messages=[{"role": "user", "content": "Explain JavaScript"}],
    max_tokens=100  # Oblige à une explication brève
)

# Réponses détaillées et complètes
response = client.chat.completions.create(
    messages=[{"role": "user", "content": "Explain JavaScript"}],
    max_tokens=1500  # Permet des explications détaillées avec des exemples
)

Top_p (0,0 à 1,0) : le paramètre de focus

Ce que ça fait : Contrôle à quel point lIA reste focalisée sur les réponses les plus probables.

Imaginez que lIA possède un énorme vocabulaire, classé par probabilité de chaque mot :

  • top_p=0,1 : Ne considère que les 10% de mots les plus probables (très concentré)
  • top_p=0,9 : Considère 90% des mots possibles (plus créatif)
  • top_p=1,0 : Considère tout (variété maximale)

Par exemple : Si vous demandez « Le ciel est généralement... »

  • top_p bas : Dit presque toujours « bleu »
  • top_p élevé : Peut dire « bleu », « nuageux », « vaste », « changeant », « magnifique », etc.

Mise en pratique : combinaisons de paramètres pour différents cas dusage

# Pour des réponses factuelles et cohérentes (comme un bot de documentation)
factual_params = {
    "temperature": 0.2,
    "max_tokens": 300,
    "top_p": 0.3
}

# Pour l'assistance en écriture créative
creative_params = {
    "temperature": 1.1,
    "max_tokens": 1000,
    "top_p": 0.9
}

# Pour des réponses conversationnelles et utiles (équilibrées)
conversational_params = {
    "temperature": 0.7,
    "max_tokens": 500,
    "top_p": 0.8
}
quadrantChart
    title Matrice d'Optimisation des Paramètres de l'IA
    x-axis Faible Créativité --> Forte Créativité
    y-axis Réponse Courte --> Réponse Longue
    
    quadrant-1 Contenu Créatif
    quadrant-2 Analyse Approfondie
    quadrant-3 Faits Rapides
    quadrant-4 IA Conversationnelle
    
    Documentation Bot: [0.2, 0.3]
    Customer Service: [0.4, 0.4]
    General Assistant: [0.7, 0.5]
    Creative Writer: [0.9, 0.9]
    Brainstorming Tool: [0.8, 0.8]

Pourquoi ces paramètres comptent : Différentes applications ont besoin de types de réponses différents. Un bot service client doit être cohérent et factuel (température basse), alors quun assistant décriture créative doit être imaginatif et varié (température haute). Comprendre ces paramètres vous donne le contrôle sur la personnalité et le style de réponse de votre IA.


**Here's what's happening in this code:**
- **We import** the tools we need: `os` for reading environment variables and `OpenAI` for talking to the AI
- **We set up** the OpenAI client to point to GitHub's AI servers instead of OpenAI directly
- **We authenticate** using a special GitHub token (more on that in a minute!)
- **We structure** our conversation with different "roles"  think of it like setting the scene for a play
- **We send** our request to the AI with some fine-tuning parameters
- **We extract** the actual response text from all the data that comes back

> 🔐 **Security Note**: Never hardcode API keys in your source code! Always use environment variables to store sensitive credentials like your `GITHUB_TOKEN`.

### Creating a Reusable AI Function

Let's refactor this code into a clean, reusable function that we can easily integrate into our web application:

```python
import asyncio
from openai import AsyncOpenAI

# Use AsyncOpenAI for better performance
client = AsyncOpenAI(
    base_url="https://models.github.ai/inference",
    api_key=os.environ["GITHUB_TOKEN"],
)

async def call_llm_async(prompt: str, system_message: str = "You are a helpful assistant."):
    """
    Sends a prompt to the AI model asynchronously and returns the response.
    
    Args:
        prompt: The user's question or message
        system_message: Instructions that define the AI's behavior and personality
    
    Returns:
        str: The AI's response to the prompt
    """
    try:
        response = await client.chat.completions.create(
            messages=[
                {
                    "role": "system",
                    "content": system_message,
                },
                {
                    "role": "user",
                    "content": prompt,
                }
            ],
            model="openai/gpt-4o-mini",
            temperature=1,
            max_tokens=4096,
            top_p=1
        )
        return response.choices[0].message.content
    except Exception as e:
        logger.error(f"AI API error: {str(e)}")
        return "I'm sorry, I'm having trouble processing your request right now."

# Backward compatibility function for synchronous calls
def call_llm(prompt: str, system_message: str = "You are a helpful assistant."):
    """Synchronous wrapper for async AI calls."""
    return asyncio.run(call_llm_async(prompt, system_message))

Comprendre cette fonction améliorée :

  • Accepte deux paramètres : le prompt de lutilisateur et un message système optionnel
  • Fournit un message système par défaut pour un comportement assistant général
  • Utilise des annotations de type Python appropriées pour une meilleure documentation du code
  • Inclut une docstring détaillée expliquant lobjectif et les paramètres de la fonction
  • Retourne uniquement le contenu de la réponse, facilitant son usage dans notre API web
  • Maintient les mêmes paramètres de modèle pour un comportement IA cohérent

La magie des prompts système : programmer la personnalité de lIA

Si les paramètres contrôlent la manière dont lIA pense, les prompts système contrôlent qui lIA pense être. Cest honnêtement lune des parties les plus fascinantes du travail avec lIA vous donnez essentiellement à lIA une personnalité complète, un niveau dexpertise et un style de communication.

Pensez aux prompts système comme au choix dacteurs différents pour différents rôles : Au lieu davoir un assistant générique, vous pouvez créer des experts spécialisés pour diverses situations. Besoin dun professeur patient ? Dun partenaire de brainstorming créatif ? Dun conseiller daffaires direct ? Changez simplement le prompt système !

Pourquoi les prompts système sont si puissants

Voici la partie fascinante : les modèles IA ont été entraînés sur dinnombrables conversations où les gens adoptent différents rôles et niveaux dexpertise. Lorsque vous donnez un rôle spécifique à lIA, cest comme activer un interrupteur qui déploie tous ces modèles appris.

Cest comme le jeu dacteur méthode pour lIA : dites à un acteur « vous êtes un vieux professeur sage » et regardez comment il ajuste instantanément posture, vocabulaire et manières. LIA fait quelque chose de remarquablement similaire avec les modèles de langage.

Concevoir des prompts système efficaces : lart et la science

Lanatomie dun excellent prompt système :

  1. Rôle/Identité : Qui est lIA ?
  2. Expertise : Que sait-elle ?
  3. Style de communication : Comment sexprime-t-elle ?
  4. Instructions spécifiques : Sur quoi doit-elle se concentrer ?
# ❌ Invite système vague
"You are helpful."

# ✅ Invite système détaillée et efficace
"You are Dr. Sarah Chen, a senior software engineer with 15 years of experience at major tech companies. You explain programming concepts using real-world analogies and always provide practical examples. You're patient with beginners and enthusiastic about helping them understand complex topics."

Exemples de prompts système avec contexte

Voyons comment différents prompts système créent des personnalités IA complètement différentes :

# Exemple 1 : Le professeur patient
teacher_prompt = """
You are an experienced programming instructor who has taught thousands of students. 
You break down complex concepts into simple steps, use analogies from everyday life, 
and always check if the student understands before moving on. You're encouraging 
and never make students feel bad for not knowing something.
"""

# Exemple 2 : Le collaborateur créatif
creative_prompt = """
You are a creative writing partner who loves brainstorming wild ideas. You're 
enthusiastic, imaginative, and always build on the user's ideas rather than 
replacing them. You ask thought-provoking questions to spark creativity and 
offer unexpected perspectives that make stories more interesting.
"""

# Exemple 3 : Le conseiller commercial stratégique
business_prompt = """
You are a strategic business consultant with an MBA and 20 years of experience 
helping startups scale. You think in frameworks, provide structured advice, 
and always consider both short-term tactics and long-term strategy. You ask 
probing questions to understand the full business context before giving advice.
"""

Voir les prompts système en action

Testons la même question avec différents prompts système pour voir les différences spectaculaires :

Question : « Comment gérer lauthentification utilisateur dans mon application web ? »

# Avec une invite de l'enseignant :
teacher_response = call_llm(
    "How do I handle user authentication in my web app?",
    teacher_prompt
)
# Réponse typique : « Excellente question ! Décomposons l'authentification en étapes simples.
# Imaginez-le comme un videur de boîte de nuit vérifiant les pièces d'identité... »

# Avec une invite commerciale :
business_response = call_llm(
    "How do I handle user authentication in my web app?", 
    business_prompt
)
# Réponse typique : « D'un point de vue stratégique, l'authentification est cruciale pour la confiance des utilisateurs et la conformité réglementaire.
# Laissez-moi vous présenter un cadre tenant compte de la sécurité,
# de l'expérience utilisateur et de la scalabilité... »

Techniques avancées de prompts système

1. Mise en contexte : Fournissez un contexte à lIA

system_prompt = """
You are helping a junior developer who just started their first job at a startup. 
They know basic HTML/CSS/JavaScript but are new to backend development and databases. 
Be encouraging and explain things step-by-step without being condescending.
"""

2. Formatage de la sortie : Dites à lIA comment structurer les réponses

system_prompt = """
You are a technical mentor. Always structure your responses as:
1. Quick Answer (1-2 sentences)
2. Detailed Explanation 
3. Code Example
4. Common Pitfalls to Avoid
5. Next Steps for Learning
"""

3. Définition des contraintes : Définissez ce que lIA ne doit PAS faire

system_prompt = """
You are a coding tutor focused on teaching best practices. Never write complete 
solutions for the user - instead, guide them with hints and questions so they 
learn by doing. Always explain the 'why' behind coding decisions.
"""

Pourquoi cest important pour votre assistant de chat

Comprendre les invites système vous donne un pouvoir incroyable pour créer des assistants IA spécialisés :

  • Bot de service client : Utile, patient, conscient des politiques
  • Tuteur dapprentissage : Encourageant, étape par étape, vérifie la compréhension
  • Partenaire créatif : Imaginatif, construit sur les idées, pose la question « et si ? »
  • Expert technique : Précis, détaillé, conscient de la sécurité

Lidée clé : Vous nappelez pas simplement une API IA vous créez une personnalité IA personnalisée qui sert votre cas dusage spécifique. Cest ce qui rend les applications IA modernes adaptées et utiles plutôt que génériques.

🎯 Vérification pédagogique : Programmation de la personnalité IA

Pause et réflexion : Vous venez dapprendre à programmer des personnalités IA par des invites système. Cest une compétence fondamentale dans le développement moderne dapplications IA.

Auto-évaluation rapide :

  • Pouvez-vous expliquer en quoi les invites système diffèrent des messages utilisateur classiques ?
  • Quelle est la différence entre les paramètres temperature et top_p ?
  • Comment créeriez-vous une invite système pour un cas dutilisation spécifique (comme un tuteur de code) ?

Lien avec le monde réel : Les techniques dinvite système que vous avez apprises sont utilisées dans toutes les grandes applications IA de lassistance au codage de GitHub Copilot à linterface conversationnelle de ChatGPT. Vous maîtrisez les mêmes modèles utilisés par les équipes produits IA des grandes entreprises tech.

Question défi : Comment pourriez-vous concevoir différentes personnalités IA pour différents types dutilisateurs (débutant vs expert) ? Réfléchissez à comment un même modèle IA sous-jacent peut servir différents publics via lingénierie des invites.

Construire lAPI Web avec FastAPI : Votre hub de communication IA haute performance

Construisons maintenant le backend qui connecte votre frontend aux services IA. Nous allons utiliser FastAPI, un framework Python moderne qui excelle dans la création dAPI pour applications IA.

FastAPI offre plusieurs avantages pour ce type de projet : support natif de lasync pour gérer des requêtes concurrentes, génération automatique de documentation API, et excellente performance. Votre serveur FastAPI agit comme intermédiaire qui reçoit les requêtes du frontend, communique avec les services IA, et renvoie les réponses formatées.

Pourquoi FastAPI pour les applications IA ?

Vous vous demandez peut-être : « Ne puis-je pas appeler directement lIA depuis mon JavaScript frontend ? » ou « Pourquoi FastAPI plutôt que Flask ou Django ? » Excellentes questions !

Voici pourquoi FastAPI est parfait pour ce que nous construisons :

  • Async par défaut : Peut gérer plusieurs requêtes IA simultanément sans blocage
  • Docs automatiques : Visitez /docs et obtenez gratuitement une documentation API interactive superbe
  • Validation intégrée : Détecte les erreurs avant quelles ne causent des problèmes
  • Ultra rapide : Un des frameworks Python les plus rapides
  • Python moderne : Profite des dernières fonctionnalités avancées de Python

Et pourquoi avons-nous besoin dun backend :

Sécurité : Votre clé API IA est comme un mot de passe si vous la placez dans le JavaScript frontend, toute personne qui voit le code source de votre site web pourrait la voler et utiliser vos crédits IA. Le backend garde les identifiants sensibles en sécurité.

Limitation de débit et contrôle : Le backend vous permet de contrôler la fréquence des requêtes utilisateurs, dimplémenter lauthentification, et dajouter des logs pour suivre lusage.

Traitement des données : Vous pourriez vouloir sauvegarder les conversations, filtrer du contenu inapproprié, ou combiner plusieurs services IA. Le backend est lendroit où cette logique vit.

Larchitecture ressemble à un modèle client-serveur :

  • Frontend : couche interface utilisateur pour linteraction
  • Backend API : couche de traitement et de routage des requêtes
  • Service IA : calcul externe et génération de réponses
  • Variables denvironnement : stockage sécurisé de la configuration et des identifiants

Comprendre le flux requête-réponse

Suivons ce qui se passe quand un utilisateur envoie un message :

sequenceDiagram
    participant User as 👤 Utilisateur
    participant Frontend as 🌐 Frontend
    participant API as 🔧 Serveur FastAPI
    participant AI as 🤖 Service IA
    
    User->>Frontend: Tape "Bonjour IA !"
    Frontend->>API: POST /hello {"message": "Bonjour IA !"}
    Note over API: Valide la requête<br/>Ajoute une invite système
    API->>AI: Envoie la requête formatée
    AI->>API: Retourne la réponse IA
    Note over API: Traite la réponse<br/>Enregistre la conversation
    API->>Frontend: {"response": "Bonjour ! Comment puis-je aider ?"}
    Frontend->>User: Affiche le message IA

Comprendre chaque étape :

  1. Interaction utilisateur : la personne tape dans linterface de chat
  2. Traitement frontend : JavaScript capture lentrée et la formate en JSON
  3. Validation API : FastAPI valide automatiquement la requête avec les modèles Pydantic
  4. Intégration IA : le backend ajoute le contexte (invite système) et appelle le service IA
  5. Gestion de la réponse : lAPI reçoit la réponse IA et peut la modifier si besoin
  6. Affichage frontend : JavaScript affiche la réponse dans linterface de chat

Comprendre larchitecture API

sequenceDiagram
    participant Frontend
    participant FastAPI
    participant AI Function
    participant GitHub Models
    
    Frontend->>FastAPI: POST /hello {"message": "Bonjour IA !"}
    FastAPI->>AI Function: call_llm(message, system_prompt)
    AI Function->>GitHub Models: requête API
    GitHub Models->>AI Function: réponse IA
    AI Function->>FastAPI: texte de réponse
    FastAPI->>Frontend: {"response": "Bonjour ! Comment puis-je vous aider ?"}
flowchart TD
    A[Saisie Utilisateur] --> B[Validation Frontend]
    B --> C[Requête HTTP POST]
    C --> D[Routeur FastAPI]
    D --> E[Validation Pydantic]
    E --> F[Appel Fonction IA]
    F --> G[API Modèles GitHub]
    G --> H[Traitement de la Réponse]
    H --> I[Réponse JSON]
    I --> J[Mise à jour Frontend]
    
    subgraph "Couche de Sécurité"
        K[Middleware CORS]
        L[Variables d'Environnement]
        M[Gestion des Erreurs]
    end
    
    D --> K
    F --> L
    H --> M

Création de lapplication FastAPI

Construisons notre API pas à pas. Créez un fichier nommé api.py avec le code FastAPI suivant :

# api.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from llm import call_llm
import logging

# Configurer la journalisation
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Créer l'application FastAPI
app = FastAPI(
    title="AI Chat API",
    description="A high-performance API for AI-powered chat applications",
    version="1.0.0"
)

# Configurer le CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Configurer correctement pour la production
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Modèles Pydantic pour la validation des requêtes/réponses
class ChatMessage(BaseModel):
    message: str

class ChatResponse(BaseModel):
    response: str

@app.get("/")
async def root():
    """Root endpoint providing API information."""
    return {
        "message": "Welcome to the AI Chat API",
        "docs": "/docs",
        "health": "/health"
    }

@app.get("/health")
async def health_check():
    """Health check endpoint."""
    return {"status": "healthy", "service": "ai-chat-api"}

@app.post("/hello", response_model=ChatResponse)
async def chat_endpoint(chat_message: ChatMessage):
    """Main chat endpoint that processes messages and returns AI responses."""
    try:
        # Extraire et valider le message
        message = chat_message.message.strip()
        if not message:
            raise HTTPException(status_code=400, detail="Message cannot be empty")
        
        logger.info(f"Processing message: {message[:50]}...")
        
        # Appeler le service IA (note : call_llm devrait être asynchrone pour de meilleures performances)
        ai_response = await call_llm_async(message, "You are a helpful and friendly assistant.")
        
        logger.info("AI response generated successfully")
        return ChatResponse(response=ai_response)
        
    except HTTPException:
        raise
    except Exception as e:
        logger.error(f"Error processing chat message: {str(e)}")
        raise HTTPException(status_code=500, detail="Internal server error")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=5000, reload=True)

Comprendre limplémentation FastAPI :

  • Imports FastAPI pour les fonctionnalités modernes du framework web et Pydantic pour validation des données
  • Crée la documentation API automatique (disponible à /docs quand le serveur tourne)
  • Active le middleware CORS pour permettre les requêtes frontend provenant dorigines différentes
  • Définit les modèles Pydantic pour validation et documentation automatiques des requêtes/réponses
  • Utilise des endpoints async pour de meilleures performances lors de requêtes concurrentes
  • Implémente des codes HTTP adéquats et gestion derreurs avec HTTPException
  • Inclut un logging structuré pour monitoring et débogage
  • Fournit un endpoint de vérification de létat de santé pour surveiller le service

Avantages clés de FastAPI par rapport aux frameworks traditionnels :

  • Validation automatique : les modèles Pydantic garantissent lintégrité des données avant traitement
  • Docs interactives : visitez /docs pour une documentation API autogénérée et testable
  • Sécurité de typage : les annotations Python préviennent erreurs dexécution et améliorent la qualité du code
  • Support async : gérer plusieurs requêtes IA simultanément sans blocage
  • Performance : traitement des requêtes nettement plus rapide pour des applications en temps réel

Comprendre CORS : Le gardien de sécurité du web

CORS (Cross-Origin Resource Sharing) est comme un agent de sécurité dans un immeuble qui vérifie si les visiteurs ont le droit dentrer. Comprenons pourquoi cest important et comment cela affecte votre application.

Quest-ce que CORS et pourquoi existe-t-il ?

Le problème : Imaginez que nimporte quel site web puisse envoyer des requêtes au site de votre banque en votre nom, sans votre accord. Ce serait un cauchemar de sécurité ! Les navigateurs empêchent cela par défaut grâce à la « politique de même origine ».

Politique de même origine : Les navigateurs autorisent uniquement les pages web à faire des requêtes vers le même domaine, port, et protocole doù elles ont été chargées.

Analogie réelle : Cest comme la sécurité dun immeuble dappartements seuls les résidents (même origine) peuvent entrer par défaut. Si vous voulez laisser un ami (origine différente) visiter, vous devez dire explicitement à la sécurité que cest OK.

CORS dans votre environnement de développement

Pendant le développement, votre frontend et backend tournent sur des ports différents :

  • Frontend : http://localhost:3000 (ou file:// si vous ouvrez le HTML directement)
  • Backend : http://localhost:5000

Ce sont des « origines différentes » même sils sont sur le même ordinateur !

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(__name__)
CORS(app)   # Cela indique aux navigateurs : "Il est acceptable que d'autres origines fassent des requêtes à cette API"

Ce que la configuration CORS fait en pratique :

  • Ajoute des en-têtes HTTP spéciaux dans les réponses API qui disent aux navigateurs « cette requête cross-origin est autorisée »
  • Gère les requêtes « preflight » (les navigateurs vérifient parfois les permissions avant denvoyer la requête réelle)
  • Évite lerreur redoutée « bloqué par la politique CORS » dans la console de votre navigateur

Sécurité CORS : développement vs production

# 🚨 Développement : Autorise TOUS les origines (pratique mais non sécurisé)
CORS(app)

# ✅ Production : Autoriser uniquement votre domaine frontend spécifique
CORS(app, origins=["https://yourdomain.com", "https://www.yourdomain.com"])

# 🔒 Avancé : Différents origines pour différents environnements
if app.debug:  # Mode développement
    CORS(app, origins=["http://localhost:3000", "http://127.0.0.1:3000"])
else:  # Mode production
    CORS(app, origins=["https://yourdomain.com"])

Pourquoi cest important : En développement, CORS(app) est comme laisser votre porte dentrée ouverte pratique mais pas sécurisé. En production, vous devez spécifier exactement quels sites web peuvent accéder à votre API.

Scénarios courants CORS et solutions

Scénario Problème Solution
Développement local Le frontend ne peut pas joindre le backend Ajouter CORSMiddleware à FastAPI
GitHub Pages + Heroku Frontend déployé ne peut pas joindre lAPI Ajouter lURL GitHub Pages dans les origines CORS
Domaine personnalisé Erreurs CORS en production Mettre à jour les origines CORS pour correspondre à votre domaine
Application mobile Lapp ne peut pas joindre lAPI web Ajouter le domaine de lapp ou utiliser * avec précaution

Astuce pro : Vous pouvez vérifier les en-têtes CORS dans les outils développeur de votre navigateur, onglet Réseau. Cherchez des en-têtes comme Access-Control-Allow-Origin dans la réponse.

Gestion des erreurs et validation

Notez comment notre API inclut une gestion correcte des erreurs :

# Valider que nous avons reçu un message
if not message:
    return jsonify({"error": "Message field is required"}), 400

Principes clés de validation :

  • Vérifie les champs obligatoires avant traitement des requêtes
  • Renvoie des messages derreur clairs en format JSON
  • Utilise des codes HTTP appropriés (400 pour requêtes incorrectes)
  • Fournit un retour clair pour aider les développeurs frontend à déboguer

Mise en place et lancement de votre backend

Maintenant que notre intégration IA et serveur FastAPI sont prêts, mettons tout en route. Le processus dinstallation implique linstallation des dépendances Python, la configuration des variables denvironnement, et le lancement de votre serveur de développement.

Configuration de lenvironnement Python

Mettons en place votre environnement de développement Python. Les environnements virtuels fonctionnent comme lapproche compartimentée du Projet Manhattan chaque projet a son espace isolé avec ses outils et dépendances spécifiques, évitant les conflits entre projets différents.

# Naviguez vers votre répertoire backend
cd backend

# Créez un environnement virtuel (comme créer une pièce propre pour votre projet)
python -m venv venv

# Activez-le (Linux/Mac)
source ./venv/bin/activate

# Sous Windows, utilisez :
# venv\Scripts\activate

# Installez les bons trucs
pip install openai fastapi uvicorn python-dotenv

Ce que nous venons de faire :

  • Créé notre propre petit bubble Python où installer les packages sans affecter autre chose
  • Activé cet environnement pour que le terminal utilise celui-ci spécifiquement
  • Installé les essentiels : OpenAI pour la magie IA, FastAPI pour notre API web, Uvicorn pour le lancement, et python-dotenv pour la gestion sécurisée des secrets

Dépendances clés expliquées :

  • FastAPI : framework web moderne et rapide avec documentation API automatique
  • Uvicorn : serveur ASGI ultra rapide qui exécute les applications FastAPI
  • OpenAI : bibliothèque officielle pour les modèles GitHub et intégration API OpenAI
  • python-dotenv : chargement sécurisé des variables denvironnement depuis les fichiers .env

Configuration de lenvironnement : garder les secrets en sécurité

Avant de démarrer notre API, parlons dune des leçons les plus importantes du développement web : comment garder vos secrets vraiment secrets. Les variables denvironnement fonctionnent comme un coffre-fort sécurisé accessible uniquement par votre application.

Quest-ce que les variables denvironnement ?

Pensez aux variables denvironnement comme un coffre-fort – vous y mettez vos objets précieux, et seuls vous (et votre app) avez la clé pour les sortir. Au lieu décrire des infos sensibles directement dans votre code (où littéralement tout le monde peut les voir), vous les stockez en sécurité dans lenvironnement.

Voici la différence :

  • La mauvaise méthode : écrire votre mot de passe sur un post-it collé à votre écran
  • La bonne méthode : garder votre mot de passe dans un gestionnaire de mots de passe sécurisé auquel vous seul avez accès

Pourquoi les variables denvironnement comptent

# 🚨 NE JAMAIS FAIRE CECI - Clé API visible par tous
client = OpenAI(
    api_key="ghp_1234567890abcdef...",  # N'importe qui peut la voler !
    base_url="https://models.github.ai/inference"
)

# ✅ FAIRE CECI - Clé API stockée en toute sécurité
client = OpenAI(
    api_key=os.environ["GITHUB_TOKEN"],  # Seule votre application peut y accéder
    base_url="https://models.github.ai/inference"
)

Ce qui arrive quand vous codez en dur vos secrets :

  1. Exposition dans le contrôle de version : toute personne ayant accès à votre dépôt Git voit votre clé API
  2. Répertoires publics : si vous poussez sur GitHub, votre clé est visible par Internet entier
  3. Partage en équipe : les autres développeurs voient votre clé personnelle
  4. Failles de sécurité : si quelquun vole votre clé, il peut utiliser vos crédits IA

Mise en place de votre fichier denvironnement

Créez un fichier .env dans votre répertoire backend. Ce fichier stocke vos secrets localement :

# Fichier .env - Ceci ne doit JAMAIS être commis dans Git
GITHUB_TOKEN=your_github_personal_access_token_here
FASTAPI_DEBUG=True
ENVIRONMENT=development

Comprendre le fichier .env :

  • Un secret par ligne au format CLÉ=valeur
  • Pas despaces autour du signe égal
  • Pas de guillemets nécessaires autour des valeurs (en général)
  • Commentaires commencent par #

Création de votre token daccès personnel GitHub

Votre token GitHub est comme un mot de passe spécial qui donne à votre application la permission dutiliser les services IA de GitHub :

Création du token pas à pas :

  1. Allez dans les paramètres GitHub → Paramètres développeur → Tokens daccès personnel → Tokens (classiques)
  2. Cliquez sur « Générer un nouveau token (classique) »
  3. Configurez la date dexpiration (30 jours pour test, plus long en production)
  4. Sélectionnez les scopes : Cochez « repo » et toute autre permission nécessaire
  5. Générez le token et copiez-le immédiatement (vous ne pourrez plus le voir !)
  6. Collez-le dans votre fichier .env
# Exemple de ce à quoi ressemble votre jeton (c'est faux !)
GITHUB_TOKEN=ghp_1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R

Chargement des variables denvironnement en Python

import os
from dotenv import load_dotenv

# Charger les variables d'environnement à partir du fichier .env
load_dotenv()

# Vous pouvez désormais y accéder en toute sécurité
api_key = os.environ.get("GITHUB_TOKEN")
if not api_key:
    raise ValueError("GITHUB_TOKEN not found in environment variables!")

client = OpenAI(
    api_key=api_key,
    base_url="https://models.github.ai/inference"
)

Ce que fait ce code :

  • Charge votre fichier .env et rend les variables disponibles dans Python
  • Vérifie si le token requis existe (bonne gestion derreur !)
  • Lève une erreur claire si le token manque
  • Utilise le token en toute sécurité sans lexposer dans le code

Sécurité Git : Le fichier .gitignore

Votre fichier .gitignore indique à Git quels fichiers ne jamais suivre ou uploader :

# .gitignore - Ajoutez ces lignes
.env
*.env
.env.local
.env.production
__pycache__/
venv/
.vscode/

Pourquoi cest crucial : une fois .env ajouté à .gitignore, Git ignore votre fichier denvironnement, vous évitant de téléverser accidentellement vos secrets sur GitHub.

Environnements différents, secrets différents

Les applications professionnelles utilisent différentes clés API pour différents environnements :

# .env.developpement
GITHUB_TOKEN=your_development_token
DEBUG=True

# .env.production
GITHUB_TOKEN=your_production_token
DEBUG=False

Pourquoi cest important : Vous ne voulez pas que vos expérimentations de développement impactent votre quota IA de production, et vous souhaitez différents niveaux de sécurité selon les environnements.

Démarrage de votre serveur de développement : donner vie à votre FastAPI

Voici venu le moment excitant : lancer votre serveur de développement FastAPI et voir votre intégration IA prendre vie ! FastAPI utilise Uvicorn, un serveur ASGI ultra-rapide spécialement conçu pour les applications Python asynchrones.

Comprendre le processus de démarrage du serveur FastAPI

# Méthode 1 : Exécution directe en Python (avec rechargement automatique)
python api.py

# Méthode 2 : Utilisation directe de Uvicorn (plus de contrôle)
uvicorn api:app --host 0.0.0.0 --port 5000 --reload

Lorsque vous exécutez cette commande, voici ce qui se passe en coulisses :

1. Python charge votre application FastAPI :

  • Importe toutes les bibliothèques requises (FastAPI, Pydantic, OpenAI, etc.)
  • Charge les variables denvironnement depuis votre fichier .env
  • Crée linstance de lapplication FastAPI avec documentation automatique

2. Uvicorn configure le serveur ASGI :

  • Se lie au port 5000 avec des capacités de gestion asynchrone des requêtes
  • Configure le routage des requêtes avec validation automatique
  • Active le rechargement à chaud pour le développement (redémarrage lors de modifications)
  • Génère une documentation interactive de lAPI

3. Le serveur commence à écouter :

  • Votre terminal affiche : INFO: Uvicorn running on http://0.0.0.0:5000
  • Le serveur peut gérer plusieurs requêtes IA simultanément
  • Votre API est prête avec une documentation automatique à http://localhost:5000/docs

Ce que vous devriez voir lorsque tout fonctionne

$ python api.py
INFO:     Will watch for changes in these directories: ['/your/project/path']
INFO:     Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
INFO:     Started reloader process [12345] using WatchFiles
INFO:     Started server process [12346]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

Comprendre la sortie FastAPI :

  • Will watch for changes : Rechargement automatique activé pour le développement
  • Uvicorn running : Serveur ASGI haute performance est actif
  • Started reloader process : Observateur de fichiers pour redémarrages automatiques
  • Application startup complete : Application FastAPI initialisée avec succès
  • Interactive docs available : Visitez /docs pour la documentation automatique de lAPI

Tester votre FastAPI : plusieurs approches puissantes

FastAPI fournit plusieurs moyens pratiques pour tester votre API, y compris une documentation interactive automatique :

Méthode 1 : Documentation interactive de lAPI (recommandée)

  1. Ouvrez votre navigateur et allez sur http://localhost:5000/docs
  2. Vous verrez Swagger UI avec tous vos endpoints documentés
  3. Cliquez sur /hello → « Try it out » → Entrez un message de test → « Execute »
  4. Voyez la réponse directement dans le navigateur avec une mise en forme adéquate

Méthode 2 : Test simple via navigateur

  1. Allez sur http://localhost:5000 pour le point dentrée racine
  2. Allez sur http://localhost:5000/health pour vérifier la santé du serveur
  3. Cela confirme que votre serveur FastAPI fonctionne correctement

Méthode 2 : Test en ligne de commande (avancé)

# Test avec curl (si disponible)
curl -X POST http://localhost:5000/hello \
  -H "Content-Type: application/json" \
  -d '{"message": "Hello AI!"}'

# Réponse attendue :
# {"response": "Bonjour ! Je suis votre assistant IA. Comment puis-je vous aider aujourd'hui ?"}

Méthode 3 : Script de test Python

# test_api.py - Créez ce fichier pour tester votre API
import requests
import json

# Tester le point de terminaison de l'API
url = "http://localhost:5000/hello"
data = {"message": "Tell me a joke about programming"}

response = requests.post(url, json=data)
if response.status_code == 200:
    result = response.json()
    print("AI Response:", result['response'])
else:
    print("Error:", response.status_code, response.text)

Résolution des problèmes courants au démarrage

Message derreur Signification Comment réparer
ModuleNotFoundError: No module named 'fastapi' FastAPI non installé Lancez pip install fastapi uvicorn dans votre environnement virtuel
ModuleNotFoundError: No module named 'uvicorn' Serveur ASGI non installé Lancez pip install uvicorn dans votre environnement virtuel
KeyError: 'GITHUB_TOKEN' Variable denvironnement introuvable Vérifiez votre fichier .env et lappel à load_dotenv()
Address already in use Le port 5000 est occupé Tuez les autres processus utilisant le port 5000 ou changez de port
ValidationError Les données de la requête ne correspondent pas au modèle Pydantic Vérifiez que le format de votre requête correspond au schéma attendu
HTTPException 422 Entité non traitable La validation de la requête a échoué, vérifiez /docs pour le format correct
OpenAI API error Échec dauthentification au service IA Vérifiez que votre token GitHub est correct et dispose des bonnes permissions

Bonnes pratiques de développement

Rechargement à chaud : FastAPI avec Uvicorn fournit un rechargement automatique lorsque vous enregistrez des modifications dans vos fichiers Python. Cela signifie que vous pouvez modifier votre code et tester immédiatement sans redémarrage manuel.

# Activer le rechargement à chaud explicitement
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)  # debug=True active le rechargement à chaud

Journalisation pour le développement : Ajoutez des logs pour comprendre ce qui se passe :

import logging

# Configurer la journalisation
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.route("/hello", methods=["POST"])
def hello():
    data = request.get_json()
    message = data.get("message", "")
    
    logger.info(f"Received message: {message}")
    
    if not message:
        logger.warning("Empty message received")
        return jsonify({"error": "Message field is required"}), 400
    
    try:
        response = call_llm(message, "You are a helpful and friendly assistant.")
        logger.info(f"AI response generated successfully")
        return jsonify({"response": response})
    except Exception as e:
        logger.error(f"AI API error: {str(e)}")
        return jsonify({"error": "AI service temporarily unavailable"}), 500

Pourquoi la journalisation est utile : Pendant le développement, vous pouvez voir exactement quelles requêtes arrivent, comment lIA répond et où les erreurs surviennent. Cela accélère grandement le débogage.

Configuration pour GitHub Codespaces : développement cloud simplifié

GitHub Codespaces, cest comme avoir un puissant ordinateur de développement dans le cloud accessible depuis nimporte quel navigateur. Si vous travaillez dans Codespaces, quelques étapes supplémentaires sont nécessaires pour rendre votre backend accessible à votre frontend.

Comprendre le réseau dans Codespaces

Dans un environnement de développement local, tout fonctionne sur la même machine :

  • Backend : http://localhost:5000
  • Frontend : http://localhost:3000 (ou file://)

Dans Codespaces, votre environnement sexécute sur les serveurs GitHub, donc « localhost » a un sens différent. GitHub crée automatiquement des URL publiques pour vos services, mais vous devez les configurer correctement.

Configuration étape par étape dans Codespaces

1. Démarrez votre serveur backend :

cd backend
python api.py

Vous verrez le message habituel de démarrage FastAPI/Uvicorn, mais remarquez quil sexécute dans lenvironnement Codespace.

2. Configurez la visibilité du port :

  • Cherchez longlet « Ports » dans le panneau inférieur de VS Code
  • Trouvez le port 5000 dans la liste
  • Faites un clic droit sur le port 5000
  • Sélectionnez « Port Visibility » → « Public »

Pourquoi le rendre public ? Par défaut, les ports Codespace sont privés (accessibles uniquement par vous). Le rendre public permet à votre frontend (qui tourne dans le navigateur) de communiquer avec votre backend.

3. Récupérez votre URL publique : Après avoir rendu le port public, vous verrez une URL comme :

https://your-codespace-name-5000.app.github.dev

4. Mettez à jour votre configuration frontend :

// Dans votre frontend app.js, mettez à jour le BASE_URL:
this.BASE_URL = "https://your-codespace-name-5000.app.github.dev";

Comprendre les URLs Codespace

Les URLs Codespace suivent un modèle prédictible :

https://[codespace-name]-[port].app.github.dev

Détail de la composition :

  • codespace-name : Identifiant unique de votre Codespace (généralement inclut votre nom dutilisateur)
  • port : Le numéro de port sur lequel votre service tourne (5000 pour notre app FastAPI)
  • app.github.dev : Domaine GitHub pour les applications Codespace

Tester votre configuration Codespace

1. Testez directement le backend : Ouvrez votre URL publique dans un nouvel onglet du navigateur. Vous devriez voir :

Welcome to the AI Chat API. Send POST requests to /hello with JSON payload containing 'message' field.

2. Testez avec les outils développeurs du navigateur :

// Ouvrez la console du navigateur et testez votre API
fetch('https://your-codespace-name-5000.app.github.dev/hello', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({message: 'Hello from Codespaces!'})
})
.then(response => response.json())
.then(data => console.log(data));

Codespaces vs développement local

Aspect Développement local GitHub Codespaces
Temps dinstallation Plus long (installation Python, dépendances) Instantané (environnement pré-configuré)
Accès URL http://localhost:5000 https://xyz-5000.app.github.dev
Configuration des ports Automatique Manuelle (rendre les ports publics)
Persistance des fichiers Machine locale Répertoire GitHub
Collaboration Partage denvironnement difficile Partage facile du lien Codespace
Dépendance internet Uniquement pour les appels API IA Requise pour tout

Conseils pour le développement dans Codespaces

Variables denvironnement dans Codespaces : Votre fichier .env fonctionne de la même façon dans Codespaces, mais vous pouvez aussi définir des variables denvironnement directement dans le Codespace :

# Définir une variable d'environnement pour la session en cours
export GITHUB_TOKEN="your_token_here"

# Ou l'ajouter à votre .bashrc pour la persistance
echo 'export GITHUB_TOKEN="your_token_here"' >> ~/.bashrc

Gestion des ports :

  • Codespaces détecte automatiquement lorsque votre application commence à écouter un port
  • Vous pouvez rediriger plusieurs ports simultanément (utile si vous ajoutez une base de données plus tard)
  • Les ports restent accessibles tant que votre Codespace est actif

Workflow de développement :

  1. Faites des modifications dans VS Code
  2. FastAPI se recharge automatiquement (grâce au mode reload dUvicorn)
  3. Testez les modifications immédiatement via lURL publique
  4. Committez et poussez quand cest prêt

💡 Astuce pro : Mettez en favori lURL de votre backend Codespace pendant le développement. Comme les noms des Codespaces sont stables, lURL ne changera pas tant que vous utilisez le même Codespace.

Création de linterface chat frontend : où les humains rencontrent lIA

Nous allons maintenant construire linterface utilisateur la partie qui détermine comment les gens interagissent avec votre assistant IA. Comme pour le design de linterface originale de liPhone, lobjectif est de rendre la technologie complexe intuitive et naturelle à utiliser.

Comprendre larchitecture moderne du frontend

Notre interface chat sera ce que nous appelons une « application monopage » ou SPA. Au lieu de lapproche traditionnelle où chaque clic charge une nouvelle page, notre application se met à jour de façon fluide et instantanée :

Sites web anciens : Comme lire un livre physique vous tournez des pages complètement nouvelles
Notre application de chat : Comme utiliser votre téléphone tout coule et se met à jour sans rupture

graph TD
    A[Utilisateur Tape un Message] --> B[JavaScript Capture l'Entrée]
    B --> C[Valider & Formater les Données]
    C --> D[Envoyer à l'API Backend]
    D --> E[Afficher l'État de Chargement]
    E --> F[Recevoir la Réponse de l'IA]
    F --> G[Mettre à Jour l'Interface de Chat]
    G --> H[Prêt pour le Message Suivant]
classDiagram
    class ChatApp {
        +messages: HTMLElement
        +form: HTMLElement
        +input: HTMLElement
        +sendButton: HTMLElement
        +BASE_URL: string
        +API_ENDPOINT: string
        
        +constructor()
        +initializeEventListeners()
        +handleSubmit(event)
        +callAPI(message)
        +appendMessage(text, role)
        +escapeHtml(text)
        +scrollToBottom()
        +setLoading(isLoading)
    }
    
    ChatApp --> DOM : manipule
    ChatApp --> FastAPI : envoie des requêtes

Les trois piliers du développement frontend

Toute application frontend des sites simples aux apps complexes comme Discord ou Slack repose sur trois technologies fondamentales. Pensez-y comme à la base de tout ce que vous voyez et avec quoi vous interagissez sur le web :

HTML (Structure) : Cest votre fondation

  • Décide quels éléments existent (boutons, zones de texte, conteneurs)
  • Donne du sens au contenu (cest un titre, cest un formulaire, etc.)
  • Crée la structure de base sur laquelle tout le reste sappuie

CSS (Présentation) : Cest votre décorateur dintérieur

  • Rend tout joli (couleurs, polices, mises en page)
  • Gère les différentes tailles décran (téléphone vs portable vs tablette)
  • Crée des animations fluides et des retours visuels

JavaScript (Comportement) : Cest votre cerveau

  • Réagit aux actions utilisateurs (clics, saisies, défilement)
  • Communique avec votre backend et met à jour la page
  • Rend tout interactif et dynamique

Pensez-y comme un projet architectural :

  • HTML : Le plan structurel (définition des espaces et relations)
  • CSS : Le design esthétique et environnemental (style visuel et expérience utilisateur)
  • JavaScript : Les systèmes mécaniques (fonctionnalité et interactivité)

Pourquoi larchitecture JavaScript moderne est importante

Notre application chat utilisera des patterns JavaScript modernes que vous rencontrerez dans des applications professionnelles. Comprendre ces concepts vous aidera à progresser en tant que développeur :

Architecture basée sur les classes : Nous organiserons notre code en classes, ce qui revient à créer des plans pour des objets
Async/Await : Manière moderne de gérer les opérations longues (comme les appels API)
Programmation événementielle : Notre app réagit aux actions de lutilisateur (clics, pressions de touches) au lieu de tourner en boucle
Manipulation du DOM : Mise à jour dynamique du contenu de la page web selon les interactions utilisateur et les réponses API

Configuration de la structure du projet

Créez un répertoire frontend avec cette structure organisée :

frontend/
├── index.html      # Main HTML structure
├── app.js          # JavaScript functionality
└── styles.css      # Visual styling

Comprendre larchitecture :

  • Sépare les préoccupations entre structure (HTML), comportement (JavaScript) et présentation (CSS)
  • Maintient une structure de fichiers simple facile à naviguer et modifier
  • Suit les meilleures pratiques web pour lorganisation et la maintenabilité

Construire la fondation HTML : structure sémantique pour laccessibilité

Commençons par la structure HTML. Le développement web moderne met laccent sur le « HTML sémantique » utiliser des éléments HTML qui décrivent clairement leur rôle, pas seulement leur apparence. Cela rend votre application accessible aux lecteurs décran, moteurs de recherche et autres outils.

Pourquoi le HTML sémantique est important : Imaginez décrire votre application de chat à quelquun au téléphone. Vous diriez « il y a un en-tête avec le titre, une zone principale où apparaissent les conversations, et un formulaire en bas pour taper les messages ». Le HTML sémantique utilise des éléments qui correspondent à cette description naturelle.

Créez index.html avec ce balisage structuré avec soin :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Chat Assistant</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="chat-container">
        <header class="chat-header">
            <h1>AI Chat Assistant</h1>
            <p>Ask me anything!</p>
        </header>
        
        <main class="chat-messages" id="messages" role="log" aria-live="polite">
            <!-- Messages will be dynamically added here -->
        </main>
        
        <form class="chat-form" id="chatForm">
            <div class="input-group">
                <input 
                    type="text" 
                    id="messageInput" 
                    placeholder="Type your message here..." 
                    required
                    aria-label="Chat message input"
                >
                <button type="submit" id="sendBtn" aria-label="Send message">
                    Send
                </button>
            </div>
        </form>
    </div>
    <script src="app.js"></script>
</body>
</html>

Comprendre chaque élément HTML et son rôle :

Structure du document

  • <!DOCTYPE html> : Indique au navigateur quil sagit de HTML5 moderne
  • <html lang="en"> : Spécifie la langue de la page pour les lecteurs décran et outils de traduction
  • <meta charset="UTF-8"> : Assure un encodage de caractères correct pour le texte international
  • <meta name="viewport"...> : Rend la page responsive en contrôlant le zoom et léchelle

Éléments sémantiques

  • <header> : Identifie clairement la section supérieure avec titre et description
  • <main> : Désigne la zone de contenu principal (où ont lieu les conversations)
  • <form> : Sémantiquement correct pour la saisie utilisateur, permet une bonne navigation clavier

Fonctionnalités daccessibilité

  • role="log" : Indique aux lecteurs décran que cette zone contient un journal chronologique des messages
  • aria-live="polite" : Annonce les nouveaux messages aux lecteurs décran sans interruption
  • aria-label : Fournit des étiquettes descriptives pour les contrôles du formulaire
  • required : Le navigateur valide que lutilisateur entre un message avant lenvoi

Intégration CSS et JavaScript

  • Attributs class : Fournissent des points dancrage pour le style CSS (ex. chat-container, input-group)
  • Attributs id : Permettent à JavaScript de cibler et manipuler des éléments spécifiques
  • Placement du script : Le fichier JavaScript est chargé en fin de page pour que le HTML soit chargé dabord

Pourquoi cette structure est efficace :

  • Flux logique : En-tête → Contenu principal → Formulaire dentrée suit lordre naturel de lecture
  • Accessible au clavier : Les utilisateurs peuvent naviguer avec la touche Tab à travers tous les éléments interactifs
  • Compatible avec les lecteurs décran : Repères clairs et descriptions pour les utilisateurs malvoyants
  • Responsive : La meta viewport permet un design adapté aux mobiles
  • Amélioration progressive : Fonctionne même si le CSS ou JavaScript ne charge pas

Ajouter du JavaScript interactif : logique dapplication web moderne

Passons maintenant à la création du code JavaScript qui donnera vie à notre interface de chat. Nous utiliserons des modèles JavaScript modernes que vous rencontrerez dans le développement web professionnel, notamment les classes ES6, async/await et la programmation événementielle.

Comprendre larchitecture JavaScript moderne

Au lieu décrire un code procédural (une série de fonctions qui sexécutent dans lordre), nous allons créer une architecture basée sur des classes. Pensez à une classe comme un plan pour créer des objets comme un plan darchitecte utilisé pour construire plusieurs maisons.

Pourquoi utiliser des classes pour les applications web ?

  • Organisation : Toutes les fonctionnalités liées sont regroupées ensemble
  • Réutilisabilité : Vous pouvez créer plusieurs instances de chat sur la même page
  • Maintenabilité : Plus facile de déboguer et modifier des fonctionnalités spécifiques
  • Standard professionnel : Ce modèle est utilisé dans des frameworks comme React, Vue et Angular

Créez app.js avec ce JavaScript moderne et bien structuré :

// app.js - Logique moderne de l'application de chat

class ChatApp {
    constructor() {
        // Obtenir les références des éléments du DOM que nous devons manipuler
        this.messages = document.getElementById("messages");
        this.form = document.getElementById("chatForm");
        this.input = document.getElementById("messageInput");
        this.sendButton = document.getElementById("sendBtn");
        
        // Configurez ici l'URL de votre backend
        this.BASE_URL = "http://localhost:5000"; // Mettez à jour cela pour votre environnement
        this.API_ENDPOINT = `${this.BASE_URL}/hello`;
        
        // Configurer les écouteurs d'événements lors de la création de l'application de chat
        this.initializeEventListeners();
    }
    
    initializeEventListeners() {
        // Écouter la soumission du formulaire (lorsque l'utilisateur clique sur Envoyer ou appuie sur Entrée)
        this.form.addEventListener("submit", (e) => this.handleSubmit(e));
        
        // Écouter également la touche Entrée dans le champ de saisie (meilleure expérience utilisateur)
        this.input.addEventListener("keypress", (e) => {
            if (e.key === "Enter" && !e.shiftKey) {
                e.preventDefault();
                this.handleSubmit(e);
            }
        });
    }
    
    async handleSubmit(event) {
        event.preventDefault(); // Empêcher le formulaire de rafraîchir la page
        
        const messageText = this.input.value.trim();
        if (!messageText) return; // Ne pas envoyer de messages vides
        
        // Fournir un retour utilisateur indiquant qu'une action est en cours
        this.setLoading(true);
        
        // Ajouter immédiatement le message de l'utilisateur au chat (interface optimiste)
        this.appendMessage(messageText, "user");
        
        // Vider le champ de saisie pour que l'utilisateur puisse taper le message suivant
        this.input.value = '';
        
        try {
            // Appeler l'API IA et attendre la réponse
            const reply = await this.callAPI(messageText);
            
            // Ajouter la réponse de l'IA au chat
            this.appendMessage(reply, "assistant");
        } catch (error) {
            console.error('API Error:', error);
            this.appendMessage("Sorry, I'm having trouble connecting right now. Please try again.", "error");
        } finally {
            // Réactiver l'interface, que la requête réussisse ou échoue
            this.setLoading(false);
        }
    }
    
    async callAPI(message) {
        const response = await fetch(this.API_ENDPOINT, {
            method: "POST",
            headers: { 
                "Content-Type": "application/json" 
            },
            body: JSON.stringify({ message })
        });
        
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        
        const data = await response.json();
        return data.response;
    }
    
    appendMessage(text, role) {
        const messageElement = document.createElement("div");
        messageElement.className = `message ${role}`;
        messageElement.innerHTML = `
            <div class="message-content">
                <span class="message-text">${this.escapeHtml(text)}</span>
                <span class="message-time">${new Date().toLocaleTimeString()}</span>
            </div>
        `;
        
        this.messages.appendChild(messageElement);
        this.scrollToBottom();
    }
    
    escapeHtml(text) {
        const div = document.createElement('div');
        div.textContent = text;
        return div.innerHTML;
    }
    
    scrollToBottom() {
        this.messages.scrollTop = this.messages.scrollHeight;
    }
    
    setLoading(isLoading) {
        this.sendButton.disabled = isLoading;
        this.input.disabled = isLoading;
        this.sendButton.textContent = isLoading ? "Sending..." : "Send";
    }
}

// Initialiser l'application de chat lorsque la page se charge
document.addEventListener("DOMContentLoaded", () => {
    new ChatApp();
});

Comprendre chaque concept JavaScript

Structure de classe ES6 :

class ChatApp {
    constructor() {
        // Cela s'exécute lorsque vous créez une nouvelle instance de ChatApp
        // C'est comme la fonction "setup" pour votre chat
    }
    
    methodName() {
        // Les méthodes sont des fonctions qui appartiennent à la classe
        // Elles peuvent accéder aux propriétés de la classe en utilisant "this"
    }
}

Modèle async/await :

// Ancienne manière (enfer des callbacks) :
fetch(url)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

// Manière moderne (async/await) :
try {
    const response = await fetch(url);
    const data = await response.json();
    console.log(data);
} catch (error) {
    console.error(error);
}

Programmation événementielle : Au lieu de vérifier constamment si quelque chose sest produit, on "écoute" les événements :

// Lorsque le formulaire est soumis, exécutez handleSubmit
this.form.addEventListener("submit", (e) => this.handleSubmit(e));

// Lorsque la touche Entrée est pressée, exécutez également handleSubmit
this.input.addEventListener("keypress", (e) => { /* ... */ });

Manipulation du DOM :

// Créer de nouveaux éléments
const messageElement = document.createElement("div");

// Modifier leurs propriétés
messageElement.className = "message user";
messageElement.innerHTML = "Hello world!";

// Ajouter à la page
this.messages.appendChild(messageElement);

Sécurité et bonnes pratiques

Prévention des XSS :

escapeHtml(text) {
    const div = document.createElement('div');
    div.textContent = text;  // Ceci échappe automatiquement le HTML
    return div.innerHTML;
}

Pourquoi cest important : Si un utilisateur tape <script>alert('hack')</script>, cette fonction garantit que cela saffiche en texte et ne sexécute pas comme du code.

Gestion des erreurs :

try {
    const reply = await this.callAPI(messageText);
    this.appendMessage(reply, "assistant");
} catch (error) {
    // Afficher une erreur conviviale au lieu de faire planter l'application
    this.appendMessage("Sorry, I'm having trouble...", "error");
}

Considérations sur lexpérience utilisateur :

  • Interface optimiste : Ajouter immédiatement le message de lutilisateur, ne pas attendre la réponse du serveur
  • États de chargement : Désactiver les boutons et afficher "Envoi..." pendant lattente
  • Défilement automatique : Garder les messages les plus récents visibles
  • Validation des entrées : Ne pas envoyer de messages vides
  • Raccourcis clavier : La touche Entrée envoie les messages (comme dans les vraies applis de chat)

Comprendre le flux de lapplication

  1. Chargement de la page → lévénement DOMContentLoaded se déclenche → création dune new ChatApp()
  2. Exécution du constructeur → obtention des références DOM → configuration des écouteurs dévénements
  3. Lutilisateur saisit un message → appuie sur Entrée ou clique sur Envoyer → exécution de handleSubmit
  4. handleSubmit → validation de lentrée → affichage de létat de chargement → appel à lAPI
  5. Réponse de lAPI → ajout du message IA au chat → réactivation de linterface
  6. Prêt pour le message suivant → lutilisateur peut continuer à discuter

Cette architecture est évolutive vous pouvez facilement ajouter des fonctionnalités comme lédition de messages, les téléchargements de fichiers ou plusieurs fils de conversation sans réécrire la structure de base.

🎯 Vérification pédagogique : Architecture frontend moderne

Compréhension de larchitecture : Vous avez mis en œuvre une application à page unique complète en utilisant des modèles JavaScript modernes. Cela représente un développement frontend de niveau professionnel.

Concepts clés maîtrisés :

  • Architecture basée sur des classes ES6 : code organisé et maintenable
  • Modèles async/await : programmation asynchrone moderne
  • Programmation événementielle : conception dinterfaces réactives
  • Bonnes pratiques de sécurité : prévention des XSS et validation dentrées

Lien avec lindustrie : Les modèles que vous avez appris (architecture orientée classe, opérations asynchrones, manipulation du DOM) forment la base des frameworks modernes comme React, Vue et Angular. Vous construisez avec la même logique architecturale utilisée dans les applications en production.

Question de réflexion : Comment étendriez-vous cette application de chat pour gérer plusieurs conversations ou lauthentification utilisateur ? Réfléchissez aux changements architecturaux nécessaires et à lévolution de la structure de la classe.

Styliser votre interface de chat

Créons maintenant une interface de chat moderne et visuellement attrayante avec du CSS. Un bon style donne à votre application un aspect professionnel et améliore lexpérience utilisateur globale. Nous utiliserons des fonctionnalités CSS modernes comme Flexbox, CSS Grid et les variables personnalisées pour un design responsive et accessible.

Créez styles.css avec ces styles complets :

/* styles.css - Modern chat interface styling */

:root {
    --primary-color: #2563eb;
    --secondary-color: #f1f5f9;
    --user-color: #3b82f6;
    --assistant-color: #6b7280;
    --error-color: #ef4444;
    --text-primary: #1e293b;
    --text-secondary: #64748b;
    --border-radius: 12px;
    --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
}

.chat-container {
    width: 100%;
    max-width: 800px;
    height: 600px;
    background: white;
    border-radius: var(--border-radius);
    box-shadow: var(--shadow);
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

.chat-header {
    background: var(--primary-color);
    color: white;
    padding: 20px;
    text-align: center;
}

.chat-header h1 {
    font-size: 1.5rem;
    margin-bottom: 5px;
}

.chat-header p {
    opacity: 0.9;
    font-size: 0.9rem;
}

.chat-messages {
    flex: 1;
    padding: 20px;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 15px;
    background: var(--secondary-color);
}

.message {
    display: flex;
    max-width: 80%;
    animation: slideIn 0.3s ease-out;
}

.message.user {
    align-self: flex-end;
}

.message.user .message-content {
    background: var(--user-color);
    color: white;
    border-radius: var(--border-radius) var(--border-radius) 4px var(--border-radius);
}

.message.assistant {
    align-self: flex-start;
}

.message.assistant .message-content {
    background: white;
    color: var(--text-primary);
    border-radius: var(--border-radius) var(--border-radius) var(--border-radius) 4px;
    border: 1px solid #e2e8f0;
}

.message.error .message-content {
    background: var(--error-color);
    color: white;
    border-radius: var(--border-radius);
}

.message-content {
    padding: 12px 16px;
    box-shadow: var(--shadow);
    position: relative;
}

.message-text {
    display: block;
    line-height: 1.5;
    word-wrap: break-word;
}

.message-time {
    display: block;
    font-size: 0.75rem;
    opacity: 0.7;
    margin-top: 5px;
}

.chat-form {
    padding: 20px;
    border-top: 1px solid #e2e8f0;
    background: white;
}

.input-group {
    display: flex;
    gap: 10px;
    align-items: center;
}

#messageInput {
    flex: 1;
    padding: 12px 16px;
    border: 2px solid #e2e8f0;
    border-radius: var(--border-radius);
    font-size: 1rem;
    outline: none;
    transition: border-color 0.2s ease;
}

#messageInput:focus {
    border-color: var(--primary-color);
}

#messageInput:disabled {
    background: #f8fafc;
    opacity: 0.6;
    cursor: not-allowed;
}

#sendBtn {
    padding: 12px 24px;
    background: var(--primary-color);
    color: white;
    border: none;
    border-radius: var(--border-radius);
    font-size: 1rem;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.2s ease;
    min-width: 80px;
}

#sendBtn:hover:not(:disabled) {
    background: #1d4ed8;
}

#sendBtn:disabled {
    background: #94a3b8;
    cursor: not-allowed;
}

@keyframes slideIn {
    from {
        opacity: 0;
        transform: translateY(10px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* Responsive design for mobile devices */
@media (max-width: 768px) {
    body {
        padding: 10px;
    }
    
    .chat-container {
        height: calc(100vh - 20px);
        border-radius: 8px;
    }
    
    .message {
        max-width: 90%;
    }
    
    .input-group {
        flex-direction: column;
        gap: 10px;
    }
    
    #messageInput {
        width: 100%;
    }
    
    #sendBtn {
        width: 100%;
    }
}

/* Accessibility improvements */
@media (prefers-reduced-motion: reduce) {
    .message {
        animation: none;
    }
    
    * {
        transition: none !important;
    }
}

/* Dark mode support */
@media (prefers-color-scheme: dark) {
    .chat-container {
        background: #1e293b;
        color: #f1f5f9;
    }
    
    .chat-messages {
        background: #0f172a;
    }
    
    .message.assistant .message-content {
        background: #334155;
        color: #f1f5f9;
        border-color: #475569;
    }
    
    .chat-form {
        background: #1e293b;
        border-color: #475569;
    }
    
    #messageInput {
        background: #334155;
        color: #f1f5f9;
        border-color: #475569;
    }
}

Comprendre larchitecture CSS :

  • Utilise les propriétés personnalisées CSS (variables) pour un thème cohérent et une maintenance aisée
  • Implémente un layout Flexbox pour un design responsive et un alignement approprié
  • Inclut des animations douces pour lapparition des messages sans être distrayantes
  • Fournit une distinction visuelle entre les messages utilisateur, les réponses IA et les états derreur
  • Supporte un design responsive fonctionnel sur ordinateurs et mobiles
  • Prend en compte laccessibilité avec les préférences de réduction des animations et des contrastes appropriés
  • Propose un support du mode sombre selon les préférences système de lutilisateur

Configuration de lURL de votre backend

La dernière étape consiste à mettre à jour la BASE_URL dans votre JavaScript pour quelle corresponde à votre serveur backend :

// Pour le développement local
this.BASE_URL = "http://localhost:5000";

// Pour GitHub Codespaces (remplacez par votre URL réelle)
this.BASE_URL = "https://your-codespace-name-5000.app.github.dev";

Déterminer lURL de votre backend :

  • Développement local : Utilisez http://localhost:5000 si vous exécutez frontend et backend localement
  • Codespaces : Retrouvez lURL de votre backend dans longlet Ports après avoir rendu le port 5000 public
  • Production : Remplacez par votre domaine réel lors du déploiement sur un service dhébergement

💡 Conseil de test : Vous pouvez tester votre backend directement en visitant lURL racine dans votre navigateur. Vous devriez voir le message de bienvenue de votre serveur FastAPI.

Test et déploiement

Maintenant que vous avez construit les composants frontend et backend, testons que tout fonctionne ensemble et explorons les options de déploiement pour partager votre assistant de chat avec dautres.

Flux de test local

Suivez ces étapes pour tester votre application complète :

graph TD
    A[Démarrer le serveur backend] --> B[Configurer les variables d'environnement]
    B --> C[Tester les points de terminaison API]
    C --> D[Ouvrir le frontend dans le navigateur]
    D --> E[Tester la fonctionnalité de chat]
    E --> F[Déboguer les problèmes éventuels]

Processus de test étape par étape :

  1. Démarrez votre serveur backend :

    cd backend
    source venv/bin/activate  # ou venv\Scripts\activate sous Windows
    python api.py
    
  2. Vérifiez que lAPI fonctionne :

    • Ouvrez http://localhost:5000 dans votre navigateur
    • Vous devriez voir le message de bienvenue de votre serveur FastAPI
  3. Ouvrez votre frontend :

    • Naviguez dans votre dossier frontend
    • Ouvrez index.html dans votre navigateur
    • Ou utilisez lextension Live Server de VS Code pour une meilleure expérience de développement
  4. Testez la fonctionnalité de chat :

    • Tapez un message dans le champ de saisie
    • Cliquez sur "Envoyer" ou appuyez sur Entrée
    • Vérifiez que lIA répond de manière appropriée
    • Consultez la console du navigateur pour détecter déventuelles erreurs JavaScript

Dépannage des problèmes courants

Problème Symptômes Solution
Erreur CORS Le frontend natteint pas le backend Assurez-vous que CORSMiddleware de FastAPI est configuré correctement
Erreur clé API Réponses 401 Unauthorized Vérifiez votre variable denvironnement GITHUB_TOKEN
Connexion refusée Erreurs réseau dans le frontend Vérifiez lURL du backend et que le serveur Flask tourne
Pas de réponse IA Réponses vides ou erreurs Consultez les logs backend pour quota API ou problèmes dauthentification

Étapes courantes de débogage :

  • Vérifiez la console des outils de développement du navigateur pour les erreurs JavaScript
  • Confirmez dans longlet Réseau que les requêtes API sont bien envoyées et reçoivent une réponse
  • Examinez la sortie terminal du backend pour les erreurs Python ou API
  • Assurez-vous que les variables denvironnement sont correctement chargées et accessibles

📈 Votre progression dans le développement dapplications AI

timeline
    title Parcours complet de développement d'une application IA
    
    section Fondations de l'IA
        Comprendre l'IA générative
            : Comprendre les concepts de reconnaissance de motifs
            : Maîtriser le contrôle des paramètres IA
            : Apprendre les techniques d'ingénierie de prompt
        
        Intégration des modèles GitHub
            : Naviguer sur les plateformes de services IA
            : Gérer l'authentification en toute sécurité
            : Optimiser les paramètres du modèle
    
    section Développement Backend
        Architecture API Python
            : Construire des applications FastAPI
            : Implémenter des opérations asynchrones
            : Créer des points d'accès sécurisés
        
        Intégration des services IA
            : Se connecter aux APIs IA externes
            : Gérer la limitation de débit
            : Implémenter des limites d'erreur
    
    section Maîtrise Frontend
        Patterns modernes JavaScript
            : Maîtriser l'architecture des classes ES6
            : Implémenter les flux async/await
            : Construire des interfaces réactives
        
        Expérience utilisateur en temps réel
            : Créer des interfaces de chat dynamiques
            : Gérer les états de chargement
            : Optimiser les interactions utilisateur
    
    section Prêt pour la production
        Sécurité & Performance
            : Implémenter une gestion sécurisée des tokens
            : Prévenir les vulnérabilités XSS
            : Optimiser les performances API
        
        Déploiement professionnel
            : Construire des architectures évolutives
            : Créer un code maintenable
            : Documenter les processus de développement

🎓 Étape de graduation : Vous avez construit avec succès une application complète alimentée par lIA utilisant les mêmes technologies et architectures que celles qui animent les assistants IA modernes. Ces compétences représentent lintersection entre le développement web traditionnel et lintégration avancée dIA.

🔄 Capacités de niveau supérieur :

  • Prêt à explorer des frameworks AI avancés (LangChain, LangGraph)
  • Préparé à créer des applications AI multimodales (texte, image, voix)
  • Équipé pour implémenter des bases de données vectorielles et systèmes de recherche
  • Fondations posées pour lapprentissage machine et lajustement fin des modèles AI

Défi GitHub Copilot Agent 🚀

Utilisez le mode Agent pour relever le défi suivant :

Description : Améliorez lassistant de chat en ajoutant lhistorique des conversations et la persistance des messages. Ce défi vous aidera à comprendre comment gérer létat dans les applications de chat et implémenter le stockage des données pour améliorer lexpérience utilisateur.

Consigne : Modifiez lapplication de chat pour inclure un historique des conversations qui persiste entre les sessions. Ajoutez la fonctionnalité pour sauvegarder les messages dans le stockage local, afficher lhistorique à louverture de la page, et inclure un bouton "Effacer lhistorique". Implémentez également des indicateurs de saisie et des horodatages des messages pour rendre lexpérience plus réaliste.

En savoir plus sur le mode agent ici.

Projet : Construisez votre assistant AI personnel

Vous allez maintenant créer votre propre implémentation dassistant AI. Plutôt que de simplement reproduire le code du tutoriel, cest loccasion dappliquer les concepts tout en construisant quelque chose qui reflète vos intérêts et cas dusage.

Exigences du projet

Organisons votre projet avec une structure propre et organisée :

my-ai-assistant/
├── backend/
│   ├── api.py          # Your FastAPI server
│   ├── llm.py          # AI integration functions
│   ├── .env            # Your secrets (keep this safe!)
│   └── requirements.txt # Python dependencies
├── frontend/
│   ├── index.html      # Your chat interface
│   ├── app.js          # The JavaScript magic
│   └── styles.css      # Make it look amazing
└── README.md           # Tell the world about your creation

Tâches principales dimplémentation

Développement backend :

  • Prenez notre code FastAPI et faites-le vôtre
  • Créez une personnalité AI unique peut-être un assistant cuisine, un partenaire décriture créative, ou un compagnon détudes ?
  • Ajoutez une gestion robuste des erreurs pour que votre app ne plante pas en cas de problème
  • Rédigez une documentation claire pour que quiconque puisse comprendre le fonctionnement de votre API

Développement frontend :

  • Concevez une interface de chat intuitive et accueillante
  • Écrivez un JavaScript propre et moderne dont vous serez fier devant dautres développeurs
  • Créez un style personnalisé reflétant la personnalité de votre AI fun et coloré ? Sobre et minimaliste ? À vous de voir !
  • Assurez-vous que ça fonctionne parfaitement sur téléphones et ordinateurs

Exigences de personnalisation :

  • Choisissez un nom et une personnalité uniques pour votre assistant AI peut-être quelque chose qui reflète vos centres dintérêt ou les problèmes que vous souhaitez résoudre
  • Personnalisez le design visuel pour coller à lambiance de votre assistant
  • Rédigez un message de bienvenue engageant qui donne envie de commencer à discuter
  • Testez votre assistant avec divers types de questions pour voir ses réactions

Idées daméliorations (optionnel)

Envie daller plus loin ? Voici quelques idées amusantes à explorer :

Fonctionnalité Description Compétences exercées
Historique des messages Mémoriser les conversations même après rafraîchissement Manipulation du localStorage, gestion JSON
Indicateurs de saisie Afficher "IA est en train décrire..." pendant lattente Animations CSS, programmation asynchrone
Horodatage des messages Afficher lheure denvoi de chaque message Formatage date/heure, design UX
Exporter la conversation Permettre à lutilisateur de télécharger ses échanges Gestion fichiers, export de données
Changement de thème Basculer entre mode clair/sombre Variables CSS, préférences utilisateur
Saisie vocale Ajouter la fonction reconnaissance vocale API Web, accessibilité

Tests et documentation

Assurance qualité :

  • Testez votre application avec différents types de saisies et cas limites
  • Vérifiez que le design responsive fonctionne sur plusieurs tailles décran
  • Contrôlez laccessibilité avec navigation clavier et lecteurs décran
  • Validez le HTML et CSS pour la conformité aux standards

Exigences de documentation :

  • Rédigez un README.md expliquant votre projet et comment le lancer
  • Incluez des captures décran de votre interface de chat en action
  • Documentez les fonctionnalités ou personnalisations uniques que vous avez ajoutées
  • Fournissez des instructions dinstallation claires pour dautres développeurs

Consignes de rendu

Livrables du projet :

  1. Dossier complet du projet avec tout le code source
  2. README.md avec description et instructions dinstallation
  3. Captures décran démontrant votre assistant de chat en fonctionnement
  4. Brève réflexion sur ce que vous avez appris et les défis rencontrés

Critères dévaluation :

  • Fonctionnalité : Lassistant de chat fonctionne-t-il comme attendu ?
  • Qualité du code : Le code est-il bien organisé, commenté et maintenable ?
  • Design : Linterface est-elle esthétique et facile à utiliser ?
  • Créativité : Quelle est loriginalité et la personnalisation de votre réalisation ?
  • Documentation : Les instructions sont-elles claires et complètes ?

💡 Conseil pour réussir : Commencez par les exigences de base, puis ajoutez des améliorations une fois que tout fonctionne. Concentrez-vous sur une expérience principale soignée avant dajouter des fonctionnalités avancées.

Solution

Solution

Défis bonus

Prêt à faire passer votre assistant AI au niveau supérieur ? Essayez ces défis avancés qui approfondiront votre compréhension de lintégration IA et du développement web.

Personnalisation de la personnalité

La vraie magie arrive quand vous donnez une personnalité unique à votre assistant AI. Expérimentez avec différents prompts système pour créer des assistants spécialisés :

Exemple dassistant professionnel :

call_llm(message, "You are a professional business consultant with 20 years of experience. Provide structured, actionable advice with specific steps and considerations.")

Exemple daide à lécriture créative :

call_llm(message, "You are an enthusiastic creative writing coach. Help users develop their storytelling skills with imaginative prompts and constructive feedback.")

Exemple de mentor technique :

call_llm(message, "You are a patient senior developer who explains complex programming concepts using simple analogies and practical examples.")

Améliorations frontend

Transformez votre interface de chat avec ces améliorations visuelles et fonctionnelles :

Fonctionnalités CSS avancées :

  • Implémentez des animations douces des messages et des transitions
  • Ajoutez des designs personnalisés pour les bulles de chat avec formes CSS et dégradés
  • Créez une animation dindicateur de saisie quand lIA "réfléchit"
  • Concevez des réactions emoji ou un système dévaluation des messages

Améliorations JavaScript :

  • Ajoutez des raccourcis clavier (Ctrl+Entrée pour envoyer, Échap pour vider la saisie)
  • Implémentez une fonction de recherche et filtrage des messages
  • Créez une option dexportation de conversation (téléchargement texte ou JSON)
  • Ajoutez une sauvegarde automatique dans localStorage pour éviter la perte des messages

Intégration IA avancée

Personnalités AI multiples :

  • Créez un menu déroulant pour changer de personnalité AI
  • Sauvegardez la personnalité préférée de lutilisateur dans localStorage
  • Implémentez la gestion de contexte qui maintient le flux de la conversation
  • Implémentez des suggestions intelligentes basées sur le sujet de la conversation
  • Créez des boutons de réponse rapide pour les questions courantes

🎯 Objectif d'apprentissage : Ces défis bonus vous aident à comprendre les modèles avancés de développement web et les techniques dintégration de lIA utilisées dans les applications en production.

Résumé et étapes suivantes

Félicitations ! Vous avez réussi à construire un assistant de chat complet piloté par IA à partir de zéro. Ce projet vous a permis dacquérir une expérience pratique avec les technologies modernes de développement web et lintégration de lIA des compétences de plus en plus précieuses dans le paysage technologique actuel.

Ce que vous avez accompli

Au cours de cette leçon, vous avez maîtrisé plusieurs technologies et concepts clés :

Développement Backend :

  • Intégré lAPI GitHub Models pour la fonctionnalité IA
  • Construit une API RESTful avec Flask en gérant correctement les erreurs
  • Implémenté une authentification sécurisée utilisant les variables denvironnement
  • Configuré le CORS pour les requêtes cross-origin entre frontend et backend

Développement Frontend :

  • Créé une interface de chat responsive en HTML sémantique
  • Implémenté du JavaScript moderne avec async/await et une architecture orientée classes
  • Conçu une interface utilisateur attractive avec CSS Grid, Flexbox et animations
  • Ajouté des fonctionnalités daccessibilité et des principes de design responsive

Intégration Full-Stack :

  • Connecté frontend et backend via des appels API HTTP
  • Géré les interactions utilisateurs en temps réel et le flux de données asynchrones
  • Implémenté la gestion des erreurs et le retour utilisateur dans toute lapplication
  • Testé le workflow complet de lapplication depuis la saisie utilisateur jusquà la réponse IA

Résultats clés dapprentissage

mindmap
  root((Compétences de l'application de chat IA))
    API Integration
      Authentication
      Error Handling
      Async Programming
    Web Development
      HTML5 Semantics
      Modern CSS
      ES6+ JavaScript
    User Experience
      Responsive Design
      Accessibility
      Real-time Interaction
    AI Understanding
      Prompt Engineering
      Model Parameters
      Conversation Flow

Ce projet vous a introduit aux fondamentaux de la construction dapplications pilotées par IA, qui représentent lavenir du développement web. Vous comprenez maintenant comment intégrer des capacités IA dans des applications web traditionnelles, créant des expériences utilisateurs attrayantes qui paraissent intelligentes et réactives.

Applications professionnelles

Les compétences que vous avez développées dans cette leçon sont directement applicables aux carrières modernes du développement logiciel :

  • Développement web full-stack avec des frameworks et API modernes
  • Intégration IA dans les applications web et mobiles
  • Conception et développement dAPI pour des architectures microservices
  • Développement dinterfaces utilisateur avec un focus sur laccessibilité et le design responsive
  • Pratiques DevOps incluant la configuration denvironnement et le déploiement

Poursuivre votre parcours de développement IA

Étapes dapprentissage suivantes :

  • Explorer des modèles IA et APIs plus avancés (GPT-4, Claude, Gemini)
  • Apprendre les techniques dingénierie de prompt pour de meilleures réponses IA
  • Étudier la conception de conversation et les principes UX des chatbots
  • Sinformer sur la sécurité IA, léthique et les pratiques responsables de développement IA
  • Construire des applications plus complexes avec mémoire de conversation et conscience du contexte

Idées de projets avancés :

  • Salles de chat multi-utilisateurs avec modération IA
  • Chatbots de service client pilotés par IA
  • Assistants de tutorat éducatif personnalisés
  • Collaborateurs décriture créative avec différentes personnalités IA
  • Assistants pour la documentation technique à destination des développeurs

Démarrer avec GitHub Codespaces

Vous souhaitez tester ce projet dans un environnement de développement cloud ? GitHub Codespaces fournit un environnement complet dans votre navigateur, parfait pour expérimenter les applications IA sans nécessité dinstallation locale.

Configuration de votre environnement de développement

Étape 1 : Créer à partir du modèle

Create from template interface showing the green "Use this template" button

Étape 2 : Lancer Codespaces

  • Ouvrez votre nouveau dépôt créé
  • Cliquez sur le bouton vert "Code" et sélectionnez "Codespaces"
  • Choisissez "Create codespace on main" pour démarrer votre environnement de développement

Create codespace interface with options for launching cloud development environment

Étape 3 : Configuration de lenvironnement
Une fois votre Codespace chargé, vous aurez accès à :

  • Python, Node.js préinstallés ainsi que tous les outils de développement nécessaires
  • Interface VS Code avec des extensions pour le développement web
  • Accès au terminal pour lancer les serveurs backend et frontend
  • Redirection de port pour tester vos applications

Ce que Codespaces fournit :

  • Élimine les problèmes dinstallation et de configuration locale
  • Offre un environnement de développement cohérent sur différents appareils
  • Inclut des outils et extensions préconfigurés pour le développement web
  • Propose une intégration fluide avec GitHub pour le contrôle de version et la collaboration

🚀 Conseil pro : Codespaces est parfait pour apprendre et prototyper des applications IA car il gère automatiquement toute la configuration complexe de lenvironnement, vous permettant de vous concentrer sur la construction et lapprentissage plutôt que sur le dépannage de la configuration.


Avertissement :
Ce document a été traduit à laide du service de traduction automatique Co-op Translator. Bien que nous nous efforçons dassurer lexactitude, veuillez noter que les traductions automatiques peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue dorigine doit être considéré comme la source faisant foi. Pour les informations critiques, une traduction professionnelle réalisée par un humain est recommandée. Nous déclinons toute responsabilité en cas de malentendus ou de mauvaises interprétations résultant de lutilisation de cette traduction.