Files
huobao-drama/domain/models/ai_config.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")
}