package model import ( "time" "gorm.io/gorm" ) // ProviderGroup represents a shared upstream definition. type ProviderGroup struct { gorm.Model Name string `gorm:"size:255;uniqueIndex;not null" json:"name"` Type string `gorm:"size:50;not null" json:"type"` // openai, anthropic, gemini BaseURL string `gorm:"size:512;not null" json:"base_url"` GoogleProject string `gorm:"size:128" json:"google_project,omitempty"` GoogleLocation string `gorm:"size:64" json:"google_location,omitempty"` StaticHeaders string `gorm:"type:text" json:"static_headers,omitempty"` HeadersProfile string `gorm:"size:64" json:"headers_profile,omitempty"` Models string `json:"models"` // comma-separated list of supported models Status string `gorm:"size:50;default:'active'" json:"status"` } // APIKey represents a credential within a provider group. type APIKey struct { gorm.Model GroupID uint `gorm:"not null;index" json:"group_id"` APIKey string `gorm:"not null" json:"api_key"` AccessToken string `gorm:"type:text" json:"access_token,omitempty"` RefreshToken string `gorm:"type:text" json:"-"` ExpiresAt *time.Time `json:"expires_at,omitempty"` AccountID string `gorm:"size:255" json:"account_id,omitempty"` ProjectID string `gorm:"size:255" json:"project_id,omitempty"` Weight int `gorm:"default:1" json:"weight"` Status string `gorm:"size:50;default:'active'" json:"status"` AutoBan bool `gorm:"default:true" json:"auto_ban"` BanReason string `gorm:"size:255" json:"ban_reason"` BanUntil *time.Time `json:"ban_until"` }