group.go 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. // Code generated by ent, DO NOT EDIT.
  2. package ent
  3. import (
  4. "encoding/json"
  5. "encoding/json/jsontext"
  6. "fmt"
  7. "strings"
  8. "time"
  9. "entgo.io/ent"
  10. "entgo.io/ent/dialect/sql"
  11. "github.com/Wei-Shaw/sub2api/ent/group"
  12. "github.com/Wei-Shaw/sub2api/internal/domain"
  13. )
  14. // Group is the model entity for the Group schema.
  15. type Group struct {
  16. config `json:"-"`
  17. // ID of the ent.
  18. ID int64 `json:"id,omitempty"`
  19. // CreatedAt holds the value of the "created_at" field.
  20. CreatedAt time.Time `json:"created_at,omitempty"`
  21. // UpdatedAt holds the value of the "updated_at" field.
  22. UpdatedAt time.Time `json:"updated_at,omitempty"`
  23. // DeletedAt holds the value of the "deleted_at" field.
  24. DeletedAt *time.Time `json:"deleted_at,omitempty"`
  25. // Name holds the value of the "name" field.
  26. Name string `json:"name,omitempty"`
  27. // Description holds the value of the "description" field.
  28. Description *string `json:"description,omitempty"`
  29. // RateMultiplier holds the value of the "rate_multiplier" field.
  30. RateMultiplier float64 `json:"rate_multiplier,omitempty"`
  31. // 是否启用高峰时段倍率
  32. PeakRateEnabled bool `json:"peak_rate_enabled,omitempty"`
  33. // 高峰开始时间 HH:MM(含),如 14:00;空表示未配置;不支持跨天
  34. PeakStart string `json:"peak_start,omitempty"`
  35. // 高峰结束时间 HH:MM(不含),必须大于 peak_start;不支持跨天,如 22:00-02:00
  36. PeakEnd string `json:"peak_end,omitempty"`
  37. // 高峰时段叠加倍率,仅在 peak_rate_enabled 且处于 [peak_start, peak_end) 时乘入文本倍率
  38. PeakRateMultiplier float64 `json:"peak_rate_multiplier,omitempty"`
  39. // IsExclusive holds the value of the "is_exclusive" field.
  40. IsExclusive bool `json:"is_exclusive,omitempty"`
  41. // 分组安全策略总开关,默认关闭
  42. SecurityPolicyEnabled bool `json:"security_policy_enabled,omitempty"`
  43. // 安全策略命中后处置:block_session 断会话 / block_request 仅拦当次
  44. SecurityPolicyMode string `json:"security_policy_mode,omitempty"`
  45. // 安全策略命中是否邮件提醒用户
  46. SecurityPolicyEmailEnabled bool `json:"security_policy_email_enabled,omitempty"`
  47. // Status holds the value of the "status" field.
  48. Status string `json:"status,omitempty"`
  49. // 内部幂等恢复标识,不对 API 暴露
  50. DuplicateOperationID *string `json:"duplicate_operation_id,omitempty"`
  51. // Platform holds the value of the "platform" field.
  52. Platform string `json:"platform,omitempty"`
  53. // SubscriptionType holds the value of the "subscription_type" field.
  54. SubscriptionType string `json:"subscription_type,omitempty"`
  55. // DailyLimitUsd holds the value of the "daily_limit_usd" field.
  56. DailyLimitUsd *float64 `json:"daily_limit_usd,omitempty"`
  57. // WeeklyLimitUsd holds the value of the "weekly_limit_usd" field.
  58. WeeklyLimitUsd *float64 `json:"weekly_limit_usd,omitempty"`
  59. // MonthlyLimitUsd holds the value of the "monthly_limit_usd" field.
  60. MonthlyLimitUsd *float64 `json:"monthly_limit_usd,omitempty"`
  61. // DefaultValidityDays holds the value of the "default_validity_days" field.
  62. DefaultValidityDays int `json:"default_validity_days,omitempty"`
  63. // 是否允许该分组使用图片生成能力
  64. AllowImageGeneration bool `json:"allow_image_generation,omitempty"`
  65. // 是否允许该分组使用批量图片生成能力
  66. AllowBatchImageGeneration bool `json:"allow_batch_image_generation,omitempty"`
  67. // 图片生成是否使用独立倍率;false 表示共享分组有效倍率
  68. ImageRateIndependent bool `json:"image_rate_independent,omitempty"`
  69. // 图片生成独立倍率,仅 image_rate_independent=true 时生效
  70. ImageRateMultiplier float64 `json:"image_rate_multiplier,omitempty"`
  71. // ImagePrice1k holds the value of the "image_price_1k" field.
  72. ImagePrice1k *float64 `json:"image_price_1k,omitempty"`
  73. // ImagePrice2k holds the value of the "image_price_2k" field.
  74. ImagePrice2k *float64 `json:"image_price_2k,omitempty"`
  75. // ImagePrice4k holds the value of the "image_price_4k" field.
  76. ImagePrice4k *float64 `json:"image_price_4k,omitempty"`
  77. // 批量图片生成折扣倍率,最终单价会乘以该值;0 表示免费
  78. BatchImageDiscountMultiplier float64 `json:"batch_image_discount_multiplier,omitempty"`
  79. // 批量图片生成冻结价格比例,按普通生图原价乘以该比例冻结,结算后释放差额
  80. BatchImageHoldMultiplier float64 `json:"batch_image_hold_multiplier,omitempty"`
  81. // 视频生成是否使用独立倍率;false 表示共享分组有效倍率
  82. VideoRateIndependent bool `json:"video_rate_independent,omitempty"`
  83. // 视频生成独立倍率,仅 video_rate_independent=true 时生效
  84. VideoRateMultiplier float64 `json:"video_rate_multiplier,omitempty"`
  85. // VideoPrice480p holds the value of the "video_price_480p" field.
  86. VideoPrice480p *float64 `json:"video_price_480p,omitempty"`
  87. // VideoPrice720p holds the value of the "video_price_720p" field.
  88. VideoPrice720p *float64 `json:"video_price_720p,omitempty"`
  89. // VideoPrice1080p holds the value of the "video_price_1080p" field.
  90. VideoPrice1080p *float64 `json:"video_price_1080p,omitempty"`
  91. // 按模型族和分辨率覆盖视频每秒价格
  92. VideoModelPrices map[string]map[string]float64 `json:"video_model_prices,omitempty"`
  93. // Codex alpha/search 网页搜索单次价格(USD/次);nil 表示使用默认价 0.01(官方 $10/1000 次)
  94. WebSearchPricePerCall *float64 `json:"web_search_price_per_call,omitempty"`
  95. // 搜索工具价格 per 1000 calls(web_search 等)
  96. SearchPricePer1k *float64 `json:"search_price_per_1k,omitempty"`
  97. // Voice realtime 每分钟价格(USD)
  98. AudioRealtimePricePerMin *float64 `json:"audio_realtime_price_per_min,omitempty"`
  99. // TTS 每百万字符价格(USD)
  100. AudioTtsPricePerMillionChars *float64 `json:"audio_tts_price_per_million_chars,omitempty"`
  101. // STT 每小时价格(USD)
  102. AudioSttPricePerHour *float64 `json:"audio_stt_price_per_hour,omitempty"`
  103. // 是否按上下文长度应用模型阶梯价格;默认开启以保持官方/渠道长上下文价
  104. LongContextPricingEnabled bool `json:"long_context_pricing_enabled,omitempty"`
  105. // 分组逐模型定价;优先级高于渠道和内置定价
  106. ModelPricing jsontext.Value `json:"model_pricing,omitempty"`
  107. // 是否仅允许 Claude Code 客户端
  108. ClaudeCodeOnly bool `json:"claude_code_only,omitempty"`
  109. // 非 Claude Code 请求降级使用的分组 ID
  110. FallbackGroupID *int64 `json:"fallback_group_id,omitempty"`
  111. // 无效请求兜底使用的分组 ID
  112. FallbackGroupIDOnInvalidRequest *int64 `json:"fallback_group_id_on_invalid_request,omitempty"`
  113. // 模型路由配置:模型模式 -> 优先账号ID列表
  114. ModelRouting map[string][]int64 `json:"model_routing,omitempty"`
  115. // 是否启用模型路由配置
  116. ModelRoutingEnabled bool `json:"model_routing_enabled,omitempty"`
  117. // 是否注入 MCP XML 调用协议提示词(仅 antigravity 平台)
  118. McpXMLInject bool `json:"mcp_xml_inject,omitempty"`
  119. // 支持的模型系列:claude, gemini_text, gemini_image
  120. SupportedModelScopes []string `json:"supported_model_scopes,omitempty"`
  121. // 分组显示排序,数值越小越靠前
  122. SortOrder int `json:"sort_order,omitempty"`
  123. // 是否允许 /v1/messages 调度到此 OpenAI 分组
  124. AllowMessagesDispatch bool `json:"allow_messages_dispatch,omitempty"`
  125. // 是否允许此 OpenAI 分组访问 Live 接口
  126. AllowLive bool `json:"allow_live,omitempty"`
  127. // 是否强制此 OpenAI/Composite 分组请求使用 service_tier=priority
  128. ForceOpenaiFast bool `json:"force_openai_fast,omitempty"`
  129. // 是否让此 OpenAI/Composite 分组的 Fast 请求按 Standard 价格计费
  130. FreeOpenaiFast bool `json:"free_openai_fast,omitempty"`
  131. // 仅允许非 apikey 类型账号关联到此分组
  132. RequireOauthOnly bool `json:"require_oauth_only,omitempty"`
  133. // 调度时仅允许 privacy 已成功设置的账号
  134. RequirePrivacySet bool `json:"require_privacy_set,omitempty"`
  135. // 默认映射模型 ID,当账号级映射找不到时使用此值
  136. DefaultMappedModel string `json:"default_mapped_model,omitempty"`
  137. // OpenAI Messages 调度模型配置:按 Claude 系列/精确模型映射到目标 GPT 模型
  138. MessagesDispatchModelConfig domain.OpenAIMessagesDispatchModelConfig `json:"messages_dispatch_model_config,omitempty"`
  139. // 分组模型白名单:同时约束模型列表接口与请求准入
  140. ModelAllowlist domain.GroupModelAllowlist `json:"model_allowlist,omitempty"`
  141. // 固定账号获取 Codex Model Manifest 配置;开启后 /models 请求只用选定账号拉取(仅 openai 平台)
  142. CodexModelsManifestConfig domain.GroupCodexModelsManifestConfig `json:"codex_models_manifest_config,omitempty"`
  143. // 分组 RPM 上限,0 表示不限制;设置后接管该分组用户的限流
  144. RpmLimit int `json:"rpm_limit,omitempty"`
  145. // OpenAI reasoning effort 上限;可选 minimal/low/medium/high/xhigh/max
  146. MaxReasoningEffort string `json:"max_reasoning_effort,omitempty"`
  147. // 超过推理强度上限时的访问控制:downgrade 自动降档,deny 拒绝访问
  148. MaxReasoningEffortOverLimit string `json:"max_reasoning_effort_over_limit,omitempty"`
  149. // OpenAI reasoning effort 自定义映射;可按模型精确名、前缀或后缀限定,先映射再应用上限
  150. ReasoningEffortMappings []domain.ReasoningEffortMapping `json:"reasoning_effort_mappings,omitempty"`
  151. // 是否启用利润控制:调度时仅允许账号计费倍率满足毛利率要求的账号进入候选池
  152. ProfitControlEnabled bool `json:"profit_control_enabled,omitempty"`
  153. // 最低毛利率,小数(0.30=30%);账号准入条件为 U <= D*(1-margin-buffer)
  154. ProfitMinMargin float64 `json:"profit_min_margin,omitempty"`
  155. // 安全缓冲,小数;与 margin 相加后从下游倍率中扣除,默认 0
  156. ProfitSafetyBuffer float64 `json:"profit_safety_buffer,omitempty"`
  157. // Edges holds the relations/edges for other nodes in the graph.
  158. // The values are being populated by the GroupQuery when eager-loading is set.
  159. Edges GroupEdges `json:"edges"`
  160. selectValues sql.SelectValues
  161. }
  162. // GroupEdges holds the relations/edges for other nodes in the graph.
  163. type GroupEdges struct {
  164. // APIKeys holds the value of the api_keys edge.
  165. APIKeys []*APIKey `json:"api_keys,omitempty"`
  166. // RedeemCodes holds the value of the redeem_codes edge.
  167. RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"`
  168. // Subscriptions holds the value of the subscriptions edge.
  169. Subscriptions []*UserSubscription `json:"subscriptions,omitempty"`
  170. // UsageLogs holds the value of the usage_logs edge.
  171. UsageLogs []*UsageLog `json:"usage_logs,omitempty"`
  172. // Accounts holds the value of the accounts edge.
  173. Accounts []*Account `json:"accounts,omitempty"`
  174. // AllowedUsers holds the value of the allowed_users edge.
  175. AllowedUsers []*User `json:"allowed_users,omitempty"`
  176. // AccountGroups holds the value of the account_groups edge.
  177. AccountGroups []*AccountGroup `json:"account_groups,omitempty"`
  178. // UserAllowedGroups holds the value of the user_allowed_groups edge.
  179. UserAllowedGroups []*UserAllowedGroup `json:"user_allowed_groups,omitempty"`
  180. // loadedTypes holds the information for reporting if a
  181. // type was loaded (or requested) in eager-loading or not.
  182. loadedTypes [8]bool
  183. }
  184. // APIKeysOrErr returns the APIKeys value or an error if the edge
  185. // was not loaded in eager-loading.
  186. func (e GroupEdges) APIKeysOrErr() ([]*APIKey, error) {
  187. if e.loadedTypes[0] {
  188. return e.APIKeys, nil
  189. }
  190. return nil, &NotLoadedError{edge: "api_keys"}
  191. }
  192. // RedeemCodesOrErr returns the RedeemCodes value or an error if the edge
  193. // was not loaded in eager-loading.
  194. func (e GroupEdges) RedeemCodesOrErr() ([]*RedeemCode, error) {
  195. if e.loadedTypes[1] {
  196. return e.RedeemCodes, nil
  197. }
  198. return nil, &NotLoadedError{edge: "redeem_codes"}
  199. }
  200. // SubscriptionsOrErr returns the Subscriptions value or an error if the edge
  201. // was not loaded in eager-loading.
  202. func (e GroupEdges) SubscriptionsOrErr() ([]*UserSubscription, error) {
  203. if e.loadedTypes[2] {
  204. return e.Subscriptions, nil
  205. }
  206. return nil, &NotLoadedError{edge: "subscriptions"}
  207. }
  208. // UsageLogsOrErr returns the UsageLogs value or an error if the edge
  209. // was not loaded in eager-loading.
  210. func (e GroupEdges) UsageLogsOrErr() ([]*UsageLog, error) {
  211. if e.loadedTypes[3] {
  212. return e.UsageLogs, nil
  213. }
  214. return nil, &NotLoadedError{edge: "usage_logs"}
  215. }
  216. // AccountsOrErr returns the Accounts value or an error if the edge
  217. // was not loaded in eager-loading.
  218. func (e GroupEdges) AccountsOrErr() ([]*Account, error) {
  219. if e.loadedTypes[4] {
  220. return e.Accounts, nil
  221. }
  222. return nil, &NotLoadedError{edge: "accounts"}
  223. }
  224. // AllowedUsersOrErr returns the AllowedUsers value or an error if the edge
  225. // was not loaded in eager-loading.
  226. func (e GroupEdges) AllowedUsersOrErr() ([]*User, error) {
  227. if e.loadedTypes[5] {
  228. return e.AllowedUsers, nil
  229. }
  230. return nil, &NotLoadedError{edge: "allowed_users"}
  231. }
  232. // AccountGroupsOrErr returns the AccountGroups value or an error if the edge
  233. // was not loaded in eager-loading.
  234. func (e GroupEdges) AccountGroupsOrErr() ([]*AccountGroup, error) {
  235. if e.loadedTypes[6] {
  236. return e.AccountGroups, nil
  237. }
  238. return nil, &NotLoadedError{edge: "account_groups"}
  239. }
  240. // UserAllowedGroupsOrErr returns the UserAllowedGroups value or an error if the edge
  241. // was not loaded in eager-loading.
  242. func (e GroupEdges) UserAllowedGroupsOrErr() ([]*UserAllowedGroup, error) {
  243. if e.loadedTypes[7] {
  244. return e.UserAllowedGroups, nil
  245. }
  246. return nil, &NotLoadedError{edge: "user_allowed_groups"}
  247. }
  248. // scanValues returns the types for scanning values from sql.Rows.
  249. func (*Group) scanValues(columns []string) ([]any, error) {
  250. values := make([]any, len(columns))
  251. for i := range columns {
  252. switch columns[i] {
  253. case group.FieldVideoModelPrices, group.FieldModelPricing, group.FieldModelRouting, group.FieldSupportedModelScopes, group.FieldMessagesDispatchModelConfig, group.FieldModelAllowlist, group.FieldCodexModelsManifestConfig, group.FieldReasoningEffortMappings:
  254. values[i] = new([]byte)
  255. case group.FieldPeakRateEnabled, group.FieldIsExclusive, group.FieldSecurityPolicyEnabled, group.FieldSecurityPolicyEmailEnabled, group.FieldAllowImageGeneration, group.FieldAllowBatchImageGeneration, group.FieldImageRateIndependent, group.FieldVideoRateIndependent, group.FieldLongContextPricingEnabled, group.FieldClaudeCodeOnly, group.FieldModelRoutingEnabled, group.FieldMcpXMLInject, group.FieldAllowMessagesDispatch, group.FieldAllowLive, group.FieldForceOpenaiFast, group.FieldFreeOpenaiFast, group.FieldRequireOauthOnly, group.FieldRequirePrivacySet, group.FieldProfitControlEnabled:
  256. values[i] = new(sql.NullBool)
  257. 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, group.FieldSearchPricePer1k, group.FieldAudioRealtimePricePerMin, group.FieldAudioTtsPricePerMillionChars, group.FieldAudioSttPricePerHour, group.FieldProfitMinMargin, group.FieldProfitSafetyBuffer:
  258. values[i] = new(sql.NullFloat64)
  259. case group.FieldID, group.FieldDefaultValidityDays, group.FieldFallbackGroupID, group.FieldFallbackGroupIDOnInvalidRequest, group.FieldSortOrder, group.FieldRpmLimit:
  260. values[i] = new(sql.NullInt64)
  261. case group.FieldName, group.FieldDescription, group.FieldPeakStart, group.FieldPeakEnd, group.FieldSecurityPolicyMode, group.FieldStatus, group.FieldDuplicateOperationID, group.FieldPlatform, group.FieldSubscriptionType, group.FieldDefaultMappedModel, group.FieldMaxReasoningEffort, group.FieldMaxReasoningEffortOverLimit:
  262. values[i] = new(sql.NullString)
  263. case group.FieldCreatedAt, group.FieldUpdatedAt, group.FieldDeletedAt:
  264. values[i] = new(sql.NullTime)
  265. default:
  266. values[i] = new(sql.UnknownType)
  267. }
  268. }
  269. return values, nil
  270. }
  271. // assignValues assigns the values that were returned from sql.Rows (after scanning)
  272. // to the Group fields.
  273. func (_m *Group) assignValues(columns []string, values []any) error {
  274. if m, n := len(values), len(columns); m < n {
  275. return fmt.Errorf("mismatch number of scan values: %d != %d", m, n)
  276. }
  277. for i := range columns {
  278. switch columns[i] {
  279. case group.FieldID:
  280. value, ok := values[i].(*sql.NullInt64)
  281. if !ok {
  282. return fmt.Errorf("unexpected type %T for field id", value)
  283. }
  284. _m.ID = int64(value.Int64)
  285. case group.FieldCreatedAt:
  286. if value, ok := values[i].(*sql.NullTime); !ok {
  287. return fmt.Errorf("unexpected type %T for field created_at", values[i])
  288. } else if value.Valid {
  289. _m.CreatedAt = value.Time
  290. }
  291. case group.FieldUpdatedAt:
  292. if value, ok := values[i].(*sql.NullTime); !ok {
  293. return fmt.Errorf("unexpected type %T for field updated_at", values[i])
  294. } else if value.Valid {
  295. _m.UpdatedAt = value.Time
  296. }
  297. case group.FieldDeletedAt:
  298. if value, ok := values[i].(*sql.NullTime); !ok {
  299. return fmt.Errorf("unexpected type %T for field deleted_at", values[i])
  300. } else if value.Valid {
  301. _m.DeletedAt = new(time.Time)
  302. *_m.DeletedAt = value.Time
  303. }
  304. case group.FieldName:
  305. if value, ok := values[i].(*sql.NullString); !ok {
  306. return fmt.Errorf("unexpected type %T for field name", values[i])
  307. } else if value.Valid {
  308. _m.Name = value.String
  309. }
  310. case group.FieldDescription:
  311. if value, ok := values[i].(*sql.NullString); !ok {
  312. return fmt.Errorf("unexpected type %T for field description", values[i])
  313. } else if value.Valid {
  314. _m.Description = new(string)
  315. *_m.Description = value.String
  316. }
  317. case group.FieldRateMultiplier:
  318. if value, ok := values[i].(*sql.NullFloat64); !ok {
  319. return fmt.Errorf("unexpected type %T for field rate_multiplier", values[i])
  320. } else if value.Valid {
  321. _m.RateMultiplier = value.Float64
  322. }
  323. case group.FieldPeakRateEnabled:
  324. if value, ok := values[i].(*sql.NullBool); !ok {
  325. return fmt.Errorf("unexpected type %T for field peak_rate_enabled", values[i])
  326. } else if value.Valid {
  327. _m.PeakRateEnabled = value.Bool
  328. }
  329. case group.FieldPeakStart:
  330. if value, ok := values[i].(*sql.NullString); !ok {
  331. return fmt.Errorf("unexpected type %T for field peak_start", values[i])
  332. } else if value.Valid {
  333. _m.PeakStart = value.String
  334. }
  335. case group.FieldPeakEnd:
  336. if value, ok := values[i].(*sql.NullString); !ok {
  337. return fmt.Errorf("unexpected type %T for field peak_end", values[i])
  338. } else if value.Valid {
  339. _m.PeakEnd = value.String
  340. }
  341. case group.FieldPeakRateMultiplier:
  342. if value, ok := values[i].(*sql.NullFloat64); !ok {
  343. return fmt.Errorf("unexpected type %T for field peak_rate_multiplier", values[i])
  344. } else if value.Valid {
  345. _m.PeakRateMultiplier = value.Float64
  346. }
  347. case group.FieldIsExclusive:
  348. if value, ok := values[i].(*sql.NullBool); !ok {
  349. return fmt.Errorf("unexpected type %T for field is_exclusive", values[i])
  350. } else if value.Valid {
  351. _m.IsExclusive = value.Bool
  352. }
  353. case group.FieldSecurityPolicyEnabled:
  354. if value, ok := values[i].(*sql.NullBool); !ok {
  355. return fmt.Errorf("unexpected type %T for field security_policy_enabled", values[i])
  356. } else if value.Valid {
  357. _m.SecurityPolicyEnabled = value.Bool
  358. }
  359. case group.FieldSecurityPolicyMode:
  360. if value, ok := values[i].(*sql.NullString); !ok {
  361. return fmt.Errorf("unexpected type %T for field security_policy_mode", values[i])
  362. } else if value.Valid {
  363. _m.SecurityPolicyMode = value.String
  364. }
  365. case group.FieldSecurityPolicyEmailEnabled:
  366. if value, ok := values[i].(*sql.NullBool); !ok {
  367. return fmt.Errorf("unexpected type %T for field security_policy_email_enabled", values[i])
  368. } else if value.Valid {
  369. _m.SecurityPolicyEmailEnabled = value.Bool
  370. }
  371. case group.FieldStatus:
  372. if value, ok := values[i].(*sql.NullString); !ok {
  373. return fmt.Errorf("unexpected type %T for field status", values[i])
  374. } else if value.Valid {
  375. _m.Status = value.String
  376. }
  377. case group.FieldDuplicateOperationID:
  378. if value, ok := values[i].(*sql.NullString); !ok {
  379. return fmt.Errorf("unexpected type %T for field duplicate_operation_id", values[i])
  380. } else if value.Valid {
  381. _m.DuplicateOperationID = new(string)
  382. *_m.DuplicateOperationID = value.String
  383. }
  384. case group.FieldPlatform:
  385. if value, ok := values[i].(*sql.NullString); !ok {
  386. return fmt.Errorf("unexpected type %T for field platform", values[i])
  387. } else if value.Valid {
  388. _m.Platform = value.String
  389. }
  390. case group.FieldSubscriptionType:
  391. if value, ok := values[i].(*sql.NullString); !ok {
  392. return fmt.Errorf("unexpected type %T for field subscription_type", values[i])
  393. } else if value.Valid {
  394. _m.SubscriptionType = value.String
  395. }
  396. case group.FieldDailyLimitUsd:
  397. if value, ok := values[i].(*sql.NullFloat64); !ok {
  398. return fmt.Errorf("unexpected type %T for field daily_limit_usd", values[i])
  399. } else if value.Valid {
  400. _m.DailyLimitUsd = new(float64)
  401. *_m.DailyLimitUsd = value.Float64
  402. }
  403. case group.FieldWeeklyLimitUsd:
  404. if value, ok := values[i].(*sql.NullFloat64); !ok {
  405. return fmt.Errorf("unexpected type %T for field weekly_limit_usd", values[i])
  406. } else if value.Valid {
  407. _m.WeeklyLimitUsd = new(float64)
  408. *_m.WeeklyLimitUsd = value.Float64
  409. }
  410. case group.FieldMonthlyLimitUsd:
  411. if value, ok := values[i].(*sql.NullFloat64); !ok {
  412. return fmt.Errorf("unexpected type %T for field monthly_limit_usd", values[i])
  413. } else if value.Valid {
  414. _m.MonthlyLimitUsd = new(float64)
  415. *_m.MonthlyLimitUsd = value.Float64
  416. }
  417. case group.FieldDefaultValidityDays:
  418. if value, ok := values[i].(*sql.NullInt64); !ok {
  419. return fmt.Errorf("unexpected type %T for field default_validity_days", values[i])
  420. } else if value.Valid {
  421. _m.DefaultValidityDays = int(value.Int64)
  422. }
  423. case group.FieldAllowImageGeneration:
  424. if value, ok := values[i].(*sql.NullBool); !ok {
  425. return fmt.Errorf("unexpected type %T for field allow_image_generation", values[i])
  426. } else if value.Valid {
  427. _m.AllowImageGeneration = value.Bool
  428. }
  429. case group.FieldAllowBatchImageGeneration:
  430. if value, ok := values[i].(*sql.NullBool); !ok {
  431. return fmt.Errorf("unexpected type %T for field allow_batch_image_generation", values[i])
  432. } else if value.Valid {
  433. _m.AllowBatchImageGeneration = value.Bool
  434. }
  435. case group.FieldImageRateIndependent:
  436. if value, ok := values[i].(*sql.NullBool); !ok {
  437. return fmt.Errorf("unexpected type %T for field image_rate_independent", values[i])
  438. } else if value.Valid {
  439. _m.ImageRateIndependent = value.Bool
  440. }
  441. case group.FieldImageRateMultiplier:
  442. if value, ok := values[i].(*sql.NullFloat64); !ok {
  443. return fmt.Errorf("unexpected type %T for field image_rate_multiplier", values[i])
  444. } else if value.Valid {
  445. _m.ImageRateMultiplier = value.Float64
  446. }
  447. case group.FieldImagePrice1k:
  448. if value, ok := values[i].(*sql.NullFloat64); !ok {
  449. return fmt.Errorf("unexpected type %T for field image_price_1k", values[i])
  450. } else if value.Valid {
  451. _m.ImagePrice1k = new(float64)
  452. *_m.ImagePrice1k = value.Float64
  453. }
  454. case group.FieldImagePrice2k:
  455. if value, ok := values[i].(*sql.NullFloat64); !ok {
  456. return fmt.Errorf("unexpected type %T for field image_price_2k", values[i])
  457. } else if value.Valid {
  458. _m.ImagePrice2k = new(float64)
  459. *_m.ImagePrice2k = value.Float64
  460. }
  461. case group.FieldImagePrice4k:
  462. if value, ok := values[i].(*sql.NullFloat64); !ok {
  463. return fmt.Errorf("unexpected type %T for field image_price_4k", values[i])
  464. } else if value.Valid {
  465. _m.ImagePrice4k = new(float64)
  466. *_m.ImagePrice4k = value.Float64
  467. }
  468. case group.FieldBatchImageDiscountMultiplier:
  469. if value, ok := values[i].(*sql.NullFloat64); !ok {
  470. return fmt.Errorf("unexpected type %T for field batch_image_discount_multiplier", values[i])
  471. } else if value.Valid {
  472. _m.BatchImageDiscountMultiplier = value.Float64
  473. }
  474. case group.FieldBatchImageHoldMultiplier:
  475. if value, ok := values[i].(*sql.NullFloat64); !ok {
  476. return fmt.Errorf("unexpected type %T for field batch_image_hold_multiplier", values[i])
  477. } else if value.Valid {
  478. _m.BatchImageHoldMultiplier = value.Float64
  479. }
  480. case group.FieldVideoRateIndependent:
  481. if value, ok := values[i].(*sql.NullBool); !ok {
  482. return fmt.Errorf("unexpected type %T for field video_rate_independent", values[i])
  483. } else if value.Valid {
  484. _m.VideoRateIndependent = value.Bool
  485. }
  486. case group.FieldVideoRateMultiplier:
  487. if value, ok := values[i].(*sql.NullFloat64); !ok {
  488. return fmt.Errorf("unexpected type %T for field video_rate_multiplier", values[i])
  489. } else if value.Valid {
  490. _m.VideoRateMultiplier = value.Float64
  491. }
  492. case group.FieldVideoPrice480p:
  493. if value, ok := values[i].(*sql.NullFloat64); !ok {
  494. return fmt.Errorf("unexpected type %T for field video_price_480p", values[i])
  495. } else if value.Valid {
  496. _m.VideoPrice480p = new(float64)
  497. *_m.VideoPrice480p = value.Float64
  498. }
  499. case group.FieldVideoPrice720p:
  500. if value, ok := values[i].(*sql.NullFloat64); !ok {
  501. return fmt.Errorf("unexpected type %T for field video_price_720p", values[i])
  502. } else if value.Valid {
  503. _m.VideoPrice720p = new(float64)
  504. *_m.VideoPrice720p = value.Float64
  505. }
  506. case group.FieldVideoPrice1080p:
  507. if value, ok := values[i].(*sql.NullFloat64); !ok {
  508. return fmt.Errorf("unexpected type %T for field video_price_1080p", values[i])
  509. } else if value.Valid {
  510. _m.VideoPrice1080p = new(float64)
  511. *_m.VideoPrice1080p = value.Float64
  512. }
  513. case group.FieldVideoModelPrices:
  514. if value, ok := values[i].(*[]byte); !ok {
  515. return fmt.Errorf("unexpected type %T for field video_model_prices", values[i])
  516. } else if value != nil && len(*value) > 0 {
  517. if err := json.Unmarshal(*value, &_m.VideoModelPrices); err != nil {
  518. return fmt.Errorf("unmarshal field video_model_prices: %w", err)
  519. }
  520. }
  521. case group.FieldWebSearchPricePerCall:
  522. if value, ok := values[i].(*sql.NullFloat64); !ok {
  523. return fmt.Errorf("unexpected type %T for field web_search_price_per_call", values[i])
  524. } else if value.Valid {
  525. _m.WebSearchPricePerCall = new(float64)
  526. *_m.WebSearchPricePerCall = value.Float64
  527. }
  528. case group.FieldSearchPricePer1k:
  529. if value, ok := values[i].(*sql.NullFloat64); !ok {
  530. return fmt.Errorf("unexpected type %T for field search_price_per_1k", values[i])
  531. } else if value.Valid {
  532. _m.SearchPricePer1k = new(float64)
  533. *_m.SearchPricePer1k = value.Float64
  534. }
  535. case group.FieldAudioRealtimePricePerMin:
  536. if value, ok := values[i].(*sql.NullFloat64); !ok {
  537. return fmt.Errorf("unexpected type %T for field audio_realtime_price_per_min", values[i])
  538. } else if value.Valid {
  539. _m.AudioRealtimePricePerMin = new(float64)
  540. *_m.AudioRealtimePricePerMin = value.Float64
  541. }
  542. case group.FieldAudioTtsPricePerMillionChars:
  543. if value, ok := values[i].(*sql.NullFloat64); !ok {
  544. return fmt.Errorf("unexpected type %T for field audio_tts_price_per_million_chars", values[i])
  545. } else if value.Valid {
  546. _m.AudioTtsPricePerMillionChars = new(float64)
  547. *_m.AudioTtsPricePerMillionChars = value.Float64
  548. }
  549. case group.FieldAudioSttPricePerHour:
  550. if value, ok := values[i].(*sql.NullFloat64); !ok {
  551. return fmt.Errorf("unexpected type %T for field audio_stt_price_per_hour", values[i])
  552. } else if value.Valid {
  553. _m.AudioSttPricePerHour = new(float64)
  554. *_m.AudioSttPricePerHour = value.Float64
  555. }
  556. case group.FieldLongContextPricingEnabled:
  557. if value, ok := values[i].(*sql.NullBool); !ok {
  558. return fmt.Errorf("unexpected type %T for field long_context_pricing_enabled", values[i])
  559. } else if value.Valid {
  560. _m.LongContextPricingEnabled = value.Bool
  561. }
  562. case group.FieldModelPricing:
  563. if value, ok := values[i].(*[]byte); !ok {
  564. return fmt.Errorf("unexpected type %T for field model_pricing", values[i])
  565. } else if value != nil && len(*value) > 0 {
  566. if err := json.Unmarshal(*value, &_m.ModelPricing); err != nil {
  567. return fmt.Errorf("unmarshal field model_pricing: %w", err)
  568. }
  569. }
  570. case group.FieldClaudeCodeOnly:
  571. if value, ok := values[i].(*sql.NullBool); !ok {
  572. return fmt.Errorf("unexpected type %T for field claude_code_only", values[i])
  573. } else if value.Valid {
  574. _m.ClaudeCodeOnly = value.Bool
  575. }
  576. case group.FieldFallbackGroupID:
  577. if value, ok := values[i].(*sql.NullInt64); !ok {
  578. return fmt.Errorf("unexpected type %T for field fallback_group_id", values[i])
  579. } else if value.Valid {
  580. _m.FallbackGroupID = new(int64)
  581. *_m.FallbackGroupID = value.Int64
  582. }
  583. case group.FieldFallbackGroupIDOnInvalidRequest:
  584. if value, ok := values[i].(*sql.NullInt64); !ok {
  585. return fmt.Errorf("unexpected type %T for field fallback_group_id_on_invalid_request", values[i])
  586. } else if value.Valid {
  587. _m.FallbackGroupIDOnInvalidRequest = new(int64)
  588. *_m.FallbackGroupIDOnInvalidRequest = value.Int64
  589. }
  590. case group.FieldModelRouting:
  591. if value, ok := values[i].(*[]byte); !ok {
  592. return fmt.Errorf("unexpected type %T for field model_routing", values[i])
  593. } else if value != nil && len(*value) > 0 {
  594. if err := json.Unmarshal(*value, &_m.ModelRouting); err != nil {
  595. return fmt.Errorf("unmarshal field model_routing: %w", err)
  596. }
  597. }
  598. case group.FieldModelRoutingEnabled:
  599. if value, ok := values[i].(*sql.NullBool); !ok {
  600. return fmt.Errorf("unexpected type %T for field model_routing_enabled", values[i])
  601. } else if value.Valid {
  602. _m.ModelRoutingEnabled = value.Bool
  603. }
  604. case group.FieldMcpXMLInject:
  605. if value, ok := values[i].(*sql.NullBool); !ok {
  606. return fmt.Errorf("unexpected type %T for field mcp_xml_inject", values[i])
  607. } else if value.Valid {
  608. _m.McpXMLInject = value.Bool
  609. }
  610. case group.FieldSupportedModelScopes:
  611. if value, ok := values[i].(*[]byte); !ok {
  612. return fmt.Errorf("unexpected type %T for field supported_model_scopes", values[i])
  613. } else if value != nil && len(*value) > 0 {
  614. if err := json.Unmarshal(*value, &_m.SupportedModelScopes); err != nil {
  615. return fmt.Errorf("unmarshal field supported_model_scopes: %w", err)
  616. }
  617. }
  618. case group.FieldSortOrder:
  619. if value, ok := values[i].(*sql.NullInt64); !ok {
  620. return fmt.Errorf("unexpected type %T for field sort_order", values[i])
  621. } else if value.Valid {
  622. _m.SortOrder = int(value.Int64)
  623. }
  624. case group.FieldAllowMessagesDispatch:
  625. if value, ok := values[i].(*sql.NullBool); !ok {
  626. return fmt.Errorf("unexpected type %T for field allow_messages_dispatch", values[i])
  627. } else if value.Valid {
  628. _m.AllowMessagesDispatch = value.Bool
  629. }
  630. case group.FieldAllowLive:
  631. if value, ok := values[i].(*sql.NullBool); !ok {
  632. return fmt.Errorf("unexpected type %T for field allow_live", values[i])
  633. } else if value.Valid {
  634. _m.AllowLive = value.Bool
  635. }
  636. case group.FieldForceOpenaiFast:
  637. if value, ok := values[i].(*sql.NullBool); !ok {
  638. return fmt.Errorf("unexpected type %T for field force_openai_fast", values[i])
  639. } else if value.Valid {
  640. _m.ForceOpenaiFast = value.Bool
  641. }
  642. case group.FieldFreeOpenaiFast:
  643. if value, ok := values[i].(*sql.NullBool); !ok {
  644. return fmt.Errorf("unexpected type %T for field free_openai_fast", values[i])
  645. } else if value.Valid {
  646. _m.FreeOpenaiFast = value.Bool
  647. }
  648. case group.FieldRequireOauthOnly:
  649. if value, ok := values[i].(*sql.NullBool); !ok {
  650. return fmt.Errorf("unexpected type %T for field require_oauth_only", values[i])
  651. } else if value.Valid {
  652. _m.RequireOauthOnly = value.Bool
  653. }
  654. case group.FieldRequirePrivacySet:
  655. if value, ok := values[i].(*sql.NullBool); !ok {
  656. return fmt.Errorf("unexpected type %T for field require_privacy_set", values[i])
  657. } else if value.Valid {
  658. _m.RequirePrivacySet = value.Bool
  659. }
  660. case group.FieldDefaultMappedModel:
  661. if value, ok := values[i].(*sql.NullString); !ok {
  662. return fmt.Errorf("unexpected type %T for field default_mapped_model", values[i])
  663. } else if value.Valid {
  664. _m.DefaultMappedModel = value.String
  665. }
  666. case group.FieldMessagesDispatchModelConfig:
  667. if value, ok := values[i].(*[]byte); !ok {
  668. return fmt.Errorf("unexpected type %T for field messages_dispatch_model_config", values[i])
  669. } else if value != nil && len(*value) > 0 {
  670. if err := json.Unmarshal(*value, &_m.MessagesDispatchModelConfig); err != nil {
  671. return fmt.Errorf("unmarshal field messages_dispatch_model_config: %w", err)
  672. }
  673. }
  674. case group.FieldModelAllowlist:
  675. if value, ok := values[i].(*[]byte); !ok {
  676. return fmt.Errorf("unexpected type %T for field model_allowlist", values[i])
  677. } else if value != nil && len(*value) > 0 {
  678. if err := json.Unmarshal(*value, &_m.ModelAllowlist); err != nil {
  679. return fmt.Errorf("unmarshal field model_allowlist: %w", err)
  680. }
  681. }
  682. case group.FieldCodexModelsManifestConfig:
  683. if value, ok := values[i].(*[]byte); !ok {
  684. return fmt.Errorf("unexpected type %T for field codex_models_manifest_config", values[i])
  685. } else if value != nil && len(*value) > 0 {
  686. if err := json.Unmarshal(*value, &_m.CodexModelsManifestConfig); err != nil {
  687. return fmt.Errorf("unmarshal field codex_models_manifest_config: %w", err)
  688. }
  689. }
  690. case group.FieldRpmLimit:
  691. if value, ok := values[i].(*sql.NullInt64); !ok {
  692. return fmt.Errorf("unexpected type %T for field rpm_limit", values[i])
  693. } else if value.Valid {
  694. _m.RpmLimit = int(value.Int64)
  695. }
  696. case group.FieldMaxReasoningEffort:
  697. if value, ok := values[i].(*sql.NullString); !ok {
  698. return fmt.Errorf("unexpected type %T for field max_reasoning_effort", values[i])
  699. } else if value.Valid {
  700. _m.MaxReasoningEffort = value.String
  701. }
  702. case group.FieldMaxReasoningEffortOverLimit:
  703. if value, ok := values[i].(*sql.NullString); !ok {
  704. return fmt.Errorf("unexpected type %T for field max_reasoning_effort_over_limit", values[i])
  705. } else if value.Valid {
  706. _m.MaxReasoningEffortOverLimit = value.String
  707. }
  708. case group.FieldReasoningEffortMappings:
  709. if value, ok := values[i].(*[]byte); !ok {
  710. return fmt.Errorf("unexpected type %T for field reasoning_effort_mappings", values[i])
  711. } else if value != nil && len(*value) > 0 {
  712. if err := json.Unmarshal(*value, &_m.ReasoningEffortMappings); err != nil {
  713. return fmt.Errorf("unmarshal field reasoning_effort_mappings: %w", err)
  714. }
  715. }
  716. case group.FieldProfitControlEnabled:
  717. if value, ok := values[i].(*sql.NullBool); !ok {
  718. return fmt.Errorf("unexpected type %T for field profit_control_enabled", values[i])
  719. } else if value.Valid {
  720. _m.ProfitControlEnabled = value.Bool
  721. }
  722. case group.FieldProfitMinMargin:
  723. if value, ok := values[i].(*sql.NullFloat64); !ok {
  724. return fmt.Errorf("unexpected type %T for field profit_min_margin", values[i])
  725. } else if value.Valid {
  726. _m.ProfitMinMargin = value.Float64
  727. }
  728. case group.FieldProfitSafetyBuffer:
  729. if value, ok := values[i].(*sql.NullFloat64); !ok {
  730. return fmt.Errorf("unexpected type %T for field profit_safety_buffer", values[i])
  731. } else if value.Valid {
  732. _m.ProfitSafetyBuffer = value.Float64
  733. }
  734. default:
  735. _m.selectValues.Set(columns[i], values[i])
  736. }
  737. }
  738. return nil
  739. }
  740. // Value returns the ent.Value that was dynamically selected and assigned to the Group.
  741. // This includes values selected through modifiers, order, etc.
  742. func (_m *Group) Value(name string) (ent.Value, error) {
  743. return _m.selectValues.Get(name)
  744. }
  745. // QueryAPIKeys queries the "api_keys" edge of the Group entity.
  746. func (_m *Group) QueryAPIKeys() *APIKeyQuery {
  747. return NewGroupClient(_m.config).QueryAPIKeys(_m)
  748. }
  749. // QueryRedeemCodes queries the "redeem_codes" edge of the Group entity.
  750. func (_m *Group) QueryRedeemCodes() *RedeemCodeQuery {
  751. return NewGroupClient(_m.config).QueryRedeemCodes(_m)
  752. }
  753. // QuerySubscriptions queries the "subscriptions" edge of the Group entity.
  754. func (_m *Group) QuerySubscriptions() *UserSubscriptionQuery {
  755. return NewGroupClient(_m.config).QuerySubscriptions(_m)
  756. }
  757. // QueryUsageLogs queries the "usage_logs" edge of the Group entity.
  758. func (_m *Group) QueryUsageLogs() *UsageLogQuery {
  759. return NewGroupClient(_m.config).QueryUsageLogs(_m)
  760. }
  761. // QueryAccounts queries the "accounts" edge of the Group entity.
  762. func (_m *Group) QueryAccounts() *AccountQuery {
  763. return NewGroupClient(_m.config).QueryAccounts(_m)
  764. }
  765. // QueryAllowedUsers queries the "allowed_users" edge of the Group entity.
  766. func (_m *Group) QueryAllowedUsers() *UserQuery {
  767. return NewGroupClient(_m.config).QueryAllowedUsers(_m)
  768. }
  769. // QueryAccountGroups queries the "account_groups" edge of the Group entity.
  770. func (_m *Group) QueryAccountGroups() *AccountGroupQuery {
  771. return NewGroupClient(_m.config).QueryAccountGroups(_m)
  772. }
  773. // QueryUserAllowedGroups queries the "user_allowed_groups" edge of the Group entity.
  774. func (_m *Group) QueryUserAllowedGroups() *UserAllowedGroupQuery {
  775. return NewGroupClient(_m.config).QueryUserAllowedGroups(_m)
  776. }
  777. // Update returns a builder for updating this Group.
  778. // Note that you need to call Group.Unwrap() before calling this method if this Group
  779. // was returned from a transaction, and the transaction was committed or rolled back.
  780. func (_m *Group) Update() *GroupUpdateOne {
  781. return NewGroupClient(_m.config).UpdateOne(_m)
  782. }
  783. // Unwrap unwraps the Group entity that was returned from a transaction after it was closed,
  784. // so that all future queries will be executed through the driver which created the transaction.
  785. func (_m *Group) Unwrap() *Group {
  786. _tx, ok := _m.config.driver.(*txDriver)
  787. if !ok {
  788. panic("ent: Group is not a transactional entity")
  789. }
  790. _m.config.driver = _tx.drv
  791. return _m
  792. }
  793. // String implements the fmt.Stringer.
  794. func (_m *Group) String() string {
  795. var builder strings.Builder
  796. builder.WriteString("Group(")
  797. builder.WriteString(fmt.Sprintf("id=%v, ", _m.ID))
  798. builder.WriteString("created_at=")
  799. builder.WriteString(_m.CreatedAt.Format(time.ANSIC))
  800. builder.WriteString(", ")
  801. builder.WriteString("updated_at=")
  802. builder.WriteString(_m.UpdatedAt.Format(time.ANSIC))
  803. builder.WriteString(", ")
  804. if v := _m.DeletedAt; v != nil {
  805. builder.WriteString("deleted_at=")
  806. builder.WriteString(v.Format(time.ANSIC))
  807. }
  808. builder.WriteString(", ")
  809. builder.WriteString("name=")
  810. builder.WriteString(_m.Name)
  811. builder.WriteString(", ")
  812. if v := _m.Description; v != nil {
  813. builder.WriteString("description=")
  814. builder.WriteString(*v)
  815. }
  816. builder.WriteString(", ")
  817. builder.WriteString("rate_multiplier=")
  818. builder.WriteString(fmt.Sprintf("%v", _m.RateMultiplier))
  819. builder.WriteString(", ")
  820. builder.WriteString("peak_rate_enabled=")
  821. builder.WriteString(fmt.Sprintf("%v", _m.PeakRateEnabled))
  822. builder.WriteString(", ")
  823. builder.WriteString("peak_start=")
  824. builder.WriteString(_m.PeakStart)
  825. builder.WriteString(", ")
  826. builder.WriteString("peak_end=")
  827. builder.WriteString(_m.PeakEnd)
  828. builder.WriteString(", ")
  829. builder.WriteString("peak_rate_multiplier=")
  830. builder.WriteString(fmt.Sprintf("%v", _m.PeakRateMultiplier))
  831. builder.WriteString(", ")
  832. builder.WriteString("is_exclusive=")
  833. builder.WriteString(fmt.Sprintf("%v", _m.IsExclusive))
  834. builder.WriteString(", ")
  835. builder.WriteString("security_policy_enabled=")
  836. builder.WriteString(fmt.Sprintf("%v", _m.SecurityPolicyEnabled))
  837. builder.WriteString(", ")
  838. builder.WriteString("security_policy_mode=")
  839. builder.WriteString(_m.SecurityPolicyMode)
  840. builder.WriteString(", ")
  841. builder.WriteString("security_policy_email_enabled=")
  842. builder.WriteString(fmt.Sprintf("%v", _m.SecurityPolicyEmailEnabled))
  843. builder.WriteString(", ")
  844. builder.WriteString("status=")
  845. builder.WriteString(_m.Status)
  846. builder.WriteString(", ")
  847. if v := _m.DuplicateOperationID; v != nil {
  848. builder.WriteString("duplicate_operation_id=")
  849. builder.WriteString(*v)
  850. }
  851. builder.WriteString(", ")
  852. builder.WriteString("platform=")
  853. builder.WriteString(_m.Platform)
  854. builder.WriteString(", ")
  855. builder.WriteString("subscription_type=")
  856. builder.WriteString(_m.SubscriptionType)
  857. builder.WriteString(", ")
  858. if v := _m.DailyLimitUsd; v != nil {
  859. builder.WriteString("daily_limit_usd=")
  860. builder.WriteString(fmt.Sprintf("%v", *v))
  861. }
  862. builder.WriteString(", ")
  863. if v := _m.WeeklyLimitUsd; v != nil {
  864. builder.WriteString("weekly_limit_usd=")
  865. builder.WriteString(fmt.Sprintf("%v", *v))
  866. }
  867. builder.WriteString(", ")
  868. if v := _m.MonthlyLimitUsd; v != nil {
  869. builder.WriteString("monthly_limit_usd=")
  870. builder.WriteString(fmt.Sprintf("%v", *v))
  871. }
  872. builder.WriteString(", ")
  873. builder.WriteString("default_validity_days=")
  874. builder.WriteString(fmt.Sprintf("%v", _m.DefaultValidityDays))
  875. builder.WriteString(", ")
  876. builder.WriteString("allow_image_generation=")
  877. builder.WriteString(fmt.Sprintf("%v", _m.AllowImageGeneration))
  878. builder.WriteString(", ")
  879. builder.WriteString("allow_batch_image_generation=")
  880. builder.WriteString(fmt.Sprintf("%v", _m.AllowBatchImageGeneration))
  881. builder.WriteString(", ")
  882. builder.WriteString("image_rate_independent=")
  883. builder.WriteString(fmt.Sprintf("%v", _m.ImageRateIndependent))
  884. builder.WriteString(", ")
  885. builder.WriteString("image_rate_multiplier=")
  886. builder.WriteString(fmt.Sprintf("%v", _m.ImageRateMultiplier))
  887. builder.WriteString(", ")
  888. if v := _m.ImagePrice1k; v != nil {
  889. builder.WriteString("image_price_1k=")
  890. builder.WriteString(fmt.Sprintf("%v", *v))
  891. }
  892. builder.WriteString(", ")
  893. if v := _m.ImagePrice2k; v != nil {
  894. builder.WriteString("image_price_2k=")
  895. builder.WriteString(fmt.Sprintf("%v", *v))
  896. }
  897. builder.WriteString(", ")
  898. if v := _m.ImagePrice4k; v != nil {
  899. builder.WriteString("image_price_4k=")
  900. builder.WriteString(fmt.Sprintf("%v", *v))
  901. }
  902. builder.WriteString(", ")
  903. builder.WriteString("batch_image_discount_multiplier=")
  904. builder.WriteString(fmt.Sprintf("%v", _m.BatchImageDiscountMultiplier))
  905. builder.WriteString(", ")
  906. builder.WriteString("batch_image_hold_multiplier=")
  907. builder.WriteString(fmt.Sprintf("%v", _m.BatchImageHoldMultiplier))
  908. builder.WriteString(", ")
  909. builder.WriteString("video_rate_independent=")
  910. builder.WriteString(fmt.Sprintf("%v", _m.VideoRateIndependent))
  911. builder.WriteString(", ")
  912. builder.WriteString("video_rate_multiplier=")
  913. builder.WriteString(fmt.Sprintf("%v", _m.VideoRateMultiplier))
  914. builder.WriteString(", ")
  915. if v := _m.VideoPrice480p; v != nil {
  916. builder.WriteString("video_price_480p=")
  917. builder.WriteString(fmt.Sprintf("%v", *v))
  918. }
  919. builder.WriteString(", ")
  920. if v := _m.VideoPrice720p; v != nil {
  921. builder.WriteString("video_price_720p=")
  922. builder.WriteString(fmt.Sprintf("%v", *v))
  923. }
  924. builder.WriteString(", ")
  925. if v := _m.VideoPrice1080p; v != nil {
  926. builder.WriteString("video_price_1080p=")
  927. builder.WriteString(fmt.Sprintf("%v", *v))
  928. }
  929. builder.WriteString(", ")
  930. builder.WriteString("video_model_prices=")
  931. builder.WriteString(fmt.Sprintf("%v", _m.VideoModelPrices))
  932. builder.WriteString(", ")
  933. if v := _m.WebSearchPricePerCall; v != nil {
  934. builder.WriteString("web_search_price_per_call=")
  935. builder.WriteString(fmt.Sprintf("%v", *v))
  936. }
  937. builder.WriteString(", ")
  938. if v := _m.SearchPricePer1k; v != nil {
  939. builder.WriteString("search_price_per_1k=")
  940. builder.WriteString(fmt.Sprintf("%v", *v))
  941. }
  942. builder.WriteString(", ")
  943. if v := _m.AudioRealtimePricePerMin; v != nil {
  944. builder.WriteString("audio_realtime_price_per_min=")
  945. builder.WriteString(fmt.Sprintf("%v", *v))
  946. }
  947. builder.WriteString(", ")
  948. if v := _m.AudioTtsPricePerMillionChars; v != nil {
  949. builder.WriteString("audio_tts_price_per_million_chars=")
  950. builder.WriteString(fmt.Sprintf("%v", *v))
  951. }
  952. builder.WriteString(", ")
  953. if v := _m.AudioSttPricePerHour; v != nil {
  954. builder.WriteString("audio_stt_price_per_hour=")
  955. builder.WriteString(fmt.Sprintf("%v", *v))
  956. }
  957. builder.WriteString(", ")
  958. builder.WriteString("long_context_pricing_enabled=")
  959. builder.WriteString(fmt.Sprintf("%v", _m.LongContextPricingEnabled))
  960. builder.WriteString(", ")
  961. builder.WriteString("model_pricing=")
  962. builder.WriteString(fmt.Sprintf("%v", _m.ModelPricing))
  963. builder.WriteString(", ")
  964. builder.WriteString("claude_code_only=")
  965. builder.WriteString(fmt.Sprintf("%v", _m.ClaudeCodeOnly))
  966. builder.WriteString(", ")
  967. if v := _m.FallbackGroupID; v != nil {
  968. builder.WriteString("fallback_group_id=")
  969. builder.WriteString(fmt.Sprintf("%v", *v))
  970. }
  971. builder.WriteString(", ")
  972. if v := _m.FallbackGroupIDOnInvalidRequest; v != nil {
  973. builder.WriteString("fallback_group_id_on_invalid_request=")
  974. builder.WriteString(fmt.Sprintf("%v", *v))
  975. }
  976. builder.WriteString(", ")
  977. builder.WriteString("model_routing=")
  978. builder.WriteString(fmt.Sprintf("%v", _m.ModelRouting))
  979. builder.WriteString(", ")
  980. builder.WriteString("model_routing_enabled=")
  981. builder.WriteString(fmt.Sprintf("%v", _m.ModelRoutingEnabled))
  982. builder.WriteString(", ")
  983. builder.WriteString("mcp_xml_inject=")
  984. builder.WriteString(fmt.Sprintf("%v", _m.McpXMLInject))
  985. builder.WriteString(", ")
  986. builder.WriteString("supported_model_scopes=")
  987. builder.WriteString(fmt.Sprintf("%v", _m.SupportedModelScopes))
  988. builder.WriteString(", ")
  989. builder.WriteString("sort_order=")
  990. builder.WriteString(fmt.Sprintf("%v", _m.SortOrder))
  991. builder.WriteString(", ")
  992. builder.WriteString("allow_messages_dispatch=")
  993. builder.WriteString(fmt.Sprintf("%v", _m.AllowMessagesDispatch))
  994. builder.WriteString(", ")
  995. builder.WriteString("allow_live=")
  996. builder.WriteString(fmt.Sprintf("%v", _m.AllowLive))
  997. builder.WriteString(", ")
  998. builder.WriteString("force_openai_fast=")
  999. builder.WriteString(fmt.Sprintf("%v", _m.ForceOpenaiFast))
  1000. builder.WriteString(", ")
  1001. builder.WriteString("free_openai_fast=")
  1002. builder.WriteString(fmt.Sprintf("%v", _m.FreeOpenaiFast))
  1003. builder.WriteString(", ")
  1004. builder.WriteString("require_oauth_only=")
  1005. builder.WriteString(fmt.Sprintf("%v", _m.RequireOauthOnly))
  1006. builder.WriteString(", ")
  1007. builder.WriteString("require_privacy_set=")
  1008. builder.WriteString(fmt.Sprintf("%v", _m.RequirePrivacySet))
  1009. builder.WriteString(", ")
  1010. builder.WriteString("default_mapped_model=")
  1011. builder.WriteString(_m.DefaultMappedModel)
  1012. builder.WriteString(", ")
  1013. builder.WriteString("messages_dispatch_model_config=")
  1014. builder.WriteString(fmt.Sprintf("%v", _m.MessagesDispatchModelConfig))
  1015. builder.WriteString(", ")
  1016. builder.WriteString("model_allowlist=")
  1017. builder.WriteString(fmt.Sprintf("%v", _m.ModelAllowlist))
  1018. builder.WriteString(", ")
  1019. builder.WriteString("codex_models_manifest_config=")
  1020. builder.WriteString(fmt.Sprintf("%v", _m.CodexModelsManifestConfig))
  1021. builder.WriteString(", ")
  1022. builder.WriteString("rpm_limit=")
  1023. builder.WriteString(fmt.Sprintf("%v", _m.RpmLimit))
  1024. builder.WriteString(", ")
  1025. builder.WriteString("max_reasoning_effort=")
  1026. builder.WriteString(_m.MaxReasoningEffort)
  1027. builder.WriteString(", ")
  1028. builder.WriteString("max_reasoning_effort_over_limit=")
  1029. builder.WriteString(_m.MaxReasoningEffortOverLimit)
  1030. builder.WriteString(", ")
  1031. builder.WriteString("reasoning_effort_mappings=")
  1032. builder.WriteString(fmt.Sprintf("%v", _m.ReasoningEffortMappings))
  1033. builder.WriteString(", ")
  1034. builder.WriteString("profit_control_enabled=")
  1035. builder.WriteString(fmt.Sprintf("%v", _m.ProfitControlEnabled))
  1036. builder.WriteString(", ")
  1037. builder.WriteString("profit_min_margin=")
  1038. builder.WriteString(fmt.Sprintf("%v", _m.ProfitMinMargin))
  1039. builder.WriteString(", ")
  1040. builder.WriteString("profit_safety_buffer=")
  1041. builder.WriteString(fmt.Sprintf("%v", _m.ProfitSafetyBuffer))
  1042. builder.WriteByte(')')
  1043. return builder.String()
  1044. }
  1045. // Groups is a parsable slice of Group.
  1046. type Groups []*Group