Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
8f54f7f
added dibi & texy
dg Oct 3, 2025
ddb26a9
neon: link to fiddle
dg Apr 27, 2026
bf6918a
texy: extensive documentation update
dg Oct 21, 2025
d04e45a
removed null as an array offset
dg Oct 31, 2025
9b06819
typo [Closes #1081]
jtojnar Sep 27, 2025
df6a0f6
latte 3.1.0
dg Nov 26, 2025
e6012c9
application: improved info about attributes, added #[Deprecated]
dg Nov 29, 2025
6e824a0
application: improved info about template variables and extensions
dg Nov 29, 2025
a3c532a
nette/utils 4.0.10
dg Dec 1, 2025
56d972a
nette/application 3.2.9
dg Nov 29, 2025
748f09a
adding missing stuff in nette/http
dg Dec 27, 2025
ae083e7
used first-class callables
dg Jan 4, 2026
f41ca80
added coding standard section about global functions and constants
dg Jan 6, 2026
24ac08e
Tester 2.6: updated documentation for php.ini loading behavior change
dg Jan 6, 2026
d98def6
typo
dg Aug 1, 2026
3c65f2b
replaced bg, el, hu, pt, ro, sl and uk with redirects to English
dg Aug 1, 2026
f95cf99
docs: replaced typographic quotes and dashes with plain ASCII
dg Aug 1, 2026
f4cf823
added ai.nette.org
dg Jan 8, 2026
fd8a74c
latte 3.1.2
dg Jan 23, 2026
c76c62f
latte: info about whitespace
dg Mar 17, 2026
8bd05e6
latte 3.1.3
dg Dec 23, 2025
cbf90a6
typo
dg Feb 23, 2026
d6f2eba
latte: changed user template
dg Apr 13, 2026
d930ca3
php-generator: v4.2.2
dg Feb 23, 2026
a1722de
di: documented @Type as service key for modifications
dg Mar 5, 2026
f4ae582
nette/mail 4.1.0
dg Mar 27, 2026
e7239d7
updated links to PhpStorm plugins
dg Apr 12, 2026
2cb47fd
tracy: open-files-in-ide updated Chrome policy to AutoLaunchProtocols…
dg Apr 12, 2026
8a21978
coding standard: added enums.php convention
dg Apr 6, 2026
eca09a1
latte 3.1.4
dg Dec 23, 2025
902413a
latte: develop.texy adds 'Ways to Extend Latte' overview
dg Apr 25, 2026
d044f27
nette: add emoji icons to documentation home links
dg Apr 25, 2026
13294b0
nette/utils 4.1.4
dg May 11, 2026
86cbf9f
nette/database 3.2.9
dg May 17, 2026
356ab03
database: renamed mapping.texy to type-conversion.texy
dg May 17, 2026
c2c1789
nette/mail 4.1.2
dg May 19, 2026
acbe67a
best-practices: add 'Pretty URLs with Slugs' guide
dg May 20, 2026
0c35cc1
latte: improve and clarify the grouping cookbook
dg May 22, 2026
69d0953
nette/security 3.2.4
dg May 23, 2026
790249d
added tools
dg Jun 6, 2026
490d15d
moved code-checker to tools
dg Jun 6, 2026
7737f01
moved editor-and-tools to tools:ide
dg Jun 6, 2026
d3f16f6
improved code-checker
dg Jun 6, 2026
bc8b713
improved IDE
dg Jun 6, 2026
a850596
added Coding Standard page
dg Jun 6, 2026
81d06d4
added Nette PHPStan Rules page
dg May 25, 2026
4a9711e
added X-ray page
dg Jun 6, 2026
3910b8d
tracy 2.12.0
dg May 25, 2026
3fd2a90
nette/http 3.3.4
dg May 26, 2026
12c0a37
nette/http 3.4.0
dg Jun 2, 2026
dbfb2e1
improved homepages
dg Jun 14, 2026
f087946
nette/forms 3.3.0
dg Jun 24, 2026
2ac5e23
nette/forms - custom controls guide
dg Jul 2, 2026
6949591
nette/application 3.3.0
dg Jun 24, 2026
3303653
latte: added headers
dg Jun 28, 2026
eb1f033
latte sandbox: document implicit __toString() coercion is not policed
dg Jun 28, 2026
764cf1a
added nette/command-line
dg Jul 5, 2026
55f04d9
typos
dg Jul 4, 2026
6bbd283
application: fixes based on documentation audit against the code
dg Jul 4, 2026
73201d0
assets: fixes based on documentation audit against the code
dg Jul 4, 2026
7635f64
caching: fixes based on documentation audit against the code
dg Jul 5, 2026
9f2d9d6
component-model: fixes based on documentation audit against the code
dg Jul 4, 2026
debc519
database: fixes based on documentation audit against the code
dg Jul 4, 2026
55d8f64
dependency-injection: fixes based on documentation audit against the …
dg Jul 5, 2026
29575cf
forms: fixes based on documentation audit against the code
dg Jul 5, 2026
8be93ef
http: fixes based on documentation audit against the code
dg Jul 5, 2026
4684124
neon: fixes based on documentation audit against the code
dg Jul 5, 2026
dcbb54e
mail: fixes based on documentation audit against the code
dg Jul 5, 2026
3f5f7dc
latte: fixes based on documentation audit against the code
dg Jul 5, 2026
740c091
php-generator: fixes based on documentation audit against the code
dg Jul 5, 2026
fb57914
robot-loader: fixes based on documentation audit against the code
dg Jul 5, 2026
8dce6f9
safe-stream: fixes based on documentation audit against the code
dg Jul 5, 2026
c3df57a
security: fixes based on documentation audit against the code
dg Jul 5, 2026
d5ce4c3
schema: fixes based on documentation audit against the code
dg Jul 5, 2026
fff762f
tester: fixes based on documentation audit against the code
dg Jul 5, 2026
2b8297a
tokenizer: fixes based on documentation audit against the code
dg Jul 5, 2026
39de51b
tracy: fixes based on documentation audit against the code
dg Jul 5, 2026
3b0e88c
utils: fixes based on documentation audit against the code
dg Jul 5, 2026
dce7c0f
contributing: proofread and fixed texts
dg Aug 10, 2026
da435e5
www: proofread and fixed texts
dg Aug 11, 2026
f4b5ebc
best-practices: proofread and fixed texts
dg Aug 10, 2026
2adfb6a
quickstart: proofread and fixed texts
dg Aug 10, 2026
acbcb9e
nette: fixed English grammar
dg Aug 10, 2026
be16a58
www: added photo of the early development environment to history
dg Aug 1, 2026
e42aa29
nette/component-model 4.0.0
dg Jul 4, 2026
859d239
meta: loosen versions to whole major (3.x, 4.x)
dg Jul 4, 2026
be85ba5
assets: document Docker development and the Vite plugin host option (…
jeremy-step Jul 5, 2026
6a4f778
troubleshooting: cannot sent header
dg Jul 11, 2026
f4e850f
migrations: split global upgrade guides into per-package Upgrading pages
dg Jul 11, 2026
6611731
nette: added links to Nette AI, Bootstrap, Component Model, OOP intro…
dg Jul 31, 2026
13e548c
reworked left menus across the documentation
dg Jul 30, 2026
52bcf6a
disabled the left menu on landing pages via {{leftbar: no}}
dg Jul 31, 2026
b630088
nette/utils 4.1.5
dg Jul 17, 2026
e8cb48b
nette/security v3.2.6
dg Jul 24, 2026
444daaf
nette/mail 4.2.0
dg Jul 27, 2026
3e47cfc
latte v3.1.5
dg Jul 25, 2026
01ad9ff
latte v3.1.6
dg Jul 27, 2026
629aabf
synced all language mutations with the cs/en baseline
dg Aug 1, 2026
f1a5d76
added links to the "by example" courses
dg Aug 4, 2026
e5238f7
assets: document new @nette/vite-plugin options (refresh, appUrl, hos…
dg Jul 11, 2026
e6a2414
meta.json: added explicit api URL to books with API docs
dg Aug 25, 2026
5a68fb1
routing and AI pages declare their own repo and api next to composer
dg Aug 25, 2026
2992fc8
added AI-Access
dg Aug 10, 2026
ec3b6c3
added CLAUDE.md
dg Dec 28, 2025
5d5d948
nette/di v3.2.7
dg Aug 27, 2026
e8db27c
WIP
dg Aug 1, 2026
a17e946
schema
dg Aug 17, 2026
752953e
cover wip
dg Aug 26, 2026
c4a0076
http: documented 'baseUrl' option, the base URL fallback outside HTTP…
dg Aug 27, 2026
4ea2f6f
schema: documented the news of version 1.4
dg Aug 31, 2026
dd85c68
dresscode & phpsyntax WIP
dg Sep 5, 2026
8bbce29
tools, latte: add Latte+ to the PhpStorm plugins
zipper Sep 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
12 changes: 9 additions & 3 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
.gitattributes export-ignore
.gitignore export-ignore
*.texy linguist-language=Text
.gitattributes export-ignore
.github/ export-ignore
.gitignore export-ignore
AGENTS.md export-ignore
docs/ export-ignore
tests/ export-ignore

*.php* diff=php
*.sh text eol=lf
347 changes: 347 additions & 0 deletions AGENTS.md

Large diffs are not rendered by default.

162 changes: 162 additions & 0 deletions ai-access/cs/@home.texy
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
AI Access: jedno PHP rozhraní pro OpenAI, Claude, Gemini, DeepSeek a Grok
*************************************************************************

<div class=perex>

AI Access je PHP knihovna, která sjednocuje práci s jazykovými modely. Místo pěti různých API a pěti různých formátů odpovědí píšeš jeden kód, který mluví s ChatGPT od OpenAI, s Claude od Anthropicu, s Gemini od Googlu, s DeepSeekem i s Grokem od xAI. Přepnutí mezi nimi je změna jediného řádku.

Zvládá celý pracovní postup: konverzaci, streamování odpovědí, volání nástrojů (function calling), strukturovaný výstup podle JSON schématu, obrázky a dokumenty na vstupu, generování obrázků, embeddingy pro vyhledávání i dávkové zpracování za poloviční cenu.

Nemá žádné závislosti. Jen čisté PHP 8.3 a curl, žádné SDK od výrobce a žádné konflikty verzí ve tvém projektu.

</div>


K čemu je jazykový model v aplikaci dobrý
=========================================

Jestli jsi žádné AI API zatím nevolal, princip je jednodušší, než se zvenčí zdá. Pošleš text a model pošle text zpátky. Všechno ostatní jsou nadstavby nad tímhle jedním pohybem.

V praxi z toho vyroste překvapivě široká škála úloh a stojí za to je znát dřív, než se pustíš do kódu, protože podle toho poznáš, kterou část dokumentace vlastně potřebuješ:

- **Psaní a přepisování textu.** Shrnutí článku, návrh odpovědi na e-mail, překlad, korektura. Nejběžnější a nejjednodušší případ, stačí ti [obyčejná konverzace |chat].
- **Klasifikace a rozhodování.** Je tahle registrace spam? Do které kategorie patří tenhle dotaz? Model odpoví jedním slovem a ty se podle toho zachováš.
- **Vytahování dat z nestrukturovaného textu.** Z faktury, životopisu nebo e-mailu potřebuješ pole, která umíš uložit do databáze. Na to je [strukturovaný výstup |structured-output], kde modelu předepíšeš JSON schéma a on ho dodrží.
- **Odpovídání nad vlastními daty.** Model o tvé dokumentaci nic neví, ale když mu k dotazu přiložíš relevantní úryvky, odpoví přesně. Najít ty správné úryvky je práce pro [embeddingy |embeddings], což je právě to vyhledávání podle významu, kterému se říká RAG.
- **Práce s obrázky a dokumenty.** Popiš, co je na fotce, přečti údaje z účtenky, shrň přiložené PDF. Viz [obrázky a dokumenty na vstupu |multimodal].
- **Akce, ne jen text.** Model může požádat o zavolání tvojí funkce, dostat výsledek a pokračovat. Tak vzniká asistent, který se opravdu podívá do tvé databáze, místo aby si odpověď vymyslel. Viz [volání nástrojů |tools].
- **Hromadné zpracování.** Když nepotřebuješ odpověď hned, [dávkové zpracování |batch] ti dá tytéž modely za polovinu ceny.

Co AI Access naopak není: není to agentní framework, nesnaží se za tebe vymýšlet prompty ani si nedrží konverzace v databázi. Je to vrstva, která mluví s API providerů, a končí přesně tam, kde začínají rozhodnutí tvojí aplikace.


Instalace
=========

```shell
composer require ai-access/ai-access
```

Vyžaduje PHP 8.3 nebo novější a rozšíření curl, json a fileinfo, která bývají všude.


První zpráva
============

Potřebuješ klíč od providera, kterého chceš použít. Vydávají je ve svých konzolích [OpenAI |https://platform.openai.com/api-keys], [Anthropic |https://console.anthropic.com/settings/keys], [Google |https://aistudio.google.com/app/apikey], [DeepSeek |https://platform.deepseek.com/api_keys] a [xAI |https://console.x.ai/team/default/api-keys].

```php
$client = new AIAccess\Provider\OpenAI\Client($apiKey);

$response = $client->createChat('gpt-5.6-luna')
->sendMessage('Napiš haiku o PHP.');

echo $response->getText();
```

To je celé. `createChat()` otevře konverzaci nad zvoleným modelem, `sendMessage()` pošle zprávu a vrátí odpověď.

Jméno modelu je obyčejný řetězec, ne konstanta ani výčtový typ. Zní to jako maličkost, ale znamená to, že nový model funguje v den, kdy ho provider vydá, a nemusíš čekat na aktualizaci knihovny. Ověřit, že model pořád existuje, umí [seznam modelů |providers#Jaké modely provider právě nabízí].


Přepnutí providera je jeden řádek
=================================

Tohle je hlavní slib knihovny, tak ať je vidět hned. Když klient zná i model, mění se opravdu jen ten jeden řádek:

```php
$client = new AIAccess\Provider\Claude\Client($apiKey, chatModel: 'claude-sonnet-5');
$client = new AIAccess\Provider\Gemini\Client($apiKey, chatModel: 'gemini-3.5-flash-lite');
$client = new AIAccess\Provider\DeepSeek\Client($apiKey, chatModel: 'deepseek-v4-flash');
$client = new AIAccess\Provider\Grok\Client($apiKey, chatModel: 'grok-4.3');

// zbytek kódu je pro všechny stejný
$chat = $client->createChat();
```

[Jméno modelu patří ke klíči |providers#Výchozí modely], protože obojí je vlastní jednomu provideru. V reálné aplikaci si klienta zaregistruješ do [DI kontejneru |dependency-injection:] a přepnutí providera je pak změna v konfiguraci, ne v kódu.


Pět API, která se neshodnou na ničem
====================================

Když si vlastní obal nad providery napíšeš sám, u prvních dvou to vypadá na pár hodin práce. Problém začne u třetího, protože každý z nich má jinou představu o tom, jak vypadá rozhovor s modelem. Tady je malý výběr toho, v čem se liší:

| v čem se liší | Claude | OpenAI | Gemini | Grok a DeepSeek |
|----------------------------|----------------------|------------------------------------|---------------------------|--------------------|
| endpoint | `v1/messages` | `v1/responses` | `:generateContent` | `chat/completions` |
| autentizace | hlavička `x-api-key` | `Bearer` | hlavička `x-goog-api-key` | `Bearer` |
| tvar požadavku | `messages[]` | `input[]` a `instructions` | `contents[].parts[]` | `messages[]` |
| jak se jmenuje role modelu | `assistant` | `assistant` | **`model`** | `assistant` |
| klíče spotřeby tokenů | `input_tokens` | totéž | `promptTokenCount` | `prompt_tokens` |
| kde je důvod ukončení | `stop_reason` | `status`, pak `incomplete_details` | `finishReason` | `finish_reason` |

Poslední řádek má háček, který stojí za vyslovení nahlas: Gemini v `finishReason` **nikdy** neohlásí, že model chce zavolat nástroj. Zůstane tam `STOP` a samotné volání najdeš až mezi částmi odpovědi. Kdo to neví, napíše kód, který tiše ignoruje polovinu toho, co model řekl, a nedozví se o tom.

Takových drobností jsou desítky a žádná z nich není zajímavá práce. AI Access je má vyřešené a otestované proti skutečným odpovědím API, ne proti vymyšlenému JSONu.

Zároveň ale nepředstírá, že rozdíly neexistují. Sjednocuje to, co mají provideři opravdu společné, a kde se liší, dá ti to najevo typem nebo výjimkou hned při psaní kódu, ne až chybou z produkce.


Co knihovna umí
===============

| Schopnost | OpenAI | Claude | Gemini | DeepSeek | Grok | Generický klient |
|-------------------------------------------|--------|--------|--------|----------|------|------------------|
| [Konverzace |chat] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Reasoning effort |options] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Volání nástrojů |tools] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Streamování |streaming] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Obrázky na vstupu |multimodal] | ✅ | ✅ | ✅ | ➖ | ✅ | ✅ |
| [Dokumenty na vstupu |multimodal] | ✅ | ✅ | ✅ | ➖ | ➖ | ➖ |
| [Strukturovaný výstup |structured-output] | ✅ | ✅ | ✅ | ➖ | ✅ | ✅ |
| [Generování obrázků |images] | ✅ | ➖ | ✅ | ➖ | ✅ | ➖ |
| [Dávkové zpracování |batch] | ✅ | ✅ | ✅ | ➖ | ➖ | ➖ |
| [Embeddingy |embeddings] | ✅ | ➖ | ✅ | ➖ | ➖ | ➖ |
| [Seznam modelů |providers] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |

Kde je minus, tam buď provider takové API nemá, nebo ho knihovna zatím nezabaluje.

Poslední sloupec je generický klient pro cokoli, co mluví dialektem `chat/completions`: běžící Ollamu na tvém notebooku, Mistral, OpenRouter, Together, vLLM nebo Azure. Značka u něj znamená něco jiného než u ostatních, totiž co knihovna umí poslat; jestli to opravdu funguje, rozhoduje endpoint a model, na který ho namíříš. Podrobnosti najdeš u [providerů |providers].


Navržená, ne nabalená
=====================

Nastavení specifická pro providera jsou pojmenované argumenty, ne klíče ve sdíleném poli. Rozdíl poznáš hned při psaní: IDE ti u každého providera nabídne přesně to, co daný provider umí, místo aby pole tiše spolklo klíč, který nikam nedojde. K tomu striktní typy všude a readonly hodnotové objekty.

Hierarchie výjimek je postavená na jediné otázce, která v produkci opravdu dává smysl, totiž jestli má cenu volání zopakovat:

```php
try {
$response = $chat->sendMessage('...');

} catch (AIAccess\ApiException $e) {
// provider řekl ne; $e->getCode() nese HTTP status
if ($e->getCode() === 429) {
// překročený limit, zkus to za chvíli
}

} catch (AIAccess\CommunicationException $e) {
// výpadek sítě nebo nečitelná odpověď, opakování může pomoct
}
```

`LogicException` schválně stojí mimo tenhle strom, protože chyba ve tvém vlastním kódu není nic, co by měla produkce odchytávat a přecházet. Celou hierarchii rozebírá kapitola o [ošetření chyb |errors].

Opakování mimochodem nemusíš psát ručně. Knihovna má [dekorátory HTTP vrstvy |http], které umí opakovat po limitech a výpadcích, logovat každý požadavek nebo odpovědi během vývoje cachovat, aby tě opětovné spouštění skriptu nestálo peníze.


Kam dál
=======

- [Začínáme |getting-started] - klíče, první volání a co dělat, když něco nesedí
- [Konverzace |chat] - historie, systémová instrukce, čtení odpovědi a spotřeby tokenů
- [Nastavení a reasoning effort |options] - kolik přemýšlení si od modelu vyžádáš
- [Streamování |streaming] - odpověď čti, zatímco ji model teprve píše
- [Volání nástrojů |tools] - model se zeptá, tvůj kód odpoví, smyčka se uzavře sama
- [Strukturovaný výstup |structured-output] - JSON schéma místo proseb v promptu
- [Provideři |providers] - co který umí, čím se liší a jak zapojit Ollamu nebo OpenRouter

.[note]
A když si při psaní kódu necháváš pomáhat od AI agenta, mrkni na [Nette AI |ai:]. Najdeš tam plugin pro Claude Code, který agenta naučí Nette, a MCP Inspector, díky kterému se agent podívá přímo do tvojí běžící aplikace.
14 changes: 14 additions & 0 deletions ai-access/cs/@left-menu.texy
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
- [Přehled |@home]
- [Začínáme |getting-started]
- [Konverzace |chat]
- [Nastavení a reasoning effort |options]
- [Streamování |streaming]
- [Volání nástrojů |tools]
- [Strukturovaný výstup |structured-output]
- [Obrázky a dokumenty |multimodal]
- [Generování obrázků |images]
- [Embeddingy |embeddings]
- [Dávkové zpracování |batch]
- [Ošetření chyb |errors]
- [HTTP vrstva |http]
- [Provideři a modely |providers]
1 change: 1 addition & 0 deletions ai-access/cs/@meta.texy
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{sitename: AI Access}}
Loading