Перейти к содержанию

Жизненный цикл Flow

Flow — это линейная цепочка шагов, которую проходит пользователь в диалоге с ботом. Каждый шаг собирает одну единицу данных.

Участники

Участник Роль
Handler Принимает ввод от пользователя, записывает данные в State
Flow Хранит список шагов, итерирует их по порядку
Step Проверяет одно поле в State. Если пусто — вызывает Presenter
Presenter Формирует и отправляет сообщение пользователю
State Pydantic-модель с данными, собранными в процессе flow

Процесс

sequenceDiagram
    participant П as Пользователь
    participant H as Handler
    participant St as State
    participant F as Flow
    participant S1 as Step 1
    participant S2 as Step 2
    participant Pr as Presenter

    П->>H: Нажимает кнопку «Начать»
    H->>F: flow.start(user)
    F->>S1: execute(user, state)
    S1->>St: state.name заполнено?
    St-->>S1: Нет
    S1->>Pr: send("Как вас зовут?")
    Pr-->>П: Сообщение в чат

    П->>H: Вводит "Иван"
    H->>St: state.name = "Иван"
    H->>F: flow.route(user)
    F->>S1: execute(user, state)
    S1->>St: state.name заполнено?
    St-->>S1: Да
    S1-->>F: True (готово)
    F->>S2: execute(user, state)
    S2->>St: state.email заполнено?
    St-->>S2: Нет
    S2->>Pr: send("Ваш email?")
    Pr-->>П: Сообщение в чат

Принцип разделения ответственности

flowchart LR
    H[Handler] -->|пишет в| S[State]
    H -->|вызывает| F[Flow.route]
    F -->|итерирует| ST[Steps]
    ST -->|вызывает| P[Presenter]
    P -->|отправляет| U[Пользователю]

Ключевые правила:

  • Handler не знает о Presenter — он только записывает данные и передаёт управление Flow
  • Step не знает о Handler — он только проверяет State и вызывает Presenter
  • Presenter не знает о Step и Flow — он только формирует и отправляет сообщение
  • Flow не знает о содержимом шагов — он только вызывает их по порядку

Завершение Flow

Когда все шаги вернули True (все поля State заполнены), Flow вызывает callback on_complete. Обычно это финальный Presenter, который показывает подтверждение.

flowchart LR
    S1[Step 1 ✓] --> S2[Step 2 ✓] --> S3[Step 3 ✓] --> OC[on_complete]

Типичная структура файлов Flow

src/flows/my_flow/
├── factory.py            # Сборка зависимостей
├── handlers/             # Обработчики ввода
├── steps/                # Шаги flow
├── presenters/           # Отправка сообщений
├── entities/             # State (Pydantic-модель)
└── repos/                # Хранилище state

Подробнее

Полный пример создания flow с кодом — в разделе Создание Flow.