Dan 2/28: Razumevanje AI API-ja - kako mašine razgovaraju
Vreme potrebno: 60 – 120 minuta
Gde je Učitelj Vasa danas?
Učitelj Vasa može da pozdravi korisnike i predstavi se kroz konzolni program. Ima svoj dom na GitHub-u sa profesionalnom strukturom projekta i prve Python funkcije koje rade. Ali još uvek nema pravu inteligenciju – može samo da ispisuje unapred definisane poruke. Danas ćemo razumeti kako da spojimo Vasu sa pravim AI mozgom kroz API pozive.
Cilj današnje lekcije
Danas ćeš razumeti šta su API-ji, kako funkcioniše AI servisi poput OpenAI-ja, i pripremiće te da sutra povežeš Učitelja Vasu sa pravom veštačkom inteligencijom. Nakon ove lekcije, znaćeš kako mašine komuniciraju preko interneta i kako AI kompanije omogućavaju pristup svojim modelima.
Predznanja
- Kreiran i funkcionalan main.py i vasa_core.py (Dan 1)
- Razumevanje osnovnih Python funkcija
- Osnovno razumevanje kako internet funkcioniše
- PyCharm projekat “ucitelj-vasa” otvoren i spreman
Glavni sadržaj
API – kako programi razgovaraju između sebe
Pre nego što Učitelj Vasa postane inteligentan, moramo razumeti kako će naš Python kod komunicirati sa AI servisima. To se radi kroz nešto što se zove API.
📚 NIVO 1 – Osnovno objašnjenje
API (Application Programming Interface) je kao restoran sa dostavom. Zamisli:
- Ti si kod kuće (tvoj Python program)
- Restoran ima hranu (AI servis ima inteligenciju)
- Telefon/aplikacija za naručivanje je API
Kada pozoveš restoran i naručiš pizzu, ne moraš znati kako se pravi – samo kažeš šta želiš, a oni ti dostave gotov proizvod. Isto je sa AI API-jem: tvoj program pošalje pitanje, a AI servis vrati odgovor.
🚀 NIVO 2 – Dublje razumevanje
API je skup pravila i protokola koji omogućava različitim softverskim aplikacijama da komuniciraju. U kontekstu web API-ja (što koriste AI servisi), komunikacija se odvija preko HTTP protokola. Tvoj program šalje HTTP zahtev (request) sa podacima u JSON formatu, a server vraća HTTP odgovor (response) takođe u JSON formatu. Ova standardizacija omogućava da bilo koji programski jezik može da koristi isti API.
🔍 UVID: API-ji predstavljaju apstrakciju. Oni sakrivaju kompleksnu logiku servera iza jednostavnog “ugovora”. Za Učitelja Vasu, to znači da ne moramo da brinemo o tome kako GPT-4 radi, na kom hardveru se izvršava, ili kako se ažurira. Mi samo poštujemo “ugovor” (endpoint, format poruke). Ovo je ključni princip modernog softverskog inženjeringa: fokusiraj se na svoju logiku (ponašanje Vase) i koristi druge servise kao “crne kutije” za kompleksne zadatke.
💡 PRO TIP: Kada testiraš REST API ručno, koristi Postman ili VS Code REST klijent. Vizuelno vidiš tačan HTTP zahtev i odgovor, pa ćeš kasnije u Python-u lakše razumeti gde si pogrešio ako dobiješ status 401 ili 429. Zamisli ih kao “rendgenski snimak” razgovora između tvog koda i OpenAI-ja – vidiš glavu (zaglavlja), telo (body) i puls (status code).
🎈 ZABAVNA ČINJENICA: Prvi javno dokumentovani web API bio je Salesforce-ov SOAP endpoint 2000. godine; danas postoje deseci miliona javnih API-ja – svojevrsni “digitalni nervni sistem” Interneta.
Kako AI kompanije dele svoju inteligenciju
Velike AI kompanije kao OpenAI, Anthropic (Claude) i Google (Gemini) ulažu milijarde dolara u treniranje AI modela. Ali kako ti, običan programer, možeš da koristiš tu tehnologiju?
📚 NIVO 1 – Osnovno objašnjenje
Treniranje AI modela je kao treniranje olimpijskog sportiste – treba godine rada, najbolji treneri (naučnici) i ogromni troškovi. OpenAI je istrenirao GPT modele, ali ne možeš (i ne treba) da skineš ceo model na svoj računar – bio bi ogroman i spor.
Umesto toga, OpenAI drži model na svojim super-računarima i omogućava ti da mu postavljaš pitanja preko interneta. Ti platiš samo za ono što koristiš – kao taksi služba za AI.
🚀 NIVO 2 – Dublje razumevanje
AI modeli kao GPT-4 imaju stotine milijardi parametara i zahtevaju specijalizovan hardver (GPU klastere) za izvršavanje. API model omogućava:
- Ekonomiju razmere – jedan model opslužuje milione korisnika
- Konstantna unapređenja – model se ažurira bez promene tvog koda
- Skalabilnost – automatski se prilagođava broju zahteva
- Bezbednost – model ostaje zaštićen od kopiranja
🔍 UVID: Model “API kao proizvod” koji koriste AI kompanije je primer ekonomije platformi. OpenAI, Google i Anthropic nisu samo prodavci AI odgovora; oni su prodavci infrastrukture. Tvoj API ključ je doslovno ključ za pristup toj višemilionskoj infrastrukturi. Razmišljaj o tome kao o plaćanju struje – ne gradiš svoju elektranu, već plaćaš po potrošenom kilovatu. Ovde plaćaš po potrošenom “tokenu” (jedinici inteligencije).
💡 PRO TIP: Kada budeš birao između različitih AI API servisa, gledaj ne samo cenu po tokenu, već i “rate limits” (koliko zahteva možeš poslati po minuti), dostupnost modela u tvojoj regiji, i kvalitet dokumentacije. OpenAI ima odličnu dokumentaciju što ga čini idealnim za učenje.
📊 DIJAGRAM: Arhitektura AI API servisa
TVOJ RAČUNAR INTERNET OPENAI SERVERI
┌─────────────┐ ┌─────────────────┐
│ Python kod │ │ │
│ (Učitelj │ HTTP Request │ GPT-4 Model │
│ Vasa) │ ─────────────> "Objasni gravitaciju" │ (175B params) │
│ │ │ │
│ │ HTTP Response │ GPU Klasteri │
│ │ <───────────── "Gravitacija je sila..." │ │
└─────────────┘ └─────────────────┘
│ │
└── Plaćaš: $0.01 └── Troši: $1000/h
za 1000 tokena električne energije
🎈 ZABAVNA ČINJENICA: OpenAI-jeva prva komercijalna verzija modela (GPT-3 iz 2020.) imala je mesečni “čekanje u redu”. Danas se novi GPT modeli lansiraju istog dana kada su istrenirani, što pokazuje koliko je DevOps kultura u AI-ju napredovala.
JSON – univerzalni jezik API komunikacije
Pre nego što naučimo kako konkretno razgovarati sa OpenAI API-jem, moramo razumeti format podataka koji se koristi.
📚 NIVO 1 – Osnovno objašnjenje
JSON (JavaScript Object Notation) je način zapisivanja podataka koji mogu da razumeju svi programski jezici. Zamisli ga kao univerzalni obrazac koji svi razumeju.
Primer JSON podataka:
{
"ime": "Petar",
"godine": 25,
"grad": "Beograd",
"programer": true
}
Vidiš kako liči na Python dictionary? To nije slučajnost – JSON je dizajniran da bude jednostavan i čitljiv.
🚀 NIVO 2 – Dublje razumevanje
JSON je postao de facto standard za razmenu podataka između web servisa zbog svoje jednostavnosti i podrške u svim programskim jezicima. Python ima ugrađen json modul koji automatski konvertuje između Python objekata i JSON stringa. Ključne karakteristike:
- Podržava osnovne tipove: string, broj, boolean, null, array, object
- Ne podržava komentare (za razliku od Python koda)
- Ključevi moraju biti u dvostrukim navodnicima
- UTF-8 enkodiranje po defaultu
💡 PRO TIP: U Python-u JSON pretvaraš u dict pomoću response.json(). Ako dobiješ TypeError: string indices must be integers, verovatno si već pozvao .json() a zatim opet json.loads(). Seti se pravila – jednom dekodirano je već dict!
⚡ SAVET ZA OPTIMIZACIJU: Zašto JSON, a ne neki drugi format kao XML? Za početnike, ključna razlika je u efikasnosti. JSON je znatno “lakši” od XML-a, što znači da generiše manje teksta za iste podatke. Manje teksta = brži prenos preko interneta i brže parsiranje (pretvaranje teksta u objekat koji kod može da koristi). U svetu API-ja gde se dešavaju milioni poziva, ova ušteda od nekoliko milisekundi po pozivu postaje ogromna na nivou celog sistema.
🎈 ZABAVNA ČINJENICA: JSON je nastao 2001. godine kao jednostavnija alternativa XML-u. Njegovo ime sugeriše vezu sa JavaScript-om, ali danas ga koriste svi jezici. Čak i NASA koristi JSON za razmenu podataka sa svemirskim brodovima!
Anatomija OpenAI API poziva
Hajde da vidimo kako izgleda komunikacija sa OpenAI API-jem, korak po korak.
📚 NIVO 1 – Osnovno objašnjenje
Razgovor sa OpenAI API-jem ima tri koraka:
- Pripremi pitanje – kao kada pišeš SMS
- Pošalji i čekaj – kao kada čekaš odgovor
- Pročitaj odgovor – AI ti je odgovorio!
Evo kako bi to izgledalo (sutra ćemo ovo stvarno kodirati):
# PSEUDO KOD - ne pokreći još!
poruka = "Objasni mi šta je gravitacija"
odgovor = pozovi_openai(poruka)
print(odgovor) # "Gravitacija je prirodna sila..."
🚀 NIVO 2 – Dublje razumevanje
OpenAI API koristi RESTful arhitekturu sa sledećim komponentama:
Endpoint:
https://api.openai.com/v1/chat/completionsMetod: POST
Headers:
- Authorization: Bearer YOUR_API_KEY
- Content-Type: application/json
Body (JSON):
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "Objasni gravitaciju"}
],
"temperature": 0.7
}
🔍 UVID: Parametar temperature kontroliše kreativnost odgovora. Vrednost 0 daje najkonzistentniji odgovor (dobro za faktičke informacije), dok 1.0 omogućava maksimalnu kreativnost (dobro za priče). Za Učitelja Vasu ćemo koristiti 0.7 – balans između tačnosti i prirodnog razgovora.
💡 PRO TIP: Često zaboravljeni parametar max_tokens štiti te od iznenadnih troškova. Postavi ga na maksimalnu veličinu odgovora koju korisnik zaista treba. Kao da taksimetru kažeš “vozi me najviše 10 km”, pa ne može da te odvede u drugi grad.
🌐 GOOGLE KONEKCIJA: Struktura OpenAI API poziva koju učiš je skoro identična onoj koju koristi Google Gemini API. Kada kasnije u kursu (Dan 16) budemo dodavali Gemini, videćeš iste principe: endpoint, POST metod, JSON telo poruke i autorizacioni ključ. Google Colab, popularno okruženje za AI eksperimentisanje, ima ugrađene alate za lako postavljanje API ključeva, čineći testiranje ovih poziva još jednostavnijim i sigurnijim.
🎈 ZABAVNA ČINJENICA: temperature je preuzet iz teorije termodinamike – što je “toplije”, to su rešenja entropičnija (kreativnija).
Sistem uloga u ChatGPT API-ju
OpenAI-jev chat API ima poseban način organizovanja razgovora kroz “uloge”.
📚 NIVO 1 – Osnovno objašnjenje
Zamisli pozorišnu predstavu sa tri uloge:
- System: Režiser koji daje uputstva glumcu (AI-ju)
- User: Ti, gledalac koji postavlja pitanja
- Assistant: AI glumac koji odgovara
Na primer:
- System: “Ti si ljubazni učitelj matematike”
- User: “Koliko je 2+2?”
- Assistant: “2+2 je 4! Odličo pitanje za početak učenja sabiranja.”
🚀 NIVO 2 – Dublje razumevanje
Uloge omogućavaju finiju kontrolu AI ponašanja:
{
"messages": [
{
"role": "system",
"content": "Ti si Učitelj Vasa, ljubazni AI asistent koji pomaže početnicima da nauče programiranje. Uvek si strpljiv i ohrabrujuć."
},
{
"role": "user",
"content": "Ne razumem šta su promenljive"
},
{
"role": "assistant",
"content": "Nema problema! Promenljive su kao kutije sa nazivom..."
}
]
}
System poruka se tipično postavlja jednom i definiše “ličnost” asistenta kroz ceo razgovor.
📊 DIJAGRAM: Hijerarhija uloga u konverzaciji
[Konverzacija]
│
┌─────────┴─────────┐
│ │
[System poruka] [Lista poruka]
(Definiše AI (Tok razgovora)
ličnost) │
├─ [User]: "Pitanje 1"
├─ [Assistant]: "Odgovor 1"
├─ [User]: "Pitanje 2"
└─ [Assistant]: "Odgovor 2"
🔍 UVID: System poruka deluje kao “ustav” za celu konverzaciju. Ona postavlja temeljna pravila koja AI prati. Lista poruka (User/Assistant) predstavlja “istoriju” razgovora. Kada pošaljete novi API zahtev, šaljete celu istoriju kako bi AI imao kontekst. Zato duži razgovori troše više tokena – jer svaki put šaljete sve prethodne poruke.
💡 PRO TIP: Kombinuj više system poruka za kompleksno ponašanje, na primer: prvo definiši stil (“budi strpljiv nastavnik”), zatim pravila (“ne odaj rešenja domaćih zadataka”). Redosled poruka je važan – poslovično “ko prvi, njegova smernica”.
🎈 ZABAVNA ČINJENICA: U istraživanjima iz 2024. pokazalo se da dodavanje meta system poruke “razmišljaj naglas” povećava tačnost rešavanja logičkih zadataka i do 17%.
Praktična implementacija
Simulacija API poziva
Iako još nećemo instalirati prave biblioteke, hajde da simuliramo kako će Učitelj Vasa komunicirati sa AI-jem. U src folder, kreiraj novi fajl ai_simulator.py:
📊 DIJAGRAM: Tok izvršavanja demonstriraj_api_komunikaciju
[Start]
│
v
[Prikaz zaglavlja]
│
v
[Definisanje poruke: "Objasni promenljive..."]
│
v
[Poziv `prikazi_api_strukturu(poruka)`]
│ └──> [Kreiranje JSON strukture] ──> [Return Dict]
v
[Štampanje JSON strukture]
│
v
[Poziv `simuliraj_ai_odgovor(poruka)`]
│ └──> [Kašnjenje: 0.5-2.0s] ──> [Odabir odgovora] ──> [Return String]
v
[Štampanje AI odgovora]
│
v
[Prikaz objašnjenja "ŠTA SE DESILO"]
│
v
[End]
"""
Simulator AI API poziva
Ovaj modul simulira AI odgovore dok ne dobijemo pravi API ključ.
"""
import json
import random
import time
from typing import Dict, List
def simuliraj_ai_odgovor(poruka: str) -> str:
"""
Simulira AI odgovor sa random kašnjenjem.
U stvarnom API pozivu, ovo bi slalo zahtev OpenAI serveru.
"""
# Simuliraj network kašnjenje
vreme_odgovora = random.uniform(0.5, 2.0)
print(f"🤔 Razmišljam... (simulacija {vreme_odgovora:.1f}s kašnjenja)")
time.sleep(vreme_odgovora)
# Simulirani odgovori za različite tipove pitanja
odgovori = {
"pozdrav": [
"Zdravo! Kako mogu da ti pomognem danas sa učenjem programiranja?",
"Pozdrav! Spreman sam da ti pomognem da savladaš Python!",
"Hej! Drago mi je što si tu. Šta te zanima danas?"
],
"python": [
"Python je odličan izbor za početnike! Hajde da učimo korak po korak.",
"Python sintaksa je vrlo čitljiva. Pokazaću ti na primerima.",
"Divno pitanje o Python-u! Evo objašnjenja..."
],
"default": [
"Interesantno pitanje! Hajde da ga istražimo zajedno.",
"Dobro pitanje! Evo kako bih ja to objasnio...",
"Hmm, hajde da razmislimo o tome korak po korak."
]
}
# Jednostavna logika za izbor odgovora
poruka_lower = poruka.lower()
if any(rec in poruka_lower for rec in ["zdravo", "pozdrav", "hej", "ćao"]):
kategorija = "pozdrav"
elif "python" in poruka_lower or "programir" in poruka_lower:
kategorija = "python"
else:
kategorija = "default"
return random.choice(odgovori[kategorija])
def prikazi_api_strukturu(poruka: str) -> Dict:
"""
Prikazuje kako bi izgledao pravi API poziv.
Ovo je edukativno - pokazuje strukturu koju ćemo koristiti.
"""
api_struktura = {
"url": "https://api.openai.com/v1/chat/completions",
"method": "POST",
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE",
"Content-Type": "application/json"
},
"body": {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "Ti si Učitelj Vasa, AI asistent za učenje programiranja."
},
{
"role": "user",
"content": poruka
}
],
"temperature": 0.7,
"max_tokens": 150
}
}
return api_struktura
def demonstriraj_api_komunikaciju():
"""Demonstrira kako će izgledati komunikacija sa pravim API-jem."""
print("\n" + "="*60)
print("🎓 DEMONSTRACIJA API KOMUNIKACIJE")
print("="*60)
# Korisnikov unos
test_poruka = "Objasni mi šta su promenljive u Python-u"
print(f"\n📤 TVOJE PITANJE: {test_poruka}")
# Prikaz API strukture
print("\n📋 STRUKTURA API POZIVA:")
api_data = prikazi_api_strukturu(test_poruka)
print(json.dumps(api_data, indent=2, ensure_ascii=False))
# Simulirani odgovor
print("\n⏳ SLANJE ZAHTEVA...")
odgovor = simuliraj_ai_odgovor(test_poruka)
print(f"\n📥 AI ODGOVOR: {odgovor}")
# Objašnjenje
print("\n💡 ŠTA SE DESILO:")
print("1. Pripremili smo pitanje u JSON formatu")
print("2. Dodali smo API ključ u header (za autentifikaciju)")
print("3. Poslali POST zahtev na OpenAI endpoint")
print("4. Sačekali odgovor (simulirano kašnjenje)")
print("5. Primili i prikazali AI odgovor")
print("\n⚠️ Napomena: Ovo je simulacija. Sutra ćemo koristiti pravi API!")
if __name__ == "__main__":
demonstriraj_api_komunikaciju()
🎯 ALTERNATIVNO REŠENJE: Umesto ručne kategorizacije u ai_simulator.py, možeš koristiti mapu funkcija radi lakšeg dodavanja novih tema:
def odg_pozdrav():
return random.choice([
"Zdravo! Kako mogu da ti pomognem danas sa učenjem programiranja?",
"Pozdrav! Spreman sam da ti pomognem da savladaš Python!",
"Hej! Drago mi je što si tu. Šta te zanima danas?"
])
def odg_python():
return random.choice([
"Python je odličan izbor za početnike! Hajde da učimo korak po korak.",
"Python sintaksa je vrlo čitljiva. Pokazaću ti na primerima.",
"Divno pitanje o Python-u! Evo objašnjenja..."
])
def odg_default():
return random.choice([
"Interesantno pitanje! Hajde da ga istražimo zajedno.",
"Dobro pitanje! Evo kako bih ja to objasnio...",
"Hmm, hajde da razmislimo o tome korak po korak."
])
KATEGORIJE: dict[str, Callable[[], str]] = {
"pozdrav": odg_pozdrav,
"python": odg_python,
"git": odg_git, # Lako dodaš novu funkciju
}
def simuliraj_ai_odgovor(poruka: str) -> str:
kljuc = next((k for k in KATEGORIJE if k in poruka.lower()), "default")
return KATEGORIJE.get(kljuc, odg_default)()
Lakše je održavati – samo dodaš novu funkciju i ključ u mapu.
⚡ SAVET ZA OPTIMIZACIJU: Funkcija time.sleep() u našem simulatoru zaustavlja izvršavanje celog programa. Ovo se zove “blokirajući” poziv. U stvarnom svetu, dok čekamo odgovor od OpenAI servera, naš program ne radi ništa korisno. Napredniji pristup (koji ćemo učiti na Danu 18) je asinhroni poziv. On omogućava programu da radi druge stvari dok čeka odgovor, što je ključno za aplikacije koje opslužuju više korisnika istovremeno.
Ažuriranje main.py sa API simulacijom
Ažuriraj main.py da koristi novi simulator:
"""
Glavni program za Učitelja Vasu
Ovo je ulazna tačka za pokretanje AI asistenta.
"""
from vasa_core import pozdrav, predstavi_se, glavni_meni
from ai_simulator import simuliraj_ai_odgovor, demonstriraj_api_komunikaciju
def pokreni_vasu():
"""Pokreće glavnu petlju programa Učitelj Vasa."""
print("\n" + "🎓" * 25)
print(pozdrav())
print("🎓" * 25 + "\n")
# Glavna petlja programa
while True:
print("\nŠta želiš da uradiš?")
print("1. Pozdravi me")
print("2. Predstavi se")
print("3. Postavi pitanje AI-ju (simulacija)")
print("4. Vidi kako API funkcioniše")
print("5. Izađi")
print("\nTvoj izbor: ", end="")
izbor = input().strip()
if izbor == "1":
print("\n" + pozdrav() + "\n")
elif izbor == "2":
print("\n" + predstavi_se() + "\n")
elif izbor == "3":
print("\n💬 Postavi mi bilo koje pitanje o programiranju:")
pitanje = input().strip()
if pitanje:
odgovor = simuliraj_ai_odgovor(pitanje)
print(f"\n🤖 Učitelj Vasa: {odgovor}")
else:
print("\n❌ Nisi uneo pitanje.")
elif izbor == "4":
demonstriraj_api_komunikaciju()
elif izbor == "5":
print("\nHvala što si koristio Učitelja Vasu! Vidimo se! 👋")
break
else:
print("\n❌ Nepoznata opcija. Pokušaj ponovo.\n")
print("\nProgram završen.")
if __name__ == "__main__":
pokreni_vasu()
🔄 VEŽBA:
- Dodaj kategoriju “git” koja prepoznaje reči “commit”, “branch” ili “merge” i vraća tri prijateljska saveta za rad sa Git-om.
- Implementiraj brojač koliko puta je svaka kategorija pozvana i prikaži statistiku pre izlaska iz programa.
Razumevanje API ključeva
Kreiraj novi fajl api_key_info.py u src folderu:
"""
Informacije o API ključevima
Edukativni modul koji objašnjava važnost sigurnog čuvanja API ključeva.
"""
def objasni_api_kljuc():
"""Objašnjava šta je API ključ i zašto je važan."""
objasnjenje = """
🔑 ŠTA JE API KLJUČ?
==================
API ključ je kao lozinka za korišćenje AI servisa.
Kada sutra dobijemo OpenAI API ključ, on će izgledati ovako:
sk-proj-abcd1234wxyz5678...
⚠️ VAŽNA PRAVILA:
1. NIKAD ne stavljaj API ključ direktno u kod:
❌ LOŠE: api_key = "sk-proj-tvoj-pravi-kljuc"
✅ DOBRO: api_key = os.getenv("OPENAI_API_KEY")
2. NIKAD ne commit-uj API ključ na GitHub:
- Koristi .env fajl (već je u .gitignore)
- Čuvaj ključ lokalno
3. API ključ = NOVAC:
- Svaki API poziv košta
- Neko ko ima tvoj ključ može da troši tvoj novac
- OpenAI naplaćuje po broju tokena (reči)
4. Ako ključ procuri:
- Odmah ga deaktiviraj na OpenAI dashboard-u
- Generiši novi ključ
- Ažuriraj .env fajl
💡 CENE (okvirno):
- GPT-3.5: ~$0.001 za 1000 tokena (≈750 reči)
- GPT-4: ~$0.03 za 1000 tokena (30x skuplje!)
- Prosečan razgovor: 500-2000 tokena
📊 PRIMER TROŠKA:
Ako Učitelj Vasa odgovori na 100 pitanja dnevno:
- Sa GPT-3.5: ~$0.10-0.20 dnevno
- Sa GPT-4: ~$3-6 dnevno
Zato ćemo početi sa GPT-3.5! 😊
"""
return objasnjenje
def pripremi_env_fajl():
"""Prikazuje kako će izgledati .env fajl sutra."""
env_sadrzaj = """
# Ovako će izgledati tvoj .env fajl od sutra:
# OpenAI API ključ (dobićeš ga na https://platform.openai.com)
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxx
# Opciono: Koji model da koristi Vasa
OPENAI_MODEL=gpt-3.5-turbo
# Opciono: Maksimalan broj tokena po odgovoru
MAX_TOKENS=150
# NAPOMENA: Zameni xxxx sa pravim ključem!
"""
return env_sadrzaj
if __name__ == "__main__":
print(objasni_api_kljuc())
print("\n" + "="*60)
print(pripremi_env_fajl())
💡 PRO TIP: Kada radiš sa API ključevima, koristi “environment variables” ne samo zbog sigurnosti, već i zbog fleksibilnosti. Možeš imati različite ključeve za razvoj i produkciju, ili lako promeniti ključ bez menjanja koda.
Česte greške i rešenja
❌ GREŠKA: JSONDecodeError kada pokušavam da parsiram API odgovor
💡 REŠENJE: Proveri da li je odgovor stvarno JSON. Ponekad API vraća grešku u plain text formatu. Uvek koristi try/except blok oko json.loads()
🔬 DETALJNIJE: API servisi mogu vratiti različite formate odgovora u zavisnosti od situacije. Uspešan odgovor je obično JSON, ali greške mogu biti:
- 429 Too Many Requests: Plain text ili HTML koji kaže da si premašio limit
- 500 Server Error: HTML stranica sa greškom
- 401 Unauthorized: JSON sa porukom o nevalidnom ključu
Profesionalni kod UVEK proverava status kod pre parsiranja:
if response.status_code == 200:
data = response.json() # Sigurno je JSON
else:
print(f"Greška {response.status_code}: {response.text}")
❌ GREŠKA: API pozivi su spori
💡 REŠENJE: To je normalno! AI modeli su kompleksni. GPT-3.5 obično odgovara za 1-3 sekunde. Dodaj loading indikator da korisnik zna da se nešto dešava
❌ GREŠKA: “Rate limit exceeded”
💡 REŠENJE: Previše zahteva u kratkom vremenu. Besplatni nalozi imaju ograničenja (npr. 3 zahteva po minuti). Dodaj time.sleep() između poziva
❌ GREŠKA: Dobijam čudne simbole umesto ćirilice
💡 REŠENJE: Koristi ensure_ascii=False kada radiš sa json.dumps(). API podržava UTF-8, ali Python ponekad pokušava da escape non-ASCII karaktere
❌ GREŠKA: Ne razumem razliku između sinhronih i asinhronih poziva
💡 REŠENJE: Za sada ne brini! Koristićemo sinhrona pozive (program čeka odgovor). Asinhroni pozivi su napredna tema za Dan 18
Proveri svoje razumevanje
[NIVO 1]:
- Objasni svojim rečima šta je API?
- Zašto ne možemo jednostavno skinuti GPT model na naš računar?
- Šta je JSON i zašto ga koriste svi API servisi?
[NIVO 2]:
- Koja je razlika između system, user i assistant uloga u ChatGPT API-ju?
- Zašto je važno čuvati API ključ u .env fajlu umesto u kodu?
- Kako bi dizajnirao sistem koji kešira česte odgovore da smanji troškove?
🤔 MINI-KVIZ:
Šta bi se dogodilo da zaboraviš
Authorizationheader u OpenAI pozivu?- Odgovor: Dobio bi HTTP 401 Unauthorized grešku
Ako podesiš
temperature=1.2, kako to utiče na stabilnost odgovora i cenu?- Odgovor: Odgovori postaju veoma kreativni ali i nepredvidivi; cena ostaje ista (plaćaš po tokenima)
Navedi dva razloga zašto je
response.status_codevažan pre parsiranja JSON-a.- Odgovor: (1) Greške često nisu JSON format, (2) Omogućava različito rukovanje različitim tipovima grešaka
Dodatni primeri i zabavne vežbe
- Kreiraj “ping” skriptu koja šalje test poruku “ping” svakih 30 sekundi i meri prosečno vreme odgovora simulatora.
- Pretvori JSON u tabelu: parsiraj telo API zahteva i prikaži svaki ključ-vrednost par u koloni Key / Value da vežbaš rad sa pandas.
- Eksperimentiši s entropijom: pokreni pet zahteva sa
temperature0, 0.5 i 1 i uporedi koliko se odgovori razlikuju pomoću Levenshtein rastojanja.
Ažuriranje dokumentacije
Ažuriraj README.md:
## 🚀 Trenutni Status
- ✅ Dan -3: Python 3.13+ instaliran
- ✅ Dan -2: PyCharm unified edition podešen
- ✅ Dan -1: GitHub repository kreiran
- ✅ Dan 0: Profesionalna struktura projekta
- ✅ Dan 1: Prvi Python moduli - Vasa može da pozdravi!
- ✅ Dan 2: Razumevanje AI API-ja - simulacija komunikacije
- ⏳ Dan 3: Dobijanje pravog API ključa (sutra)
Dodaj u docs/development_log.md:
## Dan 2: Razumevanje AI API-ja (15.06.2025)
### Šta je urađeno:
- ✅ Kreiran ai_simulator.py za demonstraciju API koncepta
- ✅ Implementirana simulacija AI odgovora sa kašnjenjem
- ✅ Dodata demonstracija API strukture (JSON format)
- ✅ Kreiran api_key_info.py sa sigurnosnim uputstvima
- ✅ Ažuriran main.py sa novim opcijama
### Naučene lekcije:
- API omogućava programima da komuniciraju preko interneta
- JSON je univerzalni format za razmenu podataka
- AI servisi koriste role-based sistem za kontrolu ponašanja
- API ključevi su kao lozinke i moraju se čuvati sigurno
### Problemi i rešenja:
- **Problem**: Kako objasniti API bez stvarnog poziva?
- **Rešenje**: Kreirana simulacija koja pokazuje strukturu i kašnjenje
### Za sutra (Dan 3):
- Registracija na OpenAI platform.openai.com
- Dobijanje pravog API ključa
- Čuvanje ključa u .env fajl
Git commit za danas
git add .
git commit -m "Dan 2: Dodata simulacija API komunikacije i edukativni moduli"
git push
Odličan napredak! Učitelj Vasa sada razume kako će komunicirati sa pravim AI servisima! 🚀 Videli smo strukturu API poziva, razumeli JSON format i važnost sigurnog čuvanja API ključeva.
Sutra Učitelj Vasa uči
Sutra je veliki dan – dobićeš pravi OpenAI API ključ! Naučićeš kako da se registruješ na platform.openai.com, kako da bezebedno sačuvaš API ključ u .env fajl, i kako da ga učitaš u Python kod. Ovo je poslednji korak pre nego što Učitelj Vasa dobije pravu veštačku inteligenciju!
📚 REČNIK DANAŠNJE LEKCIJE:
- API (Application Programming Interface): Skup pravila koja omogućavaju programima da komuniciraju, kao univerzalni jezik između aplikacija
- JSON (JavaScript Object Notation): Standardni format za razmenu podataka između programa, čitljiv i ljudima i mašinama
- HTTP Request/Response: Način kako pregledač ili program traži i prima podatke sa servera
- Endpoint: Specifična adresa (URL) na koju šaljemo API zahteve
- Token: Jedinica teksta u AI modelima, obično 3-4 karaktera ili kratka reč
- API Key: Tajna šifra koja identifikuje i autorizuje tvoju aplikaciju za korišćenje servisa
- Rate Limiting: Ograničenje broja API poziva u određenom vremenskom periodu