Do Telegramu napíšete /kamsevydat Kolín 25. Hermes vyhledá zajímavosti, spočítá cestu na kole a nabídne tři cíle pro výlet dlouhý přibližně 25 kilometrů tam i zpět. Když některý navštívíte nebo o něj nestojíte, stačí to napsat zpátky. Příště už ho agent vynechá.

Tohle není další chatbot, který z paměti chrlí tipy na výlet. Skill /kamsevydat je osobní nástroj pro cyklistu, který chce najít místo, kde je něco k vidění nebo vyfotografování.
Stačí napsat místo a vzdálenost
Povel má tvar /kamsevydat [místo] [km]. Místo i počet kilometrů jsou nepovinné a mohou být v libovolném pořadí. Agent pozná číslo jako vzdálenost a zbytek jako místo.
Samotné /kamsevydat použije autorův přednastavený výchozí bod v pražských Hrdlořezích a vzdálenost 15 kilometrů na celý výlet tam i zpět. Skutečná délka cesty se může od zadané vzdálenosti lišit o 20 %, tedy zhruba 12 až 18 kilometrů. Počítá se cesta na kole, ne čára na mapě.
Výsledkem jsou tři očíslované návrhy. Po výletě lze napsat třeba /kamsevydat splneno 2 a označit druhé místo jako navštívené. Pokud místo neláká, použije se /kamsevydat nechci 1. Lze označit i více návrhů najednou. Při dalším hledání se navštívené a odmítnuté cíle vyřadí.
Výběr není žebříček nejlepších výletů. Z vhodných míst se vybírají tři náhodná. Dva blízké cíle přitom nemusí vadit, protože se dají spojit do jednoho výletu. Opakovaný povel proto může přinést jiné návrhy.

Tři zdroje, tři různé úkoly
Skill nemá vlastní katalog turistických míst. Hledání skládá z veřejných zdrojů. OpenStreetMap dodá kandidáty, například vyhlídky, rozhledny, hrady nebo zříceniny. Konkrétně se nad jeho daty hledá přes Overpass API.
Pak přichází na řadu Mapy.com Routing API, které spočítá cestu na kole ke kandidátovi. Díky tomu se místo neposuzuje jen podle vzdálenosti vzdušnou čarou. Výsledek zahrnuje také odhad převýšení a typu cesty i obce po trase.
O tom, proč by místo mohlo stát za návštěvu, má napovědět Wikidata nebo text z Wikipedie dostupný přes MediaWiki API. Pokud k místu není použitelný popis, skill si nevymyslí příběh. Může uvést jen věcný typ místa podle mapových dat, nebo ho vynechat.
Jinými slovy: jeden zdroj pomůže najít, co je v okolí, druhý změří cestu na kole a třetí dodá kontext. Agent tyto kroky spojí, vybere tři kandidáty podle zadané vzdálenosti a zohlední, co už uživatel označil. V testovacím běhu se mezi návrhy objevila například vyhlídka Skála Rozloučení.
Proč je to agent a ne jen odpověď chatbota
Na otázku „kam na výlet?“ může běžný chatbot odpovědět podle toho, co má v naučených datech. Tady ale samotná znalost modelu nestačí: je potřeba najít aktuální mapové objekty, spočítat trasy, doplnit popis a vyřadit místa z předchozích výletů. Jde o několik návazných úkonů, které agent provede pomocí nástrojů a uloženého stavu.
To je i důležitá brzda proti halucinacím. Když zdroj neposkytne dost informací, správným výsledkem není hezky znějící, ale smyšlené povídání. Databáze mohou být neúplné a ani popis z Wikipedie nezaručuje, že místo bude zajímat každého. Nástroj nabízí kandidáty, ne záruku nejlepšího výletu.
Zajímavá je i cesta od zadání k hotovému nástroji. První návrh připravil offline Claude bez internetu a nástrojů. Navrhl například konfiguraci v YAML, ale pro jednoduchý program v Pythonu se nakonec použil JSON, protože Python YAML bez další knihovny neumí přečíst. Před psaním kódu se také ověřily podrobnosti Mapy.com API. Návrh se tedy nejdřív prověřil a upravil, až potom se řešení programovalo a testovalo.
# Zadání: skill `kamsevydat` pro Hermes Agent
## Cíl
Hermes skill, který na povel `/kamsevydat` doporučí cíl cyklovýletu: místo, kde je něco k vidění a ideálně k vyfocení. Pamatuje si, kde už uživatel byl (`/splneno`) a kam nechce (`/nechci`), a tato místa znovu nenabízí.
Princip: **KISS.** Žádné počasí, otevírací doby ani hodnocení. Co není v tomto zadání, nedělat.
## Umístění
- Vše leží v repu `hermes-skills` jako podsložka `kamsevydat/`, včetně datového souboru (kvůli git syncu mezi minis a Mac mini).
- Repo je do Hermes napojené přes `skills.external_dirs`.
Navržená struktura (implementátor může upravit, pokud to Hermes vyžaduje):
```
kamsevydat/
SKILL.md # instrukce pro agenta, frontmatter name/description
config.yaml # výchozí start, vzdálenost, tolerance, formát odkazu, API klíč přes env
scripts/
kamsevydat.py # hledání kandidátů, routing, výběr
evidence.py # /splneno, /nechci, zápis + git sync
data/
places.json # splněná a nechtěná místa
last.json # poslední doporučení (aby /splneno věděl, co označit)
```
**Ověřit v dokumentaci Hermes:** jak se skilly mapují na slash příkazy. Pokud jeden skill = jeden příkaz, udělat tři tenké skilly (`kamsevydat`, `splneno`, `nechci`), které sdílejí skripty a data v jedné složce.
## Příkazy
### `/kamsevydat [místo] [km]`
Oba parametry jsou volitelné, na pořadí nezáleží (číslo = km, zbytek = místo).
- **místo**: výchozí bod. Když chybí, použije se `config.yaml` → Praha Hrdlořezy. Souřadnice Hrdlořez zjistit geokódováním jednou při setupu a uložit do configu natvrdo. Zadané místo (např. „Kolín“, „Černý Most“) se geokóduje přes Mapy.com API.
- **km**: vzdálenost **jedním směrem**, výchozí 15 (tj. výlet celkem ~30 km). Tolerance ±20 %, tedy při 15 km přijatelný cíl 12–18 km po trase.
Příklady: `/kamsevydat`, `/kamsevydat 20`, `/kamsevydat Kolín`, `/kamsevydat Kolín 25`.
### `/splneno [1|2|3]`
Označí místo z posledního doporučení jako navštívené. Bez čísla = hlavní doporučení (1). Zapíše do `places.json` se stavem `visited` a datem.
### `/nechci [1|2|3]`
Totéž, stav `rejected`. Místo se už nikdy nenabídne.
## Postup hledání (`kamsevydat.py`)
Místa se berou **z dat, ne z paměti modelu.** LLM jen píše text nad nalezenými fakty.
1. **Kandidáti z OpenStreetMap (Overpass API)** v mezikruží kolem startu, vzdušnou čarou zhruba 0,6× až 1,2× cílové vzdálenosti.
Tagy:
- `tourism=viewpoint`
- `man_made=tower` + `tower:type=observation`
- `historic=castle|ruins|archaeological_site|monastery|manor`
- `tourism=attraction`
- kostely, kapličky, technické památky apod. **jen pokud mají tag `wikidata` nebo `wikipedia`**
Filtr kvality: vyhlídky a rozhledny projdou vždy, všechno ostatní jen s `wikidata`/`wikipedia`. Tím odpadnou pamětní desky a boží muka bez příběhu.
2. **Vyřadit** vše z `places.json` (visited i rejected). Shoda podle souřadnic do 300 m, ne podle názvu.
3. **Routing přes Mapy.com API** (cyklistický profil) pro omezený vzorek kandidátů (max. ~25, kvůli limitům API). Ponechat jen ty s délkou trasy v toleranci. API klíč z env proměnné, ne v gitu.
4. **Výběr 3 míst:** náhodně vážený výběr z vyhovujících (ne vždy „nejlepší“), aby opakované volání dávalo různé výsledky. Preferovat, aby tři místa nebyla stejným směrem.
5. **„Kudy“:** z geometrie trasy reverzně geokódovat 2–3 body (cca 1/3, 2/3) a získat názvy obcí/čtvrtí, přes které se jede. Plus světová strana.
6. **„Proč tam jet“:** text z české Wikipedie přes sitelink z Wikidat. Když chybí, fallback Firecrawl (už je nastavený). Když ani to nic nedá, místo vyřadit nebo popsat jen z OSM tagů, nevymýšlet.
7. Uložit trojici do `last.json`.
Skript vrací strukturovaný JSON, agent z něj složí odpověď.
## Formát odpovědi (Telegram)
Krátce, česky. Hlavní doporučení + 2 záložní, každé:
- **Název** a jedna věta, co to je
- **Proč tam jet:** 2–3 věty, co je tam k vidění a co vyfotit
- **Kudy:** směr + „přes X a Y“, délka trasy tam (a celkem tam a zpět)
- **Souřadnice** (desetinné, pro vložení do cyklonavigace) + odkaz do mapy
**Odkaz NE na Mapy.com.** Výchozí: Google Maps (`https://www.google.com/maps/search/?api=1&query=LAT,LON`). Formát odkazu nastavitelný v `config.yaml` (šablona s `{lat}` a `{lon}`), aby šel změnit bez zásahu do kódu.
Na konci jeden řádek: `/splneno 1–3 · /nechci 1–3`.
## Data (`places.json`)
```json
[
{
"name": "Rozhledna XY",
"lat": 50.0,
"lon": 14.0,
"osm_id": "node/123",
"status": "visited",
"date": "2026-09-27"
}
]
```
Čitelné, ručně editovatelné (uživatel může místo přidat nebo smazat i ručně).
## Git sync
- Před čtením dat `git pull --rebase`, po zápisu `git commit` + `git push` (jen soubory v `kamsevydat/data/`).
- Selhání pushe nesmí shodit příkaz: zapsat lokálně, oznámit, zkusit příště.
- **Ověřit:** jestli `skills.write_approval: true` zasahuje i do zápisu datových souborů skriptem. Záměr: data se zapisují volně, schvalování platí jen pro úpravy instrukcí/kódu skillu. Pokud to koliduje, přesunout jen `data/` mimo schvalování (a zdokumentovat jak).
## Mimo rozsah (Future TODO)
- Počasí / vítr
- `/splneno` s volným textem (místo, které agent nedoporučil)
- Export trasy do GPX
Python dělá práci, Telegram ji zpřístupní
Program je napsaný v Pythonu, ale Telegram je médium, kterým se zadání i výsledek dostanou k uživateli. To je praktické hlavně ve chvíli, kdy je člověk už venku, sedí na kole a ještě se nerozhodl, kam vyrazit: pošle krátkou zprávu a dostane návrhy do stejného chatu. Hermes podporuje Telegram jako komunikační kanál agenta.
Samotný program v Pythonu by mohl hledat stejná místa i počítat stejné trasy. Bylo by ale potřeba také vyřešit, jak se spouští, jak zadat místo a vzdálenost a jak označit konkrétní tip jako navštívený. Program v Pythonu může mít webové rozhraní nebo vlastního Telegramového bota; nejde o něco, co by Python neuměl. V tomto případě se autor opírá o prostředí Hermesu, ve kterém už používá další schopnosti, a o Telegram, přes který mu výsledek přijde.
Přínos tedy není v tom, že Telegram počítá trasy nebo že Hermes je jediný možný agent. Telegram předává zprávu a doručí odpověď, Hermes spouští příslušný skill a program v Pythonu pracuje se zdroji. I po první odpovědi lze zůstat v témže chatu a označit tip jako splneno nebo nechci. Podobně je Telegram použit jako komunikační kanál i v příkladu Hermesova Daily Briefing Bota. Obecnější vysvětlení agentů najdete ve starším tipu o agentských AI systémech.
Jestli už máte vlastní skript v Pythonu a vyhovuje vám, není důvod ho přepisovat jen kvůli AI agentovi. /kamsevydat ukazuje jinou možnost: propojit malý účelový program s asistentem a ovládat ho běžnou zprávou, včetně jednoduché paměti pro další doporučení.
POZNÁMKA: Jak autor „Hermes Bot“ napovídá, tip psal SKILL pro 365tipů, který je také Hermes. Dohledává odkazy, související vnitřní i hodící se vnější. Málokdy napíše něco na první dobrou, někdy nedělá co má (jako například že má nejpre udělat rešerší, teprve po odsouhlasení se pustit do článku). Ale je je to Hermes Agent a z každých omylů a nedostatků se „učít“ – SKILL aktualizuje a doplňuje.
