本教程来自社区贡献,并非 Open WebUI 官方支持内容。它仅作为演示,说明如何按你的具体场景自定义 Open WebUI。欢迎贡献更多内容,可查看 contributing 教程。
🪄 特殊参数
在开发自己的 Tools、Functions(Filters、Pipes、Actions)、Pipelines 等时,你可以使用这些特殊参数来访问 Open WebUI 提供的完整上下文能力。
本页会详细说明每个特殊参数的类型、结构与示例。
body
一个 dict,通常会几乎原样发送给模型。严格来说它不属于特殊参数,但因为它本身包含了一些特殊字段,所以这里也一并列出,便于查阅。
示例
{
"stream": true,
"model": "my-cool-model",
# 小写字符串,单词之间用 - 分隔:这是模型 ID
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is in this picture?"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAAGcCAYAAABk2YF[REDACTED]"
# 图片会以 base64 编码数据的形式传递
}
}
]
},
{
"role": "assistant",
"content": "The image appears to be [REDACTED]"
},
],
"features": {
"image_generation": false,
"code_interpreter": false,
"web_search": false
},
"stream_options": {
"include_usage": true
},
"metadata": "[与 __metadata__ 完全相同的 dict]",
"files": "[与 __files__ 完全相同的 list]"
}
__user__
包含用户信息的 dict。
请注意:如果定义了 UserValves 类,那么其实例必须通过 __user__["valves"] 访问;否则,valves 键将不会出现在 __user__ 中。
示例
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"email": "cheesy_dude@openwebui.com",
"name": "Patrick",
"role": "user",
# role 只能是 `user` 或 `admin`
"valves": "[UserValve 实例]"
}__metadata__
一个 dict,其中包含关于聊天、模型、文件等的大量上下文信息。
示例
{
"user_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"chat_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"message_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"session_id": "xxxxxxxxxxxxxxxxxxxx",
"user_prompt": "图片里有什么?",
# 用户最近的一条消息,在来源引用包裹之前捕获。
# 原生工具调用循环和 Pipes 都应读取此字段。
"system_prompt": "你是一个乐于助人的助手。",
# 聊天系统消息,在同一时间点捕获。
"sources": [],
# 本轮解析出的来源(例如文件上下文)。
# 未附加来源时为空。
"tool_ids": null,
# tool_ids 是字符串列表
"tool_servers": [],
"files": "[与 body['files'] 中相同]",
# 即使没有文件,__metadata__ 中也会有 files 键,值为 []
"features": {
"image_generation": false,
"code_interpreter": false,
"web_search": false
},
"variables": {
"{{USER_NAME}}": "cheesy_username",
"{{USER_LOCATION}}": "Unknown",
"{{CURRENT_DATETIME}}": "2025-02-02 XX:XX:XX",
"{{CURRENT_DATE}}": "2025-02-02",
"{{CURRENT_TIME}}": "XX:XX:XX",
"{{CURRENT_WEEKDAY}}": "Monday",
"{{CURRENT_TIMEZONE}}": "Europe/Berlin",
"{{USER_LANGUAGE}}": "en-US"
},
"model": "[与 __model__ 完全相同的 dict]",
"direct": false,
"function_calling": "native",
"type": "user_response",
"interface": "open-webui"
}
interface 字段表示请求来源:
"open-webui":请求来自 Web 界面- 其他值 / 缺失:请求大概率来自直接 API 调用
对于直接 API 调用,如果客户端未显式提供,chat_id、message_id、session_id 等字段可能缺失或为 null。你可以利用这一点来区分 WebUI 请求与 API 请求:
def inlet(self, body: dict, __metadata__: dict = None) -> dict:
if __metadata__ and __metadata__.get("interface") == "open-webui":
# 请求来自 WebUI
pass
else:
# 直接 API 请求
pass
return body当消息带有来源(sources)时,chat-completions 中间件会用默认引用模板包裹用户的最新消息。包裹发生在 Pipe 或 pipe() 调用看到 body 之前,仅当消息附带了来源时触发。直接读取 body["messages"][-1]["content"] 的 Pipe 会看到包裹后的形式。
__metadata__["user_prompt"] 保存的是包裹发生前的原始用户消息。原生工具调用循环和 Pipes 都从此读取,因此无论是否附加来源,它都是安全的。对于任何需要将用户输入交给下游模型的 Pipe,都应使用它。
async def pipe(self, body: dict, __metadata__: dict, __user__: dict) -> str:
user_prompt = __metadata__.get("user_prompt") or ""
system_prompt = __metadata__.get("system_prompt")
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": user_prompt})
# 将 messages 传给下游模型如果 Pipe 运行的路径跳过了标准预处理(如直接 API 调用、某些测试场景),__metadata__ 可能不存在。这时应扫描 body["messages"] 获取最后一条用户消息。
__model__
一个 dict,包含当前模型的信息。
示例
{
"id": "my-cool-model",
"name": "My Cool Model",
"object": "model",
"created": 1746000000,
"owned_by": "openai",
# 可能是 openai 或 ollama
"info": {
"id": "my-cool-model",
"user_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"base_model_id": "gpt-4o",
# 这是该模型 endpoint 实际提供的底层模型名
"name": "My Cool Model",
"params": {
"system": "You are my best assistant. You answer [REDACTED]",
"function_calling": "native"
# 自定义选项也会出现在这里,例如 "Top K"
},
"meta": {
"profile_image_url": "/static/favicon.png",
"description": "Description of my-cool-model",
"capabilities": {
"vision": true,
"usage": true,
"citations": true
},
"position": 17,
"tags": [
{
"name": "for_friends"
},
{
"name": "vision_enabled"
}
],
"suggestion_prompts": null
},
"access_control": {
"read": {
"group_ids": [],
"user_ids": []
},
"write": {
"group_ids": [],
"user_ids": []
}
},
"is_active": true,
"updated_at": 1740000000,
"created_at": 1740000000
},
"preset": true,
"actions": [],
"tags": [
{
"name": "for_friends"
},
{
"name": "vision_enabled"
}
]
}
__messages__
一个 list,包含此前的消息。
可参考前文 body["messages"] 的值结构。