Skip to content

Шаблоны YAML-конфигов для плагинов (сервисов и утилит)

Этот документ служит справочником для оформления конфигов всех типов плагинов проекта (сервисов и утилит). Секции, помеченные как (опционально), можно опускать, если они не нужны для конкретного случая. Следуйте структуре шаблона для своего типа плагина.


1. Универсальный шаблон для всех утилит

Применяется к: Custom Layers, Foundation, Core

yaml
name: "logger"                    # Уникальное имя утилиты (обязательно)
description: "Краткое описание утилиты"
singleton: false                  # (опционально) true если плагин должен быть в единственном экземпляре

dependencies:                     # (опционально, если утилита использует другие утилиты)
  - "logger"                      # Формат: "utility_name" (уникальное имя утилиты)
  - "database"                    # Система автоматически найдет утилиту по имени
  - "cache"                       # Список обязательных утилит

optional_dependencies:            # (опционально) Зависимости, которые могут отсутствовать
  - "tg_bot"                      # Формат: "utility_name" (уникальное имя утилиты)
  - "analytics"                   # Система передаст None если утилита не найдена

settings:                         # (опционально, если есть настройки)
  param_name:
    type: string
    default: "..."
    description: "..."

methods:                          # ОБЯЗАТЕЛЬНО для утилит - публичные методы
  method_name:
    description: "..."
    input:
      param1:
        type: ...
        description: "..."
    output:
      type: ...
      description: "..."

actions:                          # (опционально) Действия для вызова из сценариев
  action_name:
    description: "Описание действия"
    access_rules: ["rule_name"]   # (опционально) Правила доступа для валидации
    public: false                 # (опционально) Доступность в сценариях: true=публичное, false=системное (по умолчанию false)
    input:
      data:                       # ОБЯЗАТЕЛЬНО - блок data с параметрами
        type: object
        properties:
          param1:
            type: ...
            description: "..."
          param2:
            type: ...
            optional: true
            description: "Опциональный параметр"
    output:
      result:                     # ОБЯЗАТЕЛЬНО - результат выполнения
        type: string
        description: "Результат: success, error, timeout, not_found"
      error:                      # Опционально - структура ошибки
        type: object
        optional: true
        description: "Структура ошибки при неудаче"
        properties:
          code:
            type: string
            description: "Код ошибки"
          message:
            type: string
            description: "Сообщение об ошибке"
          details:
            type: array
            optional: true
            description: "Детали ошибки (например, ошибки валидации полей)"
      response_data:              # Опционально - данные ответа (аналог data в API)
        type: object
        properties:
          field1:
            type: integer
            description: "Описание поля 1"
          field2:
            type: string
            replaceable: true  # (опционально) Маркер для полей, которые могут быть подменены через response_key
            description: "Описание поля 2"
features:                         # (опционально, если есть)
  - "..."

2. Services — API методы сервисов

yaml
name: "user_service"              # Уникальное имя сервиса (обязательно)
description: "Краткое описание сервиса"
singleton: false                  # (опционально) true если плагин должен быть в единственном экземпляре

dependencies:                     # (опционально, если сервис использует утилиты)
  - "logger"                      # Формат: "utility_name" (уникальное имя утилиты)
  - "database_service"            # Система автоматически найдет утилиту по имени
  - "hash_manager"                # Утилиты автоматически будут переданы в конструктор
  
optional_dependencies:            # (опционально) Зависимости, которые могут отсутствовать
  - "cache_service"               # Формат: "utility_name" (уникальное имя утилиты)
  - "analytics_service"           # Система передаст None если утилита не найдена
  
settings:                         # (опционально, если есть настройки)
  # Стандартные настройки для сервисов
  processing_interval:            # (рекомендуется для сервисов с циклом обработки)
    type: float
    default: 0.10
    description: "Интервал (в секундах) между итерациями обработки"
  batch_size:                     # (рекомендуется для сервисов с пакетной обработкой)
    type: integer
    default: 50
    description: "Максимальное количество элементов, обрабатываемых за одну итерацию"
  
  # Другие специфичные настройки сервиса
  param_name:
    type: string
    default: "..."
    description: "..."
    
actions:                          # ОБЯЗАТЕЛЬНО для сервисов - действия для сценариев
  create_profile:
    description: "Создание профиля пользователя"
    access_rules: ["system_access"]  # Правила доступа для валидации
    public: true                      # (опционально) true — доступно в общих сценариях; по умолчанию false (системное)
    input:
      data:                       # ОБЯЗАТЕЛЬНО - блок data с параметрами
        type: object
        properties:
          user_id:
            type: integer
            description: "ID пользователя"
          source:
            type: string
            optional: true
            description: "Источник регистрации (опциональный)"
    output:
      result:                     # ОБЯЗАТЕЛЬНО - результат выполнения
        type: string
        description: "Результат: success, error, timeout, not_found"
      error:                      # Опционально - структура ошибки
        type: object
        optional: true
        description: "Структура ошибки при неудаче"
        properties:
          code:
            type: string
            description: "Код ошибки"
          message:
            type: string
            description: "Сообщение об ошибке"
          details:
            type: array
            optional: true
            description: "Детали ошибки (например, ошибки валидации полей)"
      response_data:              # Опционально - данные ответа (аналог data в API)
        type: object
        properties:
          user_id:
            type: integer
            description: "ID пользователя"
          profile_created:
            type: boolean
            description: "Профиль создан успешно"
  
  get_profile:
    description: "Получение профиля пользователя"
    access_rules: ["data_integrity"]  # Правила доступа для валидации
    public: false                     # Явно укажем системное действие (опционально)
    input:
      data:                       # ОБЯЗАТЕЛЬНО - блок data с параметрами
        type: object
        properties:
          user_id:
            type: integer
            description: "ID пользователя"
    output:
      result:                     # ОБЯЗАТЕЛЬНО - результат выполнения
        type: string
        description: "Результат: success, error, timeout, not_found"
      error:                      # Опционально - структура ошибки
        type: object
        optional: true
        description: "Структура ошибки при неудаче"
        properties:
          code:
            type: string
            description: "Код ошибки"
          message:
            type: string
            description: "Сообщение об ошибке"
          details:
            type: array
            optional: true
            description: "Детали ошибки"
      response_data:              # Опционально - данные ответа (аналог data в API)
        type: object
        properties:
          user_id:
            type: integer
            description: "ID пользователя"
          username:
            type: string
            description: "Имя пользователя"
          first_name:
            type: string
            description: "Имя"
          last_name:
            type: string
            description: "Фамилия"

# ℹ️ Секция actions ОБЯЗАТЕЛЬНА для сервисов - описывает действия для сценариев
# ℹ️ Метод run() ОПЦИОНАЛЕН - для фонового запуска сервисов
# ℹ️ Сервисы вызываются через сценарии, передавая параметры в действия
# ℹ️ В input ОБЯЗАТЕЛЬНО использовать блок data с описанием полей внутри
# ℹ️ В output всегда обязателен result, error и response_data опциональны
# ℹ️ error - структурированный объект с полями code, message, details (не строка)
# ℹ️ response_data - аналог data в REST API, содержит возвращаемые данные
# ℹ️ Действия принимают плоский словарь data для универсальности
# ℹ️ Опциональные зависимости позволяют сервисам работать с дополнительными утилитами
# ℹ️ access_rules определяет правила доступа для валидации действий
# ℹ️ public: boolean — пометка доступности в сценариях (по умолчанию false = системное)

features:                         # (опционально, если есть)
  - "..."

Система валидации доступа (access_rules)

Назначение

Поле access_rules определяет правила доступа для валидации действий. Система автоматически проверяет права доступа перед выполнением действия.

Актуальные настройки

Все правила доступа и группы пользователей находятся в action_hub/config.yaml — это центральное место для управления системой валидации доступа.

Доступные правила доступа:

  • system_access — доступ только для системных операций (управление ботами, тенантами)
  • data_integrity — доступ для операций с данными (отправка сообщений, валидация)
  • no_access — действия без ограничений доступа (обработка событий)

Примеры использования:

yaml
actions:
  start_bot:
    description: "Запуск бота"
    access_rules: ["system_access"]  # Только системные операции
    
  send_message:
    description: "Отправка сообщения"
    access_rules: ["data_integrity"]  # Операции с данными
    
  process_event:
    description: "Обработка события"
    access_rules: ["no_access"]  # Без ограничений

Формат ответа действий (output)

Структура ответа

Все действия возвращают единообразный формат ответа:

yaml
output:
  result:                     # ОБЯЗАТЕЛЬНО - статус выполнения
    type: string
    description: "Результат: success, error, timeout, not_found"
  error:                      # Опционально - структура ошибки
    type: object
    optional: true
    properties:
      code:                   # Код ошибки
        type: string
      message:                # Сообщение об ошибке
        type: string
      details:                # Детали ошибки (опционально)
        type: array
        optional: true
  response_data:              # Опционально - данные ответа (аналог data в REST API)
    type: object
    properties: ...

Примеры ответов

Успешный ответ:

json
{
  "result": "success",
  "response_data": {
    "user_id": 123,
    "username": "john_doe"
  }
}

Ответ с ошибкой:

json
{
  "result": "error",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Ошибка валидации входных данных",
    "details": [
      {
        "field": "email",
        "message": "Поле обязательно",
        "type": "value_error.missing"
      }
    ]
  }
}

Особый статус (не ошибка):

json
{
  "result": "not_found"
}

Назначение полей

  • result — статус выполнения действия. Может быть: success, error, timeout, not_found и другие. Используется в транзишнах для определения дальнейших действий.
  • error — структурированная информация об ошибке. Содержит код ошибки, сообщение и детали. Формат соответствует стандартам REST API для легкого перехода в будущем.
  • response_data — данные ответа (только при result=success). Аналог поля data в REST API. Может содержать любую структуру данных.

Коды ошибок (рекомендуемые)

Для поля error.code рекомендуется использовать следующие стандартные коды:

  • VALIDATION_ERROR — ошибка валидации входных данных (некорректные параметры, отсутствуют обязательные поля)
  • NOT_FOUND — ресурс не найден (пользователь, бот, тенант и т.д.)
  • ALREADY_EXISTS — ресурс уже существует (попытка создать дубликат)
  • PERMISSION_DENIED — недостаточно прав для выполнения операции
  • INTERNAL_ERROR — внутренняя ошибка сервиса (неожиданные исключения, ошибки БД)
  • TIMEOUT — превышено время ожидания операции
  • INVALID_STATE — недопустимое состояние для операции (например, попытка отменить уже оплаченный инвойс)
  • API_ERROR — ошибка при обращении к внешнему API (GitHub, Telegram и т.д.)
  • SYNC_ERROR — ошибка синхронизации данных
  • PARSE_ERROR — ошибка парсинга данных (конфигурации, сценариев и т.д.)

Маркер replaceable

Назначение

Маркер replaceable: true указывает, что поле в response_data может быть подменено через параметр response_key в input действии. Если указан response_key, основное значение возвращается под этим ключом вместо стандартного.

Использование

yaml
output:
  response_data:
    properties:
      main_value:
        type: string
        replaceable: true  # Поле может быть подменено через response_key
        description: "Основное значение"

Пример

yaml
# В config.yaml
output:
  response_data:
    properties:
      user_storage_values:
        type: any
        replaceable: true
        description: "Данные пользователя"

# В сценарии
- action: "get_user_storage"
  params:
    key: "active_tenant_id"
    response_key: "active_tenant_id"  # Значение будет в _cache.active_tenant_id

Общие рекомендации

  • Не добавляйте пустые или неиспользуемые секции
  • Документируйте только то, что реально используется другими слоями или пользователями
  • Следуйте структуре шаблона для своего типа сервиса
  • При сомнениях — сверяйтесь с этим документом или уточняйте у архитектора
  • Все сервисы используют единый шаблон для унификации
  • Соблюдайте иерархию зависимостей, описанную в архитектуре проекта
  • Используйте plugin_management для управления включением/отключением плагинов
  • Работа с базой данных происходит через утилиту database_service
  • Всегда указывайте access_rules для действий сервисов
  • Используйте маркер replaceable для полей, которые могут быть подменены через response_key

Ключевые различия между утилитами и сервисами

🔧 Утилиты (Utilities)

  • Секция methods: ОБЯЗАТЕЛЬНА - описывает публичные методы
  • Секция actions: ОПЦИОНАЛЬНА - описывает действия для вызова из сценариев
  • Назначение: Вспомогательные компоненты для расширения функционала
  • Зависимости: Только от других утилит

🚀 Сервисы (Services)

  • Секция actions: ОБЯЗАТЕЛЬНА - описывает действия для сценариев
  • Метод run(): ОПЦИОНАЛЕН - для фонового запуска сервисов
  • Назначение: Основная бизнес-логика приложения (оркестраторы, обработчики событий)
  • Зависимости: От утилит (не от других сервисов)

Секция dependencies

Назначение

Секция dependencies позволяет автоматически определять и передавать необходимые утилиты в конструктор сервиса или утилиты. Это обеспечивает:

  • Автоматическую инъекцию зависимостей — утилиты передаются автоматически
  • Проверку иерархии зависимостей — система проверяет корректность зависимостей
  • Упрощение регистрации — не нужно вручную указывать зависимости при создании сервиса
  • Гибкость архитектуры — утилиты можно легко перемещать между уровнями

Формат записи зависимостей

yaml
dependencies:
  - "logger"             # Уникальное имя утилиты
  - "database"           # Система автоматически найдет утилиту по имени
  - "cache"              # Независимо от того, в каком level она находится
optional_dependencies:
  - "tg_bot"             # Опциональная зависимость
  - "analytics"           # Система передаст None если утилита не найдена

Правила зависимостей

  1. Утилиты могут зависеть только от других утилит
  2. Сервисы могут зависеть от утилит
  3. Сервисы НЕ могут зависеть от других сервисов
  4. Циклические зависимости запрещены
  5. Опциональные зависимости НЕ передаются в конструктор если утилита не найдена

Coreness — Create. Automate. Scale.