# Changelog

> Významné změny AYETO API.

Zde jsou uvedeny změny, které se dotýkají klientů API, od nejnovějších. Uvádějí se
i přírůstky, které nemění stávající chování (nové volitelné pole, nový endpoint),
abyste viděli, co je nově k dispozici.

## 2026-10-03

- Chybně utvořené dotazy na seznamy se odmítají s `422` a srozumitelným `detail`
  místo `500`: podmínka, která nemá 3 ani 4 prvky, prvek `filters`, který není pole
  ani objekt, objekt skupiny bez klíče nebo s několika klíči, skupina `AND` / `OR`,
  jejíž hodnota není neprázdné pole, skupiny vnořené hlouběji než do 32 úrovní,
  záporné `limit_from` a `limit_to` nižší než `limit_from`.
- Odpovědi `429` omezovače požadavků mají tělo `{"detail": "Too many requests"}` jako
  všechny ostatní chyby (klíč `reason` zmizel); `Retry-After` se nemění.
- Na chybějící rozsah API klíče se všude odpovídá `401` `API key is invalid`.
- Endpointy `.../get` a `.../delete` přijímají id i v těle JSON `{"id": "<uuid>"}`;
  parametr dotazu `entity_id` dál funguje. Když chybí obojí, nebo jde o dvě různá id,
  vrací se `422`. Tělo, které jim posíláte, musí být JSON.
- Nové `POST /user_credit/get_self` a `POST /version` (GET dál funguje a sdílí limit
  požadavků); `/version` má limit požadavků úrovně static (1 200 požadavků za minutu).
- `POST /ai_tool/get_all` už nevrací skryté ani zastaralé nástroje.
- Nový `POST /conversation/count` (rozsah `ayeto.conversation`, stejné tělo jako
  `/conversation/find`).
- Náklady konverzace (`POST /usage/cost/conversation`) jsou součtem skutečně
  účtovaných kreditů, ne přepočtem podle aktuálních cen; zahrnují textové tokeny
  obrázkových modelů a už neselhávají s `404` u modelů, které byly mezitím odebrány.
- Chat s modelem, který neumí streamovat, odpověď uloží a vrátí (dříve se odpověď
  modelu ztratila a požadavek vracel zprávu uživatele).
- Přílohy chatu se kontrolují a ukládají ještě před vším ostatním: příloha odmítnutá
  s `422` (`file is too large`, kvóta úložiště, neplatná data) už po sobě nenechává
  zprávu uživatele. Chybně utvořený base64 vrací `422` `invalid base64 data in attachment
  '<filename>'` (nebo `invalid data URI in attachment '<filename>'`) místo `500`.
  Pole `size` u příloh už není povinné a ignoruje se.
- Navazující zpráva chatu ke konverzaci vytvořené v organizaci běží v této organizaci,
  když požadavek žádnou organizaci neuvádí (účtuje se tam, vyžaduje se členství);
  uvedení jiné organizace vrací `422` `the conversation belongs to another
  organization`. Konverzace jiného uživatele se odmítne s `403` dřív, než se uloží
  jakákoli příloha.
- Strukturovaný stream chatu (`runner_version` `"2"`) už neposílá nepoužívané pole
  `iteration`.
- Booster databáze: vytvoření záznamu s klíčem, který už existuje, vrací `422`
  `a record with key '<key>' already exists` místo `500`; `limit_from` bez
  `limit_to` vrací až 100 záznamů od `limit_from` (`limit_from` musí být menší
  než `1000`); chybně utvořené filtry `AND` / `OR` vracejí `422` místo `500`.
- Data loader: nepodporované typy souborů vracejí `422` `unsupported file type '<mime>'`
  a neúčtují se.
- Workflow: soubor uvedený svým id ve vstupu běhu zůstává uživateli a už se nemaže
  spolu s během (soubory poslané jako base64 dál patří běhu).

## 2026-10-02

- Pravidla kolekcí booster databáze platí jen pro panely v režimu veřejné databáze;
  v soukromém režimu se ignorují. Uživatelé, se kterými je panel sdílen jen pro čtení,
  teď mohou zapisovat jeho záznamy a brát zámky (v obou režimech).
- `POST /tts/mp3` vyžaduje nový rozsah `ayeto.tts` a `POST /data-loader/load` nový
  rozsah `ayeto.data_loader`. Stávající API klíče dostaly oba rozsahy; klíče vytvořené
  spárováním desktopového klienta (jen `ayeto.connector`) už tyto endpointy volat nemohou.
- `POST /tts/mp3` a `POST /data-loader/load` přijímají volitelné `organization_id`:
  požadavek běží v organizaci a účtuje se z kreditu uživatele v ní (jen administrátoři
  a členové; hosté a nečlenové dostanou `403`).
- `POST /tts/mp3` vrací `422` s `not enough user credit` / `not enough organization
  credit`, když dojde kredit, místo `500` `Failed to generate audio`.
- Chat odmítne model vypnutý administrátory (požadovaný přímo nebo jako model
  asistenta) s `422` `model is disabled` a automatický model bez dostupného modelu
  s `422` `model is not available`; `model is deprecated` se vrací dřív, než se
  na konverzaci sáhne.
- Čtení konverzace jiného uživatele přes `/conversation/get` (odmítnuté s `404`) už
  neaktualizuje její pole `accessed`.
- Hlavička `language` požadavku API už nemění preferovaný jazyk uživatele v aplikaci
  AYETO (dříve ho každý požadavek uložil a požadavek bez hlavičky ho vrátil na
  angličtinu).
- `POST /assistant/avatar/get` přijímá API klíče s novým rozsahem `ayeto.assistant`,
  který lze nyní vybrat při vytváření klíče (pokrývá i `/assistant/find`).
- Nová dokumentace API v3, která nahrazuje dřívější poznámky k betaverzi.
- Workflow jsou dostupná v API: čtení, spouštění, streamování běhů, schvalování,
  úpravy, publikování, export a import (`ayeto.workflow`, `ayeto.workflow.write`).
- Soukromé API booster databáze s vlastními rozsahy (`ayeto.booster.database`,
  `ayeto.booster.database.write`).
