Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor ratio #2038

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open

Conversation

WqyJh
Copy link
Contributor

@WqyJh WqyJh commented Jan 17, 2025

close #2023

我已确认该 PR 已自测通过,相关截图如下:

默认倍率
image

自定义倍率配置
image

自定义倍率前后对比
image

@Laisky
Copy link
Contributor

Laisky commented Jan 17, 2025

还是统一使用 ctxkey 比较好,你可以让 KeyRequestBody=gin.BodyBytesKey

@Laisky
Copy link
Contributor

Laisky commented Jan 17, 2025

请教下这个重构的意义是什么,带来了什么新功能吗或解决了什么问题吗?

@WqyJh
Copy link
Contributor Author

WqyJh commented Jan 17, 2025

请教下这个重构的意义是什么,带来了什么新功能吗或解决了什么问题吗?

See #2023

@Laisky
Copy link
Contributor

Laisky commented Jan 19, 2025

看了下,感觉很不错。不过我觉得没必要在页面上保留那两个【已废弃】,能自动将历史数据转为新格式就更好了。

@WqyJh
Copy link
Contributor Author

WqyJh commented Jan 20, 2025

看了下,感觉很不错。不过我觉得没必要在页面上保留那两个【已废弃】,能自动将历史数据转为新格式就更好了。

Good idea~ 已经实现了

截图中展示旧的倍率

Snipaste_2025-01-20_17-37-54

新代码启动之后,自动迁移到新倍率中

Snipaste_2025-01-20_17-42-49

导入一次之后,新倍率会写到 options 表中

Snipaste_2025-01-20_17-43-11

可以在次基础上修改新倍率

Snipaste_2025-01-20_17-49-13

再次重启 one-api,新倍率已持久化,不会被旧倍率覆盖
Snipaste_2025-01-20_17-49-13

之后的版本中可以删除 ModelRatio, CompletionRatio 相关代码和配置

@WqyJh
Copy link
Contributor Author

WqyJh commented Jan 21, 2025

Hi @songquanpeng, would you please help review and merge the code?

@popdo
Copy link

popdo commented Jan 22, 2025

感觉是多此一举,补全倍率很少去配置,这样修改后反而每个模型都要配置补全,反向优化

@Laisky
Copy link
Contributor

Laisky commented Jan 22, 2025

DELETED, 详见下面的新回复

@Laisky
Copy link
Contributor

Laisky commented Jan 23, 2025

@WqyJh 感觉还是有几个地方可以优化下

加载 Option 的时候,仅当 Ratio 为空时才需要合并旧数据,不用每次启动都合并一次

one-api/model/option.go

Lines 101 to 114 in f2bff58

for _, option := range options {
if option.Key == "Ratio" {
option.Value = billingratio.AddOldRatio(oldModelRatio, oldCompletionRatio)
err := updateOptionMap(option.Key, option.Value)
if err != nil {
logger.SysError("failed to update option map: " + err.Error())
}
err = UpdateOption(option.Key, option.Value)
if err != nil {
logger.SysError("failed to update option map: " + err.Error())
}
logger.SysLog("ratio merged")
}
}

Option 内的 Ratio 支持更细粒度的缺省值

解决 @popdo 提到的问题,用户编辑倍率的时候,可能并不需要为每一个模型都写上 Input 和 Output 倍率,而是仅需要编写和默认值不一样的项即可。

在下面的代码里,让读取 ratio 更细粒度一些。在从 billingratio.GetRatio 中读取到 ratio 后,再进一步检查其中的每一个成员项,Input/Output/LongThreshold/LongInput/LongOutput,如果为空的话用 adaptor.Ratio 补上。这样可以最大程度减轻维护的负担

func GetRatio(meta *meta.Meta, adaptor adaptor.Adaptor) ratio.Ratio {
result := billingratio.GetRatio(meta.OriginModelName, meta.ChannelType)
if result != nil {
return *result
}
ratio := adaptor.GetRatio(meta)
if ratio != nil {
return *ratio
}
logger.SysError("model ratio not found: " + meta.OriginModelName)
return billingratio.FallbackRatio
}

@songquanpeng
Copy link
Owner

算是 breaking change,在 One API 不同派生项目中也没办法通用,不过目前的倍率配置确实是有点乱,我先看看哈

@Laisky
Copy link
Contributor

Laisky commented Jan 31, 2025

算是 breaking change,在 One API 不同派生项目中也没办法通用,不过目前的倍率配置确实是有点乱,我先看看哈

如果能自动将旧数据转换为新格式存新表的话就还好,升级回滚都可以自动完成。
这个提交还是很必要的,现在模型的计费很复杂,光靠一个 prompt 和 completion 已经无法满足需求了,要想同时支持 text、image、audio、阶梯计划,支持多样化的 struct 定义是必须的。

@Laisky
Copy link
Contributor

Laisky commented Feb 6, 2025

@songquanpeng 建议优先处理一下这个问题,计费系统已经到了不得不大改的地步了。不然下游只能选择硬分叉,后期再加新模型就很难合并回来了。

几个痛点:

  1. 不同 channel 共用模型名,但是费率不一致
  2. 按 tokens 数量阶梯计价
  3. 多模态模型对 text、audio、image 有不同的费率

这个 PR 稍微再优化一下,可以很好的解决所有的问题

@chenzikun
Copy link
Contributor

是不是可以将模型列表和倍率建一张表,通过页面、接口去增加模型

@Laisky
Copy link
Contributor

Laisky commented Feb 8, 2025

是不是可以将模型列表和倍率建一张表,通过页面、接口去增加模型

因为不同 channel 可能有同名模型,但是费率不同,集中管理会很麻烦。

或者给费率增加一个字段可以绑定到特定 channel,默认不绑定。

@ArcaneWhispers
Copy link

像new-api那样 通过令牌分组倍率来区分同名模型的不同价格比较好,不然用户调同个模型 多种价格就很迷惑。用户看的也是一脸懵逼。

@Laisky
Copy link
Contributor

Laisky commented Feb 8, 2025

像new-api那样 通过令牌分组倍率来区分同名模型的不同价格比较好,不然用户调同个模型 多种价格就很迷惑。用户看的也是一脸懵逼。

分组倍率这个功能是有的,但是粒度是 channel 级的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ModelRatio and CompletionRatio should be maintained by adapter
6 participants