跳到主要内容
注意

这是一篇社区贡献文档,不属于 OPL 数据空间官方支持范围。它主要用于展示如何按你的具体场景自定义 OPL 数据空间。

🪄 保留参数(Special Arguments)

当你开发自定义 ToolsFunctionsFiltersPipesActions)、Pipelines 等时,可以使用一组由 OPL 数据空间自动注入的特殊参数。本页汇总这些参数的结构与用途,方便你在开发时快速查阅。

body

body 是一个 dict,通常会非常接近最终发往模型的请求体。虽然它不算严格意义上的“特殊参数”,但它本身也包含一些与上下文强相关的字段,因此值得一起说明。

典型结构:

{
  "stream": true,
  "model": "my-cool-model",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "What is in this picture?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "data:image/png;base64,..."
          }
        }
      ]
    }
  ],
  "features": {
    "image_generation": false,
    "code_interpreter": false,
    "web_search": false
  },
  "stream_options": {
    "include_usage": true
  },
  "metadata": "[same as __metadata__]",
  "files": "[same as __files__]"
}

__user__

__user__ 是一个包含当前用户信息的 dict

如果定义了 UserValves,要通过 __user__["valves"] 访问它;否则 valves 键根本不会出现。

典型结构:

{
  "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "email": "user@example.com",
  "name": "Patrick",
  "role": "user",
  "valves": "[the UserValve instance]"
}

__metadata__

__metadata__ 是一个范围很广的上下文对象,里面通常包含聊天、消息、会话、文件、功能开关、变量、模型等信息。

典型结构:

{
  "user_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "chat_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "message_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "session_id": "xxxxxxxxxxxxxxxxxxxx",
  "tool_ids": null,
  "tool_servers": [],
  "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": "[same as __model__]",
  "direct": false,
  "function_calling": "native",
  "type": "user_response",
  "interface": "open-webui"
}
检测请求来源

interface 字段可以帮助你区分请求是从 Web UI 发起,还是直接来自 API:

  • open-webui:来自 Web 界面
  • 其他值或缺失:大概率是直接 API 调用

这在编写 Filter 时尤其有用:

def inlet(self, body: dict, __metadata__: dict = None) -> dict:
    if __metadata__ and __metadata__.get("interface") == "open-webui":
        pass
    else:
        pass
    return body

__model__

__model__ 是一个关于当前模型的 dict,其中包括:

  • 模型 ID、名称、归属
  • info.params 中的模型参数,例如 function_calling
  • meta.capabilitiestagsaccess_control
  • 是否启用、创建时间、更新时间等

这对于按模型能力做分支逻辑、读取模型级配置或审计来源非常有用。

__messages__

__messages__ 是先前消息的列表。内容基本等同于 body["messages"]

__chat_id__

当前聊天的 chat_id,类型为 str

这个字段在所有来自聊天上下文的函数调用中都比较可靠,包括:

  • 用户正常发消息
  • 内部任务调用,例如标题生成、查询生成、标签生成等

如果你要在 Function / Pipe 中维护“按聊天隔离的状态”,优先用它。

同样的信息也可以从 __metadata__["chat_id"] 里拿到。

__session_id__

当前会话的 session_id,通常也能从 __metadata__["session_id"] 中获取。

__message_id__

当前消息的 message_id,通常也能从 __metadata__["message_id"] 中获取。

使用建议

  • 需要用户级别上下文时,看 __user__
  • 需要聊天 / 功能 / 来源上下文时,看 __metadata__
  • 需要模型参数或能力时,看 __model__
  • 需要历史消息时,用 __messages__body["messages"]
  • 需要做按聊天状态管理时,用 __chat_id__