# AI Coach: návod pro AI agenta > Zdroj: https://ongy.cz/pages/ai/coach/ > Autor: Ongy (ongy.cz). AI Coach: osobní trenér v Telegramu na Claude API. Foto jídla na kalorie, hlasovky, připomínky cvičení, váha automaticky z Home Assistantu. Co umí, co stojí a co mě naučil provoz. ## Pro agenta Pomoz uživateli postavit vlastní verzi tohohle projektu. Nejdřív se ho zeptej na vybavení a na to, co z požadavků už má. Pak postupuj po krocích a po každém kroku s ním ověř, že funguje, než půjdeš dál. Hodnoty v `` doplň s uživatelem, nikdy si nevymýšlej adresy, hesla ani tokeny. Kód autora není veřejný: tohle je popis řešení, ne repozitář ke stažení. ## Cíl Osobní trenér v Telegramu: fotka nebo popis jídla se promění v odhad kalorií a maker, hlasovka projde stejnou cestou jako napsaná zpráva, ráno a večer přijde připomínka cvičení s tlačítky a váha se stahuje sama z Home Assistantu. Bot běží v Dockeru na domácím serveru, data drží v lokální SQLite a nepotřebuje žádný otevřený port. Odpovídá jen jednomu povolenému chatu, ostatní zprávy zahodí. ## K čemu to je Hubnutí a cvičení padá na zapisování. Počítat kalorie z hlavy, vést tabulku, pamatovat si vážení. Po týdnu to vzdá každý. Tak jsem si postavil bota do Telegramu. Vyfotím talíř a dostanu odhad kalorií a maker. Řeknu do mikrofonu „dal jsem si oběd“ a je zapsáno. Ráno a večer přijde připomínka cvičení s konkrétní sestavou. Váhu nezadávám. Stoupnu na chytrou váhu a hodnota doputuje přes Home Assistant do bota sama. ## Proč právě takhle Fitness aplikace jsem zkoušel několikrát. Vždy stejný konec: další ikona, další formulář, po pár týdnech ticho. Chtěl jsem nástroj, který rozumí tomu, co mu normálně napíšu. A chtěl jsem trenéra, ne tabulku. Někoho, kdo ráno řekne, co dělat, a večer se zeptá, jestli jsem to udělal. ## Jak to funguje - **Každá zpráva nejdřív projde tříděním.** Sonnet pozná, jestli jde o jídlo, cvičení, dotaz nebo nápad. - **Fotky jídla řeší silnější model.** Opus odhadne porci a makra. Když nesedí, odpovím opravou a bot přepočítá. - **Hlasovka je totéž co text.** Whisper ji přepíše a dál jde stejnou cestou. - **Tělo měří Home Assistant.** Chytrá váha a hodinky posílají váhu, složení těla, kroky a tep. Bot si je čte sám. ## Stack a modely - **Modely:** Claude Opus jen na vision (odhad porce a maker z fotky). Claude Sonnet na rozpoznání záměru, klasifikaci zprávy a odpovědi na dotazy. Prompty laděné na české porce. - **Hlas:** Whisper přepíše hlasovku na text, dál jde stejnou cestou jako napsaná zpráva. - **Data:** SQLite na home serveru: jídla, cvičení, váha, složení těla, nápady, log volání API. Migrace s ochranou proti chybám. Záloha databáze každou noc na serveru (drží 30 dní), jednou týdně celý projekt bez tajných klíčů přes rclone na Google Drive. - **Home Assistant:** Chytrá váha přes Bluetooth a Galaxy Watch (kroky, tep, klidový tep, HRV, spálené kalorie). Bot čte hodnoty z HA history API, nic se nezadává ručně. ## Co to stojí | Období | USD | CZK | |---|---|---| | Denně | ~0,11 $ | ~2,5 Kč | | Měsíčně | ~3,20 $ | ~75 Kč | | Ročně | ~38 $ | ~900 Kč | Tenký obal kolem Anthropic klienta zapíše u každého volání model, tokeny a cenu do databáze; `/usage` ukáže skutečnou útratu přímo z účtu Anthropic (Admin API). Hlavní náklad je Opus vision, ~0,02 $ za talíř. Klidné dny jsou v haléřích, vývojové dražší; běžné používání vyjde spíš na ~60 Kč měsíčně. Kurz ~23,5 Kč/$, ceny modelů ověřené proti Admin API. ## Korekce, režimy a vývoj Oprava odhadu jde přes odpověď na původní zprávu (reply): bot vezme svůj odhad, moje upřesnění a přepočítá. Kolikrát opravuju, je zároveň barometr přesnosti modelu. Režim kouče (pohodový, šťouchavý, přísný, opatrný) se volí z posledních 7 dní: počet vynechaných cvičení a hlášená bolest. Hlášení bolesti vyřadí rizikové cviky na několik dní. Scheduler posílá ranní a večerní push, nedělní e-mail shrne týden. Nový příkaz vždy přidávám i do `/info`, aby existoval jediný seznam toho, co bot umí. Projekt není v gitu, jde o osobní zdravotní data. ## Co budeš potřebovat - Stále běžící stroj s Dockerem (autor: notebook jako domácí server). Veřejná adresa ani otevřený port potřeba nejsou, bot si zprávy stahuje sám (long polling). - Telegram a vlastní bot od @BotFather: `` a ID svého chatu ``. Jeden token smí číst jen jeden proces. - Claude přes API `` s nastaveným limitem útraty (autor: silnější model Opus jen na odhad jídla, levnější Sonnet na zbytek, provoz kolem 75 Kč měsíčně). - Přepis hlasovek: Whisper přes API `` (autor) nebo lokální Whisper, pokud to server utáhne. - Volitelně Home Assistant s chytrou váhou a daty z hodinek nebo telefonu a dlouhodobý token `` (autor: váha přes Bluetooth, hodinky přes Health Connect a aplikaci Home Assistant v telefonu). - Volitelně SMTP schránka pro týdenní souhrn `` / `` (heslo aplikace) a místo mimo server pro zálohy. - Vlastní cíle a sestavy cviků. Pokud máš zdravotní omezení, sestavu i vyřazování cviků při bolesti konzultuj s odborníkem, bot lékařské rady dávat nemá. ## Postup ### 1. Telegram bot a whitelist Založ bota u @BotFather a zjisti ID svého chatu. Bot běží v režimu long polling (žádný webhook, žádný port). Kontrolu `` dej na všechny vstupy: příkazy, text, fotky, hlasovky i stisky tlačítek (callback). Zprávu z cizího chatu nejdřív zaloguj a pak zahoď, jinak se v logu nedá poznat, jestli vůbec přišla. Pro každého bota vlastní token, dva procesy na jednom tokenu si kradou zprávy. ### 2. Kostra a konfigurace Python 3.12 v Dockeru pod neprivilegovaným uživatelem, `restart: unless-stopped`, `TZ` na místní časové pásmo a jedna složka `/data` připojená z hostitele (databáze, fotky jídel, lokální zálohy). Autor používá python-telegram-bot, APScheduler, anthropic, openai (jen Whisper) a matplotlib na grafy. Všechno nastavitelné (tokeny, názvy modelů, časy připomínek, ID entit v Home Assistantu) patří do `.env` s právy 600, načtené do jedné typované konfigurace. Model pro jídlo a model pro ostatní ať jsou dvě samostatné proměnné. ### 3. Datový model v SQLite Tabulky: `meals` (čas, kcal, bílkoviny, tuky, sacharidy, vláknina, popis od AI, varování, cesta k fotce, popisek od uživatele, ID odpovědi bota a chatu kvůli opravám, historie oprav), `weights` (jeden záznam za den, UNIQUE na datum, volitelně složení těla a zdroj), `exercise_sessions` (datum, ráno nebo večer, stav done/skipped/pain, důvod, místo bolesti, UNIQUE na datum a část dne), `exercises` (knihovna cviků: část dne, slug, název, série, popis provedení, pořadí, příznak aktivní pro měkké mazání), `exercise_skips` (slug cviku a do kdy je vyřazený), `daily_metrics` (denní snímek z Home Assistantu), `ideas` (nápady se stavem open/done/dropped) a `settings` (klíč a hodnota pro režimy a příznaky migrací). Zápisy jako UPSERT, migrace doplní chybějící sloupce podle `PRAGMA table_info` a jednorázové datové migrace si po úspěchu zapíšou příznak do `settings`. ### 4. Třídění zpráv podle záměru Hlasovku nejdřív přepiš na text, dál jde stejnou funkcí jako napsaná zpráva. Levnější model dostane text a vrátí JSON s akcí z pevného výčtu, u autora: váha, jídlo, cvičení hotové, cvičení přeskočené s důvodem, bolest, nápad, otázka. Akci pak provede kód, ne model. Odpověď (reply) na zprávu bota je vyhrazená pro opravu odhadu a tříděním neprochází. U fotky nejdřív klasifikace: talíř, papír s cviky (model vytáhne cviky a bot se zeptá, jestli ranní, nebo večerní), jídelní lístek (doporučí pokrm podle zbývajícího denního rozpočtu), nebo nic z toho. ### 5. Odhad jídla a opravy Fotku ulož na disk a pošli silnějšímu modelu s obrázkem. Systémový prompt: odhaduj porce podle místní kuchyně, počítej se skrytým tukem v omáčkách a v restauraci, v pochybnostech jdi spíš výš, popisek od uživatele má přednost před tím, co je vidět. Výstup jen JSON (popis, položky, kcal, makra, varování, tip). Záznam ulož, odpověz souhrnem se součtem za den a zbytkem do cíle a k záznamu si zapiš ID své odpovědi. Když uživatel na tuhle zprávu odpoví upřesněním, dohledej záznam podle chatu a ID zprávy, pošli modelu fotku, původní odhad i upřesnění, přepiš hodnoty a přidej řádek do historie oprav. Posledních zhruba osm opravených jídel vkládej do promptu jako kalibrační příklady. ### 6. Cvičení, režimy a kouč Knihovna cviků žije v databázi (YAML jen jako počáteční náplň), aby šla měnit bez nového buildu. Připomínka pošle sestavu s tlačítky Hotovo, Přeskočit (výběr důvodu) a Bolí (výběr místa). Režim kouče počítá čistá funkce nad posledními 7 dny záznamů cvičení. Místo bolesti se mapuje na slugy cviků, které se na několik dní vyřadí, a po třech dnech bolesti v řadě bot doporučí odbornou kontrolu. Hlášky kouče generuje levnější model s tónem podle skóre, v promptu výslovně: mluv přímo na uživatele, nikdy neurážej, žádné lékařské rady. Když API selže, vyber hlášku ze statického seznamu pro daný tón. ### 7. Plánovač a odesílání APScheduler s místním časovým pásmem: ranní a večerní připomínka (autor má o víkendu ranní později), stažení váhy, noční tichý snímek metrik, noční záloha databáze přes `VACUUM INTO` s držením posledních N kopií a týdenní souhrn e-mailem s grafy. Všechny zprávy z plánovače posílej přes jeden pomocník s opakováním při síťové chybě. Autor má navíc dva přepínače uložené v `settings`: dovolená (mění režim, bez kalorického limitu) a ticho (jen ztlumí připomínky, cíle platí dál). Ticho kontroluj v jobech i v pomocníkovi pro odeslání a chybové hlášky pouštěj vždy. ### 8. Napojení na Home Assistant Bot se ptá Home Assistantu přes REST s tokenem `` a ID entit z `.env`. Váhu ber z historie entity za okno kolem 36 hodin, ne z aktuálního stavu, a ulož jen měření z dneška. Platí první zápis dne: pozdější vážení ranní hodnotu nepřepíše. Když Home Assistant nic nemá, zůstává ruční zápis příkazem nebo hlasovkou. Kroky a další metriky ukládej jednou denně do `daily_metrics`. ### 9. Náklady, zálohy a vývoj Útratu sleduj proti skutečnému účtu (autor: příkaz `/usage` a `/kredit` v chatu), ne jen podle vlastního ceníku. Příkaz `/napad` ukládá nápady do fronty, kterou projdeš při další vývojové session. Nový příkaz přidej vždy i do `/info`, aby existoval jeden seznam. Projekt s osobními daty nepatří do veřejného gitu. Zálohu celého projektu posílej mimo server bez `.env` (autor: rclone na Google Drive jednou týdně, lokální záloha databáze denně) a ideálně šifrovaně. ## Na co si dát pozor - SQLite `DEFAULT (datetime('now'))` je vždy UTC bez ohledu na `TZ` kontejneru. Čas zápisu posílej z Pythonu, nebo použij `datetime('now', 'localtime')`, jinak budou záznamy o hodiny posunuté. - Krátký výpadek sítě přesně v čas připomínky shodí celý job a zpráva přijde až další den. Opakuj jednotlivé zprávy s rostoucí pauzou (autor: 6 pokusů, zhruba 4 minuty), ne celý job, a po úspěšném ranním odeslání si zapiš datum, aby pozdější job zmeškanou připomínku dohnal. - Home Assistant history API: bez parametru `end_time` vrátí jen jeden den od začátku okna a prázdný `minimal_response=` vrátí prázdný seznam. Parametr buď vynech, nebo pošli bez hodnoty. - Číslo z přepisu hlasovky validuj stejně jako z příkazu (autor: váha 40 až 200 kg), přeslech jinak zapíše nesmysl. Mazání jídla dej jen na tlačítko, příkaz nebo reply, ne na rozpoznaný záměr, chybná klasifikace by mazala data. - Text od modelu vkládaný do zpráv v HTML režimu Telegramu escapuj, jinak zprávu shodí špičatá závorka z názvu cviku. Model občas vrátí markdown `**tučně**`, který v Telegramu zůstane jako hvězdičky. - `docker compose restart` nepřebírá změny v `.env`, použij `docker compose up -d --force-recreate`. Když kód není do kontejneru připojený, každá změna potřebuje `--build`. Syntaktickou chybu build nepozná a kontejner spadne až při startu, proto před buildem aspoň `python -m py_compile` nebo `ast.parse`. - Ceník v kódu si ověř proti skutečné útratě na účtu. Autor měl u jednoho modelu v ceníku trojnásobnou cenu a vlastní odhad útraty byl proto úplně mimo. - Ztlumení bota nesmí zastavit sběr dat ani umlčet chybové hlášky. Tichý bot, kterému tiše selhává záloha, přichází o data a nikdo to nevidí. ## Jak ověřit, že to funguje - [ ] `/ping` z povoleného chatu odpoví do pár sekund. Zpráva z jiného účtu nedostane odpověď a v logu je vidět jako zahozená. - [ ] `docker port ` nevypíše nic: bot nepublikuje žádný port. - [ ] Fotka talíře: do 30 sekund přijde odhad s kcal a makry a v tabulce `meals` přibude řádek s cestou k fotce a ID odpovědi bota. - [ ] Reply „bylo to 900 kcal“ na odhad přepíše hodnoty téhož řádku (počet řádků v `meals` se nezmění) a sloupec s historií oprav není prázdný. - [ ] Hlasovka nebo text „vážím 80,5“ zapíše dnešní váhu. „Vážím 8,05“ bot odmítne a nic neuloží. - [ ] Druhé vážení během dne nepřepíše první: hodnota v `weights` pro dnešek zůstane ranní. - [ ] Nový záznam má `created_at` v místním čase, rozdíl proti hodinám serveru je pod minutu. - [ ] Při čase připomínky nastaveném na nejbližší minutu přijde zpráva včas. Při dočasně odpojené síti v tu minutu dorazí po obnovení spojení, a to jen jednou. - [ ] Tři přeskočená cvičení během 7 dní přepnou další připomínku do přísného tónu. Hlášená bolest zad vyřadí příslušné cviky z nejbližší sestavy. - [ ] Ráno existuje nová záloha databáze, jde otevřít přes `sqlite3` a obsahuje včerejší záznamy. V záloze mimo server není `.env`. ## Přizpůsobení - Bez Home Assistanta: váhu a kroky zapisuj ručně příkazem nebo hlasovkou, zbytek bota funguje stejně. - Jeden model na všechno: levnější varianta stačí na třídění a odpovědi, ale počítej s podhodnocenými porcemi (autor to tak měl u fotek jídla). Kompenzuj opravami přes reply a kalibračními příklady z nich. - Jiný cíl než hubnutí: stejná kostra (záměr, akce, databáze, plánovač) poslouží na nabírání svalů, doplňky nebo učení jazyka. Změň výčet záměrů, tabulky a prompt kouče. - Pro víc lidí: whitelist na víc chatů, sloupec s ID uživatele ve všech tabulkách a cíle i omezení zvlášť pro každého. Zdravotní data jednotlivých lidí drž oddělená a nesdílej je v jednom promptu. --- Stránka projektu s fotkami a diagramem: https://ongy.cz/pages/ai/coach/