Obrázky a dokumenty na vstupu

Ke zprávě můžeš přiložit fotku nebo PDF a ptát se na jejich obsah. Ukážeme si, jak se soubor přikládá, co který provider akceptuje a proč se přiložený obrázek platí znovu v každém dalším kole konverzace.

Zeptej se na obrázek

Zpráva nemusí být jen text. Když jí místo řetězce předáš pole, může v něm být kromě textu i soubor:

use AIAccess\Media;

$chat = $client->createChat('gpt-5.6-luna');

$response = $chat->sendMessage([
	'Co je na tomhle obrázku?',
	Media::fromFile('/cesta/k/fotce.jpg'),
]);

echo $response->getText();

Media::fromFile() soubor načte a typ obsahu si zjistí sám, takže mu nemusíš nic říkat. Model pak vidí obrázek i otázku najednou a odpoví na obojí.

Tímhle způsobem se dá řešit překvapivě dost práce: přečíst údaje z účtenky nebo faktury, nechat si k fotce napsat popisek pro nevidomé, přečíst chybovou hlášku ze snímku obrazovky, který ti poslal uživatel, nebo ověřit, jestli nahraná fotka opravdu ukazuje to, co má.

Když soubor nemáš na disku

Obrázek často přichází z formuláře nebo z databáze a na disku vůbec není. Na to je fromBinary(), kterému předáš data a typ obsahu:

$media = Media::fromBinary($bytes, 'image/png');

Jméno souboru je volitelný třetí argument. U obrázků na něm nezáleží, u dokumentů ho ale OpenAI vyžaduje a modelu ho ukazuje, takže jméno jako faktura-2026-03.pdf samo o sobě nese informaci. Když ho nezadáš, knihovna doplní obecné podle typu obsahu, aby požadavek nespadl.

Dokumenty, hlavně PDF

Dokumenty se přikládají úplně stejně jako obrázky:

$response = $chat->sendMessage([
	'Shrň mi hlavní body téhle smlouvy.',
	Media::fromFile('/cesta/ke/smlouve.pdf'),
]);

Liší se jen tím, kteří provideři je přijmou. Model si poradí i s tabulkou nebo formulářem, tedy s tím, na čem si běžná textová extrakce v PHP vyláme zuby. PDF tedy nemusíš předem převádět na text.

Co který provider přijme

Provider Obrázky Dokumenty
OpenAI
Claude
Gemini
Grok
DeepSeek

DeepSeek zatím nemá žádný model, který by viděl; Grok obrázky přijímá, ale dokumenty ne.

Když providerovi pošleš obsah, který neumí zpracovat, nedozvíš se to až z chyby API. Knihovna to pozná ještě před odesláním a vyhodí AIAccess\LogicException se jménem typu obsahu, takže víš rovnou, co bylo špatně:

DeepSeek cannot send image/png content: it has no vision model.

Tuhle výjimku nemá smysl odchytávat a požadavek opakovat. Říká, že posíláš obrázek modelu, který nevidí, a to žádné další odeslání nespraví; oprava patří do kódu, třeba volbou jiného providera.

Obrázek v historii se platí znovu

Tohle je nejčastější nepříjemné překvapení na účtu. Přiložený obrázek se stane součástí historie konverzace, a protože se s každým dalším dotazem posílá celá historie znovu, posílá a platí se znovu i ten obrázek.

Změřeno na jednoduchém příkladu: první kolo s obrázkem stálo 49 vstupních tokenů, druhé kolo, ve kterém už šlo jen o textovou doplňující otázku, jich stálo 64. Rozdíl nedělá ta krátká otázka, ale obrázek poslaný podruhé.

U velkých obrázků a delších konverzací to roste rychle. Dají se s tím dělat tři věci:

  • Zeptej se na obrázek najednou. Když víš, co všechno z něj potřebuješ, zeptej se na to v jedné zprávě místo v pěti.
  • Po vytěžení obrázku začni nanovo. Odpověď modelu si ulož a konverzaci vyčisti přes clearMessages(); dál pokračuj nad textem, který už obrázek popisuje.
  • Zmenši obrázek předem. Cena roste s rozlišením, a na otázku „je na faktuře razítko“ stačí menší obrázek než na čtení drobného písma.

Kam dál