🔄 Клапаны
Клапаны
Клапаны и ПользовательскиеКлапаны используются для предоставления пользователями динамических данных, таких как ключ API или опция конфигурации. Они создают заполняемое поле или переключатель в меню GUI для заданной функции. Они всегда опциональны, но НАСТОЯТЕЛЬНО рекомендуется их использование.
Таким образом, классы Клапанов и ПользовательскихКлапанов могут быть определены в классах Pipe
, Pipeline
, Filter
или Tools
.
Клапаны настраиваются только администраторами через меню Tools или Functions. С другой стороны, ПользовательскиеКлапаны могут настраиваться любым пользователем напрямую из чата.
Пример с комментариями
from pydantic import BaseModel, Field
from typing import Literal
# Определите и настройте клапаны
class Filter:
# Обратите внимание на текущий отступ: Клапаны и ПользовательскиеКлапаны должны быть объявлены
# как атрибуты классов Tools, Filter или Pipe. Здесь используется
# пример фильтра.
class Valves(BaseModel):
# Клапаны и ПользовательскиеКлапаны наследуются от BaseModel библиотеки pydantic. Это
# позволяет использовать сложные случаи, такие как валидаторы моделей и т. д.
test_valve: int = Field( # Обратите внимание на подсказку типа: она используется для
# выбора типа элемента GUI, показываемого пользователю (кнопки,
# тексты и т. д.).
default=4,
description="Клапан, управляющий числовым значением"
# required=False, # вы можете сделать поле обязательным, используя True
)
# Чтобы предоставить пользователю выбор между несколькими строками, вы можете использовать Literal из typing:
choice_option: Literal["choiceA", "choiceB"] = Field(
default="choiceA",
description="Пример клапана с множественным выбором",
)
priority: int = Field(
default=0,
description="Уровень приоритета для операций фильтра. Сначала проходят значения с меньшим приоритетом"
)
# Поле приоритета опционально, но ес ли оно присутствует, то будет использоваться для
# сортировки фильтров.
pass
# Обратите внимание, что эта инструкция 'pass' помогает при разборе и рекомендуется.
# ПользовательскиеКлапаны определяются таким же образом.
class UserValves(BaseModel):
test_user_valve: bool = Field(
default=False, description="Пользовательский клапан, управляющий переключателем True/False (вкл/выкл)"
)
pass
def __init__(self):
self.valves = self.Valves()
# Так как они установлены администратором, они доступны напрямую
# при выполнении кода.
pass
# Метод inlet используется только для фильтров, но обработка __user__ идентична
def inlet(self, body: dict, __user__: dict):
# Так как ПользовательскиеКлапаны определяются для каждого пользователя, они доступны
# только при использовании.
# Обратите внимание, что хотя __user__ является словарем, __user__["valves"] представляет собой объект
# класса ПользовательскиеКлапаны. Следовательно, вы можете получать значения таким образом:
test_user_valve = __user__["valves"].test_user_valve
# Или:
test_user_valve = dict(__user__["valves"])["test_user_valve"]
# Но это вернет значение по умолчанию вместо фактического значения:
# test_user_valve = __user__["valves"]["test_user_valve"] # Не делайте так!