【OpenWebUI】新版下开关模型原生能力更优雅的方式

需要v0.6.10版本

新版本对Filter函数新增了Toggle属性,可以在输入框下增加切换按钮来控制Filter函数生效

以下是我的配置示例,具体参数设定仅对LiteLLM中转的api有效,NewAPI类可以参考修改:

联网搜索:

"""
title: 联网搜索
description: 原生联网搜索
"""

from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any


class Filter:
    class Valves(BaseModel):
        priority: int = Field(default=100, description="优先级")
        pass

    def __init__(self):
        self.valves = self.Valves()
        self.toggle = True
        self.icon = """data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjc1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgY2xhc3M9InNpemUtNSI+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNMTIgMjFhOS4wMDQgOS4wMDQgMCAwIDAgOC43MTYtNi43NDdNMTIgMjFhOS4wMDQgOS4wMDQgMCAwIDEtOC43MTYtNi43NDdNMTIgMjFjMi40ODUgMCA0LjUtNC4wMyA0LjUtOVMxNC40ODUgMyAxMiAzbTAgMThjLTIuNDg1IDAtNC41LTQuMDMtNC41LTlTOS41MTUgMyAxMiAzbTAgMGE4Ljk5NyA4Ljk5NyAwIDAgMSA3Ljg0MyA0LjU4Mk0xMiAzYTguOTk3IDguOTk3IDAgMCAwLTcuODQzIDQuNTgybTE1LjY4NiAwQTExLjk1MyAxMS45NTMgMCAwIDEgMTIgMTAuNWMtMi45OTggMC01Ljc0LTEuMS03Ljg0My0yLjkxOG0xNS42ODYgMEE4Ljk1OSA4Ljk1OSAwIDAgMSAyMSAxMmMwIC43NzgtLjA5OSAxLjUzMy0uMjg0IDIuMjUzbTAgMEExNy45MTkgMTcuOTE5IDAgMCAxIDEyIDE2LjVjLTMuMTYyIDAtNi4xMzMtLjgxNS04LjcxNi0yLjI0N20wIDBBOS4wMTUgOS4wMTUgMCAwIDEgMyAxMmMwLTEuNjA1LjQyLTMuMTEzIDEuMTU3LTQuNDE4Ij48L3BhdGg+PC9zdmc+"""
        pass

    def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
        model_name = body.get("model")

        if isinstance(model_name, str):
            if model_name.startswith("google/"):
                grounding_tool_key = "googleSearch"
                grounding_tool = {grounding_tool_key: {}}
                tools_list = body.setdefault("tools", [])
                if not isinstance(tools_list, list):
                    tools_list = []
                    body["tools"] = tools_list
                if not any(
                    grounding_tool_key in tool
                    for tool in tools_list
                    if isinstance(tool, dict)
                ):
                    tools_list.append(grounding_tool)
                body["tools"] = tools_list

            elif model_name.startswith("deepseek/"):
                body["model"] = model_name + "-search"

        return body

深度思考:

"""
title: 深度思考
description: 先思考后回答,解决推理问题
"""

from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any


class Filter:
    class Valves(BaseModel):
        priority: int = Field(default=100, description="优先级")
        pass

    def __init__(self):
        self.valves = self.Valves()
        self.toggle = True
        self.icon = """data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBjbGFzcz0ic2l6ZS02Ij4KICA8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xMiAxOHYtNS4yNW0wIDBhNi4wMSA2LjAxIDAgMCAwIDEuNS0uMTg5bS0xLjUuMTg5YTYuMDEgNi4wMSAwIDAgMS0xLjUtLjE4OW0zLjc1IDcuNDc4YTEyLjA2IDEyLjA2IDAgMCAxLTQuNSAwbTMuNzUgMi4zODNhMTQuNDA2IDE0LjQwNiAwIDAgMS0zIDBNMTQuMjUgMTh2LS4xOTJjMC0uOTgzLjY1OC0xLjgyMyAxLjUwOC0yLjMxNmE3LjUgNy41IDAgMSAwLTcuNTE3IDBjLjg1LjQ5MyAxLjUwOSAxLjMzMyAxLjUwOSAyLjMxNlYxOCIgLz4KPC9zdmc+Cg=="""
        pass

    def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
        body["thinking"] = {"type": "enabled", "budget_tokens": 2048}
        return body

实现效果:


非常的优雅!

另外,这次新版本也补上了事件的文档,看起来结合新的Toggle Filter能玩出很多花样了

47 个赞

感谢分享

2 个赞

感谢佬友分享 :folded_hands:

2 个赞

wow,那很赞了,虽然我不用OWUI(

2 个赞

太强了,大佬

2 个赞

很详细,感谢大佬的分享

1 个赞

openwebui 现在有没有好的接入MCP的方法?还是只能以openai通用格式接入进来,就是MCP前边再加一层openai的代理?

2 个赞

只能再跑个mcpo把mcp转成openapi格式后接入openwebui。其实这样也有好处,用mcpo是有swagger文档的,能直接在上面调试mcp,对个人来说方便些

3 个赞

有没有推荐的mcpo框架?最好是有docker的。。。
我用了这款GitHub - flyfox666/mcpo_docker_use: An example Docker image for mcpo(with npm,curl,nodejs,uv Pre-Built;Pre-Built MCP:amap;baidumap;server-brave-search; tavily;fetch), a tool that exposes MCP (Model Context Protocol) servers as OpenAPI-compatible HTTP endpoints for OpenWebUI. 但是他的sse接入不知如何配置,stdio接入是没问题了, 只是不很稳定,有时候网络或者环境原因拉不起来

1 个赞

请问这个怎么导入呀

请问怎么导入工具呀,我在工作空间导入老是显示,我在官网导入工具也显示object
image

自带的联网和深度思考是什么逻辑呢

真的蛮优雅的

这是函数不是工具

官方的已经支持docker了

1 个赞

佬那个深度思考可以弄成比如调用r1的吗,这样是不是就可以全模型思考了 :laughing:


佬友,这个深度思考是有模型使用限制的吗,哪些模型可以使用呀

你用不到,也无法用,因为目前支持开关深度思考的模型只有 gemini-2.5,而且 new-api 并没有适配自定义参数来改变,只有系统设置中固定设置参数。在 open-webui 只有使用 pipe 连接的 gemini 或者用 litellm 来实现,所以题主发的东西对你来说不是必要的

okk,谢谢

不过单独对于 gemini 的内置联网联网还是可以用的,这里是匹配了 gemini 开头的模型,你可以自行修改,我测试对接 new-api 的 gemini 模型是可以实现联网的,使用方法和楼主发的一样

"""
title: 联网搜索
description: 原生联网搜索
"""

from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any


class Filter:
    class Valves(BaseModel):
        priority: int = Field(default=100, description="优先级")
        pass

    def __init__(self):
        self.valves = self.Valves()
        self.toggle = True
        self.icon = """data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjc1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgY2xhc3M9InNpemUtNSI+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNMTIgMjFhOS4wMDQgOS4wMDQgMCAwIDAgOC43MTYtNi43NDdNMTIgMjFhOS4wMDQgOS4wMDQgMCAwIDEtOC43MTYtNi43NDdNMTIgMjFjMi40ODUgMCA0LjUtNC4wMyA0LjUtOVMxNC40ODUgMyAxMiAzbTAgMThjLTIuNDg1IDAtNC41LTQuMDMtNC41LTlTOS41MTUgMyAxMiAzbTAgMGE4Ljk5NyA4Ljk5NyAwIDAgMSA3Ljg0MyA0LjU4Mk0xMiAzYTguOTk3IDguOTk3IDAgMCAwLTcuODQzIDQuNTgybTE1LjY4NiAwQTExLjk1MyAxMS45NTMgMCAwIDEgMTIgMTAuNWMtMi45OTggMC01Ljc0LTEuMS03Ljg0My0yLjkxOG0xNS42ODYgMEE4Ljk1OSA4Ljk1OSAwIDAgMSAyMSAxMmMwIC43NzgtLjA5OSAxLjUzMy0uMjg0IDIuMjUzbTAgMEExNy45MTkgMTcuOTE5IDAgMCAxIDEyIDE2LjVjLTMuMTYyIDAtNi4xMzMtLjgxNS04LjcxNi0yLjI0N20wIDBBOS4wMTUgOS4wMTUgMCAwIDEgMyAxMmMwLTEuNjA1LjQyLTMuMTEzIDEuMTU3LTQuNDE4Ij48L3BhdGg+PC9zdmc+"""
        pass

    def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
        model_name = body.get("model")

        if isinstance(model_name, str):
            if model_name.startswith("gemini"):
                # 如果 body 中已经存在 "tools" 字段,则追加;否则创建新字段
                if "tools" not in body:
                    body["tools"] = []

                # 添加 googleSearch 工具
                body["tools"].append(
                    {"type": "function", "function": {"name": "googleSearch"}}
                )

        return body
4 个赞