Skip to main content

Valves (阀门)

Valves (阀门)

Valves 和 UserValves 用于允许用户提供动态详情,如 API 密钥或配置选项。这些将在给定功能的 GUI 菜单中创建一个可填充字段或布尔开关。它们始终是可选的,但强烈建议使用。

因此,可以在 PipePipelineFilterTools 类中定义 Valves 和 UserValves 类。

Valves 仅由管理员通过“工具”或“函数”菜单配置。另一方面,UserValves 可由任何用户直接从聊天会话中配置。

带注释的示例
from pydantic import BaseModel, Field
from typing import Literal

# 定义 Valves
class Filter:
# 注意当前的缩进:Valves 和 UserValves 必须声明为
# Tools、Filter 或 Pipe 类的属性。这里我们以
# Filter 为例。
class Valves(BaseModel):
# Valves 和 UserValves 继承自 pydantic 的 BaseModel。
# 这可以实现复杂的用例,如模型验证器等。
test_valve: int = Field( # 注意类型提示:它用于
# 选择向用户显示的 UI 元素类型(按钮、
# 文本等)。
default=4,
description="一个控制数值的 valve"
# required=False, # 您可以使用 True 来强制要求字段
)
# 要让用户在多个字符串之间进行选择,可以使用 typing 中的 Literal:
choice_option: Literal["choiceA", "choiceB"] = Field(
default="choiceA",
description="一个多选 valve 的示例",
)
priority: int = Field(
default=0,
description="过滤器操作的优先级。较低的值将优先通过"
)
# priority 字段是可选的,但如果存在,将用于
# 对过滤器进行排序。
pass
# 请注意,这个 'pass' 有助于解析,建议添加。

# UserValves 的定义方式相同。
class UserValves(BaseModel):
test_user_valve: bool = Field(
default=False, description="一个控制真/假(开/关)开关的 user valve"
)
pass

def __init__(self):
self.valves = self.Valves()
# 因为它们是由管理员设置的,所以在代码执行时可以直接访问。
pass

# inlet 方法仅用于 Filter,但 __user__ 的处理方式相同
def inlet(self, body: dict, __user__: dict):
# 因为 UserValves 是针对每个用户定义的,所以它们仅在
# 使用时可用。
# 请注意,尽管 __user__ 是一个 dict,但 __user__["valves"] 是一个
# UserValves 对象。因此您可以这样访问值:
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"] # 不要这样做!