diff --git a/backend/ent/migrate/schema.go b/backend/ent/migrate/schema.go index 6c56f2d0..bdbb9fdd 100644 --- a/backend/ent/migrate/schema.go +++ b/backend/ent/migrate/schema.go @@ -744,6 +744,10 @@ var ( {Name: "model", Type: field.TypeString, Size: 100}, {Name: "requested_model", Type: field.TypeString, Nullable: true, Size: 100}, {Name: "upstream_model", Type: field.TypeString, Nullable: true, Size: 100}, + {Name: "channel_id", Type: field.TypeInt64, Nullable: true}, + {Name: "model_mapping_chain", Type: field.TypeString, Nullable: true, Size: 500}, + {Name: "billing_tier", Type: field.TypeString, Nullable: true, Size: 50}, + {Name: "billing_mode", Type: field.TypeString, Nullable: true, Size: 20}, {Name: "input_tokens", Type: field.TypeInt, Default: 0}, {Name: "output_tokens", Type: field.TypeInt, Default: 0}, {Name: "cache_creation_tokens", Type: field.TypeInt, Default: 0}, @@ -783,31 +787,31 @@ var ( ForeignKeys: []*schema.ForeignKey{ { Symbol: "usage_logs_api_keys_usage_logs", - Columns: []*schema.Column{UsageLogsColumns[30]}, + Columns: []*schema.Column{UsageLogsColumns[34]}, RefColumns: []*schema.Column{APIKeysColumns[0]}, OnDelete: schema.NoAction, }, { Symbol: "usage_logs_accounts_usage_logs", - Columns: []*schema.Column{UsageLogsColumns[31]}, + Columns: []*schema.Column{UsageLogsColumns[35]}, RefColumns: []*schema.Column{AccountsColumns[0]}, OnDelete: schema.NoAction, }, { Symbol: "usage_logs_groups_usage_logs", - Columns: []*schema.Column{UsageLogsColumns[32]}, + Columns: []*schema.Column{UsageLogsColumns[36]}, RefColumns: []*schema.Column{GroupsColumns[0]}, OnDelete: schema.SetNull, }, { Symbol: "usage_logs_users_usage_logs", - Columns: []*schema.Column{UsageLogsColumns[33]}, + Columns: []*schema.Column{UsageLogsColumns[37]}, RefColumns: []*schema.Column{UsersColumns[0]}, OnDelete: schema.NoAction, }, { Symbol: "usage_logs_user_subscriptions_usage_logs", - Columns: []*schema.Column{UsageLogsColumns[34]}, + Columns: []*schema.Column{UsageLogsColumns[38]}, RefColumns: []*schema.Column{UserSubscriptionsColumns[0]}, OnDelete: schema.SetNull, }, @@ -816,32 +820,32 @@ var ( { Name: "usagelog_user_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[33]}, + Columns: []*schema.Column{UsageLogsColumns[37]}, }, { Name: "usagelog_api_key_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[30]}, + Columns: []*schema.Column{UsageLogsColumns[34]}, }, { Name: "usagelog_account_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[31]}, + Columns: []*schema.Column{UsageLogsColumns[35]}, }, { Name: "usagelog_group_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[32]}, + Columns: []*schema.Column{UsageLogsColumns[36]}, }, { Name: "usagelog_subscription_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[34]}, + Columns: []*schema.Column{UsageLogsColumns[38]}, }, { Name: "usagelog_created_at", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[29]}, + Columns: []*schema.Column{UsageLogsColumns[33]}, }, { Name: "usagelog_model", @@ -861,17 +865,17 @@ var ( { Name: "usagelog_user_id_created_at", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[33], UsageLogsColumns[29]}, + Columns: []*schema.Column{UsageLogsColumns[37], UsageLogsColumns[33]}, }, { Name: "usagelog_api_key_id_created_at", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[30], UsageLogsColumns[29]}, + Columns: []*schema.Column{UsageLogsColumns[34], UsageLogsColumns[33]}, }, { Name: "usagelog_group_id_created_at", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[32], UsageLogsColumns[29]}, + Columns: []*schema.Column{UsageLogsColumns[36], UsageLogsColumns[33]}, }, }, } diff --git a/backend/ent/mutation.go b/backend/ent/mutation.go index a862209d..28d9a0ef 100644 --- a/backend/ent/mutation.go +++ b/backend/ent/mutation.go @@ -19725,6 +19725,11 @@ type UsageLogMutation struct { model *string requested_model *string upstream_model *string + channel_id *int64 + addchannel_id *int64 + model_mapping_chain *string + billing_tier *string + billing_mode *string input_tokens *int addinput_tokens *int output_tokens *int @@ -20160,6 +20165,223 @@ func (m *UsageLogMutation) ResetUpstreamModel() { delete(m.clearedFields, usagelog.FieldUpstreamModel) } +// SetChannelID sets the "channel_id" field. +func (m *UsageLogMutation) SetChannelID(i int64) { + m.channel_id = &i + m.addchannel_id = nil +} + +// ChannelID returns the value of the "channel_id" field in the mutation. +func (m *UsageLogMutation) ChannelID() (r int64, exists bool) { + v := m.channel_id + if v == nil { + return + } + return *v, true +} + +// OldChannelID returns the old "channel_id" field's value of the UsageLog entity. +// If the UsageLog object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UsageLogMutation) OldChannelID(ctx context.Context) (v *int64, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldChannelID is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldChannelID requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldChannelID: %w", err) + } + return oldValue.ChannelID, nil +} + +// AddChannelID adds i to the "channel_id" field. +func (m *UsageLogMutation) AddChannelID(i int64) { + if m.addchannel_id != nil { + *m.addchannel_id += i + } else { + m.addchannel_id = &i + } +} + +// AddedChannelID returns the value that was added to the "channel_id" field in this mutation. +func (m *UsageLogMutation) AddedChannelID() (r int64, exists bool) { + v := m.addchannel_id + if v == nil { + return + } + return *v, true +} + +// ClearChannelID clears the value of the "channel_id" field. +func (m *UsageLogMutation) ClearChannelID() { + m.channel_id = nil + m.addchannel_id = nil + m.clearedFields[usagelog.FieldChannelID] = struct{}{} +} + +// ChannelIDCleared returns if the "channel_id" field was cleared in this mutation. +func (m *UsageLogMutation) ChannelIDCleared() bool { + _, ok := m.clearedFields[usagelog.FieldChannelID] + return ok +} + +// ResetChannelID resets all changes to the "channel_id" field. +func (m *UsageLogMutation) ResetChannelID() { + m.channel_id = nil + m.addchannel_id = nil + delete(m.clearedFields, usagelog.FieldChannelID) +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (m *UsageLogMutation) SetModelMappingChain(s string) { + m.model_mapping_chain = &s +} + +// ModelMappingChain returns the value of the "model_mapping_chain" field in the mutation. +func (m *UsageLogMutation) ModelMappingChain() (r string, exists bool) { + v := m.model_mapping_chain + if v == nil { + return + } + return *v, true +} + +// OldModelMappingChain returns the old "model_mapping_chain" field's value of the UsageLog entity. +// If the UsageLog object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UsageLogMutation) OldModelMappingChain(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldModelMappingChain is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldModelMappingChain requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldModelMappingChain: %w", err) + } + return oldValue.ModelMappingChain, nil +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (m *UsageLogMutation) ClearModelMappingChain() { + m.model_mapping_chain = nil + m.clearedFields[usagelog.FieldModelMappingChain] = struct{}{} +} + +// ModelMappingChainCleared returns if the "model_mapping_chain" field was cleared in this mutation. +func (m *UsageLogMutation) ModelMappingChainCleared() bool { + _, ok := m.clearedFields[usagelog.FieldModelMappingChain] + return ok +} + +// ResetModelMappingChain resets all changes to the "model_mapping_chain" field. +func (m *UsageLogMutation) ResetModelMappingChain() { + m.model_mapping_chain = nil + delete(m.clearedFields, usagelog.FieldModelMappingChain) +} + +// SetBillingTier sets the "billing_tier" field. +func (m *UsageLogMutation) SetBillingTier(s string) { + m.billing_tier = &s +} + +// BillingTier returns the value of the "billing_tier" field in the mutation. +func (m *UsageLogMutation) BillingTier() (r string, exists bool) { + v := m.billing_tier + if v == nil { + return + } + return *v, true +} + +// OldBillingTier returns the old "billing_tier" field's value of the UsageLog entity. +// If the UsageLog object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UsageLogMutation) OldBillingTier(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldBillingTier is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldBillingTier requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldBillingTier: %w", err) + } + return oldValue.BillingTier, nil +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (m *UsageLogMutation) ClearBillingTier() { + m.billing_tier = nil + m.clearedFields[usagelog.FieldBillingTier] = struct{}{} +} + +// BillingTierCleared returns if the "billing_tier" field was cleared in this mutation. +func (m *UsageLogMutation) BillingTierCleared() bool { + _, ok := m.clearedFields[usagelog.FieldBillingTier] + return ok +} + +// ResetBillingTier resets all changes to the "billing_tier" field. +func (m *UsageLogMutation) ResetBillingTier() { + m.billing_tier = nil + delete(m.clearedFields, usagelog.FieldBillingTier) +} + +// SetBillingMode sets the "billing_mode" field. +func (m *UsageLogMutation) SetBillingMode(s string) { + m.billing_mode = &s +} + +// BillingMode returns the value of the "billing_mode" field in the mutation. +func (m *UsageLogMutation) BillingMode() (r string, exists bool) { + v := m.billing_mode + if v == nil { + return + } + return *v, true +} + +// OldBillingMode returns the old "billing_mode" field's value of the UsageLog entity. +// If the UsageLog object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UsageLogMutation) OldBillingMode(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldBillingMode is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldBillingMode requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldBillingMode: %w", err) + } + return oldValue.BillingMode, nil +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (m *UsageLogMutation) ClearBillingMode() { + m.billing_mode = nil + m.clearedFields[usagelog.FieldBillingMode] = struct{}{} +} + +// BillingModeCleared returns if the "billing_mode" field was cleared in this mutation. +func (m *UsageLogMutation) BillingModeCleared() bool { + _, ok := m.clearedFields[usagelog.FieldBillingMode] + return ok +} + +// ResetBillingMode resets all changes to the "billing_mode" field. +func (m *UsageLogMutation) ResetBillingMode() { + m.billing_mode = nil + delete(m.clearedFields, usagelog.FieldBillingMode) +} + // SetGroupID sets the "group_id" field. func (m *UsageLogMutation) SetGroupID(i int64) { m.group = &i @@ -21781,7 +22003,7 @@ func (m *UsageLogMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *UsageLogMutation) Fields() []string { - fields := make([]string, 0, 34) + fields := make([]string, 0, 38) if m.user != nil { fields = append(fields, usagelog.FieldUserID) } @@ -21803,6 +22025,18 @@ func (m *UsageLogMutation) Fields() []string { if m.upstream_model != nil { fields = append(fields, usagelog.FieldUpstreamModel) } + if m.channel_id != nil { + fields = append(fields, usagelog.FieldChannelID) + } + if m.model_mapping_chain != nil { + fields = append(fields, usagelog.FieldModelMappingChain) + } + if m.billing_tier != nil { + fields = append(fields, usagelog.FieldBillingTier) + } + if m.billing_mode != nil { + fields = append(fields, usagelog.FieldBillingMode) + } if m.group != nil { fields = append(fields, usagelog.FieldGroupID) } @@ -21906,6 +22140,14 @@ func (m *UsageLogMutation) Field(name string) (ent.Value, bool) { return m.RequestedModel() case usagelog.FieldUpstreamModel: return m.UpstreamModel() + case usagelog.FieldChannelID: + return m.ChannelID() + case usagelog.FieldModelMappingChain: + return m.ModelMappingChain() + case usagelog.FieldBillingTier: + return m.BillingTier() + case usagelog.FieldBillingMode: + return m.BillingMode() case usagelog.FieldGroupID: return m.GroupID() case usagelog.FieldSubscriptionID: @@ -21983,6 +22225,14 @@ func (m *UsageLogMutation) OldField(ctx context.Context, name string) (ent.Value return m.OldRequestedModel(ctx) case usagelog.FieldUpstreamModel: return m.OldUpstreamModel(ctx) + case usagelog.FieldChannelID: + return m.OldChannelID(ctx) + case usagelog.FieldModelMappingChain: + return m.OldModelMappingChain(ctx) + case usagelog.FieldBillingTier: + return m.OldBillingTier(ctx) + case usagelog.FieldBillingMode: + return m.OldBillingMode(ctx) case usagelog.FieldGroupID: return m.OldGroupID(ctx) case usagelog.FieldSubscriptionID: @@ -22095,6 +22345,34 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error { } m.SetUpstreamModel(v) return nil + case usagelog.FieldChannelID: + v, ok := value.(int64) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetChannelID(v) + return nil + case usagelog.FieldModelMappingChain: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetModelMappingChain(v) + return nil + case usagelog.FieldBillingTier: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetBillingTier(v) + return nil + case usagelog.FieldBillingMode: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetBillingMode(v) + return nil case usagelog.FieldGroupID: v, ok := value.(int64) if !ok { @@ -22292,6 +22570,9 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error { // this mutation. func (m *UsageLogMutation) AddedFields() []string { var fields []string + if m.addchannel_id != nil { + fields = append(fields, usagelog.FieldChannelID) + } if m.addinput_tokens != nil { fields = append(fields, usagelog.FieldInputTokens) } @@ -22354,6 +22635,8 @@ func (m *UsageLogMutation) AddedFields() []string { // was not set, or was not defined in the schema. func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) { switch name { + case usagelog.FieldChannelID: + return m.AddedChannelID() case usagelog.FieldInputTokens: return m.AddedInputTokens() case usagelog.FieldOutputTokens: @@ -22399,6 +22682,13 @@ func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) { // type. func (m *UsageLogMutation) AddField(name string, value ent.Value) error { switch name { + case usagelog.FieldChannelID: + v, ok := value.(int64) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.AddChannelID(v) + return nil case usagelog.FieldInputTokens: v, ok := value.(int) if !ok { @@ -22539,6 +22829,18 @@ func (m *UsageLogMutation) ClearedFields() []string { if m.FieldCleared(usagelog.FieldUpstreamModel) { fields = append(fields, usagelog.FieldUpstreamModel) } + if m.FieldCleared(usagelog.FieldChannelID) { + fields = append(fields, usagelog.FieldChannelID) + } + if m.FieldCleared(usagelog.FieldModelMappingChain) { + fields = append(fields, usagelog.FieldModelMappingChain) + } + if m.FieldCleared(usagelog.FieldBillingTier) { + fields = append(fields, usagelog.FieldBillingTier) + } + if m.FieldCleared(usagelog.FieldBillingMode) { + fields = append(fields, usagelog.FieldBillingMode) + } if m.FieldCleared(usagelog.FieldGroupID) { fields = append(fields, usagelog.FieldGroupID) } @@ -22586,6 +22888,18 @@ func (m *UsageLogMutation) ClearField(name string) error { case usagelog.FieldUpstreamModel: m.ClearUpstreamModel() return nil + case usagelog.FieldChannelID: + m.ClearChannelID() + return nil + case usagelog.FieldModelMappingChain: + m.ClearModelMappingChain() + return nil + case usagelog.FieldBillingTier: + m.ClearBillingTier() + return nil + case usagelog.FieldBillingMode: + m.ClearBillingMode() + return nil case usagelog.FieldGroupID: m.ClearGroupID() return nil @@ -22642,6 +22956,18 @@ func (m *UsageLogMutation) ResetField(name string) error { case usagelog.FieldUpstreamModel: m.ResetUpstreamModel() return nil + case usagelog.FieldChannelID: + m.ResetChannelID() + return nil + case usagelog.FieldModelMappingChain: + m.ResetModelMappingChain() + return nil + case usagelog.FieldBillingTier: + m.ResetBillingTier() + return nil + case usagelog.FieldBillingMode: + m.ResetBillingMode() + return nil case usagelog.FieldGroupID: m.ResetGroupID() return nil diff --git a/backend/ent/runtime/runtime.go b/backend/ent/runtime/runtime.go index fd6be291..336b1f82 100644 --- a/backend/ent/runtime/runtime.go +++ b/backend/ent/runtime/runtime.go @@ -875,92 +875,104 @@ func init() { usagelogDescUpstreamModel := usagelogFields[6].Descriptor() // usagelog.UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save. usagelog.UpstreamModelValidator = usagelogDescUpstreamModel.Validators[0].(func(string) error) + // usagelogDescModelMappingChain is the schema descriptor for model_mapping_chain field. + usagelogDescModelMappingChain := usagelogFields[8].Descriptor() + // usagelog.ModelMappingChainValidator is a validator for the "model_mapping_chain" field. It is called by the builders before save. + usagelog.ModelMappingChainValidator = usagelogDescModelMappingChain.Validators[0].(func(string) error) + // usagelogDescBillingTier is the schema descriptor for billing_tier field. + usagelogDescBillingTier := usagelogFields[9].Descriptor() + // usagelog.BillingTierValidator is a validator for the "billing_tier" field. It is called by the builders before save. + usagelog.BillingTierValidator = usagelogDescBillingTier.Validators[0].(func(string) error) + // usagelogDescBillingMode is the schema descriptor for billing_mode field. + usagelogDescBillingMode := usagelogFields[10].Descriptor() + // usagelog.BillingModeValidator is a validator for the "billing_mode" field. It is called by the builders before save. + usagelog.BillingModeValidator = usagelogDescBillingMode.Validators[0].(func(string) error) // usagelogDescInputTokens is the schema descriptor for input_tokens field. - usagelogDescInputTokens := usagelogFields[9].Descriptor() + usagelogDescInputTokens := usagelogFields[13].Descriptor() // usagelog.DefaultInputTokens holds the default value on creation for the input_tokens field. usagelog.DefaultInputTokens = usagelogDescInputTokens.Default.(int) // usagelogDescOutputTokens is the schema descriptor for output_tokens field. - usagelogDescOutputTokens := usagelogFields[10].Descriptor() + usagelogDescOutputTokens := usagelogFields[14].Descriptor() // usagelog.DefaultOutputTokens holds the default value on creation for the output_tokens field. usagelog.DefaultOutputTokens = usagelogDescOutputTokens.Default.(int) // usagelogDescCacheCreationTokens is the schema descriptor for cache_creation_tokens field. - usagelogDescCacheCreationTokens := usagelogFields[11].Descriptor() + usagelogDescCacheCreationTokens := usagelogFields[15].Descriptor() // usagelog.DefaultCacheCreationTokens holds the default value on creation for the cache_creation_tokens field. usagelog.DefaultCacheCreationTokens = usagelogDescCacheCreationTokens.Default.(int) // usagelogDescCacheReadTokens is the schema descriptor for cache_read_tokens field. - usagelogDescCacheReadTokens := usagelogFields[12].Descriptor() + usagelogDescCacheReadTokens := usagelogFields[16].Descriptor() // usagelog.DefaultCacheReadTokens holds the default value on creation for the cache_read_tokens field. usagelog.DefaultCacheReadTokens = usagelogDescCacheReadTokens.Default.(int) // usagelogDescCacheCreation5mTokens is the schema descriptor for cache_creation_5m_tokens field. - usagelogDescCacheCreation5mTokens := usagelogFields[13].Descriptor() + usagelogDescCacheCreation5mTokens := usagelogFields[17].Descriptor() // usagelog.DefaultCacheCreation5mTokens holds the default value on creation for the cache_creation_5m_tokens field. usagelog.DefaultCacheCreation5mTokens = usagelogDescCacheCreation5mTokens.Default.(int) // usagelogDescCacheCreation1hTokens is the schema descriptor for cache_creation_1h_tokens field. - usagelogDescCacheCreation1hTokens := usagelogFields[14].Descriptor() + usagelogDescCacheCreation1hTokens := usagelogFields[18].Descriptor() // usagelog.DefaultCacheCreation1hTokens holds the default value on creation for the cache_creation_1h_tokens field. usagelog.DefaultCacheCreation1hTokens = usagelogDescCacheCreation1hTokens.Default.(int) // usagelogDescInputCost is the schema descriptor for input_cost field. - usagelogDescInputCost := usagelogFields[15].Descriptor() + usagelogDescInputCost := usagelogFields[19].Descriptor() // usagelog.DefaultInputCost holds the default value on creation for the input_cost field. usagelog.DefaultInputCost = usagelogDescInputCost.Default.(float64) // usagelogDescOutputCost is the schema descriptor for output_cost field. - usagelogDescOutputCost := usagelogFields[16].Descriptor() + usagelogDescOutputCost := usagelogFields[20].Descriptor() // usagelog.DefaultOutputCost holds the default value on creation for the output_cost field. usagelog.DefaultOutputCost = usagelogDescOutputCost.Default.(float64) // usagelogDescCacheCreationCost is the schema descriptor for cache_creation_cost field. - usagelogDescCacheCreationCost := usagelogFields[17].Descriptor() + usagelogDescCacheCreationCost := usagelogFields[21].Descriptor() // usagelog.DefaultCacheCreationCost holds the default value on creation for the cache_creation_cost field. usagelog.DefaultCacheCreationCost = usagelogDescCacheCreationCost.Default.(float64) // usagelogDescCacheReadCost is the schema descriptor for cache_read_cost field. - usagelogDescCacheReadCost := usagelogFields[18].Descriptor() + usagelogDescCacheReadCost := usagelogFields[22].Descriptor() // usagelog.DefaultCacheReadCost holds the default value on creation for the cache_read_cost field. usagelog.DefaultCacheReadCost = usagelogDescCacheReadCost.Default.(float64) // usagelogDescTotalCost is the schema descriptor for total_cost field. - usagelogDescTotalCost := usagelogFields[19].Descriptor() + usagelogDescTotalCost := usagelogFields[23].Descriptor() // usagelog.DefaultTotalCost holds the default value on creation for the total_cost field. usagelog.DefaultTotalCost = usagelogDescTotalCost.Default.(float64) // usagelogDescActualCost is the schema descriptor for actual_cost field. - usagelogDescActualCost := usagelogFields[20].Descriptor() + usagelogDescActualCost := usagelogFields[24].Descriptor() // usagelog.DefaultActualCost holds the default value on creation for the actual_cost field. usagelog.DefaultActualCost = usagelogDescActualCost.Default.(float64) // usagelogDescRateMultiplier is the schema descriptor for rate_multiplier field. - usagelogDescRateMultiplier := usagelogFields[21].Descriptor() + usagelogDescRateMultiplier := usagelogFields[25].Descriptor() // usagelog.DefaultRateMultiplier holds the default value on creation for the rate_multiplier field. usagelog.DefaultRateMultiplier = usagelogDescRateMultiplier.Default.(float64) // usagelogDescBillingType is the schema descriptor for billing_type field. - usagelogDescBillingType := usagelogFields[23].Descriptor() + usagelogDescBillingType := usagelogFields[27].Descriptor() // usagelog.DefaultBillingType holds the default value on creation for the billing_type field. usagelog.DefaultBillingType = usagelogDescBillingType.Default.(int8) // usagelogDescStream is the schema descriptor for stream field. - usagelogDescStream := usagelogFields[24].Descriptor() + usagelogDescStream := usagelogFields[28].Descriptor() // usagelog.DefaultStream holds the default value on creation for the stream field. usagelog.DefaultStream = usagelogDescStream.Default.(bool) // usagelogDescUserAgent is the schema descriptor for user_agent field. - usagelogDescUserAgent := usagelogFields[27].Descriptor() + usagelogDescUserAgent := usagelogFields[31].Descriptor() // usagelog.UserAgentValidator is a validator for the "user_agent" field. It is called by the builders before save. usagelog.UserAgentValidator = usagelogDescUserAgent.Validators[0].(func(string) error) // usagelogDescIPAddress is the schema descriptor for ip_address field. - usagelogDescIPAddress := usagelogFields[28].Descriptor() + usagelogDescIPAddress := usagelogFields[32].Descriptor() // usagelog.IPAddressValidator is a validator for the "ip_address" field. It is called by the builders before save. usagelog.IPAddressValidator = usagelogDescIPAddress.Validators[0].(func(string) error) // usagelogDescImageCount is the schema descriptor for image_count field. - usagelogDescImageCount := usagelogFields[29].Descriptor() + usagelogDescImageCount := usagelogFields[33].Descriptor() // usagelog.DefaultImageCount holds the default value on creation for the image_count field. usagelog.DefaultImageCount = usagelogDescImageCount.Default.(int) // usagelogDescImageSize is the schema descriptor for image_size field. - usagelogDescImageSize := usagelogFields[30].Descriptor() + usagelogDescImageSize := usagelogFields[34].Descriptor() // usagelog.ImageSizeValidator is a validator for the "image_size" field. It is called by the builders before save. usagelog.ImageSizeValidator = usagelogDescImageSize.Validators[0].(func(string) error) // usagelogDescMediaType is the schema descriptor for media_type field. - usagelogDescMediaType := usagelogFields[31].Descriptor() + usagelogDescMediaType := usagelogFields[35].Descriptor() // usagelog.MediaTypeValidator is a validator for the "media_type" field. It is called by the builders before save. usagelog.MediaTypeValidator = usagelogDescMediaType.Validators[0].(func(string) error) // usagelogDescCacheTTLOverridden is the schema descriptor for cache_ttl_overridden field. - usagelogDescCacheTTLOverridden := usagelogFields[32].Descriptor() + usagelogDescCacheTTLOverridden := usagelogFields[36].Descriptor() // usagelog.DefaultCacheTTLOverridden holds the default value on creation for the cache_ttl_overridden field. usagelog.DefaultCacheTTLOverridden = usagelogDescCacheTTLOverridden.Default.(bool) // usagelogDescCreatedAt is the schema descriptor for created_at field. - usagelogDescCreatedAt := usagelogFields[33].Descriptor() + usagelogDescCreatedAt := usagelogFields[37].Descriptor() // usagelog.DefaultCreatedAt holds the default value on creation for the created_at field. usagelog.DefaultCreatedAt = usagelogDescCreatedAt.Default.(func() time.Time) userMixin := schema.User{}.Mixin() diff --git a/backend/ent/schema/usage_log.go b/backend/ent/schema/usage_log.go index 32c39e25..f6c725a2 100644 --- a/backend/ent/schema/usage_log.go +++ b/backend/ent/schema/usage_log.go @@ -53,6 +53,10 @@ func (UsageLog) Fields() []ent.Field { MaxLen(100). Optional(). Nillable(), + field.Int64("channel_id").Optional().Nillable().Comment("渠道 ID"), + field.String("model_mapping_chain").MaxLen(500).Optional().Nillable().Comment("模型映射链"), + field.String("billing_tier").MaxLen(50).Optional().Nillable().Comment("计费层级标签"), + field.String("billing_mode").MaxLen(20).Optional().Nillable().Comment("计费模式:token/per_request/image"), field.Int64("group_id"). Optional(). Nillable(), diff --git a/backend/ent/usagelog.go b/backend/ent/usagelog.go index fb4ee1c5..b857afdb 100644 --- a/backend/ent/usagelog.go +++ b/backend/ent/usagelog.go @@ -36,6 +36,14 @@ type UsageLog struct { RequestedModel *string `json:"requested_model,omitempty"` // UpstreamModel holds the value of the "upstream_model" field. UpstreamModel *string `json:"upstream_model,omitempty"` + // 渠道 ID + ChannelID *int64 `json:"channel_id,omitempty"` + // 模型映射链 + ModelMappingChain *string `json:"model_mapping_chain,omitempty"` + // 计费层级标签 + BillingTier *string `json:"billing_tier,omitempty"` + // 计费模式:token/per_request/image + BillingMode *string `json:"billing_mode,omitempty"` // GroupID holds the value of the "group_id" field. GroupID *int64 `json:"group_id,omitempty"` // SubscriptionID holds the value of the "subscription_id" field. @@ -177,9 +185,9 @@ func (*UsageLog) scanValues(columns []string) ([]any, error) { values[i] = new(sql.NullBool) case usagelog.FieldInputCost, usagelog.FieldOutputCost, usagelog.FieldCacheCreationCost, usagelog.FieldCacheReadCost, usagelog.FieldTotalCost, usagelog.FieldActualCost, usagelog.FieldRateMultiplier, usagelog.FieldAccountRateMultiplier: values[i] = new(sql.NullFloat64) - case usagelog.FieldID, usagelog.FieldUserID, usagelog.FieldAPIKeyID, usagelog.FieldAccountID, usagelog.FieldGroupID, usagelog.FieldSubscriptionID, usagelog.FieldInputTokens, usagelog.FieldOutputTokens, usagelog.FieldCacheCreationTokens, usagelog.FieldCacheReadTokens, usagelog.FieldCacheCreation5mTokens, usagelog.FieldCacheCreation1hTokens, usagelog.FieldBillingType, usagelog.FieldDurationMs, usagelog.FieldFirstTokenMs, usagelog.FieldImageCount: + case usagelog.FieldID, usagelog.FieldUserID, usagelog.FieldAPIKeyID, usagelog.FieldAccountID, usagelog.FieldChannelID, usagelog.FieldGroupID, usagelog.FieldSubscriptionID, usagelog.FieldInputTokens, usagelog.FieldOutputTokens, usagelog.FieldCacheCreationTokens, usagelog.FieldCacheReadTokens, usagelog.FieldCacheCreation5mTokens, usagelog.FieldCacheCreation1hTokens, usagelog.FieldBillingType, usagelog.FieldDurationMs, usagelog.FieldFirstTokenMs, usagelog.FieldImageCount: values[i] = new(sql.NullInt64) - case usagelog.FieldRequestID, usagelog.FieldModel, usagelog.FieldRequestedModel, usagelog.FieldUpstreamModel, usagelog.FieldUserAgent, usagelog.FieldIPAddress, usagelog.FieldImageSize, usagelog.FieldMediaType: + case usagelog.FieldRequestID, usagelog.FieldModel, usagelog.FieldRequestedModel, usagelog.FieldUpstreamModel, usagelog.FieldModelMappingChain, usagelog.FieldBillingTier, usagelog.FieldBillingMode, usagelog.FieldUserAgent, usagelog.FieldIPAddress, usagelog.FieldImageSize, usagelog.FieldMediaType: values[i] = new(sql.NullString) case usagelog.FieldCreatedAt: values[i] = new(sql.NullTime) @@ -248,6 +256,34 @@ func (_m *UsageLog) assignValues(columns []string, values []any) error { _m.UpstreamModel = new(string) *_m.UpstreamModel = value.String } + case usagelog.FieldChannelID: + if value, ok := values[i].(*sql.NullInt64); !ok { + return fmt.Errorf("unexpected type %T for field channel_id", values[i]) + } else if value.Valid { + _m.ChannelID = new(int64) + *_m.ChannelID = value.Int64 + } + case usagelog.FieldModelMappingChain: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field model_mapping_chain", values[i]) + } else if value.Valid { + _m.ModelMappingChain = new(string) + *_m.ModelMappingChain = value.String + } + case usagelog.FieldBillingTier: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field billing_tier", values[i]) + } else if value.Valid { + _m.BillingTier = new(string) + *_m.BillingTier = value.String + } + case usagelog.FieldBillingMode: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field billing_mode", values[i]) + } else if value.Valid { + _m.BillingMode = new(string) + *_m.BillingMode = value.String + } case usagelog.FieldGroupID: if value, ok := values[i].(*sql.NullInt64); !ok { return fmt.Errorf("unexpected type %T for field group_id", values[i]) @@ -505,6 +541,26 @@ func (_m *UsageLog) String() string { builder.WriteString(*v) } builder.WriteString(", ") + if v := _m.ChannelID; v != nil { + builder.WriteString("channel_id=") + builder.WriteString(fmt.Sprintf("%v", *v)) + } + builder.WriteString(", ") + if v := _m.ModelMappingChain; v != nil { + builder.WriteString("model_mapping_chain=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := _m.BillingTier; v != nil { + builder.WriteString("billing_tier=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := _m.BillingMode; v != nil { + builder.WriteString("billing_mode=") + builder.WriteString(*v) + } + builder.WriteString(", ") if v := _m.GroupID; v != nil { builder.WriteString("group_id=") builder.WriteString(fmt.Sprintf("%v", *v)) diff --git a/backend/ent/usagelog/usagelog.go b/backend/ent/usagelog/usagelog.go index b534f193..1567ad9b 100644 --- a/backend/ent/usagelog/usagelog.go +++ b/backend/ent/usagelog/usagelog.go @@ -28,6 +28,14 @@ const ( FieldRequestedModel = "requested_model" // FieldUpstreamModel holds the string denoting the upstream_model field in the database. FieldUpstreamModel = "upstream_model" + // FieldChannelID holds the string denoting the channel_id field in the database. + FieldChannelID = "channel_id" + // FieldModelMappingChain holds the string denoting the model_mapping_chain field in the database. + FieldModelMappingChain = "model_mapping_chain" + // FieldBillingTier holds the string denoting the billing_tier field in the database. + FieldBillingTier = "billing_tier" + // FieldBillingMode holds the string denoting the billing_mode field in the database. + FieldBillingMode = "billing_mode" // FieldGroupID holds the string denoting the group_id field in the database. FieldGroupID = "group_id" // FieldSubscriptionID holds the string denoting the subscription_id field in the database. @@ -141,6 +149,10 @@ var Columns = []string{ FieldModel, FieldRequestedModel, FieldUpstreamModel, + FieldChannelID, + FieldModelMappingChain, + FieldBillingTier, + FieldBillingMode, FieldGroupID, FieldSubscriptionID, FieldInputTokens, @@ -189,6 +201,12 @@ var ( RequestedModelValidator func(string) error // UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save. UpstreamModelValidator func(string) error + // ModelMappingChainValidator is a validator for the "model_mapping_chain" field. It is called by the builders before save. + ModelMappingChainValidator func(string) error + // BillingTierValidator is a validator for the "billing_tier" field. It is called by the builders before save. + BillingTierValidator func(string) error + // BillingModeValidator is a validator for the "billing_mode" field. It is called by the builders before save. + BillingModeValidator func(string) error // DefaultInputTokens holds the default value on creation for the "input_tokens" field. DefaultInputTokens int // DefaultOutputTokens holds the default value on creation for the "output_tokens" field. @@ -278,6 +296,26 @@ func ByUpstreamModel(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldUpstreamModel, opts...).ToFunc() } +// ByChannelID orders the results by the channel_id field. +func ByChannelID(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldChannelID, opts...).ToFunc() +} + +// ByModelMappingChain orders the results by the model_mapping_chain field. +func ByModelMappingChain(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldModelMappingChain, opts...).ToFunc() +} + +// ByBillingTier orders the results by the billing_tier field. +func ByBillingTier(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldBillingTier, opts...).ToFunc() +} + +// ByBillingMode orders the results by the billing_mode field. +func ByBillingMode(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldBillingMode, opts...).ToFunc() +} + // ByGroupID orders the results by the group_id field. func ByGroupID(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldGroupID, opts...).ToFunc() diff --git a/backend/ent/usagelog/where.go b/backend/ent/usagelog/where.go index f95bceb7..a1fb36cb 100644 --- a/backend/ent/usagelog/where.go +++ b/backend/ent/usagelog/where.go @@ -90,6 +90,26 @@ func UpstreamModel(v string) predicate.UsageLog { return predicate.UsageLog(sql.FieldEQ(FieldUpstreamModel, v)) } +// ChannelID applies equality check predicate on the "channel_id" field. It's identical to ChannelIDEQ. +func ChannelID(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldChannelID, v)) +} + +// ModelMappingChain applies equality check predicate on the "model_mapping_chain" field. It's identical to ModelMappingChainEQ. +func ModelMappingChain(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldModelMappingChain, v)) +} + +// BillingTier applies equality check predicate on the "billing_tier" field. It's identical to BillingTierEQ. +func BillingTier(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldBillingTier, v)) +} + +// BillingMode applies equality check predicate on the "billing_mode" field. It's identical to BillingModeEQ. +func BillingMode(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldBillingMode, v)) +} + // GroupID applies equality check predicate on the "group_id" field. It's identical to GroupIDEQ. func GroupID(v int64) predicate.UsageLog { return predicate.UsageLog(sql.FieldEQ(FieldGroupID, v)) @@ -565,6 +585,281 @@ func UpstreamModelContainsFold(v string) predicate.UsageLog { return predicate.UsageLog(sql.FieldContainsFold(FieldUpstreamModel, v)) } +// ChannelIDEQ applies the EQ predicate on the "channel_id" field. +func ChannelIDEQ(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldChannelID, v)) +} + +// ChannelIDNEQ applies the NEQ predicate on the "channel_id" field. +func ChannelIDNEQ(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNEQ(FieldChannelID, v)) +} + +// ChannelIDIn applies the In predicate on the "channel_id" field. +func ChannelIDIn(vs ...int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldIn(FieldChannelID, vs...)) +} + +// ChannelIDNotIn applies the NotIn predicate on the "channel_id" field. +func ChannelIDNotIn(vs ...int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotIn(FieldChannelID, vs...)) +} + +// ChannelIDGT applies the GT predicate on the "channel_id" field. +func ChannelIDGT(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGT(FieldChannelID, v)) +} + +// ChannelIDGTE applies the GTE predicate on the "channel_id" field. +func ChannelIDGTE(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGTE(FieldChannelID, v)) +} + +// ChannelIDLT applies the LT predicate on the "channel_id" field. +func ChannelIDLT(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLT(FieldChannelID, v)) +} + +// ChannelIDLTE applies the LTE predicate on the "channel_id" field. +func ChannelIDLTE(v int64) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLTE(FieldChannelID, v)) +} + +// ChannelIDIsNil applies the IsNil predicate on the "channel_id" field. +func ChannelIDIsNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldIsNull(FieldChannelID)) +} + +// ChannelIDNotNil applies the NotNil predicate on the "channel_id" field. +func ChannelIDNotNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotNull(FieldChannelID)) +} + +// ModelMappingChainEQ applies the EQ predicate on the "model_mapping_chain" field. +func ModelMappingChainEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldModelMappingChain, v)) +} + +// ModelMappingChainNEQ applies the NEQ predicate on the "model_mapping_chain" field. +func ModelMappingChainNEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNEQ(FieldModelMappingChain, v)) +} + +// ModelMappingChainIn applies the In predicate on the "model_mapping_chain" field. +func ModelMappingChainIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldIn(FieldModelMappingChain, vs...)) +} + +// ModelMappingChainNotIn applies the NotIn predicate on the "model_mapping_chain" field. +func ModelMappingChainNotIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotIn(FieldModelMappingChain, vs...)) +} + +// ModelMappingChainGT applies the GT predicate on the "model_mapping_chain" field. +func ModelMappingChainGT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGT(FieldModelMappingChain, v)) +} + +// ModelMappingChainGTE applies the GTE predicate on the "model_mapping_chain" field. +func ModelMappingChainGTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGTE(FieldModelMappingChain, v)) +} + +// ModelMappingChainLT applies the LT predicate on the "model_mapping_chain" field. +func ModelMappingChainLT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLT(FieldModelMappingChain, v)) +} + +// ModelMappingChainLTE applies the LTE predicate on the "model_mapping_chain" field. +func ModelMappingChainLTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLTE(FieldModelMappingChain, v)) +} + +// ModelMappingChainContains applies the Contains predicate on the "model_mapping_chain" field. +func ModelMappingChainContains(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContains(FieldModelMappingChain, v)) +} + +// ModelMappingChainHasPrefix applies the HasPrefix predicate on the "model_mapping_chain" field. +func ModelMappingChainHasPrefix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasPrefix(FieldModelMappingChain, v)) +} + +// ModelMappingChainHasSuffix applies the HasSuffix predicate on the "model_mapping_chain" field. +func ModelMappingChainHasSuffix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasSuffix(FieldModelMappingChain, v)) +} + +// ModelMappingChainIsNil applies the IsNil predicate on the "model_mapping_chain" field. +func ModelMappingChainIsNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldIsNull(FieldModelMappingChain)) +} + +// ModelMappingChainNotNil applies the NotNil predicate on the "model_mapping_chain" field. +func ModelMappingChainNotNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotNull(FieldModelMappingChain)) +} + +// ModelMappingChainEqualFold applies the EqualFold predicate on the "model_mapping_chain" field. +func ModelMappingChainEqualFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEqualFold(FieldModelMappingChain, v)) +} + +// ModelMappingChainContainsFold applies the ContainsFold predicate on the "model_mapping_chain" field. +func ModelMappingChainContainsFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContainsFold(FieldModelMappingChain, v)) +} + +// BillingTierEQ applies the EQ predicate on the "billing_tier" field. +func BillingTierEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldBillingTier, v)) +} + +// BillingTierNEQ applies the NEQ predicate on the "billing_tier" field. +func BillingTierNEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNEQ(FieldBillingTier, v)) +} + +// BillingTierIn applies the In predicate on the "billing_tier" field. +func BillingTierIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldIn(FieldBillingTier, vs...)) +} + +// BillingTierNotIn applies the NotIn predicate on the "billing_tier" field. +func BillingTierNotIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotIn(FieldBillingTier, vs...)) +} + +// BillingTierGT applies the GT predicate on the "billing_tier" field. +func BillingTierGT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGT(FieldBillingTier, v)) +} + +// BillingTierGTE applies the GTE predicate on the "billing_tier" field. +func BillingTierGTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGTE(FieldBillingTier, v)) +} + +// BillingTierLT applies the LT predicate on the "billing_tier" field. +func BillingTierLT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLT(FieldBillingTier, v)) +} + +// BillingTierLTE applies the LTE predicate on the "billing_tier" field. +func BillingTierLTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLTE(FieldBillingTier, v)) +} + +// BillingTierContains applies the Contains predicate on the "billing_tier" field. +func BillingTierContains(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContains(FieldBillingTier, v)) +} + +// BillingTierHasPrefix applies the HasPrefix predicate on the "billing_tier" field. +func BillingTierHasPrefix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasPrefix(FieldBillingTier, v)) +} + +// BillingTierHasSuffix applies the HasSuffix predicate on the "billing_tier" field. +func BillingTierHasSuffix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasSuffix(FieldBillingTier, v)) +} + +// BillingTierIsNil applies the IsNil predicate on the "billing_tier" field. +func BillingTierIsNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldIsNull(FieldBillingTier)) +} + +// BillingTierNotNil applies the NotNil predicate on the "billing_tier" field. +func BillingTierNotNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotNull(FieldBillingTier)) +} + +// BillingTierEqualFold applies the EqualFold predicate on the "billing_tier" field. +func BillingTierEqualFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEqualFold(FieldBillingTier, v)) +} + +// BillingTierContainsFold applies the ContainsFold predicate on the "billing_tier" field. +func BillingTierContainsFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContainsFold(FieldBillingTier, v)) +} + +// BillingModeEQ applies the EQ predicate on the "billing_mode" field. +func BillingModeEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEQ(FieldBillingMode, v)) +} + +// BillingModeNEQ applies the NEQ predicate on the "billing_mode" field. +func BillingModeNEQ(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNEQ(FieldBillingMode, v)) +} + +// BillingModeIn applies the In predicate on the "billing_mode" field. +func BillingModeIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldIn(FieldBillingMode, vs...)) +} + +// BillingModeNotIn applies the NotIn predicate on the "billing_mode" field. +func BillingModeNotIn(vs ...string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotIn(FieldBillingMode, vs...)) +} + +// BillingModeGT applies the GT predicate on the "billing_mode" field. +func BillingModeGT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGT(FieldBillingMode, v)) +} + +// BillingModeGTE applies the GTE predicate on the "billing_mode" field. +func BillingModeGTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldGTE(FieldBillingMode, v)) +} + +// BillingModeLT applies the LT predicate on the "billing_mode" field. +func BillingModeLT(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLT(FieldBillingMode, v)) +} + +// BillingModeLTE applies the LTE predicate on the "billing_mode" field. +func BillingModeLTE(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldLTE(FieldBillingMode, v)) +} + +// BillingModeContains applies the Contains predicate on the "billing_mode" field. +func BillingModeContains(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContains(FieldBillingMode, v)) +} + +// BillingModeHasPrefix applies the HasPrefix predicate on the "billing_mode" field. +func BillingModeHasPrefix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasPrefix(FieldBillingMode, v)) +} + +// BillingModeHasSuffix applies the HasSuffix predicate on the "billing_mode" field. +func BillingModeHasSuffix(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldHasSuffix(FieldBillingMode, v)) +} + +// BillingModeIsNil applies the IsNil predicate on the "billing_mode" field. +func BillingModeIsNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldIsNull(FieldBillingMode)) +} + +// BillingModeNotNil applies the NotNil predicate on the "billing_mode" field. +func BillingModeNotNil() predicate.UsageLog { + return predicate.UsageLog(sql.FieldNotNull(FieldBillingMode)) +} + +// BillingModeEqualFold applies the EqualFold predicate on the "billing_mode" field. +func BillingModeEqualFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldEqualFold(FieldBillingMode, v)) +} + +// BillingModeContainsFold applies the ContainsFold predicate on the "billing_mode" field. +func BillingModeContainsFold(v string) predicate.UsageLog { + return predicate.UsageLog(sql.FieldContainsFold(FieldBillingMode, v)) +} + // GroupIDEQ applies the EQ predicate on the "group_id" field. func GroupIDEQ(v int64) predicate.UsageLog { return predicate.UsageLog(sql.FieldEQ(FieldGroupID, v)) diff --git a/backend/ent/usagelog_create.go b/backend/ent/usagelog_create.go index 6ae0bf59..d15e231d 100644 --- a/backend/ent/usagelog_create.go +++ b/backend/ent/usagelog_create.go @@ -85,6 +85,62 @@ func (_c *UsageLogCreate) SetNillableUpstreamModel(v *string) *UsageLogCreate { return _c } +// SetChannelID sets the "channel_id" field. +func (_c *UsageLogCreate) SetChannelID(v int64) *UsageLogCreate { + _c.mutation.SetChannelID(v) + return _c +} + +// SetNillableChannelID sets the "channel_id" field if the given value is not nil. +func (_c *UsageLogCreate) SetNillableChannelID(v *int64) *UsageLogCreate { + if v != nil { + _c.SetChannelID(*v) + } + return _c +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (_c *UsageLogCreate) SetModelMappingChain(v string) *UsageLogCreate { + _c.mutation.SetModelMappingChain(v) + return _c +} + +// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil. +func (_c *UsageLogCreate) SetNillableModelMappingChain(v *string) *UsageLogCreate { + if v != nil { + _c.SetModelMappingChain(*v) + } + return _c +} + +// SetBillingTier sets the "billing_tier" field. +func (_c *UsageLogCreate) SetBillingTier(v string) *UsageLogCreate { + _c.mutation.SetBillingTier(v) + return _c +} + +// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil. +func (_c *UsageLogCreate) SetNillableBillingTier(v *string) *UsageLogCreate { + if v != nil { + _c.SetBillingTier(*v) + } + return _c +} + +// SetBillingMode sets the "billing_mode" field. +func (_c *UsageLogCreate) SetBillingMode(v string) *UsageLogCreate { + _c.mutation.SetBillingMode(v) + return _c +} + +// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil. +func (_c *UsageLogCreate) SetNillableBillingMode(v *string) *UsageLogCreate { + if v != nil { + _c.SetBillingMode(*v) + } + return _c +} + // SetGroupID sets the "group_id" field. func (_c *UsageLogCreate) SetGroupID(v int64) *UsageLogCreate { _c.mutation.SetGroupID(v) @@ -634,6 +690,21 @@ func (_c *UsageLogCreate) check() error { return &ValidationError{Name: "upstream_model", err: fmt.Errorf(`ent: validator failed for field "UsageLog.upstream_model": %w`, err)} } } + if v, ok := _c.mutation.ModelMappingChain(); ok { + if err := usagelog.ModelMappingChainValidator(v); err != nil { + return &ValidationError{Name: "model_mapping_chain", err: fmt.Errorf(`ent: validator failed for field "UsageLog.model_mapping_chain": %w`, err)} + } + } + if v, ok := _c.mutation.BillingTier(); ok { + if err := usagelog.BillingTierValidator(v); err != nil { + return &ValidationError{Name: "billing_tier", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_tier": %w`, err)} + } + } + if v, ok := _c.mutation.BillingMode(); ok { + if err := usagelog.BillingModeValidator(v); err != nil { + return &ValidationError{Name: "billing_mode", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_mode": %w`, err)} + } + } if _, ok := _c.mutation.InputTokens(); !ok { return &ValidationError{Name: "input_tokens", err: errors.New(`ent: missing required field "UsageLog.input_tokens"`)} } @@ -760,6 +831,22 @@ func (_c *UsageLogCreate) createSpec() (*UsageLog, *sqlgraph.CreateSpec) { _spec.SetField(usagelog.FieldUpstreamModel, field.TypeString, value) _node.UpstreamModel = &value } + if value, ok := _c.mutation.ChannelID(); ok { + _spec.SetField(usagelog.FieldChannelID, field.TypeInt64, value) + _node.ChannelID = &value + } + if value, ok := _c.mutation.ModelMappingChain(); ok { + _spec.SetField(usagelog.FieldModelMappingChain, field.TypeString, value) + _node.ModelMappingChain = &value + } + if value, ok := _c.mutation.BillingTier(); ok { + _spec.SetField(usagelog.FieldBillingTier, field.TypeString, value) + _node.BillingTier = &value + } + if value, ok := _c.mutation.BillingMode(); ok { + _spec.SetField(usagelog.FieldBillingMode, field.TypeString, value) + _node.BillingMode = &value + } if value, ok := _c.mutation.InputTokens(); ok { _spec.SetField(usagelog.FieldInputTokens, field.TypeInt, value) _node.InputTokens = value @@ -1093,6 +1180,84 @@ func (u *UsageLogUpsert) ClearUpstreamModel() *UsageLogUpsert { return u } +// SetChannelID sets the "channel_id" field. +func (u *UsageLogUpsert) SetChannelID(v int64) *UsageLogUpsert { + u.Set(usagelog.FieldChannelID, v) + return u +} + +// UpdateChannelID sets the "channel_id" field to the value that was provided on create. +func (u *UsageLogUpsert) UpdateChannelID() *UsageLogUpsert { + u.SetExcluded(usagelog.FieldChannelID) + return u +} + +// AddChannelID adds v to the "channel_id" field. +func (u *UsageLogUpsert) AddChannelID(v int64) *UsageLogUpsert { + u.Add(usagelog.FieldChannelID, v) + return u +} + +// ClearChannelID clears the value of the "channel_id" field. +func (u *UsageLogUpsert) ClearChannelID() *UsageLogUpsert { + u.SetNull(usagelog.FieldChannelID) + return u +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (u *UsageLogUpsert) SetModelMappingChain(v string) *UsageLogUpsert { + u.Set(usagelog.FieldModelMappingChain, v) + return u +} + +// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create. +func (u *UsageLogUpsert) UpdateModelMappingChain() *UsageLogUpsert { + u.SetExcluded(usagelog.FieldModelMappingChain) + return u +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (u *UsageLogUpsert) ClearModelMappingChain() *UsageLogUpsert { + u.SetNull(usagelog.FieldModelMappingChain) + return u +} + +// SetBillingTier sets the "billing_tier" field. +func (u *UsageLogUpsert) SetBillingTier(v string) *UsageLogUpsert { + u.Set(usagelog.FieldBillingTier, v) + return u +} + +// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create. +func (u *UsageLogUpsert) UpdateBillingTier() *UsageLogUpsert { + u.SetExcluded(usagelog.FieldBillingTier) + return u +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (u *UsageLogUpsert) ClearBillingTier() *UsageLogUpsert { + u.SetNull(usagelog.FieldBillingTier) + return u +} + +// SetBillingMode sets the "billing_mode" field. +func (u *UsageLogUpsert) SetBillingMode(v string) *UsageLogUpsert { + u.Set(usagelog.FieldBillingMode, v) + return u +} + +// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create. +func (u *UsageLogUpsert) UpdateBillingMode() *UsageLogUpsert { + u.SetExcluded(usagelog.FieldBillingMode) + return u +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (u *UsageLogUpsert) ClearBillingMode() *UsageLogUpsert { + u.SetNull(usagelog.FieldBillingMode) + return u +} + // SetGroupID sets the "group_id" field. func (u *UsageLogUpsert) SetGroupID(v int64) *UsageLogUpsert { u.Set(usagelog.FieldGroupID, v) @@ -1724,6 +1889,97 @@ func (u *UsageLogUpsertOne) ClearUpstreamModel() *UsageLogUpsertOne { }) } +// SetChannelID sets the "channel_id" field. +func (u *UsageLogUpsertOne) SetChannelID(v int64) *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.SetChannelID(v) + }) +} + +// AddChannelID adds v to the "channel_id" field. +func (u *UsageLogUpsertOne) AddChannelID(v int64) *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.AddChannelID(v) + }) +} + +// UpdateChannelID sets the "channel_id" field to the value that was provided on create. +func (u *UsageLogUpsertOne) UpdateChannelID() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateChannelID() + }) +} + +// ClearChannelID clears the value of the "channel_id" field. +func (u *UsageLogUpsertOne) ClearChannelID() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.ClearChannelID() + }) +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (u *UsageLogUpsertOne) SetModelMappingChain(v string) *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.SetModelMappingChain(v) + }) +} + +// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create. +func (u *UsageLogUpsertOne) UpdateModelMappingChain() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateModelMappingChain() + }) +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (u *UsageLogUpsertOne) ClearModelMappingChain() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.ClearModelMappingChain() + }) +} + +// SetBillingTier sets the "billing_tier" field. +func (u *UsageLogUpsertOne) SetBillingTier(v string) *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.SetBillingTier(v) + }) +} + +// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create. +func (u *UsageLogUpsertOne) UpdateBillingTier() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateBillingTier() + }) +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (u *UsageLogUpsertOne) ClearBillingTier() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.ClearBillingTier() + }) +} + +// SetBillingMode sets the "billing_mode" field. +func (u *UsageLogUpsertOne) SetBillingMode(v string) *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.SetBillingMode(v) + }) +} + +// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create. +func (u *UsageLogUpsertOne) UpdateBillingMode() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateBillingMode() + }) +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (u *UsageLogUpsertOne) ClearBillingMode() *UsageLogUpsertOne { + return u.Update(func(s *UsageLogUpsert) { + s.ClearBillingMode() + }) +} + // SetGroupID sets the "group_id" field. func (u *UsageLogUpsertOne) SetGroupID(v int64) *UsageLogUpsertOne { return u.Update(func(s *UsageLogUpsert) { @@ -2600,6 +2856,97 @@ func (u *UsageLogUpsertBulk) ClearUpstreamModel() *UsageLogUpsertBulk { }) } +// SetChannelID sets the "channel_id" field. +func (u *UsageLogUpsertBulk) SetChannelID(v int64) *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.SetChannelID(v) + }) +} + +// AddChannelID adds v to the "channel_id" field. +func (u *UsageLogUpsertBulk) AddChannelID(v int64) *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.AddChannelID(v) + }) +} + +// UpdateChannelID sets the "channel_id" field to the value that was provided on create. +func (u *UsageLogUpsertBulk) UpdateChannelID() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateChannelID() + }) +} + +// ClearChannelID clears the value of the "channel_id" field. +func (u *UsageLogUpsertBulk) ClearChannelID() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.ClearChannelID() + }) +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (u *UsageLogUpsertBulk) SetModelMappingChain(v string) *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.SetModelMappingChain(v) + }) +} + +// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create. +func (u *UsageLogUpsertBulk) UpdateModelMappingChain() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateModelMappingChain() + }) +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (u *UsageLogUpsertBulk) ClearModelMappingChain() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.ClearModelMappingChain() + }) +} + +// SetBillingTier sets the "billing_tier" field. +func (u *UsageLogUpsertBulk) SetBillingTier(v string) *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.SetBillingTier(v) + }) +} + +// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create. +func (u *UsageLogUpsertBulk) UpdateBillingTier() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateBillingTier() + }) +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (u *UsageLogUpsertBulk) ClearBillingTier() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.ClearBillingTier() + }) +} + +// SetBillingMode sets the "billing_mode" field. +func (u *UsageLogUpsertBulk) SetBillingMode(v string) *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.SetBillingMode(v) + }) +} + +// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create. +func (u *UsageLogUpsertBulk) UpdateBillingMode() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.UpdateBillingMode() + }) +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (u *UsageLogUpsertBulk) ClearBillingMode() *UsageLogUpsertBulk { + return u.Update(func(s *UsageLogUpsert) { + s.ClearBillingMode() + }) +} + // SetGroupID sets the "group_id" field. func (u *UsageLogUpsertBulk) SetGroupID(v int64) *UsageLogUpsertBulk { return u.Update(func(s *UsageLogUpsert) { diff --git a/backend/ent/usagelog_update.go b/backend/ent/usagelog_update.go index 516407b9..52f5a606 100644 --- a/backend/ent/usagelog_update.go +++ b/backend/ent/usagelog_update.go @@ -142,6 +142,93 @@ func (_u *UsageLogUpdate) ClearUpstreamModel() *UsageLogUpdate { return _u } +// SetChannelID sets the "channel_id" field. +func (_u *UsageLogUpdate) SetChannelID(v int64) *UsageLogUpdate { + _u.mutation.ResetChannelID() + _u.mutation.SetChannelID(v) + return _u +} + +// SetNillableChannelID sets the "channel_id" field if the given value is not nil. +func (_u *UsageLogUpdate) SetNillableChannelID(v *int64) *UsageLogUpdate { + if v != nil { + _u.SetChannelID(*v) + } + return _u +} + +// AddChannelID adds value to the "channel_id" field. +func (_u *UsageLogUpdate) AddChannelID(v int64) *UsageLogUpdate { + _u.mutation.AddChannelID(v) + return _u +} + +// ClearChannelID clears the value of the "channel_id" field. +func (_u *UsageLogUpdate) ClearChannelID() *UsageLogUpdate { + _u.mutation.ClearChannelID() + return _u +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (_u *UsageLogUpdate) SetModelMappingChain(v string) *UsageLogUpdate { + _u.mutation.SetModelMappingChain(v) + return _u +} + +// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil. +func (_u *UsageLogUpdate) SetNillableModelMappingChain(v *string) *UsageLogUpdate { + if v != nil { + _u.SetModelMappingChain(*v) + } + return _u +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (_u *UsageLogUpdate) ClearModelMappingChain() *UsageLogUpdate { + _u.mutation.ClearModelMappingChain() + return _u +} + +// SetBillingTier sets the "billing_tier" field. +func (_u *UsageLogUpdate) SetBillingTier(v string) *UsageLogUpdate { + _u.mutation.SetBillingTier(v) + return _u +} + +// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil. +func (_u *UsageLogUpdate) SetNillableBillingTier(v *string) *UsageLogUpdate { + if v != nil { + _u.SetBillingTier(*v) + } + return _u +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (_u *UsageLogUpdate) ClearBillingTier() *UsageLogUpdate { + _u.mutation.ClearBillingTier() + return _u +} + +// SetBillingMode sets the "billing_mode" field. +func (_u *UsageLogUpdate) SetBillingMode(v string) *UsageLogUpdate { + _u.mutation.SetBillingMode(v) + return _u +} + +// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil. +func (_u *UsageLogUpdate) SetNillableBillingMode(v *string) *UsageLogUpdate { + if v != nil { + _u.SetBillingMode(*v) + } + return _u +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (_u *UsageLogUpdate) ClearBillingMode() *UsageLogUpdate { + _u.mutation.ClearBillingMode() + return _u +} + // SetGroupID sets the "group_id" field. func (_u *UsageLogUpdate) SetGroupID(v int64) *UsageLogUpdate { _u.mutation.SetGroupID(v) @@ -795,6 +882,21 @@ func (_u *UsageLogUpdate) check() error { return &ValidationError{Name: "upstream_model", err: fmt.Errorf(`ent: validator failed for field "UsageLog.upstream_model": %w`, err)} } } + if v, ok := _u.mutation.ModelMappingChain(); ok { + if err := usagelog.ModelMappingChainValidator(v); err != nil { + return &ValidationError{Name: "model_mapping_chain", err: fmt.Errorf(`ent: validator failed for field "UsageLog.model_mapping_chain": %w`, err)} + } + } + if v, ok := _u.mutation.BillingTier(); ok { + if err := usagelog.BillingTierValidator(v); err != nil { + return &ValidationError{Name: "billing_tier", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_tier": %w`, err)} + } + } + if v, ok := _u.mutation.BillingMode(); ok { + if err := usagelog.BillingModeValidator(v); err != nil { + return &ValidationError{Name: "billing_mode", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_mode": %w`, err)} + } + } if v, ok := _u.mutation.UserAgent(); ok { if err := usagelog.UserAgentValidator(v); err != nil { return &ValidationError{Name: "user_agent", err: fmt.Errorf(`ent: validator failed for field "UsageLog.user_agent": %w`, err)} @@ -857,6 +959,33 @@ func (_u *UsageLogUpdate) sqlSave(ctx context.Context) (_node int, err error) { if _u.mutation.UpstreamModelCleared() { _spec.ClearField(usagelog.FieldUpstreamModel, field.TypeString) } + if value, ok := _u.mutation.ChannelID(); ok { + _spec.SetField(usagelog.FieldChannelID, field.TypeInt64, value) + } + if value, ok := _u.mutation.AddedChannelID(); ok { + _spec.AddField(usagelog.FieldChannelID, field.TypeInt64, value) + } + if _u.mutation.ChannelIDCleared() { + _spec.ClearField(usagelog.FieldChannelID, field.TypeInt64) + } + if value, ok := _u.mutation.ModelMappingChain(); ok { + _spec.SetField(usagelog.FieldModelMappingChain, field.TypeString, value) + } + if _u.mutation.ModelMappingChainCleared() { + _spec.ClearField(usagelog.FieldModelMappingChain, field.TypeString) + } + if value, ok := _u.mutation.BillingTier(); ok { + _spec.SetField(usagelog.FieldBillingTier, field.TypeString, value) + } + if _u.mutation.BillingTierCleared() { + _spec.ClearField(usagelog.FieldBillingTier, field.TypeString) + } + if value, ok := _u.mutation.BillingMode(); ok { + _spec.SetField(usagelog.FieldBillingMode, field.TypeString, value) + } + if _u.mutation.BillingModeCleared() { + _spec.ClearField(usagelog.FieldBillingMode, field.TypeString) + } if value, ok := _u.mutation.InputTokens(); ok { _spec.SetField(usagelog.FieldInputTokens, field.TypeInt, value) } @@ -1279,6 +1408,93 @@ func (_u *UsageLogUpdateOne) ClearUpstreamModel() *UsageLogUpdateOne { return _u } +// SetChannelID sets the "channel_id" field. +func (_u *UsageLogUpdateOne) SetChannelID(v int64) *UsageLogUpdateOne { + _u.mutation.ResetChannelID() + _u.mutation.SetChannelID(v) + return _u +} + +// SetNillableChannelID sets the "channel_id" field if the given value is not nil. +func (_u *UsageLogUpdateOne) SetNillableChannelID(v *int64) *UsageLogUpdateOne { + if v != nil { + _u.SetChannelID(*v) + } + return _u +} + +// AddChannelID adds value to the "channel_id" field. +func (_u *UsageLogUpdateOne) AddChannelID(v int64) *UsageLogUpdateOne { + _u.mutation.AddChannelID(v) + return _u +} + +// ClearChannelID clears the value of the "channel_id" field. +func (_u *UsageLogUpdateOne) ClearChannelID() *UsageLogUpdateOne { + _u.mutation.ClearChannelID() + return _u +} + +// SetModelMappingChain sets the "model_mapping_chain" field. +func (_u *UsageLogUpdateOne) SetModelMappingChain(v string) *UsageLogUpdateOne { + _u.mutation.SetModelMappingChain(v) + return _u +} + +// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil. +func (_u *UsageLogUpdateOne) SetNillableModelMappingChain(v *string) *UsageLogUpdateOne { + if v != nil { + _u.SetModelMappingChain(*v) + } + return _u +} + +// ClearModelMappingChain clears the value of the "model_mapping_chain" field. +func (_u *UsageLogUpdateOne) ClearModelMappingChain() *UsageLogUpdateOne { + _u.mutation.ClearModelMappingChain() + return _u +} + +// SetBillingTier sets the "billing_tier" field. +func (_u *UsageLogUpdateOne) SetBillingTier(v string) *UsageLogUpdateOne { + _u.mutation.SetBillingTier(v) + return _u +} + +// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil. +func (_u *UsageLogUpdateOne) SetNillableBillingTier(v *string) *UsageLogUpdateOne { + if v != nil { + _u.SetBillingTier(*v) + } + return _u +} + +// ClearBillingTier clears the value of the "billing_tier" field. +func (_u *UsageLogUpdateOne) ClearBillingTier() *UsageLogUpdateOne { + _u.mutation.ClearBillingTier() + return _u +} + +// SetBillingMode sets the "billing_mode" field. +func (_u *UsageLogUpdateOne) SetBillingMode(v string) *UsageLogUpdateOne { + _u.mutation.SetBillingMode(v) + return _u +} + +// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil. +func (_u *UsageLogUpdateOne) SetNillableBillingMode(v *string) *UsageLogUpdateOne { + if v != nil { + _u.SetBillingMode(*v) + } + return _u +} + +// ClearBillingMode clears the value of the "billing_mode" field. +func (_u *UsageLogUpdateOne) ClearBillingMode() *UsageLogUpdateOne { + _u.mutation.ClearBillingMode() + return _u +} + // SetGroupID sets the "group_id" field. func (_u *UsageLogUpdateOne) SetGroupID(v int64) *UsageLogUpdateOne { _u.mutation.SetGroupID(v) @@ -1945,6 +2161,21 @@ func (_u *UsageLogUpdateOne) check() error { return &ValidationError{Name: "upstream_model", err: fmt.Errorf(`ent: validator failed for field "UsageLog.upstream_model": %w`, err)} } } + if v, ok := _u.mutation.ModelMappingChain(); ok { + if err := usagelog.ModelMappingChainValidator(v); err != nil { + return &ValidationError{Name: "model_mapping_chain", err: fmt.Errorf(`ent: validator failed for field "UsageLog.model_mapping_chain": %w`, err)} + } + } + if v, ok := _u.mutation.BillingTier(); ok { + if err := usagelog.BillingTierValidator(v); err != nil { + return &ValidationError{Name: "billing_tier", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_tier": %w`, err)} + } + } + if v, ok := _u.mutation.BillingMode(); ok { + if err := usagelog.BillingModeValidator(v); err != nil { + return &ValidationError{Name: "billing_mode", err: fmt.Errorf(`ent: validator failed for field "UsageLog.billing_mode": %w`, err)} + } + } if v, ok := _u.mutation.UserAgent(); ok { if err := usagelog.UserAgentValidator(v); err != nil { return &ValidationError{Name: "user_agent", err: fmt.Errorf(`ent: validator failed for field "UsageLog.user_agent": %w`, err)} @@ -2024,6 +2255,33 @@ func (_u *UsageLogUpdateOne) sqlSave(ctx context.Context) (_node *UsageLog, err if _u.mutation.UpstreamModelCleared() { _spec.ClearField(usagelog.FieldUpstreamModel, field.TypeString) } + if value, ok := _u.mutation.ChannelID(); ok { + _spec.SetField(usagelog.FieldChannelID, field.TypeInt64, value) + } + if value, ok := _u.mutation.AddedChannelID(); ok { + _spec.AddField(usagelog.FieldChannelID, field.TypeInt64, value) + } + if _u.mutation.ChannelIDCleared() { + _spec.ClearField(usagelog.FieldChannelID, field.TypeInt64) + } + if value, ok := _u.mutation.ModelMappingChain(); ok { + _spec.SetField(usagelog.FieldModelMappingChain, field.TypeString, value) + } + if _u.mutation.ModelMappingChainCleared() { + _spec.ClearField(usagelog.FieldModelMappingChain, field.TypeString) + } + if value, ok := _u.mutation.BillingTier(); ok { + _spec.SetField(usagelog.FieldBillingTier, field.TypeString, value) + } + if _u.mutation.BillingTierCleared() { + _spec.ClearField(usagelog.FieldBillingTier, field.TypeString) + } + if value, ok := _u.mutation.BillingMode(); ok { + _spec.SetField(usagelog.FieldBillingMode, field.TypeString, value) + } + if _u.mutation.BillingModeCleared() { + _spec.ClearField(usagelog.FieldBillingMode, field.TypeString) + } if value, ok := _u.mutation.InputTokens(); ok { _spec.SetField(usagelog.FieldInputTokens, field.TypeInt, value) } diff --git a/backend/internal/handler/admin/usage_handler.go b/backend/internal/handler/admin/usage_handler.go index 7a3135b8..2967b384 100644 --- a/backend/internal/handler/admin/usage_handler.go +++ b/backend/internal/handler/admin/usage_handler.go @@ -110,6 +110,7 @@ func (h *UsageHandler) List(c *gin.Context) { } model := c.Query("model") + billingMode := strings.TrimSpace(c.Query("billing_mode")) var requestType *int16 var stream *bool @@ -174,6 +175,7 @@ func (h *UsageHandler) List(c *gin.Context) { RequestType: requestType, Stream: stream, BillingType: billingType, + BillingMode: billingMode, StartTime: startTime, EndTime: endTime, ExactTotal: exactTotal, @@ -234,6 +236,7 @@ func (h *UsageHandler) Stats(c *gin.Context) { } model := c.Query("model") + billingMode := strings.TrimSpace(c.Query("billing_mode")) var requestType *int16 var stream *bool @@ -312,6 +315,7 @@ func (h *UsageHandler) Stats(c *gin.Context) { RequestType: requestType, Stream: stream, BillingType: billingType, + BillingMode: billingMode, StartTime: &startTime, EndTime: &endTime, } diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index cef3a5f8..d9d65783 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -577,6 +577,7 @@ func usageLogFromServiceUser(l *service.UsageLog) UsageLog { MediaType: l.MediaType, UserAgent: l.UserAgent, CacheTTLOverridden: l.CacheTTLOverridden, + BillingMode: l.BillingMode, CreatedAt: l.CreatedAt, User: UserFromServiceShallow(l.User), APIKey: APIKeyFromService(l.APIKey), diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index 392abe2d..56b67c8c 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -390,6 +390,9 @@ type UsageLog struct { // Cache TTL Override 标记 CacheTTLOverridden bool `json:"cache_ttl_overridden"` + // BillingMode 计费模式:token/image + BillingMode *string `json:"billing_mode,omitempty"` + CreatedAt time.Time `json:"created_at"` User *User `json:"user,omitempty"` diff --git a/backend/internal/pkg/usagestats/usage_log_types.go b/backend/internal/pkg/usagestats/usage_log_types.go index 44cddb6a..eb2c81d3 100644 --- a/backend/internal/pkg/usagestats/usage_log_types.go +++ b/backend/internal/pkg/usagestats/usage_log_types.go @@ -230,6 +230,7 @@ type UsageLogFilters struct { RequestType *int16 Stream *bool BillingType *int8 + BillingMode string StartTime *time.Time EndTime *time.Time // ExactTotal requests exact COUNT(*) for pagination. Default false for fast large-table paging. diff --git a/backend/internal/repository/usage_log_repo.go b/backend/internal/repository/usage_log_repo.go index c40beffd..376f1029 100644 --- a/backend/internal/repository/usage_log_repo.go +++ b/backend/internal/repository/usage_log_repo.go @@ -28,7 +28,7 @@ import ( gocache "github.com/patrickmn/go-cache" ) -const usageLogSelectColumns = "id, user_id, api_key_id, account_id, request_id, model, requested_model, upstream_model, group_id, subscription_id, input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens, cache_creation_5m_tokens, cache_creation_1h_tokens, input_cost, output_cost, cache_creation_cost, cache_read_cost, total_cost, actual_cost, rate_multiplier, account_rate_multiplier, billing_type, request_type, stream, openai_ws_mode, duration_ms, first_token_ms, user_agent, ip_address, image_count, image_size, media_type, service_tier, reasoning_effort, inbound_endpoint, upstream_endpoint, cache_ttl_overridden, channel_id, model_mapping_chain, billing_tier, created_at" +const usageLogSelectColumns = "id, user_id, api_key_id, account_id, request_id, model, requested_model, upstream_model, group_id, subscription_id, input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens, cache_creation_5m_tokens, cache_creation_1h_tokens, input_cost, output_cost, cache_creation_cost, cache_read_cost, total_cost, actual_cost, rate_multiplier, account_rate_multiplier, billing_type, request_type, stream, openai_ws_mode, duration_ms, first_token_ms, user_agent, ip_address, image_count, image_size, media_type, service_tier, reasoning_effort, inbound_endpoint, upstream_endpoint, cache_ttl_overridden, channel_id, model_mapping_chain, billing_tier, billing_mode, created_at" // usageLogInsertArgTypes must stay in the same order as: // 1. prepareUsageLogInsert().args @@ -80,6 +80,7 @@ var usageLogInsertArgTypes = [...]string{ "bigint", // channel_id "text", // model_mapping_chain "text", // billing_tier + "text", // billing_mode "timestamptz", // created_at } @@ -356,6 +357,7 @@ func (r *usageLogRepository) createSingle(ctx context.Context, sqlq sqlExecutor, channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) VALUES ( $1, $2, $3, $4, $5, $6, $7, @@ -363,7 +365,7 @@ func (r *usageLogRepository) createSingle(ctx context.Context, sqlq sqlExecutor, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, - $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43 + $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44 ) ON CONFLICT (request_id, api_key_id) DO NOTHING RETURNING id, created_at @@ -791,10 +793,11 @@ func buildUsageLogBatchInsertQuery(keys []string, preparedByKey map[string]usage channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) AS (VALUES `) - args := make([]any, 0, len(keys)*44) + args := make([]any, 0, len(keys)*45) argPos := 1 for idx, key := range keys { if idx > 0 { @@ -865,6 +868,7 @@ func buildUsageLogBatchInsertQuery(keys []string, preparedByKey map[string]usage channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) SELECT @@ -910,6 +914,7 @@ func buildUsageLogBatchInsertQuery(keys []string, preparedByKey map[string]usage channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at FROM input ON CONFLICT (request_id, api_key_id) DO NOTHING @@ -995,10 +1000,11 @@ func buildUsageLogBestEffortInsertQuery(preparedList []usageLogInsertPrepared) ( channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) AS (VALUES `) - args := make([]any, 0, len(preparedList)*43) + args := make([]any, 0, len(preparedList)*44) argPos := 1 for idx, prepared := range preparedList { if idx > 0 { @@ -1066,6 +1072,7 @@ func buildUsageLogBestEffortInsertQuery(preparedList []usageLogInsertPrepared) ( channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) SELECT @@ -1111,6 +1118,7 @@ func buildUsageLogBestEffortInsertQuery(preparedList []usageLogInsertPrepared) ( channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at FROM input ON CONFLICT (request_id, api_key_id) DO NOTHING @@ -1164,6 +1172,7 @@ func execUsageLogInsertNoResult(ctx context.Context, sqlq sqlExecutor, prepared channel_id, model_mapping_chain, billing_tier, + billing_mode, created_at ) VALUES ( $1, $2, $3, $4, $5, $6, $7, @@ -1171,7 +1180,7 @@ func execUsageLogInsertNoResult(ctx context.Context, sqlq sqlExecutor, prepared $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, - $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43 + $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44 ) ON CONFLICT (request_id, api_key_id) DO NOTHING `, prepared.args...) @@ -1206,6 +1215,7 @@ func prepareUsageLogInsert(log *service.UsageLog) usageLogInsertPrepared { channelID := nullInt64(log.ChannelID) modelMappingChain := nullString(log.ModelMappingChain) billingTier := nullString(log.BillingTier) + billingMode := nullString(log.BillingMode) requestedModel := strings.TrimSpace(log.RequestedModel) if requestedModel == "" { requestedModel = strings.TrimSpace(log.Model) @@ -1265,6 +1275,7 @@ func prepareUsageLogInsert(log *service.UsageLog) usageLogInsertPrepared { channelID, modelMappingChain, billingTier, + billingMode, createdAt, }, } @@ -2597,8 +2608,8 @@ type UsageLogFilters = usagestats.UsageLogFilters // ListWithFilters lists usage logs with optional filters (for admin) func (r *usageLogRepository) ListWithFilters(ctx context.Context, params pagination.PaginationParams, filters UsageLogFilters) ([]service.UsageLog, *pagination.PaginationResult, error) { - conditions := make([]string, 0, 8) - args := make([]any, 0, 8) + conditions := make([]string, 0, 9) + args := make([]any, 0, 9) if filters.UserID > 0 { conditions = append(conditions, fmt.Sprintf("user_id = $%d", len(args)+1)) @@ -2622,6 +2633,10 @@ func (r *usageLogRepository) ListWithFilters(ctx context.Context, params paginat conditions = append(conditions, fmt.Sprintf("billing_type = $%d", len(args)+1)) args = append(args, int16(*filters.BillingType)) } + if filters.BillingMode != "" { + conditions = append(conditions, fmt.Sprintf("billing_mode = $%d", len(args)+1)) + args = append(args, filters.BillingMode) + } if filters.StartTime != nil { conditions = append(conditions, fmt.Sprintf("created_at >= $%d", len(args)+1)) args = append(args, *filters.StartTime) @@ -3289,6 +3304,10 @@ func (r *usageLogRepository) GetStatsWithFilters(ctx context.Context, filters Us conditions = append(conditions, fmt.Sprintf("billing_type = $%d", len(args)+1)) args = append(args, int16(*filters.BillingType)) } + if filters.BillingMode != "" { + conditions = append(conditions, fmt.Sprintf("billing_mode = $%d", len(args)+1)) + args = append(args, filters.BillingMode) + } if filters.StartTime != nil { conditions = append(conditions, fmt.Sprintf("created_at >= $%d", len(args)+1)) args = append(args, *filters.StartTime) @@ -3995,6 +4014,7 @@ func scanUsageLog(scanner interface{ Scan(...any) error }) (*service.UsageLog, e channelID sql.NullInt64 modelMappingChain sql.NullString billingTier sql.NullString + billingMode sql.NullString createdAt time.Time ) @@ -4042,6 +4062,7 @@ func scanUsageLog(scanner interface{ Scan(...any) error }) (*service.UsageLog, e &channelID, &modelMappingChain, &billingTier, + &billingMode, &createdAt, ); err != nil { return nil, err @@ -4136,6 +4157,9 @@ func scanUsageLog(scanner interface{ Scan(...any) error }) (*service.UsageLog, e if billingTier.Valid { log.BillingTier = &billingTier.String } + if billingMode.Valid { + log.BillingMode = &billingMode.String + } return log, nil } diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index 89bcb75c..7aeffa16 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -7863,6 +7863,17 @@ func (s *GatewayService) RecordUsage(ctx context.Context, input *RecordUsageInpu CreatedAt: time.Now(), } + // 设置计费模式 + if result.MediaType != "image" && result.MediaType != "video" && result.MediaType != "prompt" { + if result.ImageCount > 0 { + billingMode := "image" + usageLog.BillingMode = &billingMode + } else { + billingMode := "token" + usageLog.BillingMode = &billingMode + } + } + // 添加 UserAgent if input.UserAgent != "" { usageLog.UserAgent = &input.UserAgent @@ -8073,6 +8084,15 @@ func (s *GatewayService) RecordUsageWithLongContext(ctx context.Context, input * CreatedAt: time.Now(), } + // 设置计费模式 + if result.ImageCount > 0 { + billingMode := "image" + usageLog.BillingMode = &billingMode + } else { + billingMode := "token" + usageLog.BillingMode = &billingMode + } + // 添加 UserAgent if input.UserAgent != "" { usageLog.UserAgent = &input.UserAgent diff --git a/backend/internal/service/openai_gateway_service.go b/backend/internal/service/openai_gateway_service.go index e85f0705..ddef3d31 100644 --- a/backend/internal/service/openai_gateway_service.go +++ b/backend/internal/service/openai_gateway_service.go @@ -4204,6 +4204,11 @@ func (s *OpenAIGatewayService) RecordUsage(ctx context.Context, input *OpenAIRec FirstTokenMs: result.FirstTokenMs, CreatedAt: time.Now(), } + // 设置计费模式(OpenAI 网关都是 token 计费) + { + billingMode := "token" + usageLog.BillingMode = &billingMode + } // 添加 UserAgent if input.UserAgent != "" { usageLog.UserAgent = &input.UserAgent diff --git a/backend/internal/service/usage_log.go b/backend/internal/service/usage_log.go index da5773f5..b4755d95 100644 --- a/backend/internal/service/usage_log.go +++ b/backend/internal/service/usage_log.go @@ -110,6 +110,8 @@ type UsageLog struct { ModelMappingChain *string // BillingTier 计费层级标签(per_request/image 模式) BillingTier *string + // BillingMode 计费模式:token/image(sora 路径为 nil) + BillingMode *string // ServiceTier records the OpenAI service tier used for billing, e.g. "priority" / "flex". ServiceTier *string // ReasoningEffort is the request's reasoning effort level. diff --git a/backend/migrations/087_usage_log_billing_mode.sql b/backend/migrations/087_usage_log_billing_mode.sql new file mode 100644 index 00000000..8552be0b --- /dev/null +++ b/backend/migrations/087_usage_log_billing_mode.sql @@ -0,0 +1,2 @@ +-- Add billing_mode to usage_logs (records the billing mode: token/per_request/image) +ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS billing_mode VARCHAR(20); diff --git a/frontend/src/api/admin/usage.ts b/frontend/src/api/admin/usage.ts index bd7e3e57..d21b28dc 100644 --- a/frontend/src/api/admin/usage.ts +++ b/frontend/src/api/admin/usage.ts @@ -80,6 +80,7 @@ export interface CreateUsageCleanupTaskRequest { export interface AdminUsageQueryParams extends UsageQueryParams { user_id?: number exact_total?: boolean + billing_mode?: string } // ==================== API Functions ==================== diff --git a/frontend/src/components/admin/usage/UsageFilters.vue b/frontend/src/components/admin/usage/UsageFilters.vue index ee5020e7..66c2b4fa 100644 --- a/frontend/src/components/admin/usage/UsageFilters.vue +++ b/frontend/src/components/admin/usage/UsageFilters.vue @@ -133,6 +133,12 @@ + +
@@ -232,6 +238,13 @@ const billingTypeOptions = ref([ { value: 1, label: t('admin.usage.billingTypeSubscription') } ]) +const billingModeOptions = ref([ + { value: null, label: t('admin.usage.allBillingModes') }, + { value: 'token', label: t('admin.usage.billingModeToken') }, + { value: 'per_request', label: t('admin.usage.billingModePerRequest') }, + { value: 'image', label: t('admin.usage.billingModeImage') } +]) + const emitChange = () => emit('change') const debounceUserSearch = () => { diff --git a/frontend/src/components/admin/usage/UsageTable.vue b/frontend/src/components/admin/usage/UsageTable.vue index 4a42ab05..44f1805b 100644 --- a/frontend/src/components/admin/usage/UsageTable.vue +++ b/frontend/src/components/admin/usage/UsageTable.vue @@ -69,6 +69,12 @@ + +