feat: add deployment_mapping for Azure OpenAI
This commit is contained in:
parent
495fc628e4
commit
9042b7c4e4
@ -33,18 +33,19 @@ func testChannel(channel *model.Channel, request ChatRequest) (err error, openai
|
||||
case common.ChannelTypeXunfei:
|
||||
return errors.New("该渠道类型当前版本不支持测试,请手动测试"), nil
|
||||
case common.ChannelTypeAzure:
|
||||
request.Model = "gpt-35-turbo"
|
||||
defer func() {
|
||||
if err != nil {
|
||||
err = errors.New("请确保已在 Azure 上创建了 gpt-35-turbo 模型,并且 apiVersion 已正确填写!")
|
||||
err = errors.New("请确保已在 Azure 上创建了 gpt-35-turbo 模型,或正确配置部署映射,并且 apiVersion 已正确填写!")
|
||||
}
|
||||
}()
|
||||
fallthrough
|
||||
default:
|
||||
request.Model = "gpt-3.5-turbo"
|
||||
}
|
||||
requestURL := common.ChannelBaseURLs[channel.Type]
|
||||
if channel.Type == common.ChannelTypeAzure {
|
||||
requestURL = getFullRequestURL(channel.GetBaseURL(), fmt.Sprintf("/openai/deployments/%s/chat/completions?api-version=2023-03-15-preview", request.Model), channel.Type)
|
||||
deployment := channel.GetDeployment(request.Model)
|
||||
requestURL = fmt.Sprintf("%s/openai/deployments/%s/chat/completions?api-version=%s", channel.GetBaseURL(), deployment, channel.Other)
|
||||
} else {
|
||||
if baseURL := channel.GetBaseURL(); len(baseURL) > 0 {
|
||||
requestURL = baseURL
|
||||
|
@ -141,15 +141,13 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
|
||||
requestURL = fmt.Sprintf("%s?api-version=%s", requestURL, apiVersion)
|
||||
baseURL = c.GetString("base_url")
|
||||
task := strings.TrimPrefix(requestURL, "/v1/")
|
||||
model_ := textRequest.Model
|
||||
model_ = strings.Replace(model_, ".", "", -1)
|
||||
// https://github.com/songquanpeng/one-api/issues/67
|
||||
model_ = strings.TrimSuffix(model_, "-0301")
|
||||
model_ = strings.TrimSuffix(model_, "-0314")
|
||||
model_ = strings.TrimSuffix(model_, "-0613")
|
||||
|
||||
requestURL = fmt.Sprintf("/openai/deployments/%s/%s", model_, task)
|
||||
fullRequestURL = getFullRequestURL(baseURL, requestURL, channelType)
|
||||
deploymentMapping := c.GetStringMapString("deployment_mapping")
|
||||
deployment := deploymentMapping[textRequest.Model]
|
||||
if deployment == "" {
|
||||
deployment = model.ModelToDeployment(textRequest.Model)
|
||||
}
|
||||
fullRequestURL = fmt.Sprintf("%s/openai/deployments/%s/%s", baseURL, deployment, task)
|
||||
}
|
||||
case APITypeClaude:
|
||||
fullRequestURL = "https://api.anthropic.com/v1/complete"
|
||||
|
@ -85,6 +85,7 @@ func Distribute() func(c *gin.Context) {
|
||||
switch channel.Type {
|
||||
case common.ChannelTypeAzure:
|
||||
c.Set("api_version", channel.Other)
|
||||
c.Set("deployment_mapping", channel.GetDeploymentMapping())
|
||||
case common.ChannelTypeXunfei:
|
||||
c.Set("api_version", channel.Other)
|
||||
case common.ChannelTypeAIProxyLibrary:
|
||||
|
@ -1,8 +1,11 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
"encoding/json"
|
||||
"one-api/common"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Channel struct {
|
||||
@ -24,6 +27,7 @@ type Channel struct {
|
||||
UsedQuota int64 `json:"used_quota" gorm:"bigint;default:0"`
|
||||
ModelMapping *string `json:"model_mapping" gorm:"type:varchar(1024);default:''"`
|
||||
Priority *int64 `json:"priority" gorm:"bigint;default:0"`
|
||||
DeploymentMapping *string `json:"deployment_mapping" gorm:"type:varchar(1024);default:''"`
|
||||
}
|
||||
|
||||
func GetAllChannels(startIdx int, num int, selectAll bool) ([]*Channel, error) {
|
||||
@ -72,6 +76,35 @@ func BatchInsertChannels(channels []Channel) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (channel *Channel) GetDeploymentMapping() (deploymentMapping map[string]string) {
|
||||
if channel.DeploymentMapping == nil || *channel.DeploymentMapping == "" {
|
||||
return
|
||||
}
|
||||
err := json.Unmarshal([]byte(*channel.DeploymentMapping), &deploymentMapping)
|
||||
if err != nil {
|
||||
common.SysError("failed to unmarshal deployment mapping: " + err.Error())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (channel *Channel) GetDeployment(model string) string {
|
||||
deploymentMapping := channel.GetDeploymentMapping()
|
||||
deployment, ok := deploymentMapping[model]
|
||||
if !ok {
|
||||
return ModelToDeployment(model)
|
||||
}
|
||||
return deployment
|
||||
}
|
||||
|
||||
func ModelToDeployment(model string) string {
|
||||
model = strings.Replace(model, ".", "", -1)
|
||||
// https://github.com/songquanpeng/one-api/issues/67
|
||||
model = strings.TrimSuffix(model, "-0301")
|
||||
model = strings.TrimSuffix(model, "-0314")
|
||||
model = strings.TrimSuffix(model, "-0613")
|
||||
return model
|
||||
}
|
||||
|
||||
func (channel *Channel) GetPriority() int64 {
|
||||
if channel.Priority == nil {
|
||||
return 0
|
||||
|
@ -10,6 +10,11 @@ const MODEL_MAPPING_EXAMPLE = {
|
||||
'gpt-4-32k-0314': 'gpt-4-32k'
|
||||
};
|
||||
|
||||
const DEPLOYMENT_MAPPING_EXAMPLE = {
|
||||
'gpt-3.5-turbo': 'gpt-35-turbo',
|
||||
'gpt-4': 'custom-gpt4'
|
||||
};
|
||||
|
||||
function type2secretPrompt(type) {
|
||||
// inputs.type === 15 ? '按照如下格式输入:APIKey|SecretKey' : (inputs.type === 18 ? '按照如下格式输入:APPID|APISecret|APIKey' : '请输入渠道对应的鉴权密钥')
|
||||
switch (type) {
|
||||
@ -43,6 +48,7 @@ const EditChannel = () => {
|
||||
base_url: '',
|
||||
other: '',
|
||||
model_mapping: '',
|
||||
deployment_mapping: '',
|
||||
models: [],
|
||||
groups: ['default']
|
||||
};
|
||||
@ -396,6 +402,23 @@ const EditChannel = () => {
|
||||
autoComplete='new-password'
|
||||
/>
|
||||
</Form.Field>
|
||||
{
|
||||
inputs.type === 3 && (
|
||||
<>
|
||||
<Form.Field>
|
||||
<Form.TextArea
|
||||
label='部署映射'
|
||||
placeholder={`此项可选,为一个 JSON 字符串,键为请求中模型名称,值为要替换的部署名称,用于修改 Azure OpenAI 的 deployment 参数。如果不填此参数,则部署名称必须与模型名称一致,例如 gpt-3.5-turbo 模型对应的部署名称应该为 gpt-35-turbo。若实际的部署名称不满足此规则,则可以通过该参数自定义。例如:\n${JSON.stringify(DEPLOYMENT_MAPPING_EXAMPLE, null, 2)}`}
|
||||
name='deployment_mapping'
|
||||
onChange={handleInputChange}
|
||||
value={inputs.deployment_mapping}
|
||||
style={{ minHeight: 150, fontFamily: 'JetBrains Mono, Consolas' }}
|
||||
autoComplete='new-password'
|
||||
/>
|
||||
</Form.Field>
|
||||
</>
|
||||
)
|
||||
}
|
||||
{
|
||||
batch ? <Form.Field>
|
||||
<Form.TextArea
|
||||
|
Loading…
Reference in New Issue
Block a user