mirror of
https://github.com/alibaba/higress.git
synced 2026-02-25 21:21:01 +08:00
138 lines
3.3 KiB
Go
138 lines
3.3 KiB
Go
package provider
|
||
|
||
import (
|
||
"github.com/tidwall/gjson"
|
||
"github.com/tidwall/sjson"
|
||
)
|
||
|
||
const (
|
||
nameMaxTokens = "max_tokens"
|
||
nameTemperature = "temperature"
|
||
nameTopP = "top_p"
|
||
nameTopK = "top_k"
|
||
nameSeed = "seed"
|
||
)
|
||
|
||
var maxTokensMapping = map[string]string{
|
||
"openai": "max_tokens",
|
||
"baidu": "max_output_tokens",
|
||
"spark": "max_tokens",
|
||
"qwen": "max_tokens",
|
||
"gemini": "maxOutputTokens",
|
||
"claude": "max_tokens",
|
||
"minimax": "tokens_to_generate",
|
||
}
|
||
|
||
var temperatureMapping = map[string]string{
|
||
"openai": "temperature",
|
||
"baidu": "temperature",
|
||
"spark": "temperature",
|
||
"qwen": "temperature",
|
||
"gemini": "temperature",
|
||
"hunyuan": "Temperature",
|
||
"claude": "temperature",
|
||
"minimax": "temperature",
|
||
}
|
||
|
||
var topPMapping = map[string]string{
|
||
"openai": "top_p",
|
||
"baidu": "top_p",
|
||
"qwen": "top_p",
|
||
"gemini": "topP",
|
||
"hunyuan": "TopP",
|
||
"claude": "top_p",
|
||
"minimax": "top_p",
|
||
}
|
||
|
||
var topKMapping = map[string]string{
|
||
"spark": "top_k",
|
||
"gemini": "topK",
|
||
"claude": "top_k",
|
||
}
|
||
|
||
var seedMapping = map[string]string{
|
||
"openai": "seed",
|
||
"qwen": "seed",
|
||
}
|
||
|
||
var settingMapping = map[string]map[string]string{
|
||
nameMaxTokens: maxTokensMapping,
|
||
nameTemperature: temperatureMapping,
|
||
nameTopP: topPMapping,
|
||
nameTopK: topKMapping,
|
||
nameSeed: seedMapping,
|
||
}
|
||
|
||
type CustomSetting struct {
|
||
// @Title zh-CN 参数名称
|
||
// @Description zh-CN 想要设置的参数的名称,例如max_tokens
|
||
name string
|
||
// @Title zh-CN 参数值
|
||
// @Description zh-CN 想要设置的参数的值,例如0
|
||
value string
|
||
// @Title zh-CN 设置模式
|
||
// @Description zh-CN 参数设置的模式,可以设置为"auto"或者"raw",如果为"auto"则会根据 /plugins/wasm-go/extensions/ai-proxy/README.md中关于custom-setting部分的表格自动按照协议对参数名做改写,如果为"raw"则不会有任何改写和限制检查
|
||
mode string
|
||
// @Title zh-CN json edit 模式
|
||
// @Description zh-CN 如果为false则只在用户没有设置这个参数时填充参数,否则会直接覆盖用户原有的参数设置
|
||
overwrite bool
|
||
}
|
||
|
||
func (c *CustomSetting) FromJson(json gjson.Result) {
|
||
c.name = json.Get("name").String()
|
||
c.value = json.Get("value").Raw
|
||
if obj := json.Get("mode"); obj.Exists() {
|
||
c.mode = obj.String()
|
||
} else {
|
||
c.mode = "auto"
|
||
}
|
||
if obj := json.Get("overwrite"); obj.Exists() {
|
||
c.overwrite = obj.Bool()
|
||
} else {
|
||
c.overwrite = true
|
||
}
|
||
}
|
||
|
||
func (c *CustomSetting) Validate() bool {
|
||
return c.name != ""
|
||
}
|
||
|
||
func (c *CustomSetting) setInvalid() {
|
||
c.name = "" // set empty to represent invalid
|
||
}
|
||
|
||
func (c *CustomSetting) AdjustWithProtocol(protocol string) {
|
||
if !(c.mode == "raw") {
|
||
mapping, ok := settingMapping[c.name]
|
||
if ok {
|
||
c.name, ok = mapping[protocol]
|
||
}
|
||
if !ok {
|
||
c.setInvalid()
|
||
return
|
||
}
|
||
}
|
||
|
||
if protocol == providerTypeQwen {
|
||
c.name = "parameters." + c.name
|
||
}
|
||
if protocol == providerTypeGemini {
|
||
c.name = "generation_config." + c.name
|
||
}
|
||
}
|
||
|
||
func ReplaceByCustomSettings(body []byte, settings []CustomSetting) ([]byte, error) {
|
||
var err error
|
||
strBody := string(body)
|
||
for _, setting := range settings {
|
||
if !setting.overwrite && gjson.Get(strBody, setting.name).Exists() {
|
||
continue
|
||
}
|
||
strBody, err = sjson.SetRaw(strBody, setting.name, setting.value)
|
||
if err != nil {
|
||
break
|
||
}
|
||
}
|
||
return []byte(strBody), err
|
||
}
|