125 lines
3.8 KiB
Go
125 lines
3.8 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type AIServiceConfig struct {
|
|
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
|
ServiceType string `gorm:"type:varchar(50);not null" json:"service_type"` // text, image, video
|
|
Provider string `gorm:"type:varchar(50)" json:"provider"` // openai, gemini, volcengine, etc.
|
|
Name string `gorm:"type:varchar(100);not null" json:"name"`
|
|
BaseURL string `gorm:"type:varchar(255);not null" json:"base_url"`
|
|
APIKey string `gorm:"type:varchar(255);not null" json:"api_key"`
|
|
Model ModelField `gorm:"type:text" json:"model"`
|
|
Endpoint string `gorm:"type:varchar(255)" json:"endpoint"`
|
|
QueryEndpoint string `gorm:"type:varchar(255)" json:"query_endpoint"`
|
|
Priority int `gorm:"default:0" json:"priority"` // 优先级,数值越大优先级越高
|
|
IsDefault bool `gorm:"default:false" json:"is_default"`
|
|
IsActive bool `gorm:"default:true" json:"is_active"`
|
|
Settings string `gorm:"type:text" json:"settings"`
|
|
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
|
|
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
|
|
}
|
|
|
|
func (c *AIServiceConfig) TableName() string {
|
|
return "ai_service_configs"
|
|
}
|
|
|
|
type AIServiceProvider struct {
|
|
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
|
Name string `gorm:"type:varchar(100);not null;uniqueIndex" json:"name"`
|
|
DisplayName string `gorm:"type:varchar(100);not null" json:"display_name"`
|
|
ServiceType string `gorm:"type:varchar(50);not null" json:"service_type"`
|
|
DefaultURL string `gorm:"type:varchar(255)" json:"default_url"`
|
|
Description string `gorm:"type:text" json:"description"`
|
|
IsActive bool `gorm:"default:true" json:"is_active"`
|
|
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
|
|
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
|
|
}
|
|
|
|
func (p *AIServiceProvider) TableName() string {
|
|
return "ai_service_providers"
|
|
}
|
|
|
|
// ModelField 自定义类型,支持字符串或字符串数组
|
|
type ModelField []string
|
|
|
|
// Value 实现 driver.Valuer 接口,用于存储到数据库
|
|
func (m ModelField) Value() (driver.Value, error) {
|
|
if len(m) == 0 {
|
|
return nil, nil
|
|
}
|
|
data, err := json.Marshal(m)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return string(data), nil
|
|
}
|
|
|
|
// Scan 实现 sql.Scanner 接口,用于从数据库读取
|
|
func (m *ModelField) Scan(value interface{}) error {
|
|
if value == nil {
|
|
*m = []string{}
|
|
return nil
|
|
}
|
|
|
|
var data []byte
|
|
switch v := value.(type) {
|
|
case []byte:
|
|
data = v
|
|
case string:
|
|
data = []byte(v)
|
|
default:
|
|
return errors.New("unsupported type for ModelField")
|
|
}
|
|
|
|
// 尝试解析为数组
|
|
var arr []string
|
|
if err := json.Unmarshal(data, &arr); err == nil {
|
|
*m = arr
|
|
return nil
|
|
}
|
|
|
|
// 如果解析失败,尝试作为单个字符串处理
|
|
var str string
|
|
if err := json.Unmarshal(data, &str); err == nil {
|
|
*m = []string{str}
|
|
return nil
|
|
}
|
|
|
|
// 兼容旧数据:直接作为字符串
|
|
*m = []string{string(data)}
|
|
return nil
|
|
}
|
|
|
|
// MarshalJSON 实现 json.Marshaler 接口
|
|
func (m ModelField) MarshalJSON() ([]byte, error) {
|
|
if len(m) == 0 {
|
|
return json.Marshal([]string{})
|
|
}
|
|
return json.Marshal([]string(m))
|
|
}
|
|
|
|
// UnmarshalJSON 实现 json.Unmarshaler 接口,支持字符串或数组
|
|
func (m *ModelField) UnmarshalJSON(data []byte) error {
|
|
// 尝试解析为数组
|
|
var arr []string
|
|
if err := json.Unmarshal(data, &arr); err == nil {
|
|
*m = arr
|
|
return nil
|
|
}
|
|
|
|
// 尝试解析为单个字符串
|
|
var str string
|
|
if err := json.Unmarshal(data, &str); err == nil {
|
|
*m = []string{str}
|
|
return nil
|
|
}
|
|
|
|
return errors.New("model field must be string or array of strings")
|
|
}
|