mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-28 08:08:32 +00:00
Persist reasoning ceilings and exact mappings for OpenAI groups, enforce them across HTTP and WebSocket forwarding, and invalidate cached auth snapshots.
858 lines
36 KiB
Go
858 lines
36 KiB
Go
// Code generated by ent, DO NOT EDIT.
|
|
|
|
package ent
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"entgo.io/ent"
|
|
"entgo.io/ent/dialect/sql"
|
|
"github.com/Wei-Shaw/sub2api/ent/group"
|
|
"github.com/Wei-Shaw/sub2api/internal/domain"
|
|
)
|
|
|
|
// Group is the model entity for the Group schema.
|
|
type Group struct {
|
|
config `json:"-"`
|
|
// ID of the ent.
|
|
ID int64 `json:"id,omitempty"`
|
|
// CreatedAt holds the value of the "created_at" field.
|
|
CreatedAt time.Time `json:"created_at,omitempty"`
|
|
// UpdatedAt holds the value of the "updated_at" field.
|
|
UpdatedAt time.Time `json:"updated_at,omitempty"`
|
|
// DeletedAt holds the value of the "deleted_at" field.
|
|
DeletedAt *time.Time `json:"deleted_at,omitempty"`
|
|
// Name holds the value of the "name" field.
|
|
Name string `json:"name,omitempty"`
|
|
// Description holds the value of the "description" field.
|
|
Description *string `json:"description,omitempty"`
|
|
// RateMultiplier holds the value of the "rate_multiplier" field.
|
|
RateMultiplier float64 `json:"rate_multiplier,omitempty"`
|
|
// 是否启用高峰时段倍率
|
|
PeakRateEnabled bool `json:"peak_rate_enabled,omitempty"`
|
|
// 高峰开始时间 HH:MM(含),如 14:00;空表示未配置;不支持跨天
|
|
PeakStart string `json:"peak_start,omitempty"`
|
|
// 高峰结束时间 HH:MM(不含),必须大于 peak_start;不支持跨天,如 22:00-02:00
|
|
PeakEnd string `json:"peak_end,omitempty"`
|
|
// 高峰时段叠加倍率,仅在 peak_rate_enabled 且处于 [peak_start, peak_end) 时乘入文本倍率
|
|
PeakRateMultiplier float64 `json:"peak_rate_multiplier,omitempty"`
|
|
// IsExclusive holds the value of the "is_exclusive" field.
|
|
IsExclusive bool `json:"is_exclusive,omitempty"`
|
|
// Status holds the value of the "status" field.
|
|
Status string `json:"status,omitempty"`
|
|
// 内部幂等恢复标识,不对 API 暴露
|
|
DuplicateOperationID *string `json:"duplicate_operation_id,omitempty"`
|
|
// Platform holds the value of the "platform" field.
|
|
Platform string `json:"platform,omitempty"`
|
|
// SubscriptionType holds the value of the "subscription_type" field.
|
|
SubscriptionType string `json:"subscription_type,omitempty"`
|
|
// DailyLimitUsd holds the value of the "daily_limit_usd" field.
|
|
DailyLimitUsd *float64 `json:"daily_limit_usd,omitempty"`
|
|
// WeeklyLimitUsd holds the value of the "weekly_limit_usd" field.
|
|
WeeklyLimitUsd *float64 `json:"weekly_limit_usd,omitempty"`
|
|
// MonthlyLimitUsd holds the value of the "monthly_limit_usd" field.
|
|
MonthlyLimitUsd *float64 `json:"monthly_limit_usd,omitempty"`
|
|
// DefaultValidityDays holds the value of the "default_validity_days" field.
|
|
DefaultValidityDays int `json:"default_validity_days,omitempty"`
|
|
// 是否允许该分组使用图片生成能力
|
|
AllowImageGeneration bool `json:"allow_image_generation,omitempty"`
|
|
// 是否允许该分组使用批量图片生成能力
|
|
AllowBatchImageGeneration bool `json:"allow_batch_image_generation,omitempty"`
|
|
// 图片生成是否使用独立倍率;false 表示共享分组有效倍率
|
|
ImageRateIndependent bool `json:"image_rate_independent,omitempty"`
|
|
// 图片生成独立倍率,仅 image_rate_independent=true 时生效
|
|
ImageRateMultiplier float64 `json:"image_rate_multiplier,omitempty"`
|
|
// ImagePrice1k holds the value of the "image_price_1k" field.
|
|
ImagePrice1k *float64 `json:"image_price_1k,omitempty"`
|
|
// ImagePrice2k holds the value of the "image_price_2k" field.
|
|
ImagePrice2k *float64 `json:"image_price_2k,omitempty"`
|
|
// ImagePrice4k holds the value of the "image_price_4k" field.
|
|
ImagePrice4k *float64 `json:"image_price_4k,omitempty"`
|
|
// 批量图片生成折扣倍率,最终单价会乘以该值;0 表示免费
|
|
BatchImageDiscountMultiplier float64 `json:"batch_image_discount_multiplier,omitempty"`
|
|
// 批量图片生成冻结价格比例,按普通生图原价乘以该比例冻结,结算后释放差额
|
|
BatchImageHoldMultiplier float64 `json:"batch_image_hold_multiplier,omitempty"`
|
|
// 视频生成是否使用独立倍率;false 表示共享分组有效倍率
|
|
VideoRateIndependent bool `json:"video_rate_independent,omitempty"`
|
|
// 视频生成独立倍率,仅 video_rate_independent=true 时生效
|
|
VideoRateMultiplier float64 `json:"video_rate_multiplier,omitempty"`
|
|
// VideoPrice480p holds the value of the "video_price_480p" field.
|
|
VideoPrice480p *float64 `json:"video_price_480p,omitempty"`
|
|
// VideoPrice720p holds the value of the "video_price_720p" field.
|
|
VideoPrice720p *float64 `json:"video_price_720p,omitempty"`
|
|
// VideoPrice1080p holds the value of the "video_price_1080p" field.
|
|
VideoPrice1080p *float64 `json:"video_price_1080p,omitempty"`
|
|
// Codex alpha/search 网页搜索单次价格(USD/次);nil 表示使用默认价 0.01(官方 $10/1000 次)
|
|
WebSearchPricePerCall *float64 `json:"web_search_price_per_call,omitempty"`
|
|
// 是否仅允许 Claude Code 客户端
|
|
ClaudeCodeOnly bool `json:"claude_code_only,omitempty"`
|
|
// 非 Claude Code 请求降级使用的分组 ID
|
|
FallbackGroupID *int64 `json:"fallback_group_id,omitempty"`
|
|
// 无效请求兜底使用的分组 ID
|
|
FallbackGroupIDOnInvalidRequest *int64 `json:"fallback_group_id_on_invalid_request,omitempty"`
|
|
// 模型路由配置:模型模式 -> 优先账号ID列表
|
|
ModelRouting map[string][]int64 `json:"model_routing,omitempty"`
|
|
// 是否启用模型路由配置
|
|
ModelRoutingEnabled bool `json:"model_routing_enabled,omitempty"`
|
|
// 是否注入 MCP XML 调用协议提示词(仅 antigravity 平台)
|
|
McpXMLInject bool `json:"mcp_xml_inject,omitempty"`
|
|
// 支持的模型系列:claude, gemini_text, gemini_image
|
|
SupportedModelScopes []string `json:"supported_model_scopes,omitempty"`
|
|
// 分组显示排序,数值越小越靠前
|
|
SortOrder int `json:"sort_order,omitempty"`
|
|
// 是否允许 /v1/messages 调度到此 OpenAI 分组
|
|
AllowMessagesDispatch bool `json:"allow_messages_dispatch,omitempty"`
|
|
// 仅允许非 apikey 类型账号关联到此分组
|
|
RequireOauthOnly bool `json:"require_oauth_only,omitempty"`
|
|
// 调度时仅允许 privacy 已成功设置的账号
|
|
RequirePrivacySet bool `json:"require_privacy_set,omitempty"`
|
|
// 默认映射模型 ID,当账号级映射找不到时使用此值
|
|
DefaultMappedModel string `json:"default_mapped_model,omitempty"`
|
|
// OpenAI Messages 调度模型配置:按 Claude 系列/精确模型映射到目标 GPT 模型
|
|
MessagesDispatchModelConfig domain.OpenAIMessagesDispatchModelConfig `json:"messages_dispatch_model_config,omitempty"`
|
|
// 自定义 /v1/models 展示列表配置;仅影响模型列表响应,不影响调度
|
|
ModelsListConfig domain.GroupModelsListConfig `json:"models_list_config,omitempty"`
|
|
// 分组 RPM 上限,0 表示不限制;设置后接管该分组用户的限流
|
|
RpmLimit int `json:"rpm_limit,omitempty"`
|
|
// OpenAI reasoning effort 上限;可选 minimal/low/medium/high/xhigh/max
|
|
MaxReasoningEffort string `json:"max_reasoning_effort,omitempty"`
|
|
// OpenAI reasoning effort 自定义精确映射;先映射再应用上限
|
|
ReasoningEffortMappings []domain.ReasoningEffortMapping `json:"reasoning_effort_mappings,omitempty"`
|
|
// Edges holds the relations/edges for other nodes in the graph.
|
|
// The values are being populated by the GroupQuery when eager-loading is set.
|
|
Edges GroupEdges `json:"edges"`
|
|
selectValues sql.SelectValues
|
|
}
|
|
|
|
// GroupEdges holds the relations/edges for other nodes in the graph.
|
|
type GroupEdges struct {
|
|
// APIKeys holds the value of the api_keys edge.
|
|
APIKeys []*APIKey `json:"api_keys,omitempty"`
|
|
// RedeemCodes holds the value of the redeem_codes edge.
|
|
RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"`
|
|
// Subscriptions holds the value of the subscriptions edge.
|
|
Subscriptions []*UserSubscription `json:"subscriptions,omitempty"`
|
|
// UsageLogs holds the value of the usage_logs edge.
|
|
UsageLogs []*UsageLog `json:"usage_logs,omitempty"`
|
|
// Accounts holds the value of the accounts edge.
|
|
Accounts []*Account `json:"accounts,omitempty"`
|
|
// AllowedUsers holds the value of the allowed_users edge.
|
|
AllowedUsers []*User `json:"allowed_users,omitempty"`
|
|
// AccountGroups holds the value of the account_groups edge.
|
|
AccountGroups []*AccountGroup `json:"account_groups,omitempty"`
|
|
// UserAllowedGroups holds the value of the user_allowed_groups edge.
|
|
UserAllowedGroups []*UserAllowedGroup `json:"user_allowed_groups,omitempty"`
|
|
// loadedTypes holds the information for reporting if a
|
|
// type was loaded (or requested) in eager-loading or not.
|
|
loadedTypes [8]bool
|
|
}
|
|
|
|
// APIKeysOrErr returns the APIKeys value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) APIKeysOrErr() ([]*APIKey, error) {
|
|
if e.loadedTypes[0] {
|
|
return e.APIKeys, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "api_keys"}
|
|
}
|
|
|
|
// RedeemCodesOrErr returns the RedeemCodes value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) RedeemCodesOrErr() ([]*RedeemCode, error) {
|
|
if e.loadedTypes[1] {
|
|
return e.RedeemCodes, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "redeem_codes"}
|
|
}
|
|
|
|
// SubscriptionsOrErr returns the Subscriptions value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) SubscriptionsOrErr() ([]*UserSubscription, error) {
|
|
if e.loadedTypes[2] {
|
|
return e.Subscriptions, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "subscriptions"}
|
|
}
|
|
|
|
// UsageLogsOrErr returns the UsageLogs value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) UsageLogsOrErr() ([]*UsageLog, error) {
|
|
if e.loadedTypes[3] {
|
|
return e.UsageLogs, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "usage_logs"}
|
|
}
|
|
|
|
// AccountsOrErr returns the Accounts value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) AccountsOrErr() ([]*Account, error) {
|
|
if e.loadedTypes[4] {
|
|
return e.Accounts, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "accounts"}
|
|
}
|
|
|
|
// AllowedUsersOrErr returns the AllowedUsers value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) AllowedUsersOrErr() ([]*User, error) {
|
|
if e.loadedTypes[5] {
|
|
return e.AllowedUsers, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "allowed_users"}
|
|
}
|
|
|
|
// AccountGroupsOrErr returns the AccountGroups value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) AccountGroupsOrErr() ([]*AccountGroup, error) {
|
|
if e.loadedTypes[6] {
|
|
return e.AccountGroups, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "account_groups"}
|
|
}
|
|
|
|
// UserAllowedGroupsOrErr returns the UserAllowedGroups value or an error if the edge
|
|
// was not loaded in eager-loading.
|
|
func (e GroupEdges) UserAllowedGroupsOrErr() ([]*UserAllowedGroup, error) {
|
|
if e.loadedTypes[7] {
|
|
return e.UserAllowedGroups, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "user_allowed_groups"}
|
|
}
|
|
|
|
// scanValues returns the types for scanning values from sql.Rows.
|
|
func (*Group) scanValues(columns []string) ([]any, error) {
|
|
values := make([]any, len(columns))
|
|
for i := range columns {
|
|
switch columns[i] {
|
|
case group.FieldModelRouting, group.FieldSupportedModelScopes, group.FieldMessagesDispatchModelConfig, group.FieldModelsListConfig, group.FieldReasoningEffortMappings:
|
|
values[i] = new([]byte)
|
|
case group.FieldPeakRateEnabled, group.FieldIsExclusive, group.FieldAllowImageGeneration, group.FieldAllowBatchImageGeneration, group.FieldImageRateIndependent, group.FieldVideoRateIndependent, group.FieldClaudeCodeOnly, group.FieldModelRoutingEnabled, group.FieldMcpXMLInject, group.FieldAllowMessagesDispatch, group.FieldRequireOauthOnly, group.FieldRequirePrivacySet:
|
|
values[i] = new(sql.NullBool)
|
|
case group.FieldRateMultiplier, group.FieldPeakRateMultiplier, group.FieldDailyLimitUsd, group.FieldWeeklyLimitUsd, group.FieldMonthlyLimitUsd, group.FieldImageRateMultiplier, group.FieldImagePrice1k, group.FieldImagePrice2k, group.FieldImagePrice4k, group.FieldBatchImageDiscountMultiplier, group.FieldBatchImageHoldMultiplier, group.FieldVideoRateMultiplier, group.FieldVideoPrice480p, group.FieldVideoPrice720p, group.FieldVideoPrice1080p, group.FieldWebSearchPricePerCall:
|
|
values[i] = new(sql.NullFloat64)
|
|
case group.FieldID, group.FieldDefaultValidityDays, group.FieldFallbackGroupID, group.FieldFallbackGroupIDOnInvalidRequest, group.FieldSortOrder, group.FieldRpmLimit:
|
|
values[i] = new(sql.NullInt64)
|
|
case group.FieldName, group.FieldDescription, group.FieldPeakStart, group.FieldPeakEnd, group.FieldStatus, group.FieldDuplicateOperationID, group.FieldPlatform, group.FieldSubscriptionType, group.FieldDefaultMappedModel, group.FieldMaxReasoningEffort:
|
|
values[i] = new(sql.NullString)
|
|
case group.FieldCreatedAt, group.FieldUpdatedAt, group.FieldDeletedAt:
|
|
values[i] = new(sql.NullTime)
|
|
default:
|
|
values[i] = new(sql.UnknownType)
|
|
}
|
|
}
|
|
return values, nil
|
|
}
|
|
|
|
// assignValues assigns the values that were returned from sql.Rows (after scanning)
|
|
// to the Group fields.
|
|
func (_m *Group) assignValues(columns []string, values []any) error {
|
|
if m, n := len(values), len(columns); m < n {
|
|
return fmt.Errorf("mismatch number of scan values: %d != %d", m, n)
|
|
}
|
|
for i := range columns {
|
|
switch columns[i] {
|
|
case group.FieldID:
|
|
value, ok := values[i].(*sql.NullInt64)
|
|
if !ok {
|
|
return fmt.Errorf("unexpected type %T for field id", value)
|
|
}
|
|
_m.ID = int64(value.Int64)
|
|
case group.FieldCreatedAt:
|
|
if value, ok := values[i].(*sql.NullTime); !ok {
|
|
return fmt.Errorf("unexpected type %T for field created_at", values[i])
|
|
} else if value.Valid {
|
|
_m.CreatedAt = value.Time
|
|
}
|
|
case group.FieldUpdatedAt:
|
|
if value, ok := values[i].(*sql.NullTime); !ok {
|
|
return fmt.Errorf("unexpected type %T for field updated_at", values[i])
|
|
} else if value.Valid {
|
|
_m.UpdatedAt = value.Time
|
|
}
|
|
case group.FieldDeletedAt:
|
|
if value, ok := values[i].(*sql.NullTime); !ok {
|
|
return fmt.Errorf("unexpected type %T for field deleted_at", values[i])
|
|
} else if value.Valid {
|
|
_m.DeletedAt = new(time.Time)
|
|
*_m.DeletedAt = value.Time
|
|
}
|
|
case group.FieldName:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field name", values[i])
|
|
} else if value.Valid {
|
|
_m.Name = value.String
|
|
}
|
|
case group.FieldDescription:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field description", values[i])
|
|
} else if value.Valid {
|
|
_m.Description = new(string)
|
|
*_m.Description = value.String
|
|
}
|
|
case group.FieldRateMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field rate_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.RateMultiplier = value.Float64
|
|
}
|
|
case group.FieldPeakRateEnabled:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field peak_rate_enabled", values[i])
|
|
} else if value.Valid {
|
|
_m.PeakRateEnabled = value.Bool
|
|
}
|
|
case group.FieldPeakStart:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field peak_start", values[i])
|
|
} else if value.Valid {
|
|
_m.PeakStart = value.String
|
|
}
|
|
case group.FieldPeakEnd:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field peak_end", values[i])
|
|
} else if value.Valid {
|
|
_m.PeakEnd = value.String
|
|
}
|
|
case group.FieldPeakRateMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field peak_rate_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.PeakRateMultiplier = value.Float64
|
|
}
|
|
case group.FieldIsExclusive:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field is_exclusive", values[i])
|
|
} else if value.Valid {
|
|
_m.IsExclusive = value.Bool
|
|
}
|
|
case group.FieldStatus:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field status", values[i])
|
|
} else if value.Valid {
|
|
_m.Status = value.String
|
|
}
|
|
case group.FieldDuplicateOperationID:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field duplicate_operation_id", values[i])
|
|
} else if value.Valid {
|
|
_m.DuplicateOperationID = new(string)
|
|
*_m.DuplicateOperationID = value.String
|
|
}
|
|
case group.FieldPlatform:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field platform", values[i])
|
|
} else if value.Valid {
|
|
_m.Platform = value.String
|
|
}
|
|
case group.FieldSubscriptionType:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field subscription_type", values[i])
|
|
} else if value.Valid {
|
|
_m.SubscriptionType = value.String
|
|
}
|
|
case group.FieldDailyLimitUsd:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field daily_limit_usd", values[i])
|
|
} else if value.Valid {
|
|
_m.DailyLimitUsd = new(float64)
|
|
*_m.DailyLimitUsd = value.Float64
|
|
}
|
|
case group.FieldWeeklyLimitUsd:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field weekly_limit_usd", values[i])
|
|
} else if value.Valid {
|
|
_m.WeeklyLimitUsd = new(float64)
|
|
*_m.WeeklyLimitUsd = value.Float64
|
|
}
|
|
case group.FieldMonthlyLimitUsd:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field monthly_limit_usd", values[i])
|
|
} else if value.Valid {
|
|
_m.MonthlyLimitUsd = new(float64)
|
|
*_m.MonthlyLimitUsd = value.Float64
|
|
}
|
|
case group.FieldDefaultValidityDays:
|
|
if value, ok := values[i].(*sql.NullInt64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field default_validity_days", values[i])
|
|
} else if value.Valid {
|
|
_m.DefaultValidityDays = int(value.Int64)
|
|
}
|
|
case group.FieldAllowImageGeneration:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field allow_image_generation", values[i])
|
|
} else if value.Valid {
|
|
_m.AllowImageGeneration = value.Bool
|
|
}
|
|
case group.FieldAllowBatchImageGeneration:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field allow_batch_image_generation", values[i])
|
|
} else if value.Valid {
|
|
_m.AllowBatchImageGeneration = value.Bool
|
|
}
|
|
case group.FieldImageRateIndependent:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field image_rate_independent", values[i])
|
|
} else if value.Valid {
|
|
_m.ImageRateIndependent = value.Bool
|
|
}
|
|
case group.FieldImageRateMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field image_rate_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.ImageRateMultiplier = value.Float64
|
|
}
|
|
case group.FieldImagePrice1k:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field image_price_1k", values[i])
|
|
} else if value.Valid {
|
|
_m.ImagePrice1k = new(float64)
|
|
*_m.ImagePrice1k = value.Float64
|
|
}
|
|
case group.FieldImagePrice2k:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field image_price_2k", values[i])
|
|
} else if value.Valid {
|
|
_m.ImagePrice2k = new(float64)
|
|
*_m.ImagePrice2k = value.Float64
|
|
}
|
|
case group.FieldImagePrice4k:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field image_price_4k", values[i])
|
|
} else if value.Valid {
|
|
_m.ImagePrice4k = new(float64)
|
|
*_m.ImagePrice4k = value.Float64
|
|
}
|
|
case group.FieldBatchImageDiscountMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field batch_image_discount_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.BatchImageDiscountMultiplier = value.Float64
|
|
}
|
|
case group.FieldBatchImageHoldMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field batch_image_hold_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.BatchImageHoldMultiplier = value.Float64
|
|
}
|
|
case group.FieldVideoRateIndependent:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field video_rate_independent", values[i])
|
|
} else if value.Valid {
|
|
_m.VideoRateIndependent = value.Bool
|
|
}
|
|
case group.FieldVideoRateMultiplier:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field video_rate_multiplier", values[i])
|
|
} else if value.Valid {
|
|
_m.VideoRateMultiplier = value.Float64
|
|
}
|
|
case group.FieldVideoPrice480p:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field video_price_480p", values[i])
|
|
} else if value.Valid {
|
|
_m.VideoPrice480p = new(float64)
|
|
*_m.VideoPrice480p = value.Float64
|
|
}
|
|
case group.FieldVideoPrice720p:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field video_price_720p", values[i])
|
|
} else if value.Valid {
|
|
_m.VideoPrice720p = new(float64)
|
|
*_m.VideoPrice720p = value.Float64
|
|
}
|
|
case group.FieldVideoPrice1080p:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field video_price_1080p", values[i])
|
|
} else if value.Valid {
|
|
_m.VideoPrice1080p = new(float64)
|
|
*_m.VideoPrice1080p = value.Float64
|
|
}
|
|
case group.FieldWebSearchPricePerCall:
|
|
if value, ok := values[i].(*sql.NullFloat64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field web_search_price_per_call", values[i])
|
|
} else if value.Valid {
|
|
_m.WebSearchPricePerCall = new(float64)
|
|
*_m.WebSearchPricePerCall = value.Float64
|
|
}
|
|
case group.FieldClaudeCodeOnly:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field claude_code_only", values[i])
|
|
} else if value.Valid {
|
|
_m.ClaudeCodeOnly = value.Bool
|
|
}
|
|
case group.FieldFallbackGroupID:
|
|
if value, ok := values[i].(*sql.NullInt64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field fallback_group_id", values[i])
|
|
} else if value.Valid {
|
|
_m.FallbackGroupID = new(int64)
|
|
*_m.FallbackGroupID = value.Int64
|
|
}
|
|
case group.FieldFallbackGroupIDOnInvalidRequest:
|
|
if value, ok := values[i].(*sql.NullInt64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field fallback_group_id_on_invalid_request", values[i])
|
|
} else if value.Valid {
|
|
_m.FallbackGroupIDOnInvalidRequest = new(int64)
|
|
*_m.FallbackGroupIDOnInvalidRequest = value.Int64
|
|
}
|
|
case group.FieldModelRouting:
|
|
if value, ok := values[i].(*[]byte); !ok {
|
|
return fmt.Errorf("unexpected type %T for field model_routing", values[i])
|
|
} else if value != nil && len(*value) > 0 {
|
|
if err := json.Unmarshal(*value, &_m.ModelRouting); err != nil {
|
|
return fmt.Errorf("unmarshal field model_routing: %w", err)
|
|
}
|
|
}
|
|
case group.FieldModelRoutingEnabled:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field model_routing_enabled", values[i])
|
|
} else if value.Valid {
|
|
_m.ModelRoutingEnabled = value.Bool
|
|
}
|
|
case group.FieldMcpXMLInject:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field mcp_xml_inject", values[i])
|
|
} else if value.Valid {
|
|
_m.McpXMLInject = value.Bool
|
|
}
|
|
case group.FieldSupportedModelScopes:
|
|
if value, ok := values[i].(*[]byte); !ok {
|
|
return fmt.Errorf("unexpected type %T for field supported_model_scopes", values[i])
|
|
} else if value != nil && len(*value) > 0 {
|
|
if err := json.Unmarshal(*value, &_m.SupportedModelScopes); err != nil {
|
|
return fmt.Errorf("unmarshal field supported_model_scopes: %w", err)
|
|
}
|
|
}
|
|
case group.FieldSortOrder:
|
|
if value, ok := values[i].(*sql.NullInt64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field sort_order", values[i])
|
|
} else if value.Valid {
|
|
_m.SortOrder = int(value.Int64)
|
|
}
|
|
case group.FieldAllowMessagesDispatch:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field allow_messages_dispatch", values[i])
|
|
} else if value.Valid {
|
|
_m.AllowMessagesDispatch = value.Bool
|
|
}
|
|
case group.FieldRequireOauthOnly:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field require_oauth_only", values[i])
|
|
} else if value.Valid {
|
|
_m.RequireOauthOnly = value.Bool
|
|
}
|
|
case group.FieldRequirePrivacySet:
|
|
if value, ok := values[i].(*sql.NullBool); !ok {
|
|
return fmt.Errorf("unexpected type %T for field require_privacy_set", values[i])
|
|
} else if value.Valid {
|
|
_m.RequirePrivacySet = value.Bool
|
|
}
|
|
case group.FieldDefaultMappedModel:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field default_mapped_model", values[i])
|
|
} else if value.Valid {
|
|
_m.DefaultMappedModel = value.String
|
|
}
|
|
case group.FieldMessagesDispatchModelConfig:
|
|
if value, ok := values[i].(*[]byte); !ok {
|
|
return fmt.Errorf("unexpected type %T for field messages_dispatch_model_config", values[i])
|
|
} else if value != nil && len(*value) > 0 {
|
|
if err := json.Unmarshal(*value, &_m.MessagesDispatchModelConfig); err != nil {
|
|
return fmt.Errorf("unmarshal field messages_dispatch_model_config: %w", err)
|
|
}
|
|
}
|
|
case group.FieldModelsListConfig:
|
|
if value, ok := values[i].(*[]byte); !ok {
|
|
return fmt.Errorf("unexpected type %T for field models_list_config", values[i])
|
|
} else if value != nil && len(*value) > 0 {
|
|
if err := json.Unmarshal(*value, &_m.ModelsListConfig); err != nil {
|
|
return fmt.Errorf("unmarshal field models_list_config: %w", err)
|
|
}
|
|
}
|
|
case group.FieldRpmLimit:
|
|
if value, ok := values[i].(*sql.NullInt64); !ok {
|
|
return fmt.Errorf("unexpected type %T for field rpm_limit", values[i])
|
|
} else if value.Valid {
|
|
_m.RpmLimit = int(value.Int64)
|
|
}
|
|
case group.FieldMaxReasoningEffort:
|
|
if value, ok := values[i].(*sql.NullString); !ok {
|
|
return fmt.Errorf("unexpected type %T for field max_reasoning_effort", values[i])
|
|
} else if value.Valid {
|
|
_m.MaxReasoningEffort = value.String
|
|
}
|
|
case group.FieldReasoningEffortMappings:
|
|
if value, ok := values[i].(*[]byte); !ok {
|
|
return fmt.Errorf("unexpected type %T for field reasoning_effort_mappings", values[i])
|
|
} else if value != nil && len(*value) > 0 {
|
|
if err := json.Unmarshal(*value, &_m.ReasoningEffortMappings); err != nil {
|
|
return fmt.Errorf("unmarshal field reasoning_effort_mappings: %w", err)
|
|
}
|
|
}
|
|
default:
|
|
_m.selectValues.Set(columns[i], values[i])
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Value returns the ent.Value that was dynamically selected and assigned to the Group.
|
|
// This includes values selected through modifiers, order, etc.
|
|
func (_m *Group) Value(name string) (ent.Value, error) {
|
|
return _m.selectValues.Get(name)
|
|
}
|
|
|
|
// QueryAPIKeys queries the "api_keys" edge of the Group entity.
|
|
func (_m *Group) QueryAPIKeys() *APIKeyQuery {
|
|
return NewGroupClient(_m.config).QueryAPIKeys(_m)
|
|
}
|
|
|
|
// QueryRedeemCodes queries the "redeem_codes" edge of the Group entity.
|
|
func (_m *Group) QueryRedeemCodes() *RedeemCodeQuery {
|
|
return NewGroupClient(_m.config).QueryRedeemCodes(_m)
|
|
}
|
|
|
|
// QuerySubscriptions queries the "subscriptions" edge of the Group entity.
|
|
func (_m *Group) QuerySubscriptions() *UserSubscriptionQuery {
|
|
return NewGroupClient(_m.config).QuerySubscriptions(_m)
|
|
}
|
|
|
|
// QueryUsageLogs queries the "usage_logs" edge of the Group entity.
|
|
func (_m *Group) QueryUsageLogs() *UsageLogQuery {
|
|
return NewGroupClient(_m.config).QueryUsageLogs(_m)
|
|
}
|
|
|
|
// QueryAccounts queries the "accounts" edge of the Group entity.
|
|
func (_m *Group) QueryAccounts() *AccountQuery {
|
|
return NewGroupClient(_m.config).QueryAccounts(_m)
|
|
}
|
|
|
|
// QueryAllowedUsers queries the "allowed_users" edge of the Group entity.
|
|
func (_m *Group) QueryAllowedUsers() *UserQuery {
|
|
return NewGroupClient(_m.config).QueryAllowedUsers(_m)
|
|
}
|
|
|
|
// QueryAccountGroups queries the "account_groups" edge of the Group entity.
|
|
func (_m *Group) QueryAccountGroups() *AccountGroupQuery {
|
|
return NewGroupClient(_m.config).QueryAccountGroups(_m)
|
|
}
|
|
|
|
// QueryUserAllowedGroups queries the "user_allowed_groups" edge of the Group entity.
|
|
func (_m *Group) QueryUserAllowedGroups() *UserAllowedGroupQuery {
|
|
return NewGroupClient(_m.config).QueryUserAllowedGroups(_m)
|
|
}
|
|
|
|
// Update returns a builder for updating this Group.
|
|
// Note that you need to call Group.Unwrap() before calling this method if this Group
|
|
// was returned from a transaction, and the transaction was committed or rolled back.
|
|
func (_m *Group) Update() *GroupUpdateOne {
|
|
return NewGroupClient(_m.config).UpdateOne(_m)
|
|
}
|
|
|
|
// Unwrap unwraps the Group entity that was returned from a transaction after it was closed,
|
|
// so that all future queries will be executed through the driver which created the transaction.
|
|
func (_m *Group) Unwrap() *Group {
|
|
_tx, ok := _m.config.driver.(*txDriver)
|
|
if !ok {
|
|
panic("ent: Group is not a transactional entity")
|
|
}
|
|
_m.config.driver = _tx.drv
|
|
return _m
|
|
}
|
|
|
|
// String implements the fmt.Stringer.
|
|
func (_m *Group) String() string {
|
|
var builder strings.Builder
|
|
builder.WriteString("Group(")
|
|
builder.WriteString(fmt.Sprintf("id=%v, ", _m.ID))
|
|
builder.WriteString("created_at=")
|
|
builder.WriteString(_m.CreatedAt.Format(time.ANSIC))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("updated_at=")
|
|
builder.WriteString(_m.UpdatedAt.Format(time.ANSIC))
|
|
builder.WriteString(", ")
|
|
if v := _m.DeletedAt; v != nil {
|
|
builder.WriteString("deleted_at=")
|
|
builder.WriteString(v.Format(time.ANSIC))
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("name=")
|
|
builder.WriteString(_m.Name)
|
|
builder.WriteString(", ")
|
|
if v := _m.Description; v != nil {
|
|
builder.WriteString("description=")
|
|
builder.WriteString(*v)
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("rate_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.RateMultiplier))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("peak_rate_enabled=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.PeakRateEnabled))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("peak_start=")
|
|
builder.WriteString(_m.PeakStart)
|
|
builder.WriteString(", ")
|
|
builder.WriteString("peak_end=")
|
|
builder.WriteString(_m.PeakEnd)
|
|
builder.WriteString(", ")
|
|
builder.WriteString("peak_rate_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.PeakRateMultiplier))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("is_exclusive=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.IsExclusive))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("status=")
|
|
builder.WriteString(_m.Status)
|
|
builder.WriteString(", ")
|
|
if v := _m.DuplicateOperationID; v != nil {
|
|
builder.WriteString("duplicate_operation_id=")
|
|
builder.WriteString(*v)
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("platform=")
|
|
builder.WriteString(_m.Platform)
|
|
builder.WriteString(", ")
|
|
builder.WriteString("subscription_type=")
|
|
builder.WriteString(_m.SubscriptionType)
|
|
builder.WriteString(", ")
|
|
if v := _m.DailyLimitUsd; v != nil {
|
|
builder.WriteString("daily_limit_usd=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.WeeklyLimitUsd; v != nil {
|
|
builder.WriteString("weekly_limit_usd=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.MonthlyLimitUsd; v != nil {
|
|
builder.WriteString("monthly_limit_usd=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("default_validity_days=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.DefaultValidityDays))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("allow_image_generation=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.AllowImageGeneration))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("allow_batch_image_generation=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.AllowBatchImageGeneration))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("image_rate_independent=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ImageRateIndependent))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("image_rate_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ImageRateMultiplier))
|
|
builder.WriteString(", ")
|
|
if v := _m.ImagePrice1k; v != nil {
|
|
builder.WriteString("image_price_1k=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.ImagePrice2k; v != nil {
|
|
builder.WriteString("image_price_2k=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.ImagePrice4k; v != nil {
|
|
builder.WriteString("image_price_4k=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("batch_image_discount_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.BatchImageDiscountMultiplier))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("batch_image_hold_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.BatchImageHoldMultiplier))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("video_rate_independent=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.VideoRateIndependent))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("video_rate_multiplier=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.VideoRateMultiplier))
|
|
builder.WriteString(", ")
|
|
if v := _m.VideoPrice480p; v != nil {
|
|
builder.WriteString("video_price_480p=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.VideoPrice720p; v != nil {
|
|
builder.WriteString("video_price_720p=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.VideoPrice1080p; v != nil {
|
|
builder.WriteString("video_price_1080p=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.WebSearchPricePerCall; v != nil {
|
|
builder.WriteString("web_search_price_per_call=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("claude_code_only=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ClaudeCodeOnly))
|
|
builder.WriteString(", ")
|
|
if v := _m.FallbackGroupID; v != nil {
|
|
builder.WriteString("fallback_group_id=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
if v := _m.FallbackGroupIDOnInvalidRequest; v != nil {
|
|
builder.WriteString("fallback_group_id_on_invalid_request=")
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
}
|
|
builder.WriteString(", ")
|
|
builder.WriteString("model_routing=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ModelRouting))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("model_routing_enabled=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ModelRoutingEnabled))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("mcp_xml_inject=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.McpXMLInject))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("supported_model_scopes=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.SupportedModelScopes))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("sort_order=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.SortOrder))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("allow_messages_dispatch=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.AllowMessagesDispatch))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("require_oauth_only=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.RequireOauthOnly))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("require_privacy_set=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.RequirePrivacySet))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("default_mapped_model=")
|
|
builder.WriteString(_m.DefaultMappedModel)
|
|
builder.WriteString(", ")
|
|
builder.WriteString("messages_dispatch_model_config=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.MessagesDispatchModelConfig))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("models_list_config=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ModelsListConfig))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("rpm_limit=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.RpmLimit))
|
|
builder.WriteString(", ")
|
|
builder.WriteString("max_reasoning_effort=")
|
|
builder.WriteString(_m.MaxReasoningEffort)
|
|
builder.WriteString(", ")
|
|
builder.WriteString("reasoning_effort_mappings=")
|
|
builder.WriteString(fmt.Sprintf("%v", _m.ReasoningEffortMappings))
|
|
builder.WriteByte(')')
|
|
return builder.String()
|
|
}
|
|
|
|
// Groups is a parsable slice of Group.
|
|
type Groups []*Group
|