Začínáme s AI Access

Od prázdného projektu k první odpovědi modelu. Vysvětlíme si tři pojmy, bez kterých se neobejdeš, vybereme providera i model, získáme klíč, spustíme první skript a podíváme se, kolik to stojí a co dělat, když to nevyjde.

Tři pojmy, které potřebuješ znát

Než napíšeš první řádek, vyplatí se rozumět třem slovům, která se v dokumentaci opakují pořád dokola.

Provider je firma, která jazykové modely provozuje a účtuje si za jejich používání. AI Access jich zná pět: OpenAI (známé díky ChatGPT), Anthropic (modely Claude), Google (modely Gemini), čínský DeepSeek a xAI (modely Grok). U jednoho z nich si založíš účet.

Model je konkrétní mozek, se kterým mluvíš. Každý provider jich nabízí několik a liší se cenou i schopnostmi: malé a levné zvládnou klasifikaci nebo shrnutí, velké a drahé si poradí se složitým uvažováním. Model se v kódu určuje jménem, třeba gpt-5.6-luna.

API klíč je dlouhý náhodný řetězec, který providerovi říká, kdo volá a komu to naúčtovat. Funguje jako heslo a jako platební karta zároveň.

Volání modelu stojí peníze. Nejde o velké částky, u běžného dotazu mluvíme o zlomcích koruny, ale účet vzniká od prvního volání, takže si u providera nejspíš budeš muset nabít kredit nebo zadat platební kartu. Někteří provideři dávají nováčkům malý kredit zdarma.

Kterého providera zvolit

Dobrá zpráva je, že tahle volba není osudová. Přepnutí providera je v AI Access změna jednoho řádku, takže když ti jeden nebude vyhovovat, zkusíš druhý bez přepisování aplikace.

V běžné konverzaci si vedou dobře všichni. Rozdíly jsou jinde:

  • Šíře schopností. Chceš kromě chatu i embeddingy pro vyhledávání, dávkové zpracování nebo generování obrázků? Podívej se do tabulky schopností; nejširší záběr mají OpenAI a Gemini.
  • Cena. Mezi nejlevnějším malým modelem a nejdražším uvažovacím je rozdíl zhruba dva řády. DeepSeek bývá výrazně levnější než ostatní.
  • Kam tečou data. Pro firemní nasazení bývá rozhodující, kde se data zpracovávají a co si provider smí nechat pro trénování. Odpověď hledej v jeho obchodních podmínkách, ne v dokumentaci knihovny.
  • Dostupnost. Ne každý provider je dostupný odevšad a některé funkce, u Gemini třeba dávkové zpracování a generování obrázků, vyžadují projekt s aktivní fakturací.

Když si nevíš rady, začni u toho, u kterého snadno zaplatíš, a soustřeď se na samotnou aplikaci. Přepnout se dá kdykoli později.

Který model zvolit

Uvnitř každého providera si pak vybíráš mezi modely. Zjednodušeně platí tři pravidla.

Začni malým. Modely s označením jako flash, mini nebo lite jsou levné a rychlé a na shrnutí, klasifikaci, přeformulování nebo vytažení údajů z textu bohatě stačí. Velký model tyhle úlohy neudělá o mnoho lépe, jen dráž a pomaleji.

Po velkém sáhni, až když malý selže. Poznáš to podle výsledků: model si vymýšlí, nedodržuje instrukce nebo ztrácí nit v delším zadání. Teprve tehdy se vyplatí přejít na silnější variantu.

Uvažovací modely jsou zvláštní kategorie. Než odpoví, přemýšlejí, což stojí čas i tokeny navíc, zato zvládnou úlohy o více krocích. Kolik přemýšlení chceš, řídíš přes reasoning effort; u jednoduchých dotazů ho klidně vypni.

Rozumný start k srpnu 2026 vypadá takhle:

Provider Chat model Model pro embeddingy
OpenAI gpt-5.6-luna text-embedding-3-small
Claude claude-sonnet-5
Gemini gemini-3.5-flash-lite gemini-embedding-2
DeepSeek deepseek-v4-flash
Grok grok-4.3

Modely se obměňují rychleji, než se stíhá aktualizovat jakákoli dokumentace, takže tabulku ber jako výchozí bod, ne jako zákon. Jméno modelu je v kódu obyčejný řetězec, takže nový model funguje v den vydání; jestli ten tvůj ještě existuje, ověříš pomocí listModels().

Získání klíče

Klíč se vydává v konzoli providera. Postup je všude stejný: založíš účet, přidáš platební metodu nebo kredit a v sekci s API klíči si necháš vygenerovat nový. Klíč uvidíš jen jednou, takže si ho rovnou ulož; když ho ztratíš, vygeneruješ jiný.

Provider Konzole
OpenAI platform.openai.com
Claude console.anthropic.com
Gemini aistudio.google.com
DeepSeek platform.deepseek.com
Grok console.x.ai

V téže konzoli najdeš i aktuální ceník a přehled, kolik jsi zatím utratil. Hned na začátku se vyplatí nastavit si tam měsíční limit útraty; je to nejjednodušší pojistka proti chybě v cyklu.

První skript

Tohle je kompletní soubor, který stačí uložit a spustit. Klíč je v něm napsaný přímo, protože teď jde hlavně o to, aby ti to fungovalo na první pokus. Za chvíli si ukážeme, kam patří v ostrém provozu.

require __DIR__ . '/vendor/autoload.php';

$client = new AIAccess\Provider\OpenAI\Client('sem-vloz-svuj-klic');

$chat = $client->createChat('gpt-5.6-luna');
$response = $chat->sendMessage('Vysvětli v jedné větě, co je to dependency injection.');

echo $response->getText(), "\n";

Spustíš ho z příkazové řádky příkazem php soubor.php a za chvíli uvidíš odpověď. createChat() otevře konverzaci nad zvoleným modelem, sendMessage() pošle zprávu a počká na odpověď.

Návratová hodnota není řetězec, ale objekt odpovědi. Kromě textu se z něj dozvíš i to, proč model přestal psát a kolik to stálo.

Kam patří klíč v ostrém provozu

Klíč napsaný v kódu je v pořádku pro první pokus, ale ne pro nic dalšího. Kdo ho získá, utrácí na tvůj účet, a nejčastěji uniká tak, že se omylem dostane do gitu. Vzít to zpět jde jen zdánlivě: přepsat historii sice umíš, ale jakmile se commit dostal na server, musíš klíč považovat za prozrazený, protože ho mezitím mohl kdokoli zkopírovat. Spolehlivé řešení je jediné, totiž vydat nový klíč a starý zneplatnit.

Proto se klíč zapisuje mimo kód, nejčastěji do proměnné prostředí. To je pojmenovaná hodnota, kterou aplikaci předá operační systém, webhosting nebo Docker, takže žije v nastavení serveru a ne v souborech projektu. V PHP ji přečteš takhle:

$apiKey = getenv('OPENAI_API_KEY');

Na svém počítači ji nastavíš před spuštěním skriptu, ve Windows příkazem set OPENAI_API_KEY=..., na Linuxu a macOS příkazem export OPENAI_API_KEY=.... Na hostingu k tomu bývá kolonka v administraci.

Druhá běžná cesta je konfigurační soubor uvedený v .gitignore, takže se nikdy neverzuje. V Nette aplikaci patří klíč do lokální konfigurace a odtud do DI kontejneru:

parameters:
	openaiApiKey: '...'

services:
	- AIAccess\Provider\OpenAI\Client(%openaiApiKey%)

Tím zároveň získáš to nejpříjemnější na přepínání providerů: klienta si necháš předat konstruktorem a tvoje třída už nikdy neví, se kterým modelem mluví.

Kolik to stojí

Provideři účtují po tokenech, což jsou kousky slov. Anglický text má zhruba čtyři znaky na token, čeština kvůli diakritice a skloňování o dost víc, takže stejně dlouhá česká věta vyjde na víc tokenů než anglická.

Platí se zvlášť vstup, tedy všechno, co modelu pošleš, a zvlášť výstup, tedy co napíše. Výstup bývá několikanásobně dražší než vstup. Přemýšlení uvažovacích modelů se počítá jako výstup, i když ho nikdy neuvidíš.

Konkrétní ceny sem schválně nepíšeme, protože se mění a rychle by zestárly. Najdeš je na webu každého providera pod heslem Pricing a v téže konzoli, kde sis vydal klíč. Pro představu o řádech: krátká otázka s krátkou odpovědí na malém modelu stojí zlomky haléře, kdežto opakované shrnování dlouhých dokumentů největším uvažovacím modelem už je položka, kterou v účetnictví poznáš. Rozdíl mezi nejlevnějším a nejdražším modelem téhož providera bývá zhruba dva řády, takže volba modelu ovlivní účet mnohem víc než optimalizace promptu.

Kolik stálo konkrétní volání, ti řekne odpověď sama:

$usage = $response->getUsage();

echo 'vstup: ', $usage->inputTokens, "\n";
echo 'výstup: ', $usage->outputTokens, "\n";
echo 'celkem: ', $usage->getTotalTokens(), "\n";

Dvě čísla navíc stojí za pozornost. reasoningTokens je to, co model spotřeboval na přemýšlení, a u uvažovacích modelů bývá větší než odpověď sama. cacheReadTokens naopak říká, kolik vstupu se načetlo z providerovy cache za zlomek ceny; když posíláš pořád stejnou dlouhou systémovou instrukci, je tohle číslo tvůj kamarád.

Když první volání selže

Chyby se hlásí výjimkami a jejich typ ti řekne, co se stalo, ještě než si přečteš zprávu. Takhle je odchytíš:

try {
	$response = $chat->sendMessage('Ahoj!');
	echo $response->getText();

} catch (AIAccess\ApiException $e) {
	// provider odpověděl chybou; kód je HTTP status
	echo 'API vrátilo chybu ', $e->getCode(), ': ', $e->getMessage();

} catch (AIAccess\CommunicationException $e) {
	// nespojili jsme se, nebo přišla nečitelná odpověď
	echo 'Spojení selhalo: ', $e->getMessage();
}

Co znamenají nejčastější stavy, které v AIAccess\ApiException uvidíš:

  • 401 – klíč je špatně, chybí, nebo patří jinému providerovi.
  • 404 – model tohoto jména neexistuje. Nejčastěji překlep nebo model, který provider vyřadil; nech si vypsat seznam modelů.
  • 429 – překročil jsi limit požadavků, nebo máš prázdný kredit. Opakování za tebe umí zařídit RetryClient.
  • 500 a výš – problém na straně providera, opakování má smysl.

Kromě těch dvou výjimek existují ještě AIAccess\UnexpectedResponseException, když odpověď nemá očekávanou strukturu, a AIAccess\LogicException pro chybu ve tvém vlastním kódu, třeba odeslání konverzace bez jediné zprávy. Tu poslední nemá smysl odchytávat, ta má spadnout a upozornit tě.

Celou hierarchii i to, jak si ošetření napsat jednou pro celou aplikaci, rozebírá kapitola o ošetření chyb.

Kam dál