Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
200 changes: 103 additions & 97 deletions internal/handler/group_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,21 +45,22 @@ func (s *Server) handleGroupError(c *gin.Context, err error) bool {

// GroupCreateRequest defines the payload for creating a group.
type GroupCreateRequest struct {
Name string `json:"name"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
GroupType string `json:"group_type"` // 'standard' or 'aggregate'
Upstreams json.RawMessage `json:"upstreams"`
ChannelType string `json:"channel_type"`
Sort int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint string `json:"validation_endpoint"`
ParamOverrides map[string]any `json:"param_overrides"`
ModelRedirectRules map[string]string `json:"model_redirect_rules"`
ModelRedirectStrict bool `json:"model_redirect_strict"`
Config map[string]any `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys string `json:"proxy_keys"`
Name string `json:"name"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
GroupType string `json:"group_type"` // 'standard' or 'aggregate'
Upstreams json.RawMessage `json:"upstreams"`
ChannelType string `json:"channel_type"`
AnthropicSystemPromptCount int `json:"anthropic_system_prompt_count"`
Sort int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint string `json:"validation_endpoint"`
ParamOverrides map[string]any `json:"param_overrides"`
ModelRedirectRules map[string]string `json:"model_redirect_rules"`
ModelRedirectStrict bool `json:"model_redirect_strict"`
Config map[string]any `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys string `json:"proxy_keys"`
}

// CreateGroup handles the creation of a new group.
Expand All @@ -71,21 +72,22 @@ func (s *Server) CreateGroup(c *gin.Context) {
}

params := services.GroupCreateParams{
Name: req.Name,
DisplayName: req.DisplayName,
Description: req.Description,
GroupType: req.GroupType,
Upstreams: req.Upstreams,
ChannelType: req.ChannelType,
Sort: req.Sort,
TestModel: req.TestModel,
ValidationEndpoint: req.ValidationEndpoint,
ParamOverrides: req.ParamOverrides,
ModelRedirectRules: req.ModelRedirectRules,
ModelRedirectStrict: req.ModelRedirectStrict,
Config: req.Config,
HeaderRules: req.HeaderRules,
ProxyKeys: req.ProxyKeys,
Name: req.Name,
DisplayName: req.DisplayName,
Description: req.Description,
GroupType: req.GroupType,
Upstreams: req.Upstreams,
ChannelType: req.ChannelType,
AnthropicSystemPromptCount: req.AnthropicSystemPromptCount,
Sort: req.Sort,
TestModel: req.TestModel,
ValidationEndpoint: req.ValidationEndpoint,
ParamOverrides: req.ParamOverrides,
ModelRedirectRules: req.ModelRedirectRules,
ModelRedirectStrict: req.ModelRedirectStrict,
Config: req.Config,
HeaderRules: req.HeaderRules,
ProxyKeys: req.ProxyKeys,
}

group, err := s.GroupService.CreateGroup(c.Request.Context(), params)
Expand Down Expand Up @@ -114,21 +116,22 @@ func (s *Server) ListGroups(c *gin.Context) {
// GroupUpdateRequest defines the payload for updating a group.
// Using a dedicated struct avoids issues with zero values being ignored by GORM's Update.
type GroupUpdateRequest struct {
Name *string `json:"name,omitempty"`
DisplayName *string `json:"display_name,omitempty"`
Description *string `json:"description,omitempty"`
GroupType *string `json:"group_type,omitempty"`
Upstreams json.RawMessage `json:"upstreams"`
ChannelType *string `json:"channel_type,omitempty"`
Sort *int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint *string `json:"validation_endpoint,omitempty"`
ParamOverrides map[string]any `json:"param_overrides"`
ModelRedirectRules map[string]string `json:"model_redirect_rules"`
ModelRedirectStrict *bool `json:"model_redirect_strict"`
Config map[string]any `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys *string `json:"proxy_keys,omitempty"`
Name *string `json:"name,omitempty"`
DisplayName *string `json:"display_name,omitempty"`
Description *string `json:"description,omitempty"`
GroupType *string `json:"group_type,omitempty"`
Upstreams json.RawMessage `json:"upstreams"`
ChannelType *string `json:"channel_type,omitempty"`
AnthropicSystemPromptCount *int `json:"anthropic_system_prompt_count,omitempty"`
Sort *int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint *string `json:"validation_endpoint,omitempty"`
ParamOverrides map[string]any `json:"param_overrides"`
ModelRedirectRules map[string]string `json:"model_redirect_rules"`
ModelRedirectStrict *bool `json:"model_redirect_strict"`
Config map[string]any `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys *string `json:"proxy_keys,omitempty"`
}

// UpdateGroup handles updating an existing group.
Expand All @@ -146,18 +149,19 @@ func (s *Server) UpdateGroup(c *gin.Context) {
}

params := services.GroupUpdateParams{
Name: req.Name,
DisplayName: req.DisplayName,
Description: req.Description,
GroupType: req.GroupType,
ChannelType: req.ChannelType,
Sort: req.Sort,
ValidationEndpoint: req.ValidationEndpoint,
ParamOverrides: req.ParamOverrides,
ModelRedirectRules: req.ModelRedirectRules,
ModelRedirectStrict: req.ModelRedirectStrict,
Config: req.Config,
ProxyKeys: req.ProxyKeys,
Name: req.Name,
DisplayName: req.DisplayName,
Description: req.Description,
GroupType: req.GroupType,
ChannelType: req.ChannelType,
AnthropicSystemPromptCount: req.AnthropicSystemPromptCount,
Sort: req.Sort,
ValidationEndpoint: req.ValidationEndpoint,
ParamOverrides: req.ParamOverrides,
ModelRedirectRules: req.ModelRedirectRules,
ModelRedirectStrict: req.ModelRedirectStrict,
Config: req.Config,
ProxyKeys: req.ProxyKeys,
}

if req.Upstreams != nil {
Expand Down Expand Up @@ -185,26 +189,27 @@ func (s *Server) UpdateGroup(c *gin.Context) {

// GroupResponse defines the structure for a group response, excluding sensitive or large fields.
type GroupResponse struct {
ID uint `json:"id"`
Name string `json:"name"`
Endpoint string `json:"endpoint"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
GroupType string `json:"group_type"`
Upstreams datatypes.JSON `json:"upstreams"`
ChannelType string `json:"channel_type"`
Sort int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint string `json:"validation_endpoint"`
ParamOverrides datatypes.JSONMap `json:"param_overrides"`
ModelRedirectRules datatypes.JSONMap `json:"model_redirect_rules"`
ModelRedirectStrict bool `json:"model_redirect_strict"`
Config datatypes.JSONMap `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys string `json:"proxy_keys"`
LastValidatedAt *time.Time `json:"last_validated_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ID uint `json:"id"`
Name string `json:"name"`
Endpoint string `json:"endpoint"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
GroupType string `json:"group_type"`
Upstreams datatypes.JSON `json:"upstreams"`
ChannelType string `json:"channel_type"`
AnthropicSystemPromptCount int `json:"anthropic_system_prompt_count"`
Sort int `json:"sort"`
TestModel string `json:"test_model"`
ValidationEndpoint string `json:"validation_endpoint"`
ParamOverrides datatypes.JSONMap `json:"param_overrides"`
ModelRedirectRules datatypes.JSONMap `json:"model_redirect_rules"`
ModelRedirectStrict bool `json:"model_redirect_strict"`
Config datatypes.JSONMap `json:"config"`
HeaderRules []models.HeaderRule `json:"header_rules"`
ProxyKeys string `json:"proxy_keys"`
LastValidatedAt *time.Time `json:"last_validated_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

// newGroupResponse creates a new GroupResponse from a models.Group.
Expand All @@ -229,26 +234,27 @@ func (s *Server) newGroupResponse(group *models.Group) *GroupResponse {
}

return &GroupResponse{
ID: group.ID,
Name: group.Name,
Endpoint: endpoint,
DisplayName: group.DisplayName,
Description: group.Description,
GroupType: group.GroupType,
Upstreams: group.Upstreams,
ChannelType: group.ChannelType,
Sort: group.Sort,
TestModel: group.TestModel,
ValidationEndpoint: group.ValidationEndpoint,
ParamOverrides: group.ParamOverrides,
ModelRedirectRules: group.ModelRedirectRules,
ModelRedirectStrict: group.ModelRedirectStrict,
Config: group.Config,
HeaderRules: headerRules,
ProxyKeys: group.ProxyKeys,
LastValidatedAt: group.LastValidatedAt,
CreatedAt: group.CreatedAt,
UpdatedAt: group.UpdatedAt,
ID: group.ID,
Name: group.Name,
Endpoint: endpoint,
DisplayName: group.DisplayName,
Description: group.Description,
GroupType: group.GroupType,
Upstreams: group.Upstreams,
ChannelType: group.ChannelType,
AnthropicSystemPromptCount: group.AnthropicSystemPromptCount,
Sort: group.Sort,
TestModel: group.TestModel,
ValidationEndpoint: group.ValidationEndpoint,
ParamOverrides: group.ParamOverrides,
ModelRedirectRules: group.ModelRedirectRules,
ModelRedirectStrict: group.ModelRedirectStrict,
Config: group.Config,
HeaderRules: headerRules,
ProxyKeys: group.ProxyKeys,
LastValidatedAt: group.LastValidatedAt,
CreatedAt: group.CreatedAt,
UpdatedAt: group.UpdatedAt,
}
}

Expand Down
49 changes: 26 additions & 23 deletions internal/models/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
const (
KeyStatusActive = "active"
KeyStatusInvalid = "invalid"

MaxAnthropicSystemPromptCount = 100
)

// SystemSetting 对应 system_settings 表
Expand Down Expand Up @@ -79,29 +81,30 @@ type ParentAggregateGroupInfo struct {

// Group 对应 groups 表
type Group struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
EffectiveConfig types.SystemSettings `gorm:"-" json:"effective_config,omitempty"`
Name string `gorm:"type:varchar(255);not null;unique" json:"name"`
Endpoint string `gorm:"-" json:"endpoint"`
DisplayName string `gorm:"type:varchar(255)" json:"display_name"`
ProxyKeys string `gorm:"type:text" json:"proxy_keys"`
Description string `gorm:"type:varchar(512)" json:"description"`
GroupType string `gorm:"type:varchar(50);default:'standard'" json:"group_type"` // 'standard' or 'aggregate'
Upstreams datatypes.JSON `gorm:"type:json;not null" json:"upstreams"`
ValidationEndpoint string `gorm:"type:varchar(255)" json:"validation_endpoint"`
ChannelType string `gorm:"type:varchar(50);not null" json:"channel_type"`
Sort int `gorm:"default:0" json:"sort"`
TestModel string `gorm:"type:varchar(255);not null" json:"test_model"`
ParamOverrides datatypes.JSONMap `gorm:"type:json" json:"param_overrides"`
Config datatypes.JSONMap `gorm:"type:json" json:"config"`
HeaderRules datatypes.JSON `gorm:"type:json" json:"header_rules"`
ModelRedirectRules datatypes.JSONMap `gorm:"type:json" json:"model_redirect_rules"`
ModelRedirectStrict bool `gorm:"default:false" json:"model_redirect_strict"`
APIKeys []APIKey `gorm:"foreignKey:GroupID" json:"api_keys"`
SubGroups []GroupSubGroup `gorm:"-" json:"sub_groups,omitempty"`
LastValidatedAt *time.Time `json:"last_validated_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
EffectiveConfig types.SystemSettings `gorm:"-" json:"effective_config,omitempty"`
Name string `gorm:"type:varchar(255);not null;unique" json:"name"`
Endpoint string `gorm:"-" json:"endpoint"`
DisplayName string `gorm:"type:varchar(255)" json:"display_name"`
ProxyKeys string `gorm:"type:text" json:"proxy_keys"`
Description string `gorm:"type:varchar(512)" json:"description"`
GroupType string `gorm:"type:varchar(50);default:'standard'" json:"group_type"` // 'standard' or 'aggregate'
Upstreams datatypes.JSON `gorm:"type:json;not null" json:"upstreams"`
ValidationEndpoint string `gorm:"type:varchar(255)" json:"validation_endpoint"`
ChannelType string `gorm:"type:varchar(50);not null" json:"channel_type"`
AnthropicSystemPromptCount int `gorm:"type:int;default:0" json:"anthropic_system_prompt_count"`
Sort int `gorm:"default:0" json:"sort"`
TestModel string `gorm:"type:varchar(255);not null" json:"test_model"`
ParamOverrides datatypes.JSONMap `gorm:"type:json" json:"param_overrides"`
Config datatypes.JSONMap `gorm:"type:json" json:"config"`
HeaderRules datatypes.JSON `gorm:"type:json" json:"header_rules"`
ModelRedirectRules datatypes.JSONMap `gorm:"type:json" json:"model_redirect_rules"`
ModelRedirectStrict bool `gorm:"default:false" json:"model_redirect_strict"`
APIKeys []APIKey `gorm:"foreignKey:GroupID" json:"api_keys"`
SubGroups []GroupSubGroup `gorm:"-" json:"sub_groups,omitempty"`
LastValidatedAt *time.Time `json:"last_validated_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`

// For cache
ProxyKeysMap map[string]struct{} `gorm:"-" json:"-"`
Expand Down
Loading