89 KiB
Construirea unui Asistent de Chat cu AI
Îți amintești în Star Trek când echipajul vorbea relaxat cu computerul navei, punându-i întrebări complexe și primind răspunsuri bine gândite? Ceea ce părea pură ficțiune științifică în anii '60 este acum ceva ce poți construi folosind tehnologiile web pe care deja le cunoști.
În această lecție, vom crea un asistent de chat AI folosind HTML, CSS, JavaScript și o integrare backend. Vei descoperi cum aceleași abilități pe care le-ai învățat pot fi conectate la servicii AI puternice care înțeleg contextul și generează răspunsuri semnificative.
Gândește-te la AI ca la accesul la o bibliotecă vastă care nu doar găsește informații, ci le sintetizează în răspunsuri coerente, adaptate întrebărilor tale specifice. În loc să cauți prin mii de pagini, primești răspunsuri directe și contextuale.
Integrarea se realizează prin tehnologii web familiare care lucrează împreună. HTML creează interfața de chat, CSS se ocupă de designul vizual, JavaScript gestionează interacțiunile utilizatorului, iar un API backend conectează totul la serviciile AI. Este similar cu modul în care diferitele secțiuni ale unei orchestre lucrează împreună pentru a crea o simfonie.
Practic, construim un pod între comunicarea umană naturală și procesarea de către mașini. Vei învăța atât implementarea tehnică a integrării serviciilor AI, cât și modelele de design care fac interacțiunile să pară intuitive.
Până la sfârșitul acestei lecții, integrarea AI va părea mai puțin un proces misterios și mai mult ca un alt API cu care poți lucra. Vei înțelege modelele fundamentale care stau la baza aplicațiilor precum ChatGPT și Claude, folosind aceleași principii de dezvoltare web pe care le-ai învățat.
Iată cum va arăta proiectul finalizat:
Înțelegerea AI: De la Mister la Măiestrie
Înainte de a trece la cod, să înțelegem cu ce lucrăm. Dacă ai folosit API-uri înainte, cunoști modelul de bază: trimiți o cerere, primești un răspuns.
API-urile AI urmează o structură similară, dar în loc să recupereze date pre-stocate dintr-o bază de date, ele generează răspunsuri noi bazate pe modele învățate din cantități uriașe de text. Gândește-te la diferența dintre un sistem de catalog al bibliotecii și un bibliotecar bine informat care poate sintetiza informații din mai multe surse.
Ce este de fapt "AI Generativă"?
Imaginează-ți cum Piatra din Rosetta le-a permis savanților să înțeleagă hieroglifele egiptene, găsind modele între limbile cunoscute și cele necunoscute. Modelele AI funcționează similar – ele găsesc modele în cantități uriașe de text pentru a înțelege cum funcționează limbajul, apoi folosesc aceste modele pentru a genera răspunsuri adecvate la întrebări noi.
Să explicăm mai simplu:
- Bază de date tradițională: Ca și cum ai cere certificatul de naștere – primești exact același document de fiecare dată.
- Motor de căutare: Ca și cum ai cere unui bibliotecar să găsească cărți despre pisici – îți arată ce este disponibil.
- AI Generativă: Ca și cum ai întreba un prieten bine informat despre pisici – îți spune lucruri interesante în cuvintele sale, adaptate la ceea ce vrei să știi.
graph LR
A[Your Question] --> B[AI Model]
B --> C[Pattern Recognition]
C --> D[Content Generation]
D --> E[Contextual Response]
F[Training Data<br/>Books, Articles, Web] --> B
Cum învață modelele AI (Versiunea Simplificată)
Modelele AI învață prin expunerea la seturi de date uriașe care conțin texte din cărți, articole și conversații. Prin acest proces, ele identifică modele în:
- Cum sunt structurate gândurile în comunicarea scrisă
- Ce cuvinte apar de obicei împreună
- Cum decurg de obicei conversațiile
- Diferențele contextuale între comunicarea formală și informală
Este similar cu modul în care arheologii descifrează limbile antice: analizează mii de exemple pentru a înțelege gramatica, vocabularul și contextul cultural, ajungând în cele din urmă să interpreteze texte noi folosind modelele învățate.
De ce Modelele GitHub?
Folosim Modelele GitHub dintr-un motiv destul de practic – ne oferă acces la AI de nivel enterprise fără să fie nevoie să configurăm propria infrastructură AI (ceea ce, crede-mă, nu vrei să faci acum!). Gândește-te la asta ca la utilizarea unui API de vreme în loc să încerci să prezici vremea singur, configurând stații meteo peste tot.
Este practic "AI-ca-Serviciu", iar partea cea mai bună? Este gratuit să începi, astfel încât să poți experimenta fără să te îngrijorezi de costuri mari.
graph LR
A[Frontend Chat UI] --> B[Your Backend API]
B --> C[GitHub Models API]
C --> D[AI Model Processing]
D --> C
C --> B
B --> A
Vom folosi Modelele GitHub pentru integrarea noastră backend, care oferă acces la capabilități AI de nivel profesional printr-o interfață prietenoasă pentru dezvoltatori. GitHub Models Playground servește ca mediu de testare unde poți experimenta cu diferite modele AI și să înțelegi capacitățile lor înainte de a le implementa în cod.
Iată ce face playground-ul atât de util:
- Testează diferite modele AI precum GPT-4o-mini, Claude și altele (toate gratuite!)
- Experimentează cu ideile și solicitările tale înainte de a scrie cod
- Obține fragmente de cod gata de utilizare în limbajul tău de programare preferat
- Ajustează setări precum nivelul de creativitate și lungimea răspunsului pentru a vedea cum afectează rezultatul
După ce ai experimentat puțin, doar apasă pe fila "Code" și alege limbajul de programare pentru a obține codul de implementare de care ai nevoie.
Configurarea Integrării Backend în Python
Acum să implementăm integrarea AI folosind Python. Python este excelent pentru aplicații AI datorită sintaxei sale simple și bibliotecilor puternice. Vom începe cu codul din playground-ul Modelelor GitHub și apoi îl vom refactoriza într-o funcție reutilizabilă, gata de producție.
Înțelegerea Implementării de Bază
Când preiei codul Python din playground, vei obține ceva care arată astfel. Nu te îngrijora dacă pare mult la început – să analizăm pas cu pas:
"""Run this model in Python
> pip install openai
"""
import os
from openai import OpenAI
# To authenticate with the model you will need to generate a personal access token (PAT) in your GitHub settings.
# Create your PAT token by following instructions here: 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"],
)
```python
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)
Ce se întâmplă în acest cod:
- Importăm instrumentele de care avem nevoie:
ospentru citirea variabilelor de mediu șiOpenAIpentru comunicarea cu AI - Configurăm clientul OpenAI pentru a indica serverele AI ale GitHub în loc de OpenAI direct
- Autentificăm folosind un token special GitHub (mai multe despre asta în curând!)
- Structurăm conversația noastră cu diferite "roluri" – gândește-te la asta ca la setarea scenei pentru o piesă de teatru
- Trimitem cererea noastră către AI cu câțiva parametri de ajustare
- Extragem textul răspunsului real din toate datele care vin înapoi
Înțelegerea Rolurilor Mesajelor: Cadrul Conversației AI
Conversațiile AI folosesc o structură specifică cu diferite "roluri" care servesc scopuri distincte:
messages=[
{
"role": "system",
"content": "You are a helpful assistant who explains things simply."
},
{
"role": "user",
"content": "What is machine learning?"
}
]
Gândește-te la asta ca la regizarea unei piese de teatru:
- Rolul sistemului: Ca indicațiile scenice pentru un actor – îi spune AI-ului cum să se comporte, ce personalitate să aibă și cum să răspundă
- Rolul utilizatorului: Întrebarea sau mesajul real de la persoana care folosește aplicația ta
- Rolul asistentului: Răspunsul AI (nu îl trimiți, dar apare în istoricul conversației)
Analogie din viața reală: Imaginează-ți că prezinți un prieten cuiva la o petrecere:
- Mesajul sistemului: "Aceasta este prietena mea Sarah, este doctor și explică excelent conceptele medicale în termeni simpli"
- Mesajul utilizatorului: "Poți să-mi explici cum funcționează vaccinurile?"
- Răspunsul asistentului: Sarah răspunde ca un doctor prietenos, nu ca un avocat sau un bucătar
Înțelegerea Parametrilor AI: Ajustarea Comportamentului Răspunsului
Parametrii numerici din apelurile API AI controlează modul în care modelul generează răspunsuri. Aceste setări îți permit să ajustezi comportamentul AI pentru diferite utilizări:
Temperatura (0.0 până la 2.0): Reglajul Creativității
Ce face: Controlează cât de creative sau previzibile vor fi răspunsurile AI.
Gândește-te la asta ca la nivelul de improvizație al unui muzician de jazz:
- Temperatura = 0.1: Cântă exact aceeași melodie de fiecare dată (foarte previzibil)
- Temperatura = 0.7: Adaugă câteva variații plăcute, dar rămâne recognoscibil (creativitate echilibrată)
- Temperatura = 1.5: Jazz experimental complet, cu întorsături neașteptate (foarte imprevizibil)
# Very predictable responses (good for factual questions)
response = client.chat.completions.create(
messages=[{"role": "user", "content": "What is 2+2?"}],
temperature=0.1 # Will almost always say "4"
)
# Creative responses (good for brainstorming)
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Write a creative story opening"}],
temperature=1.2 # Will generate unique, unexpected stories
)
Max Tokens (1 până la 4096+): Controlul Lungimii Răspunsului
Ce face: Setează o limită pentru cât de lung poate fi răspunsul AI.
Gândește-te la token-uri ca fiind aproximativ echivalente cu cuvintele (aproximativ 1 token = 0.75 cuvinte în engleză):
- max_tokens=50: Scurt și la obiect (ca un mesaj text)
- max_tokens=500: Un paragraf sau două
- max_tokens=2000: O explicație detaliată cu exemple
# Short, concise answers
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Explain JavaScript"}],
max_tokens=100 # Forces a brief explanation
)
# Detailed, comprehensive answers
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Explain JavaScript"}],
max_tokens=1500 # Allows for detailed explanations with examples
)
Top_p (0.0 până la 1.0): Parametrul de Focalizare
Ce face: Controlează cât de concentrat rămâne AI pe cele mai probabile răspunsuri.
Imaginează-ți AI-ul având un vocabular uriaș, clasificat în funcție de cât de probabil este fiecare cuvânt:
- top_p=0.1: Ia în considerare doar cele mai probabile 10% cuvinte (foarte concentrat)
- top_p=0.9: Ia în considerare 90% din cuvintele posibile (mai creativ)
- top_p=1.0: Ia în considerare totul (varietate maximă)
De exemplu: Dacă întrebi "Cerul este de obicei..."
- Top_p scăzut: Aproape sigur va spune "albastru"
- Top_p ridicat: Poate spune "albastru", "înnorat", "vast", "schimbător", "frumos" etc.
Punerea Tuturor Împreună: Combinații de Parametri pentru Diferite Utilizări
# For factual, consistent answers (like a documentation bot)
factual_params = {
"temperature": 0.2,
"max_tokens": 300,
"top_p": 0.3
}
# For creative writing assistance
creative_params = {
"temperature": 1.1,
"max_tokens": 1000,
"top_p": 0.9
}
# For conversational, helpful responses (balanced)
conversational_params = {
"temperature": 0.7,
"max_tokens": 500,
"top_p": 0.8
}
De ce contează acești parametri: Aplicațiile diferite necesită tipuri diferite de răspunsuri. Un bot de servicii pentru clienți ar trebui să fie consecvent și factual (temperatură scăzută), în timp ce un asistent de scriere creativă ar trebui să fie imaginativ și variat (temperatură ridicată). Înțelegerea acestor parametri îți oferă control asupra personalității și stilului de răspuns al AI.
**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))
Înțelegerea acestei funcții îmbunătățite:
- Acceptă doi parametri: solicitarea utilizatorului și un mesaj opțional al sistemului
- Oferă un mesaj implicit al sistemului pentru comportamentul general al asistentului
- Folosește indicii de tip Python pentru o documentare mai bună a codului
- Include o docstring detaliată care explică scopul și parametrii funcției
- Returnează doar conținutul răspunsului, făcându-l ușor de utilizat în API-ul nostru web
- Menține aceiași parametri ai modelului pentru un comportament consistent al AI
Magia Prompteurilor de Sistem: Programarea Personalității AI
Dacă parametrii controlează modul în care AI gândește, prompteurile de sistem controlează cine crede AI că este. Aceasta este, sincer, una dintre cele mai interesante părți ale lucrului cu AI – practic îi oferi AI-ului o personalitate completă, un nivel de expertiză și un stil de comunicare.
Gândește-te la prompteurile de sistem ca la alegerea diferiților actori pentru diferite roluri: În loc să ai un asistent generic, poți crea experți specializați pentru diferite situații. Ai nevoie de un profesor răbdător? Un partener creativ pentru brainstorming? Un consilier de afaceri serios? Doar schimbă prompteurul de sistem!
De ce sunt prompteurile de sistem atât de puternice
Iată partea fascinantă: Modelele AI au fost antrenate pe nenumărate conversații în care oamenii adoptă diferite roluri și niveluri de expertiză. Când îi dai AI-ului un rol specific, este ca și cum ai apăsa un buton care activează toate acele modele învățate.
Este ca actorie metodică pentru AI: Spune unui actor "ești un profesor înțelept și bătrân" și vezi cum își ajustează automat postura, vocabularul și comportamentul. AI face ceva remarcabil de similar cu modelele de limbaj.
Crearea unor Prompteurile de Sistem Eficiente: Arta și Știința
Anatomia unui prompter de sistem excelent:
- Rol/Identitate: Cine este AI-ul?
- Expertiză: Ce știe?
- Stil de comunicare: Cum vorbește?
- Instrucțiuni specifice: Pe ce ar trebui să se concentreze?
# ❌ Vague system prompt
"You are helpful."
# ✅ Detailed, effective system prompt
"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."
Exemple de Prompteurile de Sistem cu Context
Să vedem cum diferite prompteurile de sistem creează personalități AI complet diferite:
# Example 1: The Patient Teacher
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.
"""
# Example 2: The Creative Collaborator
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.
"""
# Example 3: The Strategic Business Advisor
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.
"""
Vederea Prompteurilor de Sistem în Acțiune
Să testăm aceeași întrebare cu diferite prompteurile de sistem pentru a vedea diferențele dramatice:
Întrebare: "Cum gestionez autentificarea utilizatorului în aplicația mea web?"
# With teacher prompt:
teacher_response = call_llm(
"How do I handle user authentication in my web app?",
teacher_prompt
)
# Typical response: "Great question! Let's break authentication down into simple steps.
# Think of it like a nightclub bouncer checking IDs..."
# With business prompt:
business_response = call_llm(
"How do I handle user authentication in my web app?",
business_prompt
)
# Typical response: "From a strategic perspective, authentication is crucial for user
# trust and regulatory compliance. Let me outline a framework considering security,
# user experience, and scalability..."
Tehnici Avansate pentru Prompteurile de Sistem
1. Setarea Contextului: Oferă AI-ului informații de fundal
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. Formatarea Răspunsului: Spune AI-ului cum să structureze răspunsurile
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. Setarea Constrângerilor: Definește ce NU ar trebui să facă AI-ul
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.
"""
De ce Contează Acest Lucru pentru Asistentul Tău de Chat
Înțelegerea prompteurilor de sistem îți oferă o putere incredibilă de a crea asistenți AI specializați:
- Bot de servicii pentru clienți: Util, răbdător, conștient de politici
- Tutor de învățare: Încurajator, pas cu pas, verifică înțelegerea
- Partener creativ: Imaginativ, dezvoltă idei, întreabă "ce-ar fi dacă?"
- Expert tehnic: Precis, detaliat, conștient de securitate
Ideea principală: Nu doar apelezi un API AI – creezi o personalitate AI personalizată care servește scopului tău specific. Acesta este motivul pentru care aplicațiile AI moderne par adaptate și utile, mai degrabă decât generice.
Construirea API-ului Web cu FastAPI: Hub-ul Tău de Comunicare AI de Înaltă Performanță
Acum să construim backend-ul care conectează frontend-ul tău la serviciile AI. Vom folosi FastAPI, un framework modern pentru Python care excelează în construirea API-urilor pentru aplicații AI.
FastAPI oferă mai multe avantaje pentru acest tip de proiect: suport integrat pentru gestion Iată de ce FastAPI este perfect pentru ceea ce construim:
- Async implicit: Poate gestiona mai multe cereri AI simultan fără să se blocheze
- Documentație automată: Vizitează
/docsși obține o pagină interactivă de documentație API, gratuit - Validare integrată: Identifică erorile înainte ca acestea să cauzeze probleme
- Extrem de rapid: Unul dintre cele mai rapide framework-uri Python existente
- Python modern: Utilizează toate cele mai noi și mai bune funcționalități ale Python
Și iată de ce avem nevoie de un backend:
Securitate: Cheia API pentru AI este ca o parolă – dacă o pui în JavaScript-ul frontend, oricine poate vedea codul sursă al site-ului tău și o poate fura pentru a folosi creditele tale AI. Backend-ul păstrează credențialele sensibile în siguranță.
Limitarea ratei și control: Backend-ul îți permite să controlezi cât de des utilizatorii pot face cereri, să implementezi autentificarea utilizatorilor și să adaugi loguri pentru a urmări utilizarea.
Procesarea datelor: Poți dori să salvezi conversații, să filtrezi conținutul nepotrivit sau să combini mai multe servicii AI. Backend-ul este locul unde se află această logică.
Arhitectura seamănă cu un model client-server:
- Frontend: Strat de interfață pentru interacțiune
- Backend API: Strat de procesare și rutare a cererilor
- Serviciu AI: Computație externă și generare de răspunsuri
- Variabile de mediu: Stocare sigură a configurațiilor și credențialelor
Înțelegerea fluxului cerere-răspuns
Să urmărim ce se întâmplă când un utilizator trimite un mesaj:
sequenceDiagram
participant User as 👤 User
participant Frontend as 🌐 Frontend
participant API as 🔧 FastAPI Server
participant AI as 🤖 AI Service
User->>Frontend: Types "Hello AI!"
Frontend->>API: POST /hello {"message": "Hello AI!"}
Note over API: Validates request<br/>Adds system prompt
API->>AI: Sends formatted request
AI->>API: Returns AI response
Note over API: Processes response<br/>Logs conversation
API->>Frontend: {"response": "Hello! How can I help?"}
Frontend->>User: Displays AI message
Înțelegerea fiecărui pas:
- Interacțiunea utilizatorului: Persoana tastează în interfața de chat
- Procesarea frontend-ului: JavaScript capturează input-ul și îl formatează ca JSON
- Validarea API-ului: FastAPI validează automat cererea folosind modele Pydantic
- Integrarea AI: Backend-ul adaugă context (promptul sistemului) și apelează serviciul AI
- Gestionarea răspunsului: API-ul primește răspunsul AI și îl poate modifica dacă este necesar
- Afișarea în frontend: JavaScript afișează răspunsul în interfața de chat
Înțelegerea arhitecturii API
sequenceDiagram
participant Frontend
participant FastAPI
participant AI Function
participant GitHub Models
Frontend->>FastAPI: POST /hello {"message": "Hello AI!"}
FastAPI->>AI Function: call_llm(message, system_prompt)
AI Function->>GitHub Models: API request
GitHub Models->>AI Function: AI response
AI Function->>FastAPI: response text
FastAPI->>Frontend: {"response": "Hello! How can I help?"}
Crearea aplicației FastAPI
Să construim API-ul pas cu pas. Creează un fișier numit api.py cu următorul cod FastAPI:
# api.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from llm import call_llm
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Create FastAPI application
app = FastAPI(
title="AI Chat API",
description="A high-performance API for AI-powered chat applications",
version="1.0.0"
)
# Configure CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Configure appropriately for production
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Pydantic models for request/response validation
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:
# Extract and validate 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]}...")
# Call AI service (note: call_llm should be made async for better performance)
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)
Înțelegerea implementării FastAPI:
- Importă FastAPI pentru funcționalitatea modernă a framework-ului web și Pydantic pentru validarea datelor
- Creează documentație API automată (disponibilă la
/docscând serverul rulează) - Activează middleware-ul CORS pentru a permite cererile frontend din origini diferite
- Definește modele Pydantic pentru validarea automată a cererilor/răspunsurilor și documentație
- Folosește endpoint-uri asincrone pentru performanță mai bună cu cereri concurente
- Implementează coduri de stare HTTP adecvate și gestionarea erorilor cu HTTPException
- Include logare structurată pentru monitorizare și depanare
- Oferă un endpoint de verificare a stării pentru monitorizarea serviciului
Avantaje cheie ale FastAPI față de framework-urile tradiționale:
- Validare automată: Modelele Pydantic asigură integritatea datelor înainte de procesare
- Documentație interactivă: Vizitează
/docspentru documentație API generată automat - Siguranța tipurilor: Hint-urile de tip Python previn erorile la runtime și îmbunătățesc calitatea codului
- Suport async: Gestionează mai multe cereri AI simultan fără blocare
- Performanță: Procesare semnificativ mai rapidă a cererilor pentru aplicații în timp real
Înțelegerea CORS: Gardianul de securitate al web-ului
CORS (Cross-Origin Resource Sharing) este ca un gardian de securitate la o clădire care verifică dacă vizitatorii au permisiunea să intre. Să înțelegem de ce contează și cum afectează aplicația ta.
Ce este CORS și de ce există?
Problema: Imaginează-ți dacă orice site ar putea face cereri către site-ul băncii tale în numele tău fără permisiunea ta. Ar fi un coșmar de securitate! Browserele previn acest lucru implicit prin "Politica de Origine Comună".
Politica de Origine Comună: Browserele permit doar paginilor web să facă cereri către același domeniu, port și protocol de unde au fost încărcate.
Analogie din viața reală: Este ca securitatea unei clădiri de apartamente – doar rezidenții (aceeași origine) pot accesa clădirea implicit. Dacă vrei să lași un prieten (origine diferită) să viziteze, trebuie să spui explicit securității că este în regulă.
CORS în mediul de dezvoltare
În timpul dezvoltării, frontend-ul și backend-ul rulează pe porturi diferite:
- Frontend:
http://localhost:3000(sau file:// dacă deschizi HTML direct) - Backend:
http://localhost:5000
Acestea sunt considerate "origini diferite" chiar dacă sunt pe același computer!
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI(__name__)
CORS(app) # This tells browsers: "It's okay for other origins to make requests to this API"
Ce face configurarea CORS în practică:
- Adaugă anteturi HTTP speciale la răspunsurile API care spun browserelor "această cerere cross-origin este permisă"
- Gestionează cererile "preflight" (browserele verifică uneori permisiunile înainte de a trimite cererea reală)
- Previne eroarea enervantă "blocked by CORS policy" în consola browserului tău
Securitatea CORS: Dezvoltare vs Producție
# 🚨 Development: Allows ALL origins (convenient but insecure)
CORS(app)
# ✅ Production: Only allow your specific frontend domain
CORS(app, origins=["https://yourdomain.com", "https://www.yourdomain.com"])
# 🔒 Advanced: Different origins for different environments
if app.debug: # Development mode
CORS(app, origins=["http://localhost:3000", "http://127.0.0.1:3000"])
else: # Production mode
CORS(app, origins=["https://yourdomain.com"])
De ce contează: În dezvoltare, CORS(app) este ca și cum ai lăsa ușa din față descuiată – convenabil, dar nesigur. În producție, vrei să specifici exact ce site-uri pot comunica cu API-ul tău.
Scenarii comune CORS și soluții
| Scenariu | Problemă | Soluție |
|---|---|---|
| Dezvoltare locală | Frontend-ul nu poate accesa backend-ul | Adaugă CORSMiddleware la FastAPI |
| GitHub Pages + Heroku | Frontend-ul implementat nu poate accesa API-ul | Adaugă URL-ul GitHub Pages la origini CORS |
| Domeniu personalizat | Erori CORS în producție | Actualizează origini CORS pentru a se potrivi cu domeniul tău |
| Aplicație mobilă | Aplicația nu poate accesa API-ul web | Adaugă domeniul aplicației sau folosește * cu grijă |
Sfat util: Poți verifica anteturile CORS în Instrumentele pentru Dezvoltatori ale browserului, sub fila Network. Caută anteturi precum Access-Control-Allow-Origin în răspuns.
Gestionarea erorilor și validarea
Observă cum API-ul nostru include gestionarea adecvată a erorilor:
# Validate that we received a message
if not message:
return jsonify({"error": "Message field is required"}), 400
Principii cheie de validare:
- Verifică câmpurile necesare înainte de procesarea cererilor
- Returnează mesaje de eroare semnificative în format JSON
- Folosește coduri de stare HTTP adecvate (400 pentru cereri greșite)
- Oferă feedback clar pentru a ajuta dezvoltatorii frontend să depaneze problemele
Configurarea și rularea backend-ului tău
Acum că avem integrarea AI și serverul FastAPI pregătit, să punem totul în funcțiune. Procesul de configurare implică instalarea dependențelor Python, configurarea variabilelor de mediu și pornirea serverului de dezvoltare.
Configurarea mediului Python
Să configurăm mediul tău de dezvoltare Python. Mediile virtuale sunt ca abordarea compartimentată a Proiectului Manhattan – fiecare proiect are propriul spațiu izolat cu instrumente și dependențe specifice, prevenind conflictele între proiecte diferite.
# Navigate to your backend directory
cd backend
# Create a virtual environment (like creating a clean room for your project)
python -m venv venv
# Activate it (Linux/Mac)
source ./venv/bin/activate
# On Windows, use:
# venv\Scripts\activate
# Install the good stuff
pip install openai fastapi uvicorn python-dotenv
Ce am făcut:
- Am creat propria noastră bulă Python unde putem instala pachete fără a afecta altceva
- Am activat mediul astfel încât terminalul nostru să știe să folosească acest mediu specific
- Am instalat elementele esențiale: OpenAI pentru magia AI, FastAPI pentru API-ul nostru web, Uvicorn pentru a-l rula efectiv și python-dotenv pentru gestionarea sigură a secretelor
Explicația dependențelor cheie:
- FastAPI: Framework web modern și rapid cu documentație API automată
- Uvicorn: Server ASGI extrem de rapid care rulează aplicații FastAPI
- OpenAI: Biblioteca oficială pentru modelele GitHub și integrarea API-ului OpenAI
- python-dotenv: Încărcarea sigură a variabilelor de mediu din fișierele .env
Configurarea mediului: Păstrarea secretelor în siguranță
Înainte de a porni API-ul nostru, trebuie să discutăm despre una dintre cele mai importante lecții în dezvoltarea web: cum să păstrezi secretele cu adevărat secrete. Variabilele de mediu sunt ca un seif sigur pe care doar aplicația ta îl poate accesa.
Ce sunt variabilele de mediu?
Gândește-te la variabilele de mediu ca la o cutie de valori – îți pui lucrurile valoroase acolo, și doar tu (și aplicația ta) ai cheia pentru a le accesa. În loc să scrii informații sensibile direct în codul tău (unde oricine le poate vedea), le stochezi în siguranță în mediu.
Iată diferența:
- Modul greșit: Să-ți scrii parola pe un post-it și să-l pui pe monitor
- Modul corect: Să-ți păstrezi parola într-un manager de parole sigur pe care doar tu îl poți accesa
De ce contează variabilele de mediu
# 🚨 NEVER DO THIS - API key visible to everyone
client = OpenAI(
api_key="ghp_1234567890abcdef...", # Anyone can steal this!
base_url="https://models.github.ai/inference"
)
# ✅ DO THIS - API key stored securely
client = OpenAI(
api_key=os.environ["GITHUB_TOKEN"], # Only your app can access this
base_url="https://models.github.ai/inference"
)
Ce se întâmplă când codifici greșit secretele:
- Expunere în controlul versiunilor: Oricine are acces la depozitul tău Git îți vede cheia API
- Depozite publice: Dacă încarci pe GitHub, cheia ta este vizibilă pentru întreaga lume
- Partajare în echipă: Alți dezvoltatori care lucrează la proiectul tău obțin acces la cheia ta API personală
- Breșe de securitate: Dacă cineva îți fură cheia API, poate folosi creditele tale AI
Configurarea fișierului de mediu
Creează un fișier .env în directorul backend. Acest fișier stochează secretele tale local:
# .env file - This should NEVER be committed to Git
GITHUB_TOKEN=your_github_personal_access_token_here
FASTAPI_DEBUG=True
ENVIRONMENT=development
Înțelegerea fișierului .env:
- Un secret pe linie în formatul
CHEIE=valoare - Fără spații în jurul semnului egal
- Fără ghilimele necesare în jurul valorilor (de obicei)
- Comentariile încep cu
#
Crearea tokenului personal de acces GitHub
Tokenul tău GitHub este ca o parolă specială care oferă aplicației tale permisiunea de a utiliza serviciile AI ale GitHub:
Pași pentru crearea tokenului:
- Accesează Setările GitHub → Setări pentru dezvoltatori → Tokenuri de acces personal → Tokenuri (clasice)
- Click pe "Generate new token (classic)"
- Setează expirarea (30 de zile pentru testare, mai mult pentru producție)
- Selectează permisiunile: Bifează "repo" și orice alte permisiuni necesare
- Generează tokenul și copiază-l imediat (nu-l poți vedea din nou!)
- Lipește-l în fișierul tău .env
# Example of what your token looks like (this is fake!)
GITHUB_TOKEN=ghp_1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R
Încărcarea variabilelor de mediu în Python
import os
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
# Now you can access them securely
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 face acest cod:
- Încarcă fișierul .env și face variabilele disponibile pentru Python
- Verifică dacă tokenul necesar există (gestionare bună a erorilor!)
- Ridică o eroare clară dacă lipsește tokenul
- Folosește tokenul în siguranță fără a-l expune în cod
Securitatea Git: Fișierul .gitignore
Fișierul .gitignore spune Git-ului ce fișiere să nu urmărească sau să încarce:
# .gitignore - Add these lines
.env
*.env
.env.local
.env.production
__pycache__/
venv/
.vscode/
De ce este crucial: Odată ce adaugi .env la .gitignore, Git va ignora fișierul de mediu, prevenind încărcarea accidentală a secretelor tale pe GitHub.
Medii diferite, secrete diferite
Aplicațiile profesionale folosesc chei API diferite pentru medii diferite:
# .env.development
GITHUB_TOKEN=your_development_token
DEBUG=True
# .env.production
GITHUB_TOKEN=your_production_token
DEBUG=False
De ce contează: Nu vrei ca experimentele tale de dezvoltare să afecteze cota de utilizare AI din producție și vrei niveluri diferite de securitate pentru medii diferite.
Pornirea serverului de dezvoltare: Dă viață FastAPI-ului tău
Acum vine momentul entuziasmant – pornirea serverului de dezvoltare FastAPI și observarea integrării AI în acțiune! FastAPI folosește Uvicorn, un server ASGI extrem de rapid, special conceput pentru aplicații Python asincrone.
Înțelegerea procesului de pornire a serverului FastAPI
# Method 1: Direct Python execution (includes auto-reload)
python api.py
# Method 2: Using Uvicorn directly (more control)
uvicorn api:app --host 0.0.0.0 --port 5000 --reload
Când rulezi această comandă, iată ce se întâmplă în culise:
1. Python încarcă aplicația ta FastAPI:
- Importă toate bibliotecile necesare (FastAPI, Pydantic, OpenAI etc.)
- Încarcă variabilele de mediu din fișierul
.env - Creează instanța aplicației FastAPI cu documentație automată
2. Uvicorn configurează serverul ASGI:
- Se conectează la portul 5000 cu capacități de gestionare asincronă a cererilor
- Configurează rutarea cererilor cu validare automată
- Activează reîncărcarea automată pentru dezvoltare (repornire la modificarea fișierelor)
- Generează documentație API interactivă
3. Serverul începe să asculte:
- Terminalul tău afișează:
INFO: Uvicorn running on http://0.0.0.0:5000 - Serverul poate gestiona mai multe cereri AI simultan
- API-ul tău este gata cu documentație automată la
http://localhost:5000/docs
Ce ar trebui să vezi când totul funcționează
$ 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.
Înțelegerea output-ului FastAPI:
- Va monitoriza schimbările: Reîncărcare automată activată pentru dezvoltare
- Uvicorn rulează: Serverul ASGI de înaltă performanță este activ
- Procesul de reîncărcare pornit: Monitorizarea fișierelor pentru reporniri automate
- Pornirea aplicației completă: Aplicația FastAPI a fost inițializată cu succes
- Documentație interactivă disponibilă: Vizitează
/docspentru documentație API generată automat
Testarea FastAPI: Mai multe abordări puternice
FastAPI oferă mai multe moduri convenabile de a testa API-ul, inclusiv documentația interactivă automată:
Metoda 1: Documentație API interactivă (Recomandată)
- Deschide browserul și accesează
http://localhost:5000/docs - Vei vedea Swagger UI cu toate endpoint-urile tale documentate
- Click pe
/hello→ "Try it out" → Introdu un mesaj de test → "Execute" - Vezi răspunsul direct în browser cu formatare corespunzătoare
Metoda 2: Test de bază în browser
- Accesează
http://localhost:5000pentru endpoint-ul principal - Accesează
http://localhost:5000/healthpentru a verifica starea serverului - Acest lucru confirmă că serverul FastAPI funcționează corect
Metoda 2: Test din linia de comandă (Avansat)
# Test with curl (if available)
curl -X POST http://localhost:5000/hello \
-H "Content-Type: application/json" \
-d '{"message": "Hello AI!"}'
# Expected response:
# {"response": "Hello! I'm your AI assistant. How can I help you today?"}
**Metoda
# test_api.py - Create this file to test your API
import requests
import json
# Test the API endpoint
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)
Depanarea problemelor comune la pornire
| Mesaj de eroare | Ce înseamnă | Cum să rezolvi |
|---|---|---|
ModuleNotFoundError: No module named 'fastapi' |
FastAPI nu este instalat | Rulează pip install fastapi uvicorn în mediul tău virtual |
ModuleNotFoundError: No module named 'uvicorn' |
Serverul ASGI nu este instalat | Rulează pip install uvicorn în mediul tău virtual |
KeyError: 'GITHUB_TOKEN' |
Variabila de mediu nu a fost găsită | Verifică fișierul .env și apelul load_dotenv() |
Address already in use |
Portul 5000 este ocupat | Oprește alte procese care folosesc portul 5000 sau schimbă portul |
ValidationError |
Datele cererii nu corespund modelului Pydantic | Verifică dacă formatul cererii corespunde cu schema așteptată |
HTTPException 422 |
Entitate imposibil de procesat | Validarea cererii a eșuat, verifică /docs pentru formatul corect |
OpenAI API error |
Autentificarea serviciului AI a eșuat | Verifică dacă token-ul GitHub este corect și are permisiunile necesare |
Cele mai bune practici în dezvoltare
Reîncărcare automată: FastAPI împreună cu Uvicorn oferă reîncărcare automată atunci când salvezi modificările în fișierele Python. Acest lucru îți permite să modifici codul și să testezi imediat fără a reporni manual.
# Enable hot reloading explicitly
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True) # debug=True enables hot reload
Jurnalizare pentru dezvoltare: Adaugă jurnalizare pentru a înțelege ce se întâmplă:
import logging
# Set up logging
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
De ce ajută jurnalizarea: În timpul dezvoltării, poți vedea exact ce cereri sunt primite, ce răspunsuri oferă AI-ul și unde apar erorile. Acest lucru face ca depanarea să fie mult mai rapidă.
Configurarea pentru GitHub Codespaces: Dezvoltare în cloud simplificată
GitHub Codespaces este ca și cum ai avea un computer puternic de dezvoltare în cloud, pe care îl poți accesa din orice browser. Dacă lucrezi în Codespaces, există câțiva pași suplimentari pentru a face backend-ul accesibil frontend-ului.
Înțelegerea rețelei Codespaces
Într-un mediu de dezvoltare local, totul rulează pe același computer:
- Backend:
http://localhost:5000 - Frontend:
http://localhost:3000(sau file://)
În Codespaces, mediul tău de dezvoltare rulează pe serverele GitHub, astfel încât "localhost" are un alt sens. GitHub creează automat URL-uri publice pentru serviciile tale, dar trebuie să le configurezi corect.
Configurarea pas cu pas a Codespaces
1. Pornește serverul backend:
cd backend
python api.py
Vei vedea mesajul familiar de pornire FastAPI/Uvicorn, dar observă că rulează în mediul Codespace.
2. Configurează vizibilitatea portului:
- Caută fila "Ports" în panoul de jos al VS Code
- Găsește portul 5000 în listă
- Click dreapta pe portul 5000
- Selectează "Port Visibility" → "Public"
De ce să-l faci public? În mod implicit, porturile Codespace sunt private (accesibile doar pentru tine). Făcându-l public, frontend-ul tău (care rulează în browser) poate comunica cu backend-ul.
3. Obține URL-ul public: După ce faci portul public, vei vedea un URL de genul:
https://your-codespace-name-5000.app.github.dev
4. Actualizează configurația frontend-ului:
// In your frontend app.js, update the BASE_URL:
this.BASE_URL = "https://your-codespace-name-5000.app.github.dev";
Înțelegerea URL-urilor Codespace
URL-urile Codespace urmează un model previzibil:
https://[codespace-name]-[port].app.github.dev
Explicație:
codespace-name: Un identificator unic pentru Codespace-ul tău (de obicei include numele tău de utilizator)port: Numărul portului pe care rulează serviciul tău (5000 pentru aplicația noastră FastAPI)app.github.dev: Domeniul GitHub pentru aplicațiile Codespace
Testarea configurării Codespace
1. Testează direct backend-ul: Deschide URL-ul public într-o filă nouă de browser. Ar trebui să vezi:
Welcome to the AI Chat API. Send POST requests to /hello with JSON payload containing 'message' field.
2. Testează cu instrumentele de dezvoltare ale browserului:
// Open browser console and test your 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 Dezvoltare locală
| Aspect | Dezvoltare locală | GitHub Codespaces |
|---|---|---|
| Timp de configurare | Mai lung (instalare Python, dependențe) | Instant (mediu preconfigurat) |
| Acces la URL | http://localhost:5000 |
https://xyz-5000.app.github.dev |
| Configurare porturi | Automată | Manuală (fă porturile publice) |
| Persistența fișierelor | Pe computerul local | În depozitul GitHub |
| Colaborare | Dificil de partajat mediul | Ușor de partajat link-ul Codespace |
| Dependență de internet | Doar pentru apelurile API AI | Necesară pentru tot |
Sfaturi pentru dezvoltarea în Codespaces
Variabile de mediu în Codespaces:
Fișierul .env funcționează la fel în Codespaces, dar poți seta variabile de mediu direct în Codespace:
# Set environment variable for the current session
export GITHUB_TOKEN="your_token_here"
# Or add to your .bashrc for persistence
echo 'export GITHUB_TOKEN="your_token_here"' >> ~/.bashrc
Gestionarea porturilor:
- Codespaces detectează automat când aplicația ta începe să asculte pe un port
- Poți redirecționa mai multe porturi simultan (util dacă adaugi o bază de date mai târziu)
- Porturile rămân accesibile cât timp Codespace-ul tău este activ
Fluxul de lucru în dezvoltare:
- Fă modificări de cod în VS Code
- FastAPI se reîncarcă automat (datorită modului de reîncărcare al Uvicorn)
- Testează modificările imediat prin URL-ul public
- Commit și push când ești gata
💡 Sfat util: Salvează URL-ul backend-ului Codespace în timpul dezvoltării. Deoarece numele Codespace-ului sunt stabile, URL-ul nu se va schimba cât timp folosești același Codespace.
Crearea interfeței de chat pentru frontend: Unde oamenii întâlnesc AI-ul
Acum vom construi interfața utilizatorului – partea care determină modul în care oamenii interacționează cu asistentul tău AI. La fel ca designul interfeței originale a iPhone-ului, ne concentrăm pe a face tehnologia complexă să pară intuitivă și ușor de utilizat.
Înțelegerea arhitecturii moderne de frontend
Interfața noastră de chat va fi ceea ce numim o "Aplicație cu o singură pagină" sau SPA. Spre deosebire de abordarea tradițională, unde fiecare clic încarcă o pagină nouă, aplicația noastră se actualizează fluid și instantaneu:
Site-uri vechi: Ca și cum ai citi o carte fizică – întorci pagini complet noi Aplicația noastră de chat: Ca și cum ai folosi telefonul – totul curge și se actualizează fără întreruperi
graph TD
A[User Types Message] --> B[JavaScript Captures Input]
B --> C[Validate & Format Data]
C --> D[Send to Backend API]
D --> E[Display Loading State]
E --> F[Receive AI Response]
F --> G[Update Chat Interface]
G --> H[Ready for Next Message]
Cele trei piloni ai dezvoltării frontend
Fiecare aplicație frontend – de la site-uri simple la aplicații complexe precum Discord sau Slack – este construită pe trei tehnologii de bază. Gândește-te la ele ca la fundația a tot ceea ce vezi și cu care interacționezi pe web:
HTML (Structură): Aceasta este fundația ta
- Decide ce elemente există (butoane, zone de text, containere)
- Oferă sens conținutului (acesta este un antet, acesta este un formular etc.)
- Creează structura de bază pe care se construiește totul
CSS (Prezentare): Acesta este designerul tău de interior
- Face totul să arate frumos (culori, fonturi, layout-uri)
- Se ocupă de diferite dimensiuni ale ecranului (telefon vs laptop vs tabletă)
- Creează animații fluide și feedback vizual
JavaScript (Comportament): Acesta este creierul tău
- Răspunde la ceea ce fac utilizatorii (clicuri, tastare, derulare)
- Comunică cu backend-ul și actualizează pagina
- Face totul interactiv și dinamic
Gândește-te la asta ca la designul arhitectural:
- HTML: Planul structural (definirea spațiilor și relațiilor)
- CSS: Designul estetic și ambiental (stil vizual și experiență utilizator)
- JavaScript: Sistemele mecanice (funcționalitate și interactivitate)
De ce contează arhitectura modernă JavaScript
Aplicația noastră de chat va folosi modele moderne JavaScript pe care le vei întâlni în aplicațiile profesionale. Înțelegerea acestor concepte te va ajuta să te dezvolți ca programator:
Arhitectură bazată pe clase: Vom organiza codul nostru în clase, ceea ce este ca și cum am crea planuri pentru obiecte Async/Await: Mod modern de a gestiona operațiunile care necesită timp (cum ar fi apelurile API) Programare bazată pe evenimente: Aplicația noastră răspunde la acțiunile utilizatorului (clicuri, apăsări de taste) în loc să ruleze într-un ciclu Manipularea DOM: Actualizarea dinamică a conținutului paginii web pe baza interacțiunilor utilizatorului și răspunsurilor API
Configurarea structurii proiectului
Creează un director pentru frontend cu această structură organizată:
frontend/
├── index.html # Main HTML structure
├── app.js # JavaScript functionality
└── styles.css # Visual styling
Înțelegerea arhitecturii:
- Separă preocupările între structură (HTML), comportament (JavaScript) și prezentare (CSS)
- Menține o structură simplă a fișierelor, ușor de navigat și modificat
- Urmează cele mai bune practici de dezvoltare web pentru organizare și întreținere
Construirea fundației HTML: Structură semantică pentru accesibilitate
Să începem cu structura HTML. Dezvoltarea web modernă pune accent pe "HTML semantic" – utilizarea elementelor HTML care descriu clar scopul lor, nu doar aspectul. Acest lucru face ca aplicația ta să fie accesibilă cititoarelor de ecran, motoarelor de căutare și altor instrumente.
De ce contează HTML-ul semantic: Imaginează-ți că descrii aplicația ta de chat cuiva la telefon. Ai spune "există un antet cu titlul, o zonă principală unde apar conversațiile și un formular în partea de jos pentru a scrie mesaje." HTML-ul semantic folosește elemente care se potrivesc cu această descriere naturală.
Creează index.html cu acest marcaj structurat cu grijă:
<!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>
Înțelegerea fiecărui element HTML și scopul său:
Structura documentului
<!DOCTYPE html>: Spune browserului că acesta este HTML5 modern<html lang="en">: Specifică limba paginii pentru cititoarele de ecran și instrumentele de traducere<meta charset="UTF-8">: Asigură codificarea corectă a caracterelor pentru textul internațional<meta name="viewport"...>: Face pagina receptivă pentru mobil prin controlul zoom-ului și scalei
Elemente semantice
<header>: Identifică clar secțiunea de sus cu titlul și descrierea<main>: Desemnează zona principală de conținut (unde au loc conversațiile)<form>: Corect din punct de vedere semantic pentru introducerea utilizatorului, permite navigarea corectă cu tastatura
Funcții de accesibilitate
role="log": Spune cititoarelor de ecran că această zonă conține un jurnal cronologic al mesajeloraria-live="polite": Anunță mesajele noi cititoarelor de ecran fără a întrerupearia-label: Oferă etichete descriptive pentru controalele formularuluirequired: Browserul validează că utilizatorii introduc un mesaj înainte de a-l trimite
Integrarea CSS și JavaScript
- Atributele
class: Oferă puncte de ancorare pentru stilizare în CSS (de exemplu,chat-container,input-group) - Atributele
id: Permit JavaScript să găsească și să manipuleze elemente specifice - Plasarea scriptului: Fișierul JavaScript este încărcat la final, astfel încât HTML-ul să se încarce mai întâi
De ce funcționează această structură:
- Flux logic: Antet → Conținut principal → Formular de introducere corespunde ordinii naturale de citire
- Accesibil cu tastatura: Utilizatorii pot naviga prin toate elementele interactive
- Prietenos pentru cititoarele de ecran: Repere clare și descrieri pentru utilizatorii cu deficiențe de vedere
- Receptiv pentru mobil: Meta tag-ul viewport permite designul receptiv
- Îmbunătățire progresivă: Funcționează chiar dacă CSS sau JavaScript nu se încarcă
Adăugarea JavaScript interactiv: Logica aplicației web moderne
Acum să construim JavaScript-ul care aduce interfața de chat la viață. Vom folosi modele moderne JavaScript pe care le vei întâlni în dezvoltarea web profesională, inclusiv clase ES6, async/await și programare bazată pe evenimente.
Înțelegerea arhitecturii moderne JavaScript
În loc să scriem cod procedural (o serie de funcții care rulează în ordine), vom crea o arhitectură bazată pe clase. Gândește-te la o clasă ca la un plan pentru crearea obiectelor – cum ar fi cum un plan de arhitect poate fi folosit pentru a construi mai multe case.
De ce să folosești clase pentru aplicațiile web?
- Organizare: Toată funcționalitatea legată este grupată împreună
- Reutilizabilitate: Ai putea crea mai multe instanțe de chat pe aceeași pagină
- Ușor de întreținut: Mai simplu de depanat și modificat funcții specifice
- Standard profesional: Acest model este utilizat în framework-uri precum React, Vue și Angular
Creează app.js cu acest JavaScript modern, bine structurat:
// app.js - Modern chat application logic
class ChatApp {
constructor() {
// Get references to DOM elements we'll need to manipulate
this.messages = document.getElementById("messages");
this.form = document.getElementById("chatForm");
this.input = document.getElementById("messageInput");
this.sendButton = document.getElementById("sendBtn");
// Configure your backend URL here
this.BASE_URL = "http://localhost:5000"; // Update this for your environment
this.API_ENDPOINT = `${this.BASE_URL}/hello`;
// Set up event listeners when the chat app is created
this.initializeEventListeners();
}
initializeEventListeners() {
// Listen for form submission (when user clicks Send or presses Enter)
this.form.addEventListener("submit", (e) => this.handleSubmit(e));
// Also listen for Enter key in the input field (better UX)
this.input.addEventListener("keypress", (e) => {
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault();
this.handleSubmit(e);
}
});
}
async handleSubmit(event) {
event.preventDefault(); // Prevent form from refreshing the page
const messageText = this.input.value.trim();
if (!messageText) return; // Don't send empty messages
// Provide user feedback that something is happening
this.setLoading(true);
// Add user message to chat immediately (optimistic UI)
this.appendMessage(messageText, "user");
// Clear input field so user can type next message
this.input.value = '';
try {
// Call the AI API and wait for response
const reply = await this.callAPI(messageText);
// Add AI response to 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 {
// Re-enable the interface regardless of success or failure
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";
}
}
// Initialize the chat application when the page loads
document.addEventListener("DOMContentLoaded", () => {
new ChatApp();
});
Înțelegerea fiecărui concept JavaScript
Structura clasei ES6:
class ChatApp {
constructor() {
// This runs when you create a new ChatApp instance
// It's like the "setup" function for your chat
}
methodName() {
// Methods are functions that belong to the class
// They can access class properties using "this"
}
}
Modelul Async/Await:
// Old way (callback hell):
fetch(url)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
// Modern way (async/await):
try {
const response = await fetch(url);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
Programare bazată pe evenimente: În loc să verificăm constant dacă s-a întâmplat ceva, "ascultăm" evenimentele:
// When form is submitted, run handleSubmit
this.form.addEventListener("submit", (e) => this.handleSubmit(e));
// When Enter key is pressed, also run handleSubmit
this.input.addEventListener("keypress", (e) => { /* ... */ });
Manipularea DOM:
// Create new elements
const messageElement = document.createElement("div");
// Modify their properties
messageElement.className = "message user";
messageElement.innerHTML = "Hello world!";
// Add to the page
this.messages.appendChild(messageElement);
Securitate și cele mai bune practici
Prevenirea XSS:
escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text; // This automatically escapes HTML
return div.innerHTML;
}
De ce contează: Dacă un utilizator tastează <script>alert('hack')</script>, această funcție asigură că se afișează ca text, nu se execută ca cod.
Gestionarea erorilor:
try {
const reply = await this.callAPI(messageText);
this.appendMessage(reply, "assistant");
} catch (error) {
// Show user-friendly error instead of breaking the app
this.appendMessage("Sorry, I'm having trouble...", "error");
}
Considerații pentru experiența utilizatorului:
- UI optimist: Adaugă mesajul utilizatorului imediat, fără să aștepți răspunsul serverului
- Stări de încărcare: Dezactivează butoanele și afișează "Se trimite..." în timpul așteptării
- Derulare automată: Păstrează cele mai noi mesaje vizibile
- Validarea introducerii: Nu trimite mesaje goale
- Scurtături de tastatură: Tasta Enter trimite mesaje (ca în aplicațiile reale de chat)
Înțelegerea fluxului aplicației
- Pagina se încarcă → Evenimentul
DOMContentLoadedse declanșează → Se creeazănew ChatApp() - Constructorul rulează → Obține referințe la elementele DOM → Configurează ascultătorii de evenimente
- Utilizatorul tastează un mesaj → Apasă Enter sau face clic pe Trimite → Rulează
handleSubmit - handleSubmit → Validează introducerea → Afișează starea de încărcare → Apelează API-ul
- API-ul răspunde → Adaugă mesajul AI în chat → Reactivează interfața
- Pregătit pentru următorul mesaj → Utilizatorul poate continua conversația Această arhitectură este scalabilă – poți adăuga cu ușurință funcții precum editarea mesajelor, încărcarea fișierelor sau mai multe fire de conversație fără a rescrie structura de bază.
Stilizarea interfeței de chat
Acum să creăm o interfață de chat modernă și atrăgătoare vizual folosind CSS. O stilizare bună face ca aplicația ta să pară profesională și îmbunătățește experiența generală a utilizatorului. Vom folosi funcții moderne CSS precum Flexbox, CSS Grid și proprietăți personalizate pentru un design receptiv și accesibil.
Creează fișierul styles.css cu aceste stiluri cuprinzătoare:
/* 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;
}
}
Înțelegerea arhitecturii CSS:
- Folosește proprietăți personalizate CSS (variabile) pentru o tematică consistentă și o întreținere ușoară
- Implementează layout-ul Flexbox pentru un design receptiv și o aliniere corespunzătoare
- Include animații fluide pentru apariția mesajelor fără a fi deranjante
- Oferă o distincție vizuală între mesajele utilizatorului, răspunsurile AI și stările de eroare
- Suportă design receptiv care funcționează atât pe dispozitive desktop, cât și pe cele mobile
- Ia în considerare accesibilitatea cu preferințe de mișcare redusă și rapoarte de contrast corespunzătoare
- Oferă suport pentru modul întunecat bazat pe preferințele sistemului utilizatorului
Configurarea URL-ului backend
Ultimul pas este actualizarea BASE_URL în JavaScript pentru a se potrivi cu serverul tău backend:
// For local development
this.BASE_URL = "http://localhost:5000";
// For GitHub Codespaces (replace with your actual URL)
this.BASE_URL = "https://your-codespace-name-5000.app.github.dev";
Determinarea URL-ului backend:
- Dezvoltare locală: Folosește
http://localhost:5000dacă rulezi atât frontend-ul, cât și backend-ul local - Codespaces: Găsește URL-ul backend-ului în fila Ports după ce faci portul 5000 public
- Producție: Înlocuiește cu domeniul tău real atunci când implementezi pe un serviciu de găzduire
💡 Sfat pentru testare: Poți testa direct backend-ul vizitând URL-ul rădăcină în browserul tău. Ar trebui să vezi mesajul de bun venit de la serverul FastAPI.
Testare și implementare
Acum că ai construit componentele frontend și backend, să testăm dacă totul funcționează împreună și să explorăm opțiunile de implementare pentru a împărtăși asistentul de chat cu alții.
Flux de testare locală
Urmează acești pași pentru a testa aplicația completă:
graph TD
A[Start Backend Server] --> B[Configure Environment Variables]
B --> C[Test API Endpoints]
C --> D[Open Frontend in Browser]
D --> E[Test Chat Functionality]
E --> F[Debug Any Issues]
Proces de testare pas cu pas:
-
Pornește serverul backend:
cd backend source venv/bin/activate # or venv\Scripts\activate on Windows python api.py -
Verifică dacă API-ul funcționează:
- Deschide
http://localhost:5000în browserul tău - Ar trebui să vezi mesajul de bun venit de la serverul FastAPI
- Deschide
-
Deschide frontend-ul:
- Navighează la directorul frontend
- Deschide
index.htmlîn browserul tău web - Sau folosește extensia Live Server din VS Code pentru o experiență mai bună de dezvoltare
-
Testează funcționalitatea chat-ului:
- Scrie un mesaj în câmpul de introducere
- Apasă "Trimite" sau Enter
- Verifică dacă AI-ul răspunde corespunzător
- Verifică consola browserului pentru eventuale erori JavaScript
Rezolvarea problemelor comune
| Problemă | Simptome | Soluție |
|---|---|---|
| Eroare CORS | Frontend-ul nu poate accesa backend-ul | Asigură-te că FastAPI CORSMiddleware este configurat corect |
| Eroare cheie API | Răspunsuri 401 Unauthorized | Verifică variabila de mediu GITHUB_TOKEN |
| Conexiune refuzată | Erori de rețea în frontend | Verifică URL-ul backend și că serverul Flask rulează |
| Fără răspuns AI | Răspunsuri goale sau eronate | Verifică jurnalele backend pentru probleme de cotă API sau autentificare |
Pași comuni de depanare:
- Verifică consola instrumentelor de dezvoltare ale browserului pentru erori JavaScript
- Confirmă că fila Network arată cereri și răspunsuri API reușite
- Revizuiește ieșirea terminalului backend pentru erori Python sau probleme API
- Asigură-te că variabilele de mediu sunt încărcate și accesibile corect
Provocarea Agentului GitHub Copilot 🚀
Folosește modul Agent pentru a finaliza următoarea provocare:
Descriere: Îmbunătățește asistentul de chat prin adăugarea istoricului conversațiilor și a persistenței mesajelor. Această provocare te va ajuta să înțelegi cum să gestionezi starea în aplicațiile de chat și să implementezi stocarea datelor pentru o experiență mai bună a utilizatorului.
Sarcină: Modifică aplicația de chat pentru a include istoricul conversațiilor care persistă între sesiuni. Adaugă funcționalitatea de a salva mesajele de chat în stocarea locală, afișează istoricul conversațiilor când pagina se încarcă și include un buton "Șterge Istoricul". De asemenea, implementează indicatori de tastare și marcaje temporale pentru mesaje pentru a face experiența de chat mai realistă.
Află mai multe despre modul agent aici.
Temă: Construiește-ți propriul asistent AI personal
Acum vei crea propria implementare a asistentului AI. În loc să reproduci pur și simplu codul tutorialului, aceasta este o oportunitate de a aplica conceptele în timp ce construiești ceva care reflectă propriile tale interese și cazuri de utilizare.
Cerințele proiectului
Să configurăm proiectul tău cu o structură curată și organizată:
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
Sarcini de implementare de bază
Dezvoltare backend:
- Preia codul nostru FastAPI și personalizează-l
- Creează o personalitate unică pentru AI – poate un asistent util pentru gătit, un partener creativ de scriere sau un coleg de studiu?
- Adaugă gestionarea solidă a erorilor pentru ca aplicația ta să nu se blocheze în caz de probleme
- Scrie documentație clară pentru oricine dorește să înțeleagă cum funcționează API-ul tău
Dezvoltare frontend:
- Construiește o interfață de chat intuitivă și primitoare
- Scrie JavaScript modern și curat, de care să fii mândru să-l arăți altor dezvoltatori
- Proiectează un stil personalizat care reflectă personalitatea AI-ului tău – distractiv și colorat? Curat și minimalist? Alegerea îți aparține!
- Asigură-te că funcționează excelent atât pe telefoane, cât și pe computere
Cerințe de personalizare:
- Alege un nume și o personalitate unică pentru asistentul tău AI – poate ceva care reflectă interesele tale sau problemele pe care vrei să le rezolvi
- Personalizează designul vizual pentru a se potrivi cu atmosfera asistentului tău
- Scrie un mesaj de bun venit captivant care să îi facă pe oameni să înceapă să converseze
- Testează asistentul tău cu diferite tipuri de întrebări pentru a vedea cum răspunde
Idei de îmbunătățire (opțional)
Vrei să duci proiectul tău la nivelul următor? Iată câteva idei interesante de explorat:
| Funcție | Descriere | Abilități pe care le vei exersa |
|---|---|---|
| Istoricul mesajelor | Amintește-ți conversațiile chiar și după reîmprospătarea paginii | Lucrul cu localStorage, manipularea JSON |
| Indicatori de tastare | Afișează "AI tastează..." în timp ce aștepți răspunsuri | Animații CSS, programare asincronă |
| Marcaje temporale pentru mesaje | Afișează momentul în care a fost trimis fiecare mesaj | Formatarea datei/timpului, design UX |
| Exportul conversației | Permite utilizatorilor să descarce conversația lor | Manipularea fișierelor, exportul datelor |
| Comutarea temei | Comutare între modurile lumină/întuneric | Variabile CSS, preferințele utilizatorului |
| Intrare vocală | Adaugă funcționalitate de recunoaștere vocală | API-uri web, accesibilitate |
Testare și documentare
Asigurarea calității:
- Testează aplicația cu diferite tipuri de intrări și cazuri limită
- Verifică designul receptiv pe diferite dimensiuni de ecran
- Verifică accesibilitatea cu navigarea prin tastatură și cititoare de ecran
- Validează HTML și CSS pentru conformitatea cu standardele
Cerințe de documentare:
- Scrie un README.md care explică proiectul și cum să-l rulezi
- Include capturi de ecran ale interfeței de chat în acțiune
- Documentează orice funcții unice sau personalizări pe care le-ai adăugat
- Oferă instrucțiuni clare de configurare pentru alți dezvoltatori
Ghid de trimitere
Livrabilele proiectului:
- Folderul complet al proiectului cu tot codul sursă
- README.md cu descrierea proiectului și instrucțiuni de configurare
- Capturi de ecran care demonstrează asistentul de chat în acțiune
- O scurtă reflecție asupra a ceea ce ai învățat și a provocărilor întâmpinate
Criterii de evaluare:
- Funcționalitate: Funcționează asistentul de chat conform așteptărilor?
- Calitatea codului: Este codul bine organizat, comentat și ușor de întreținut?
- Design: Este interfața vizual atrăgătoare și ușor de utilizat?
- Creativitate: Cât de unic și personalizat este proiectul tău?
- Documentare: Sunt instrucțiunile de configurare clare și complete?
💡 Sfat pentru succes: Începe cu cerințele de bază, apoi adaugă îmbunătățiri odată ce totul funcționează. Concentrează-te pe crearea unei experiențe de bază bine finisate înainte de a adăuga funcții avansate.
Soluție
Provocări bonus
Ești pregătit să duci asistentul tău AI la nivelul următor? Încearcă aceste provocări avansate care îți vor aprofunda înțelegerea integrării AI și dezvoltării web.
Personalizarea personalității
Magia reală se întâmplă atunci când oferi asistentului tău AI o personalitate unică. Experimentează cu diferite solicitări de sistem pentru a crea asistenți specializați:
Exemplu de asistent profesional:
call_llm(message, "You are a professional business consultant with 20 years of experience. Provide structured, actionable advice with specific steps and considerations.")
Exemplu de ajutor pentru scriere creativă:
call_llm(message, "You are an enthusiastic creative writing coach. Help users develop their storytelling skills with imaginative prompts and constructive feedback.")
Exemplu de mentor tehnic:
call_llm(message, "You are a patient senior developer who explains complex programming concepts using simple analogies and practical examples.")
Îmbunătățiri frontend
Transformă interfața ta de chat cu aceste îmbunătățiri vizuale și funcționale:
Funcții avansate CSS:
- Implementează animații și tranziții fluide pentru mesaje
- Adaugă designuri personalizate pentru bulele de chat cu forme și degradeuri CSS
- Creează o animație pentru indicatorul de tastare atunci când AI-ul "gândește"
- Proiectează reacții emoji sau sistem de evaluare a mesajelor
Îmbunătățiri JavaScript:
- Adaugă scurtături de tastatură (Ctrl+Enter pentru trimitere, Escape pentru ștergerea câmpului de introducere)
- Implementează funcționalitatea de căutare și filtrare a mesajelor
- Creează funcția de export al conversației (descărcare ca text sau JSON)
- Adaugă salvare automată în localStorage pentru a preveni pierderea mesajelor
Integrare avansată AI
Personalități multiple AI:
- Creează un meniu derulant pentru a comuta între diferite personalități AI
- Salvează personalitatea preferată a utilizatorului în localStorage
- Implementează schimbarea contextului care menține fluxul conversației
Funcții inteligente de răspuns:
- Adaugă conștientizarea contextului conversației (AI-ul își amintește mesajele anterioare)
- Implementează sugestii inteligente bazate pe subiectul conversației
- Creează butoane de răspuns rapid pentru întrebări frecvente
🎯 Obiectiv de învățare: Aceste provocări bonus te ajută să înțelegi modele avansate de dezvoltare web și tehnici de integrare AI utilizate în aplicațiile de producție.
Rezumat și pași următori
Felicitări! Ai construit cu succes un asistent de chat complet, bazat pe AI, de la zero. Acest proiect ți-a oferit experiență practică cu tehnologiile moderne de dezvoltare web și integrarea AI – abilități din ce în ce mai valoroase în peisajul tehnologic actual.
Ce ai realizat
Pe parcursul acestei lecții, ai stăpânit mai multe tehnologii și concepte cheie:
Dezvoltare backend:
- Integrat cu GitHub Models API pentru funcționalitatea AI
- Construit un API RESTful folosind Flask cu gestionare corespunzătoare a erorilor
- Implementat autentificare sigură folosind variabile de mediu
- Configurat CORS pentru cereri cross-origin între frontend și backend
Dezvoltare frontend:
- Creat o interfață de chat receptivă folosind HTML semantic
- Implementat JavaScript modern cu async/await și arhitectură bazată pe clase
- Proiectat o interfață utilizator captivantă cu CSS Grid, Flexbox și animații
- Adăugat funcții de accesibilitate și principii de design receptiv
Integrare full-stack:
- Conectat frontend-ul și backend-ul prin apeluri API HTTP
- Gestionat interacțiuni în timp real ale utilizatorilor și flux de date asincron
- Implementat gestionarea erorilor și feedback-ul utilizatorului în întreaga aplicație
- Testat fluxul complet al aplicației de la introducerea utilizatorului la răspunsul AI
Rezultate cheie ale învățării
mindmap
root((AI Chat App Skills))
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
Acest proiect ți-a oferit o introducere în fundamentele construirii aplicațiilor bazate pe AI, care reprezintă viitorul dezvoltării web. Acum înțelegi cum să integrezi capabilitățile AI în aplicațiile web tradiționale, creând experiențe utilizator captivante care par inteligente și receptive.
Aplicații profesionale
Abilitățile pe care le-ai dezvoltat în această lecție sunt direct aplicabile în carierele moderne de dezvoltare software:
- Dezvoltare web full-stack folosind framework-uri și API-uri moderne
- Integrare AI în aplicații web și mobile
- Design și dezvoltare API pentru arhitecturi microservicii
- Dezvoltare interfețe utilizator cu accent pe accesibilitate și design receptiv
- Practici DevOps inclusiv configurarea mediului și implementarea
Continuarea călătoriei tale de dezvoltare AI
Pași următori în învățare:
- Explorează modele AI mai avansate și API-uri (GPT-4, Claude, Gemini)
- Învață despre tehnici de inginerie a solicitărilor pentru răspunsuri AI mai bune
- Studiază designul conversațiilor și principiile experienței utilizatorului chatbot
- Investighează siguranța AI, etica și practicile responsabile de dezvoltare AI
- Construiește aplicații mai complexe cu memorie conversațională și conștientizare a contextului
Idei de proiecte avansate:
- Camere de chat multi-utilizator cu moderare AI
- Chatbot-uri AI pentru servicii de relații cu clienții
- Asistenți educ
- Redirecționarea porturilor pentru testarea aplicațiilor tale
Ce oferă Codespaces:
- Elimină problemele de configurare și setare a mediului local
- Oferă un mediu de dezvoltare consistent pe diferite dispozitive
- Include instrumente și extensii preconfigurate pentru dezvoltarea web
- Asigură integrare fără probleme cu GitHub pentru controlul versiunilor și colaborare
🚀 Sfat util: Codespaces este ideal pentru învățarea și prototiparea aplicațiilor AI, deoarece gestionează automat toate setările complexe ale mediului, permițându-ți să te concentrezi pe construcție și învățare, în loc de rezolvarea problemelor de configurare.
Declinare de responsabilitate:
Acest document a fost tradus folosind serviciul de traducere AI Co-op Translator. Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru neînțelegerile sau interpretările greșite care pot apărea din utilizarea acestei traduceri.


