AI Asistent Učitelj Vasa: Praktična obuka za početnike (32 dana)

Dan 3: Dobijanje i čuvanje API ključa - OpenAI ili Gemini

Vreme potrebno: 60 – 120 minuta

Gde je Učitelj Vasa danas?

Učitelj Vasa razume kako AI servisi funkcionišu, ima simulaciju koja pokazuje strukturu API poziva i zna važnost sigurnog čuvanja API ključeva. Postavio je temelje za komunikaciju sa AI-jem kroz demonstracije i edukativne module. Danas je veliki dan – dobićemo pravi API ključ (OpenAI ili Gemini) koji će omogućiti Vasi da postane stvarno inteligentan!

Cilj današnje lekcije

Danas ćeš se registrovati na AI platformi po svom izboru (OpenAI ili Google Gemini), dobiti svoj prvi API ključ i naučiti kako da ga bezbedno sačuvaš i učitaš u Python kod. Nakon ove lekcije, imaćeš sve potrebno da sutra povežeš Učitelja Vasu sa pravom veštačkom inteligencijom.

Predznanja

  • Razumevanje šta su API-ji i kako funkcionišu (Dan 2)
  • Postojeći .env fajl u projektu (Dan 0)
  • Instaliran python-dotenv paket (Dan 0)
  • Osnovno razumevanje rada sa fajlovima u PyCharm-u

Glavni sadržaj

Izbor AI servisa – OpenAI ili Gemini?

Pre nego što krenemo sa registracijom, važno je da doneseš informisanu odluku o tome koji AI servis ćeš koristiti. Oba su odlična, ali imaju različite karakteristike.

⚠️ VAŽNA NAPOMENA O PROMENAMA: AI industrija se brzo menja! Modeli se ažuriraju, cene se menjaju, a ponekad se menja i sam API format. Pre početka rada, uvek proveri najnovije informacije:

📚 NIVO 1 – Osnovno objašnjenje

⚠️ VAŽNA INFORMACIJA: OpenAI više ne nudi besplatne kredite novim korisnicima (promena od januara 2025). Zato ti nudimo dve opcije:

Opcija A: OpenAI (preporučeno) – $5 investicija

  • Trošak: Minimum $5 (oko 600 dinara)
  • Šta dobijaš: Preko 2.5 miliona tokena sa GPT-4.1
  • Zašto OpenAI: Najpopularniji AI servis, najbolja dokumentacija, najviše primera online
  • Napomena: API format se promenio u 2025 – sada koristi responses.create()
  • Bonus: Naučićeš kako funkcioniše plaćanje za API servise u realnom svetu

Opcija B: Google Gemini (besplatno)

  • Trošak: Potpuno besplatno!
  • Ograničenja: 60 zahteva po minuti, 15 miliona tokena dnevno
  • Prednosti: Nema finansijske barijere, odličan za eksperimentisanje
  • Preporučen model: gemini-1.5-flash (stabilan, dobro dokumentovan)
  • Napomena: Kod će biti malo drugačiji, ali koncepti su identični

💡 SAVET UČITELJA: Ako možeš, investiraj $5 u OpenAI. To je kao kupovina udžbenika – mala investicija za ogromno znanje koje ćeš steći. Ali ako trenutno ne možeš ili ne želiš da trošiš novac, Gemini je fantastična alternativa i možeš uspešno pratiti ceo kurs!

🚀 NIVO 2 – Dublje razumevanje

Izbor između OpenAI i Gemini nije samo pitanje cene. Evo detaljnije analize:

OpenAI GPT-4.1:

  • Najnoviji OpenAI model sa poboljšanim performansama
  • Konzistentan API koji se retko menja
  • Plaćanje po tokenu (transparentno praćenje troškova)
  • Napomena: API format se malo promenio u 2025

Google Gemini 1.5 Flash:

  • Stabilan model koji se neće menjati bez najave
  • Odlična dokumentacija i podrška
  • 15 miliona besplatnih tokena dnevno
  • Idealan za početnike i učenje
  • Noviji model sa modernom arhitekturom
  • Besplatan tier dovoljno velikodušan za projekte
  • Integracija sa Google Cloud ekosistemom
  • Brže vreme odgovora za kraće upite

🔍 UVID: U profesionalnom svetu, kompanija često koristi više AI servisa istovremeno. Učenje rada sa oba servisa te čini fleksibilnijim programerom. Koncepti koje učiš (API ključevi, autentifikacija, slanje zahteva) su univerzalni!

Registracija na izabranoj platformi

Sada kada si doneo odluku, vreme je za registraciju. Prati instrukcije za servis koji si izabrao.

PUTANJA A: OpenAI Setup

Registracija na OpenAI platformi

📚 NIVO 1 – Osnovno objašnjenje

OpenAI platforma je kao članstvo u ekskluzivnom klubu – moraš se registrovati i platiti članarinu, ali zauzvrat dobijaš pristup najmoćnijim AI modelima na svetu.

Koraci registracije:

  1. Idi na https://platform.openai.com
  2. Klikni “Sign up” (Registruj se)
  3. Koristi email ili nastavi sa Google/Microsoft nalogom
  4. Potvrdi email adresu
  5. Unesi osnovne informacije

🚀 NIVO 2 – Dodavanje kredita

Nakon registracije, moraćeš da dodaš kredit:

  1. Idi na Billing sekciju (levo u meniju)
  2. Klikni “Add payment method”
  3. Unesi podatke kartice (Visa, Mastercard, ili American Express)
  4. Dodaj $5 kredita – to je minimum koji možeš dodati
OpenAI Billing stranica sa Add payment method

OpenAI Billing stranica sa Add payment method

SAVET ZA OPTIMIZACIJU: Postavi “usage limit” na $5 mesečno u Settings → Limits. Tako nikada nećeš slučajno potrošiti više nego što želiš. Ovo je kao postavljanje budžeta za mobilni telefon!

Kreiranje OpenAI API ključa

📚 NIVO 1 – Korak po korak

  1. U dashboard-u klikni na “API Keys” (levo u meniju)
  2. Klikni zeleno dugme “Create new secret key”
  3. Daj ime ključu: npr. “ucitelj-vasa-development”
  4. ⚠️ VAŽNO: Kada se ključ prikaže, ODMAH ga kopiraj!
  5. OpenAI će pokazati ključ SAMO JEDNOM

API ključ izgleda ovako:

sk-proj-AbCdEfGhIjKlMnOpQrStUvWxYz1234567890

PUTANJA B: Google Gemini Setup

Registracija na Google AI Studio

📚 NIVO 1 – Osnovno objašnjenje

Google AI Studio je kao Google Drive za AI – ako imaš Google nalog, već si na pola puta! Gemini API je trenutno u “generous free tier” fazi, što znači da Google daje besplatan pristup da bi privukao developere.

Koraci registracije:

  1. Idi na https://aistudio.google.com
  2. Prijavi se sa svojim Google nalogom
  3. Prihvati uslove korišćenja
  4. Dobrodošao si u AI Studio!

🚀 NIVO 2 – Razumevanje Gemini modela

Google nudi mnoštvo Gemini modela sa različitim sposobnostima:

Najnoviji modeli (januar 2025):

  • Gemini 2.5 Flash: Najbolji odnos cene i performansi, sa “thinking” sposobnostima
  • Gemini 2.5 Pro: Najmoćniji model za kompleksno razmišljanje i analizu
  • Gemini 2.0 Flash: Brz model sa niskom latencijom, idealan za agentic aplikacije
  • Gemini 1.5 Flash: Stariji ali još uvek odličan za raznovrsne zadatke

💡 SAVET ZA POČETNIKE: Za Učitelja Vasu preporučujemo gemini-1.5-flash – stabilan je, besplatan, i ima odličnu dokumentaciju. Kada savladaš osnove, možeš eksperimentisati sa novijim modelima!

Razumevanje naziva modela:

  • Stable verzije: gemini-1.5-flash (bez dodatnih brojeva)
  • Preview verzije: gemini-2.5-flash-preview-05-20 (sa datumom)
  • Experimental: mogu se promeniti bez najave

Kreiranje Gemini API ključa

📚 NIVO 1 – Korak po korak

  1. U AI Studio klikni “Get API key” (gore desno)
  2. Klikni “Create API key”
  3. Izaberi “Create API key in new project”
  4. Naziv projekta: “ucitelj-vasa”
  5. Kopiraj prikazani ključ
Google AI Studio Get API key dugme

Google AI Studio Get API key dugme

Gemini API ključ izgleda ovako:

AIzaSyBrYT3_AbCdEfGhIjKlMnOpQrStUvWx

💡 PRO TIP: Za razliku od OpenAI, Google ti omogućava da vidiš svoje API ključeve ponovo. Ali to ne znači da treba da budeš manje oprezan – čuvaj ih bezbedno!

Bezbedno čuvanje API ključa (univerzalno)

Bez obzira koji servis si izabrao, postupak čuvanja ključa je identičan. Ovo je univerzalna praksa u industriji!

⚠️ VAŽNO ZA POČETNIKE: Možeš imati oba API ključa u .env fajlu istovremeno! Ovo ti omogućava lako prebacivanje između servisa bez brisanja ključeva.

📚 NIVO 1 – Osnovno čuvanje

  1. Otvori PyCharm sa projektom “ucitelj-vasa”
  2. Pronađi .env fajl u root folderu
  3. Dodaj odgovarajući ključ:

Za OpenAI korisnike:

# AI Provider
AI_PROVIDER=openai

# OpenAI Configuration
OPENAI_API_KEY=sk-proj-tvoj-pravi-kljuc-ovde
OPENAI_MODEL=gpt-4.1
OPENAI_MAX_TOKENS=150
OPENAI_TEMPERATURE=0.7

Za Gemini korisnike:

# AI Provider
AI_PROVIDER=gemini

# Gemini Configuration
GEMINI_API_KEY=AIzaSy-tvoj-pravi-kljuc-ovde
GEMINI_MODEL=gemini-1.5-flash
GEMINI_MAX_TOKENS=150
GEMINI_TEMPERATURE=0.7
  1. OBAVEZNO: Sačuvaj fajl (Ctrl+S)
  2. PROVERI: .env je u .gitignore? (Trebalo bi da jeste iz Dana 0)

🎯 Kako funkcioniše izbor servisa?

Ovo je važno da razumeš kao početnik! Naš sistem koristi AI_PROVIDER varijablu kao “prekidač” koji određuje koji servis će se koristiti:

# Primer .env fajla sa OBA ključa:
AI_PROVIDER=gemini  ← Ovo je prekidač!

# OpenAI Configuration
OPENAI_API_KEY=sk-proj-tvoj-openai-kljuc
OPENAI_MODEL=gpt-4.1

# Gemini Configuration
GEMINI_API_KEY=AIzaSy-tvoj-gemini-kljuc
GEMINI_MODEL=gemini-2.0-flash

Šta se dešava u ovom primeru?

  • Imaš oba API ključa ✅
  • Ali koristiš samo Gemini jer je AI_PROVIDER=gemini
  • OpenAI ključ je tu, ali se trenutno ne koristi 💤

Kako da promeniš servis?
Jednostavno promeni vrednost AI_PROVIDER:

  • Za OpenAI: AI_PROVIDER=openai
  • Za Gemini: AI_PROVIDER=gemini

💡 PREDNOST: Ne moraš brisati ključeve! Samo prebaci “prekidač” i možeš testirati oba servisa. Ovo je kao da imaš dva TV kanala – možeš gledati samo jedan u isto vreme, ali imaš pristup oba!

🚀 NIVO 2 – Dodatne postavke

Dodaj i ove korisne postavke u .env:

# App Configuration (za sve)
APP_ENV=development
DEBUG_MODE=True

# Retry Configuration
MAX_RETRIES=3
RETRY_DELAY=1

Praktična implementacija

Kreiranje univerzalnog config modula

Sada ćemo kreirati config modul koji elegantno radi sa oba servisa. U src/utils/ folderu kreiraj config.py:

"""
Centralizovana konfiguracija za Učitelja Vasu
Podržava OpenAI i Gemini API servise
"""

import os
from pathlib import Path
from typing import Optional, Literal
from dotenv import load_dotenv


# Učitaj .env fajl
env_path = Path(__file__).parent.parent.parent / '.env'
load_dotenv(env_path)


class Config:
    """Centralizovana konfiguracija aplikacije."""
    
    # Izbor AI servisa
    AI_PROVIDER: Literal['openai', 'gemini'] = os.getenv('AI_PROVIDER', 'openai')
    
    # OpenAI postavke
    OPENAI_API_KEY: Optional[str] = os.getenv('OPENAI_API_KEY')
    OPENAI_MODEL: str = os.getenv('OPENAI_MODEL', 'gpt-4.1')
    OPENAI_MAX_TOKENS: int = int(os.getenv('OPENAI_MAX_TOKENS', '150'))
    OPENAI_TEMPERATURE: float = float(os.getenv('OPENAI_TEMPERATURE', '0.7'))
    
    # Gemini postavke
    GEMINI_API_KEY: Optional[str] = os.getenv('GEMINI_API_KEY')
    GEMINI_MODEL: str = os.getenv('GEMINI_MODEL', 'gemini-1.5-flash')
    GEMINI_MAX_TOKENS: int = int(os.getenv('GEMINI_MAX_TOKENS', '150'))
    GEMINI_TEMPERATURE: float = float(os.getenv('GEMINI_TEMPERATURE', '0.7'))
    
    # App postavke
    APP_ENV: str = os.getenv('APP_ENV', 'development')
    DEBUG_MODE: bool = os.getenv('DEBUG_MODE', 'True').lower() == 'true'
    
    # Retry postavke
    MAX_RETRIES: int = int(os.getenv('MAX_RETRIES', '3'))
    RETRY_DELAY: float = float(os.getenv('RETRY_DELAY', '1'))
    
    @classmethod
    def validate(cls) -> bool:
        """Proverava da li su sve potrebne postavke učitane."""
        print(f"\n🔍 Provera konfiguracije za: {cls.AI_PROVIDER.upper()}")
        print("=" * 50)
        
        if cls.AI_PROVIDER == 'openai':
            if not cls.OPENAI_API_KEY:
                print("❌ GREŠKA: OPENAI_API_KEY nije postavljen!")
                print("\n💡 Opcije:")
                print("1. Dodaj OPENAI_API_KEY u .env fajl")
                print("2. Ili prebaci na Gemini: AI_PROVIDER=gemini")
                return False
                
            if not cls.OPENAI_API_KEY.startswith('sk-'):
                print("❌ GREŠKA: OPENAI_API_KEY ne izgleda ispravno!")
                print("   Trebalo bi da počinje sa 'sk-'")
                return False
                
        elif cls.AI_PROVIDER == 'gemini':
            if not cls.GEMINI_API_KEY:
                print("❌ GREŠKA: GEMINI_API_KEY nije postavljen!")
                print("\n💡 Opcije:")
                print("1. Dodaj GEMINI_API_KEY u .env fajl")
                print("2. Ili prebaci na OpenAI: AI_PROVIDER=openai")
                return False
                
            if not cls.GEMINI_API_KEY.startswith('AIza'):
                print("❌ GREŠKA: GEMINI_API_KEY ne izgleda ispravno!")
                print("   Trebalo bi da počinje sa 'AIza'")
                return False
        else:
            print(f"❌ GREŠKA: Nepoznat AI_PROVIDER: {cls.AI_PROVIDER}")
            print("   Dozvoljene vrednosti: 'openai' ili 'gemini'")
            return False
            
        # Ako je sve OK, prikaži info
        if cls.DEBUG_MODE:
            print(f"✅ {cls.AI_PROVIDER.upper()} konfiguracija učitana!")
            if cls.AI_PROVIDER == 'openai':
                print(f"   - Model: {cls.OPENAI_MODEL}")
                print(f"   - Max tokena: {cls.OPENAI_MAX_TOKENS}")
                print(f"   - Temperature: {cls.OPENAI_TEMPERATURE}")
            else:
                print(f"   - Model: {cls.GEMINI_MODEL}")
                print(f"   - Max tokena: {cls.GEMINI_MAX_TOKENS}")
                print(f"   - Temperature: {cls.GEMINI_TEMPERATURE}")
            print(f"   - Environment: {cls.APP_ENV}")
            
        return True
    
    @classmethod
    def get_api_key(cls) -> Optional[str]:
        """Vraća API ključ za trenutno izabrani servis."""
        if cls.AI_PROVIDER == 'openai':
            return cls.OPENAI_API_KEY
        else:
            return cls.GEMINI_API_KEY
    
    @classmethod
    def get_model(cls) -> str:
        """Vraća model za trenutno izabrani servis."""
        if cls.AI_PROVIDER == 'openai':
            return cls.OPENAI_MODEL
        else:
            return cls.GEMINI_MODEL
    
    @classmethod
    def mask_api_key(cls) -> str:
        """Vraća maskiranu verziju API ključa za prikaz."""
        key = cls.get_api_key()
        if not key:
            return "Not set"
        
        # Prikaži samo prvih 7 i poslednjih 4 karaktera
        if len(key) > 15:
            return f"{key[:7]}...{key[-4:]}"
        return "Invalid key"


# Primer korišćenja
if __name__ == "__main__":
    print("=" * 50)
    print("Test učitavanja konfiguracije")
    print("=" * 50)
    
    if Config.validate():
        print(f"\n📌 AI Servis: {Config.AI_PROVIDER.upper()}")
        print(f"📌 API Key (maskiran): {Config.mask_api_key()}")
        print(f"📌 Model: {Config.get_model()}")
    else:
        print("\n⚠️ Konfiguracija nije validna!")
        print("Prati instrukcije gore za podešavanje.")

Testiranje učitavanja API ključa

Ažurirajmo test skriptu da radi sa oba servisa. U src/ ažuriraj test_api_key.py:

"""
Test skripta za proveru API ključa
Radi sa OpenAI i Gemini servisima
"""

import sys
from pathlib import Path

# Dodaj src folder u Python path
sys.path.append(str(Path(__file__).parent))

from utils.config import Config


def test_api_key_setup():
    """Testira da li je API ključ pravilno postavljen."""
    print("\n🔍 PROVERA PODEŠAVANJA API KLJUČA")
    print("=" * 50)
    
    # Korak 1: Proveri da li .env postoji
    env_path = Path(__file__).parent.parent / '.env'
    if not env_path.exists():
        print("❌ .env fajl ne postoji!")
        print(f"   Očekivana lokacija: {env_path}")
        return False
    
    print("✅ .env fajl pronađen")
    
    # Korak 2: Prikaži koji servis je izabran
    print(f"\n🤖 Izabrani AI servis: {Config.AI_PROVIDER.upper()}")
    
    # Korak 3: Proveri da li se učitava
    api_key = Config.get_api_key()
    if not api_key:
        print(f"❌ {Config.AI_PROVIDER.upper()} API ključ nije učitan!")
        print("\nMoguci razlozi:")
        print(f"1. Nisi dodao {Config.AI_PROVIDER.upper()}_API_KEY= u .env")
        print("2. Ima razmaka oko = znaka")
        print("3. Ključ je u navodnicima (ne treba)")
        return False
    
    print(f"✅ {Config.AI_PROVIDER.upper()} API ključ uspešno učitan")
    
    # Korak 4: Validacija formata
    if Config.AI_PROVIDER == 'openai':
        if not api_key.startswith('sk-'):
            print("⚠️  API ključ možda nije ispravan")
            print("   OpenAI ključevi počinju sa 'sk-'")
    else:  # gemini
        if not api_key.startswith('AIza'):
            print("⚠️  API ključ možda nije ispravan")
            print("   Gemini ključevi počinju sa 'AIza'")
    
    # Korak 5: Prikaži info
    print(f"\n📊 INFORMACIJE O KLJUČU:")
    print(f"   Servis: {Config.AI_PROVIDER.upper()}")
    print(f"   Dužina: {len(api_key)} karaktera")
    print(f"   Maskiran: {Config.mask_api_key()}")
    print(f"   Model: {Config.get_model()}")
    
    # Korak 6: Prikaži ostale postavke
    print(f"\n⚙️  OSTALE POSTAVKE:")
    if Config.AI_PROVIDER == 'openai':
        print(f"   Max tokena: {Config.OPENAI_MAX_TOKENS}")
        print(f"   Temperature: {Config.OPENAI_TEMPERATURE}")
    else:
        print(f"   Max tokena: {Config.GEMINI_MAX_TOKENS}")
        print(f"   Temperature: {Config.GEMINI_TEMPERATURE}")
    print(f"   Max pokušaja: {Config.MAX_RETRIES}")
    print(f"   Retry delay: {Config.RETRY_DELAY}s")
    
    # Korak 7: Troškovi
    if Config.AI_PROVIDER == 'openai':
        print("\n💰 TROŠKOVI:")
        print("   GPT-4.1: $0.0020 per 1K tokena (input)")
        print("   To znači: 1 milion tokena = $2.00")
        print("   Tvoj kredit od $5 = 2.5 miliona tokena!")
    else:
        print("\n💰 TROŠKOVI:")
        print("   Gemini 1.5 Flash: BESPLATNO!")
        print("   Limit: 60 zahteva po minuti")
        print("   15 miliona tokena po dan besplatno!")
        print("   Savršeno za učenje i eksperimentisanje!")
    
    print("\n✅ SVE JE SPREMNO ZA SUTRA!")
    print(f"   Učitelj Vasa može da koristi {Config.AI_PROVIDER.upper()} API 🎉")
    
    return True


def test_provider_switching():
    """Testira prebacivanje između servisa."""
    print("\n🔄 TEST PREBACIVANJA SERVISA")
    print("=" * 50)
    
    print("💡 Možeš lako prebaciti između servisa!")
    print("   Samo promeni AI_PROVIDER u .env fajlu:")
    print("   - AI_PROVIDER=openai")
    print("   - AI_PROVIDER=gemini")
    print("\nOstali kod ostaje isti!")


if __name__ == "__main__":
    # Pokreni testove
    success = test_api_key_setup()
    
    if success:
        test_provider_switching()
        
        print("\n💡 SLEDEĆI KORACI:")
        print("1. Sutra instaliramo biblioteke za izabrani servis")
        print("2. Pravimo wrapper funkciju za univerzalne pozive")
        print("3. Učitelj Vasa će progovoriti preko AI-ja!")
    else:
        print("\n❌ Ispravi greške pre nego što nastaviš!")

Ažuriranje main.py

Ažuriraj main.py da prikazuje koji servis koristiš:

"""
Glavni program za Učitelja Vasu
Podržava OpenAI i Gemini AI servise
"""

from vasa_core import pozdrav, predstavi_se, glavni_meni
from ai_simulator import simuliraj_ai_odgovor, demonstriraj_api_komunikaciju
from utils.config import Config


def proveri_spremnost():
    """Proverava da li je sistem spreman za rad."""
    print("\n🔧 Provera sistema...")
    
    if Config.validate():
        print(f"✅ {Config.AI_PROVIDER.upper()} API ključ učitan: {Config.mask_api_key()}")
        return True
    else:
        print(f"\n⚠️  UPOZORENJE: {Config.AI_PROVIDER.upper()} API ključ nije podešen!")
        print("Možeš koristiti simulaciju, ali ne i pravi AI.")
        print("Pogledaj lekciju Dana 3 za instrukcije.")
        return False


def pokreni_vasu():
    """Pokreće glavnu petlju programa Učitelj Vasa."""
    # Proveri sistem
    api_dostupan = proveri_spremnost()
    
    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. Proveri API podešavanja")
        print("6. 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("\n" + "=" * 50)
            if api_dostupan:
                print(f"✅ TRENUTNO AKTIVAN: {Config.AI_PROVIDER.upper()}")
                print(f"📌 Ključ: {Config.mask_api_key()}")
                print(f"🎯 Model: {Config.get_model()}")
                
                if Config.AI_PROVIDER == 'openai':
                    print("💰 Tip: Plaćeni servis ($5 kredit)")
                else:
                    print("💰 Tip: Besplatan servis")
                
                # Proveri da li je konfigurisan i drugi servis
                print("\n🔄 DOSTUPNI SERVISI:")
                if Config.OPENAI_API_KEY:
                    status = "✅ AKTIVAN" if Config.AI_PROVIDER == 'openai' else "💤 Spreman"
                    print(f"   - OpenAI: {status}")
                if Config.GEMINI_API_KEY:
                    status = "✅ AKTIVAN" if Config.AI_PROVIDER == 'gemini' else "💤 Spreman"
                    print(f"   - Gemini: {status}")
                
                if Config.OPENAI_API_KEY and Config.GEMINI_API_KEY:
                    print("\n💡 TIP: Možeš prebaciti servis promenom AI_PROVIDER u .env!")
            else:
                print(f"❌ {Config.AI_PROVIDER.upper()} API ključ nije podešen.")
                print("Prati instrukcije iz Dana 3.")
            print("=" * 50)
        elif izbor == "6":
            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()

Česte greške i rešenja

Univerzalne greške (oba servisa):

GREŠKA: API_KEY could not be found
💡 REŠENJE:

  • Proveri da li si sačuvao .env fajl nakon dodavanja ključa
  • Proveri da nema razmaka oko = znaka
  • Restartuj PyCharm ili Python skriptu nakon promene .env fajla

GREŠKA: API ključ se pojavljuje u Git statusu
💡 REŠENJE:

  • NIKAD ne commit-uj .env fajl!
  • Ako si slučajno stage-ovao: git reset HEAD .env
  • Ako si već commit-ovao: git rm --cached .env pa novi commit

OpenAI specifične greške:

GREŠKA: “You exceeded your current quota”
💡 REŠENJE:

  • Proveri da li si dodao kredit ($5) u Billing sekciji
  • Možda si potrošio kredit na drugim projektima
  • Prebaci se na Gemini ako ne možeš da dodaš kredit

GREŠKA: “The card was declined”
💡 REŠENJE:

  • Proveri da li kartica podržava online plaćanja
  • Kontaktiraj banku da omogući međunarodne transakcije
  • Pokušaj sa drugom karticom ili prebaci se na Gemini

Gemini specifične greške:

GREŠKA: “API key not valid. Please pass a valid API key”
💡 REŠENJE:

  • Proveri da li si omogućio Gemini API u Google Cloud Console
  • Možda si kopirao pogrešan ključ (mora počinjati sa AIza)
  • Regeneriši ključ u AI Studio

GREŠKA: “Rate limit exceeded”
💡 REŠENJE:

  • Gemini ima limit od 60 zahteva po minuti
  • Dodaj time.sleep(1) između poziva
  • Naša Config klasa već ima RETRY_DELAY postavku

Proveri svoje razumevanje

[NIVO 1]:

  1. Koja je glavna razlika između OpenAI i Gemini pristupa?
  2. Zašto je važno da API ključ bude u .env fajlu?
  3. Kako Config klasa “zna” koji servis da koristi?

[NIVO 2]:

  1. Kako bi implementirao automatsko prebacivanje na drugi servis ako prvi ne radi?
  2. Zašto koristimo get_api_key() i get_model() metode umesto direktnog pristupa?
  3. Koje su prednosti korišćenja type hints kao Literal['openai', 'gemini']?

🤔 MINI-KVIZ:

  1. Koliko tokena možeš potrošiti sa $5 OpenAI kredita?
  2. Šta se dešava ako promeniš AI_PROVIDER u .env fajlu?
  3. Da li možeš imati oba API ključa u .env fajlu istovremeno?

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: API ključ dobijen (OpenAI ili Gemini) i bezbedno sačuvan
- ⏳ Dan 4: Prvi pravi AI poziv (sutra)

## 🤖 Podržani AI servisi

Učitelj Vasa podržava:
- **OpenAI GPT-4.1** - Industrijski standard (potreban $5 kredit)
- **Google Gemini 2.0 Flash** - Besplatna alternativa

Prebacivanje između servisa je jednostavno - samo promeni `AI_PROVIDER` u `.env` fajlu!

Dodaj u docs/development_log.md:

## Dan 3: Dobijanje i čuvanje API ključa - Multi-provider podrška (15.06.2025)

### Šta je urađeno:
- ✅ Dodata podrška za OpenAI i Gemini API servise
- ✅ Kreiran univerzalni Config modul koji radi sa oba
- ✅ API ključ bezbedno sačuvan u .env
- ✅ Implementirano elegantno prebacivanje između servisa
- ✅ test_api_key.py prikazuje info za oba servisa
- ✅ main.py ažuriran sa provider-aware porukama

### Naučene lekcije:
- OpenAI više ne daje besplatne kredite (januar 2025)
- Gemini je odlična besplatna alternativa
- Univerzalni Config dizajn omogućava laku ekstenziju
- Type hints (`Literal`) poboljšavaju sigurnost koda

### Problemi i rešenja:
- **Problem**: Kako elegantno podržati dva različita API servisa?
- **Rešenje**: AI_PROVIDER varijabla + get_api_key() / get_model() metode

### Izbor servisa:
- **OpenAI**: $5 investicija, industrijski standard, najbolja dokumentacija
- **Gemini**: Potpuno besplatno, moderni model, velikodušni limiti

### Za sutra (Dan 4):
- Instalacija biblioteka (openai ili google-generativeai)
- Kreiranje wrapper funkcije za univerzalne pozive
- Prvi pravi AI poziv - Vasa konačno postaje inteligentan!

Git commit za danas

git add .
git commit -m "Dan 3: Multi-provider podrška - OpenAI i Gemini API setup"
git push

Čestitam! Učitelj Vasa sada može da koristi bilo koji od dva najpopularnija AI servisa! 🎉

Ako si izabrao OpenAI, investirao si u svoje obrazovanje i imaćeš pristup najpoznatijem AI servisu. Ako si izabrao Gemini, možeš besplatno da eksperimentišeš sa modernim AI modelom. U oba slučaja, naučićeš principe koji važe za sve AI servise!

Sutra Učitelj Vasa uči

Sutra je najuzbudljiviji dan dosad – konačno ćemo povezati Učitelja Vasu sa pravom veštačkom inteligencijom! Instalaćemo odgovarajuću biblioteku (openai ili google-generativeai), kreirati wrapper funkciju koja radi sa oba servisa, i napraviti prvi pravi AI poziv. Učitelj Vasa će moći da odgovara na pitanja koristeći moć AI-ja!

📚 REČNIK DANAŠNJE LEKCIJE:

  • Multi-provider: Podrška za više različitih servisa u istoj aplikaciji
  • API kredit: Prepaid iznos koji koristiš za API pozive (kao kredit za mobilni)
  • Free tier: Besplatan nivo servisa sa određenim ograničenjima
  • Rate limit: Maksimalan broj zahteva koji možeš poslati u određenom periodu
  • Provider agnostic: Kod koji radi nezavisno od konkretnog servisa
  • Type hints: Python anotacije koje specificiraju tipove podataka
  • Literal type: Type hint koji ograničava vrednost na specifične opcije