Omni Router: 适用于 Open WebUI 的多模型供应商 & 多用户灵活计费管理 Pipeline - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
awkamo
V2EX    分享创造

Omni Router: 适用于 Open WebUI 的多模型供应商 & 多用户灵活计费管理 Pipeline

  •  
  •   awkamo 231 天前 2308 次点击
    这是一个创建于 231 天前的主题,其中的信息可能已经有所发展或是发生改变。

    概述

    Open WebUI 功能很强大,但没有多用户计费功能,也就是说,不能追踪每个用户的用量,也不能实现按量计费。另外,如果要接入多个模型供应商,比如 Deepseek R1 就有火山引擎、阿里云等等,也不是那么方便。

    现有的各种解决方案我看了都不满意,于是自己做了一个,分享给大家,目标场景是自用+小范围共享,可以很方便地管理多个来源的模型的计费配置,记录各个用户的用量,适合朋友/熟人/小团体之间使用。

    地址: https://github.com/moeakwak/openwebui-omni-router-pipeline (求 star ~)

    目前还没时间写详细的配置教程,也暂无 README ,wiki 里有一个简单的使用说明,可能需要你对 Open WebUI 比较了解才能用起来。

    特点

    • 模型计费配置:支持自定义模型供应商和模型列表,每个模型自由设置价格,支持倍率、按量计费、按次数计费,配置起来非常灵活非常方便(下文有例子)
    • 多用户用量统计和计费:每一次 completion 请求都会统计 token 用量,根据配置进行计费
    • 显示费用:每条消息最后能够显示这一条消息的花费,非常直观
    • 自助机器人:专门提供了一个自助服务机器人,就在 Open WebUI 网页 chat 中选择该自助机器人模型,即可完成用量查询/充值等操作
    • 适配 OpenRouter:对 OpenRouter 做了特别适配,支持后台调用 API 获取精确的 token 计费结果
    • 适配 Deepseek:对 Deepseek R1 推理模型的 reasoning_content 做了特别适配,自动转换成 <think> tag

    整个 Pipeline 使用 SQLite 存储数据。

    效果

    每条消息可显示费用(这里使用了某个中转 API ,倍率设置成了 3.2 ,所以按照官方价格消耗了 0.000122 ,给用户扣费了 0.000392 ):

    omni-router-demo-1

    通过自助机器人查看用户最近的请求记录(管理员可查看全局最近的使用情况):

    omni-router-demo-2

    时间段内使用情况统计(仅供演示,简化了计费):

    omni-router-demo-3

    关于计费

    可以为模型供应商设置倍率,则一次 completion 的实际费用是 用量×模型价格×模型供应商倍率。这个和很多 API 中转站很像:例如说你想要以 RMB 结算,但是很多供应商是美元结算,你可以在模型里设置成官方的费用(比如输入$5 ,输出$15 ),然后在模型供应商上设置 7.3 的倍率,避免了手动换算汇率。你还可以设置成更低或更高的倍率,这样一来,同一个模型不用反复修改费用。

    计费支持按量计费、按次计费等等。这里有一个例子(完整文件在 https://github.com/moeakwak/openwebui-omni-router-pipeline/blob/main/omni_router.yaml ):

    providers: - key: OpenAI url: https://api.openai.com/v1 api_key: sk-xxx price_ratio: 7.3 # 倍率会影响该 provider 下所有模型的计费 - key: Deepseek url: https://api.deepseek.com/v1 api_key: sk-xxx price_ratio: 1 - key: OpenRouter url: https://openrouter.ai/api/v1 api_key: sk-or-v1-xxx price_ratio: 7.3 models: - code: gpt-4o-2024-11-20 provider: OpenAI human_name: GPT-4o-2024-11-20 prompt_price: 2.5 completion_price: 10 - code: anthropic/claude-3.5-sonnet provider: OpenRouter human_name: Claude-3.5-Sonnet (OpenRouter) prompt_price: 3 completion_price: 15 update_usage_via_openrouter_api: true # 启用后,会通过 OpenRouter 的 API 更新 usage ,得到一个精确的 cost 结果 - code: deepseek-reasoner provider: Deepseek human_name: Deepseek R1 (Official) prompt_price: 4 completion_price: 16 no_system_prompt: true # 不在请求中添加 system prompt - code: deepseek/deepseek-r1:free provider: OpenRouter human_name: Deepseek R1 (OpenRouter, free) prompt_price: 0 completion_price: 0 update_usage_via_openrouter_api: true include_reasoning: true extra_args: { "temperature": 0.6 } # 请求 payload 中的额外参数,会覆盖已有参数 no_system_prompt: true 

    简易使用说明

    见 wiki:简易配置指南(中文)

    6 条回复    2025-03-11 16:11:26 +08:00
    boleyn1992
        1
    boleyn1992  
       231 天前 via Android
    支持,用过你的 cws ,感谢 op
    lovestudykid
        2
    lovestudykid  
       231 天前
    配置文件可以在 GUI 设置吗,或者用 API 自动获取,一个个填太傻了
    lovestudykid
        3
    lovestudykid  
       231 天前
    @lovestudykid 另外可以适配下 Perplexity 么,把 citation 拼接到回复中
    awkamo
        4
    awkamo  
    OP
       230 天前 via Android
    @lovestudykid 目前暂时没精力做 GUI 。perplexity 适配这个可以有
    x4gz
        5
    x4gz  
       214 天前
    试了下 thinking 的时候看起来是重复了一次 请问是我设置有误吗
    awkamo
        6
    awkamo  
    OP
       213 天前
    @x4gz 我用着没这个问题 不知道为什么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     884 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:18 PVG 05:18 LAX 14:18 JFK 17:18
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86