Zpět na domů

Řízení dialogů v Pythonu prostřednictvím JSON konfigurace

Přehled knihovny dialog-engine pro deklarativní popis vícekrokových dialogů v Pythonu. Článek zkoumá mechanismus podmíněné viditelnosti, kontextovou navigaci, integraci s aiogram 3 a CLI nástroje pro validaci konfigurací.

Wizardy a dotazníky v Pythonu: deklarativní navigace
Advertisement 728x90

# Řízení vícekrokových dialogů v Pythonu pomocí JSON konfigurací

Vývoj dotazníků, onboardingů a složitých wizardů často vede k nahromadění podmínkové logiky, kterou je obtížné udržovat a škálovat. Knihovna dialog-engine nabízí deklarativní alternativu: struktura dialogu, pravidla viditelnosti polí a navigace se popisují v JSON nebo YAML. Engine sám vypočítává dostupné kroky na základě kontextu relace a eliminuje potřebu psát vnořené konstrukce pro každý scénář.

Deklarativní přístup k tvorbě wizardů

Tradiční implementace krok za krokem formulářů vyžaduje explicitní řízení stavu. Vývojář manuálně sleduje aktuální etapu, kontroluje podmínky přechodu a formuje rozhraní. Při změně business logiky nebo přidání nových větví se kód rychle komplikuje a mění se v těstoviny z if a match. dialog-engine tento proces obrací: dialog se stává sadou dat, nikoli posloupností instrukcí.

Konfigurační soubor obsahuje pole kroků. Každý prvek definuje identifikátor, typ vstupu, text a volitelné parametry validace. Engine neinterpreuje typy polí — text, choice, photo nebo vlastní hodnoty zůstávají na úrovni dohody mezi konfigurací a vrstvou zobrazení. To umožňuje použít stejný soubor pro Telegram bota, webové rozhraní nebo konzolovou utilitu.

Google AdInline article slot
{
  "steps": [
    { "id": "name", "type": "text", "text": "What is your name?" },
    { "id": "plan", "type": "choice", "text": "Choose a plan",
      "choices": { "free": "Free", "pro": "Professional" } },
    { "id": "company_inn", "type": "text", "text": "Enter the company tax ID",
      "show_when": { "field": "plan", "equals": "pro" } },
    { "id": "confirm", "type": "text", "text": "Is everything correct? Sending!" }
  ]
}

Instalace jádra nevyžaduje žádné externí závislosti. Další moduly se připojují podle potřeby prostřednictvím extras, což zachovává lehkost základní distribuce.

pip install dialog-engine
pip install dialog-engine[validation,yaml,aiogram]

Mechanismus podmínkové viditelnosti a navigace

Klíčovou vlastností enginu je kontextově závislá směrování. Místo hardkódovaných přechodů se používá slovník s odpověďmi uživatele. Na jeho základě se vypočítávají indexy následujícího a předchozího viditelného kroku. Skryté etapy se automaticky vyloučí z progress baru a logiky navigace, což zaručuje správné počítání pozic typu „krok 2 z 3“.

Podmínky viditelnosti se zadávají prostřednictvím polí show_when a skip_when. Podporovány jsou základní operátory porovnání a kontroly existence, stejně jako složené pravidla any_of a all_of pro realizaci složité business logiky. Pravidla lze vnořovat bez omezení hloubky.

Google AdInline article slot
{
  "skip_when": {
    "any_of": [
      { "field": "plan", "equals": "free" },
      { "field": "age", "lt": 18 }
    ]
  }
}

Python API poskytuje metody pro práci s indexy a pozicemi. To umožňuje přesně kontrolovat stav relace bez manuálního procházení podmínek.

ctx = {"plan": "free"}
next_idx = engine.next_index(1, ctx)
prev_idx = engine.previous_index(3, ctx)
pos = engine.effective_position(next_idx, ctx)
total = engine.effective_total(ctx)

if engine.is_last_visible(next_idx, ctx):
    # Complete dialog
    ...

Pro perzistenci relací je připravený třída DialogSessionState, která serializuje aktuální index a kontext do JSON. To usnadňuje ukládání stavu v Redis nebo relačních databázích mezi požadavky uživatele.

Integrace s aiogram 3 a zpracování callbacků

Jádro knihovny je framework-agnostické, ale pro ekosystém Telegramu jsou připravené hotové helpery. Ty generují inline klávesnice, automaticky označují vybrané hodnoty a formují správné callback_data. Zpracování stisků je typizované a odděluje logiku výběru, přeskočení a návratu.

Google AdInline article slot
from dialog_engine.integrations.aiogram import (
    build_step_keyboard,
    parse_choice_callback,
    is_named_callback,
    KeyboardCallbacks,
)

step = engine.get_step(current_index)
kb = build_step_keyboard(step, translate, show_back=True, current_value=ctx.get(step.id))
await message.answer(step.text, reply_markup=kb)

Rozbor příchozích callbacků probíhá prostřednictvím parserů, které vracejí identifikátor kroku a vybranou hodnotu. To eliminuje potřebu manuálně parsovat řetězce callback.data a snižuje riziko kolizí prefixů.

@router.callback_query()
async def on_callback(callback: CallbackQuery):
    cb = KeyboardCallbacks()
    pair = parse_choice_callback(callback.data, cb)
    if pair:
        step_id, choice_key = pair
        ctx[step_id] = choice_key
        next_idx = engine.next_index(current_index, ctx)
        ...

Nástroje CLI a validace konfigurací

Podpora deklarativních konfigurací vyžaduje nástroje statické analýzy. Dodávaný CLI umožňuje kontrolovat strukturu souboru na duplicity identifikátorů, chybné odkazy a syntaktické chyby ještě před spuštěním aplikace. V přísném režimu se používá Pydantic pro úplnou kontrolu typů.

  • dialog-engine validate wizard.json — základní kontrola struktury.
  • dialog-engine validate --strict wizard.json — validace přes Pydantic.
  • dialog-engine mermaid wizard.json — generování diagramu přechodů pro dokumentaci.
  • dialog-engine schema > dialog.schema.json — výstup JSON Schema pro autodoplňování v IDE.
  • dialog-engine init -o my-dialog.json — vytvoření šablony nového dialogu.

Vložení validace do CI/CD pipeline zaručuje, že nekorektní konfigurace se nedostanou do produkce. JSON Schema zajišťuje zvýraznění syntaxe a nápovědy v editech kódu, což snižuje vstupní práh pro product managery a analytiky, kteří editují dotazníky.

Co je důležité

  • Dialog se popisuje deklarativně v JSON/YAML, což odděluje business logiku od kódu aplikace a umožňuje editovat scénáře bez deploye.
  • Navigace a viditelnost kroků se vypočítávají dynamicky na základě kontextu relace, což eliminuje vnořené podmínkové konstrukce.
  • Integrace s aiogram 3 poskytuje hotové generátory klávesnic a typizované parsery callbacků, což zkracuje objem boilerplate kódu.
  • CLI utilitky a JSON Schema zajišťují statickou kontrolu konfigurací a pohodlný vývoj v IDE.
  • Knihovna se šíří pod source-available licencí: použití v projektech je povoleno, modifikace a redistribuce zdrojového kódu jsou omezeny.

— Editorial Team

Advertisement 728x90

Číst dál