| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- package controller
- import (
- "net/http"
- "strings"
- "github.com/gin-gonic/gin"
- "github.com/labring/aiproxy/middleware"
- "github.com/labring/aiproxy/model"
- "gorm.io/gorm"
- )
- type OneAPIChannel struct {
- Type int `gorm:"default:0" json:"type"`
- Key string `gorm:"type:text" json:"key"`
- Status int `gorm:"default:1" json:"status"`
- Name string `gorm:"index" json:"name"`
- BaseURL string `gorm:"column:base_url;default:''"`
- Models string `json:"models"`
- ModelMapping map[string]string `gorm:"type:varchar(1024);serializer:fastjson"`
- Priority int32 `gorm:"bigint;default:0"`
- Config ChannelConfig `gorm:"serializer:fastjson"`
- }
- func (c *OneAPIChannel) TableName() string {
- return "channels"
- }
- type ChannelConfig struct {
- Region string `json:"region,omitempty"`
- SK string `json:"sk,omitempty"`
- AK string `json:"ak,omitempty"`
- UserID string `json:"user_id,omitempty"`
- APIVersion string `json:"api_version,omitempty"`
- LibraryID string `json:"library_id,omitempty"`
- VertexAIProjectID string `json:"vertex_ai_project_id,omitempty"`
- VertexAIADC string `json:"vertex_ai_adc,omitempty"`
- }
- // https://github.com/songquanpeng/one-api/blob/main/relay/channeltype/define.go
- const (
- OneAPIOpenAI = iota + 1
- OneAPIAPI2D
- OneAPIAzure
- OneAPICloseAI
- OneAPIOpenAISB
- OneAPIOpenAIMax
- OneAPIOhMyGPT
- OneAPICustom
- OneAPIAils
- OneAPIAIProxy
- OneAPIPaLM
- OneAPIAPI2GPT
- OneAPIAIGC2D
- OneAPIAnthropic
- OneAPIBaidu
- OneAPIZhipu
- OneAPIAli
- OneAPIXunfei
- OneAPIAI360
- OneAPIOpenRouter
- OneAPIAIProxyLibrary
- OneAPIFastGPT
- OneAPITencent
- OneAPIGemini
- OneAPIMoonshot
- OneAPIBaichuan
- OneAPIMinimax
- OneAPIMistral
- OneAPIGroq
- OneAPIOllama
- OneAPILingYiWanWu
- OneAPIStepFun
- OneAPIAwsClaude
- OneAPICoze
- OneAPICohere
- OneAPIDeepSeek
- OneAPICloudflare
- OneAPIDeepL
- OneAPITogetherAI
- OneAPIDoubao
- OneAPINovita
- OneAPIVertextAI
- OneAPIProxy
- OneAPISiliconFlow
- OneAPIXAI
- OneAPIReplicate
- OneAPIBaiduV2
- OneAPIXunfeiV2
- OneAPIAliBailian
- OneAPIOpenAICompatible
- OneAPIGeminiOpenAICompatible
- )
- // relay/channeltype/define.go
- var OneAPIChannelType2AIProxyMap = map[int]int{
- OneAPIOpenAI: 1,
- OneAPIAzure: 3,
- OneAPIAnthropic: 14,
- OneAPIBaidu: 15,
- OneAPIZhipu: 16,
- OneAPIAli: 17,
- OneAPIAI360: 19,
- OneAPITencent: 23,
- OneAPIGemini: 24,
- OneAPIMoonshot: 25,
- OneAPIBaichuan: 26,
- OneAPIMinimax: 27,
- OneAPIMistral: 28,
- OneAPIGroq: 29,
- OneAPIOllama: 30,
- OneAPILingYiWanWu: 31,
- OneAPIStepFun: 32,
- OneAPIAwsClaude: 33,
- OneAPICoze: 34,
- OneAPICohere: 35,
- OneAPIDeepSeek: 36,
- OneAPICloudflare: 37,
- OneAPIDoubao: 40,
- OneAPINovita: 41,
- OneAPIVertextAI: 42,
- OneAPISiliconFlow: 43,
- OneAPIBaiduV2: 13,
- OneAPIXunfeiV2: 18,
- OneAPIAliBailian: 17,
- OneAPIGeminiOpenAICompatible: 12,
- OneAPIXAI: 45,
- }
- type ImportChannelFromOneAPIRequest struct {
- DSN string `json:"dsn"`
- }
- func AddOneAPIChannel(ch OneAPIChannel) error {
- add := AddChannelRequest{
- Type: ch.Type,
- Name: ch.Name,
- Key: ch.Key,
- BaseURL: ch.BaseURL,
- Models: strings.Split(ch.Models, ","),
- ModelMapping: ch.ModelMapping,
- Priority: ch.Priority,
- Status: ch.Status,
- }
- if t, ok := OneAPIChannelType2AIProxyMap[ch.Type]; ok {
- add.Type = t
- } else {
- add.Type = 1
- }
- if add.Type == 1 && add.BaseURL != "" {
- add.BaseURL += "/v1"
- }
- chs, err := add.ToChannels()
- if err != nil {
- return err
- }
- return model.BatchInsertChannels(chs)
- }
- func ImportChannelFromOneAPI(c *gin.Context) {
- var req ImportChannelFromOneAPIRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
- return
- }
- if req.DSN == "" {
- middleware.ErrorResponse(c, http.StatusBadRequest, "sql dsn is required")
- return
- }
- var db *gorm.DB
- var err error
- if strings.HasPrefix(req.DSN, "mysql") {
- db, err = model.OpenMySQL(req.DSN)
- } else if strings.HasPrefix(req.DSN, "postgres") {
- db, err = model.OpenPostgreSQL(req.DSN)
- } else {
- middleware.ErrorResponse(c, http.StatusBadRequest, "invalid dsn, only mysql and postgres are supported")
- return
- }
- if err != nil {
- middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
- return
- }
- sqlDB, err := db.DB()
- if err != nil {
- middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
- return
- }
- defer sqlDB.Close()
- allChannels := make([]*OneAPIChannel, 0)
- err = db.Model(&OneAPIChannel{}).Find(&allChannels).Error
- if err != nil {
- middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
- return
- }
- errs := make([]error, 0)
- for _, ch := range allChannels {
- err := AddOneAPIChannel(*ch)
- if err != nil {
- errs = append(errs, err)
- }
- }
- middleware.SuccessResponse(c, errs)
- }
|