From 0f8b9711eddb189bb3d2eb855b5c99d46615b3a7 Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Fri, 28 Aug 2026 17:27:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(pricing):=20=E6=89=A9=E5=B1=95=20charge=5F?= =?UTF-8?q?mode=20=E6=9E=9A=E4=B8=BE=EF=BC=88token/=E5=8D=95=E4=BD=8D/per?= =?UTF-8?q?=5Fperiod=EF=BC=89+=20subject=20=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- consts/pricing/charge_mode.go | 26 ++++++++++++++++++++++++ consts/pricing/subject.go | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 consts/pricing/charge_mode.go create mode 100644 consts/pricing/subject.go diff --git a/consts/pricing/charge_mode.go b/consts/pricing/charge_mode.go new file mode 100644 index 0000000..75fcf36 --- /dev/null +++ b/consts/pricing/charge_mode.go @@ -0,0 +1,26 @@ +package pricing + +// ChargeMode 计费方式(全 DB 配置,代码不写死金额;新增方式在 charge_calc 计算器注册表加一项) +type ChargeMode string + +const ( + ChargeModePerItem ChargeMode = "per_item" // 按条:档位开放、上不封顶(rules.tiers + overflow) + ChargeModePerSecond ChargeMode = "per_second" // 按秒(workflow:整秒向上取整;model:精确秒) + ChargeModePerToken ChargeMode = "per_token" // 按token(workflow 结算时按各模型 subject 实时价) + ChargeModePer1K ChargeMode = "per_1K" // 每千token(模型 token 计费) + ChargeModePer1M ChargeMode = "per_1M" // 每百万token(模型 token 计费) + ChargeModePer1 ChargeMode = "per_1" // 每个/每张图(图片按张数) + ChargeModePerMinute ChargeMode = "per_minute" // 每分钟(音频时长) + ChargeModePerHour ChargeMode = "per_hour" // 每小时(音频时长) + ChargeModePerChar ChargeMode = "per_char" // 每字(音频按字数) + ChargeModePerPeriod ChargeMode = "per_period" // 周期订阅(business 按年) +) + +// ModelUnitSet model subject 允许的计费单位(spec §4.2) +var ModelUnitSet = map[ChargeMode]bool{ + ChargeModePer1K: true, ChargeModePer1M: true, ChargeModePer1: true, + ChargeModePerSecond: true, ChargeModePerMinute: true, ChargeModePerHour: true, ChargeModePerChar: true, +} + +// PeriodSet 周期允许集合(per_period,扩月/季只加值) +var PeriodSet = map[string]bool{"year": true} diff --git a/consts/pricing/subject.go b/consts/pricing/subject.go new file mode 100644 index 0000000..4f20575 --- /dev/null +++ b/consts/pricing/subject.go @@ -0,0 +1,38 @@ +package pricing + +// SubjectType 计价对象类型(固定枚举 = pricing_config 唯一键第一部分) +type SubjectType string + +const ( + SubjectTypeWorkflow SubjectType = "workflow" // 工作流(固定单主体) + SubjectTypeModel SubjectType = "model" // 模型(model-gateway 系统模型,subject_id=模型ID) + SubjectTypeBusiness SubjectType = "business" // 业务模块(固定写死列表) +) + +// WorkflowSubjectID 工作流固定 subject_id +const WorkflowSubjectID = "workflow" + +// BusinessSubject 业务模块枚举项(固定写死,新增业务模块改这里) +type BusinessSubject struct { + SubjectID string `json:"subjectId"` + Name string `json:"name"` + ChargeModes []ChargeMode `json:"chargeModes"` +} + +// BusinessSubjects 业务模块固定列表(spec §7:与「固定枚举」一致) +var BusinessSubjects = []BusinessSubject{ + {SubjectID: "ai_customer_service", Name: "AI客服", ChargeModes: []ChargeMode{ChargeModePerPeriod}}, +} + +// ModelTypeCode 模型类型编码(透传 model-gateway 枚举,管理端按此分组渲染编辑器) +type ModelTypeCode = int + +const ( + ModelTypeReasoning ModelTypeCode = 100 // 推理 + ModelTypeImage ModelTypeCode = 200 // 图片 + ModelTypeAudio ModelTypeCode = 300 // 音频 + ModelTypeVector ModelTypeCode = 400 // 向量 + ModelTypeOmni ModelTypeCode = 500 // 多模态 + ModelTypeVideo ModelTypeCode = 600 // 视频 + ModelTypeCode2 ModelTypeCode = 700 // 代码 +)