seaislee1209 b50ad147cd
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m0s
feat: v0.15.0 Seedance 2.0 Fast 模型上线 + 四档计费
- Fast 模型:取消隐藏 Toolbar 选项,用户可选 AirDrama / AirDrama Fast
- 四档计费:按模型+有无视频参考选单价(2.0: 46/28, Fast: 37/22 元/百万tokens)
- QuotaConfig 新增 base_token_price_fast / base_token_price_fast_video 字段
- 系统设置页 4 个价格输入框(Seedance 2.0 + Fast 各两个)
- 前端预估动态选价:根据当前选的模型和有无视频参考实时计算
- 推理接入点:Fast EP ep-m-20260329211530-68999
- 消费记录表格+CSV+详情弹窗加"模型"列
- 轮询间隔改为全程固定 5 秒

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 20:33:02 +08:00

131 lines
8.2 KiB
Python

from rest_framework import serializers
class VideoGenerateSerializer(serializers.Serializer):
prompt = serializers.CharField(required=False, allow_blank=True, default='')
mode = serializers.ChoiceField(choices=['universal', 'keyframe'])
model = serializers.ChoiceField(choices=['seedance_2.0', 'seedance_2.0_fast'])
aspect_ratio = serializers.CharField(max_length=10)
duration = serializers.IntegerField()
references = serializers.ListField(child=serializers.DictField(), required=False, default=list)
class QuotaUpdateSerializer(serializers.Serializer):
daily_generation_limit = serializers.IntegerField(min_value=-1)
monthly_generation_limit = serializers.IntegerField(min_value=-1)
spending_limit = serializers.DecimalField(max_digits=12, decimal_places=2, required=False)
class UserStatusSerializer(serializers.Serializer):
is_active = serializers.BooleanField()
class AdminCreateUserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=150)
email = serializers.EmailField()
password = serializers.CharField(min_length=6)
daily_seconds_limit = serializers.IntegerField(min_value=-1, required=False, default=600)
monthly_seconds_limit = serializers.IntegerField(min_value=-1, required=False, default=6000)
daily_generation_limit = serializers.IntegerField(min_value=-1, required=False, default=50)
monthly_generation_limit = serializers.IntegerField(min_value=-1, required=False, default=1500)
is_staff = serializers.BooleanField(required=False, default=False)
class SystemSettingsSerializer(serializers.Serializer):
default_daily_seconds_limit = serializers.IntegerField(min_value=0, required=False)
default_monthly_seconds_limit = serializers.IntegerField(min_value=0, required=False)
default_daily_generation_limit = serializers.IntegerField(min_value=0, required=False)
default_monthly_generation_limit = serializers.IntegerField(min_value=0, required=False)
base_token_price = serializers.DecimalField(max_digits=10, decimal_places=2, min_value=0, required=False)
base_token_price_video = serializers.DecimalField(max_digits=10, decimal_places=2, min_value=0, required=False)
base_token_price_fast = serializers.DecimalField(max_digits=10, decimal_places=2, min_value=0, required=False)
base_token_price_fast_video = serializers.DecimalField(max_digits=10, decimal_places=2, min_value=0, required=False)
announcement = serializers.CharField(required=False, allow_blank=True, default='')
announcement_enabled = serializers.BooleanField(required=False, default=False)
max_desktop_sessions = serializers.IntegerField(min_value=1, required=False, default=1)
max_mobile_sessions = serializers.IntegerField(min_value=0, required=False, default=0)
# 异常检测配置
anomaly_detection_enabled = serializers.BooleanField(required=False, default=False)
r1_enabled_default = serializers.BooleanField(required=False, default=True)
r2_enabled_default = serializers.BooleanField(required=False, default=True)
r2_window_seconds = serializers.IntegerField(min_value=60, required=False, default=3600)
r3_enabled_default = serializers.BooleanField(required=False, default=True)
r3_window_seconds = serializers.IntegerField(min_value=60, required=False, default=3600)
r3_max_count = serializers.IntegerField(min_value=1, required=False, default=10)
r4_enabled_default = serializers.BooleanField(required=False, default=True)
r4_window_seconds = serializers.IntegerField(min_value=60, required=False, default=3600)
r4_city_count = serializers.IntegerField(min_value=1, required=False, default=5)
r5_enabled_default = serializers.BooleanField(required=False, default=True)
r5_days = serializers.IntegerField(min_value=1, required=False, default=7)
r5_country_count = serializers.IntegerField(min_value=1, required=False, default=10)
feishu_alert_mobiles = serializers.CharField(required=False, allow_blank=True, default='')
sms_alert_mobiles = serializers.CharField(required=False, allow_blank=True, default='')
alert_cooldown_seconds = serializers.IntegerField(min_value=0, required=False, default=1800)
# ── Team serializers ──
class TeamCreateSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
monthly_seconds_limit = serializers.IntegerField(min_value=0, required=False, default=6000)
daily_member_limit_default = serializers.IntegerField(min_value=0, required=False, default=600)
markup_percentage = serializers.DecimalField(max_digits=5, decimal_places=2, min_value=0, required=True)
monthly_spending_limit = serializers.DecimalField(max_digits=12, decimal_places=2, required=False, default=-1)
daily_member_spending_default = serializers.DecimalField(max_digits=12, decimal_places=2, required=False, default=50)
max_concurrent_tasks = serializers.IntegerField(min_value=0, required=False, default=5)
expected_regions = serializers.CharField(max_length=500, required=True)
class TeamUpdateSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100, required=False)
monthly_seconds_limit = serializers.IntegerField(min_value=0, required=False)
daily_member_limit_default = serializers.IntegerField(min_value=0, required=False)
markup_percentage = serializers.DecimalField(max_digits=5, decimal_places=2, min_value=0, required=False)
monthly_spending_limit = serializers.DecimalField(max_digits=12, decimal_places=2, required=False)
daily_member_spending_default = serializers.DecimalField(max_digits=12, decimal_places=2, required=False)
max_concurrent_tasks = serializers.IntegerField(min_value=0, required=False)
is_active = serializers.BooleanField(required=False)
expected_regions = serializers.CharField(max_length=500, required=False, allow_blank=True)
class TeamAnomalyConfigSerializer(serializers.Serializer):
r1_enabled = serializers.BooleanField(required=False, allow_null=True, default=None)
r2_enabled = serializers.BooleanField(required=False, allow_null=True, default=None)
r2_window_seconds = serializers.IntegerField(min_value=60, required=False, allow_null=True, default=None)
r3_enabled = serializers.BooleanField(required=False, allow_null=True, default=None)
r3_window_seconds = serializers.IntegerField(min_value=60, required=False, allow_null=True, default=None)
r3_max_count = serializers.IntegerField(min_value=1, required=False, allow_null=True, default=None)
r4_enabled = serializers.BooleanField(required=False, allow_null=True, default=None)
r4_window_seconds = serializers.IntegerField(min_value=60, required=False, allow_null=True, default=None)
r4_city_count = serializers.IntegerField(min_value=1, required=False, allow_null=True, default=None)
r5_enabled = serializers.BooleanField(required=False, allow_null=True, default=None)
r5_days = serializers.IntegerField(min_value=1, required=False, allow_null=True, default=None)
r5_country_count = serializers.IntegerField(min_value=1, required=False, allow_null=True, default=None)
class TeamTopUpSerializer(serializers.Serializer):
amount = serializers.DecimalField(max_digits=12, decimal_places=2, min_value=0.01)
class TeamAdminCreateSerializer(serializers.Serializer):
"""Create a team admin account for a specific team."""
username = serializers.CharField(max_length=150)
email = serializers.EmailField()
password = serializers.CharField(min_length=6)
class TeamMemberCreateSerializer(serializers.Serializer):
"""Team admin creates a member."""
username = serializers.CharField(max_length=150)
password = serializers.CharField(min_length=6)
daily_seconds_limit = serializers.IntegerField(min_value=-1, required=False)
monthly_seconds_limit = serializers.IntegerField(min_value=-1, required=False)
daily_generation_limit = serializers.IntegerField(min_value=-1, required=False)
monthly_generation_limit = serializers.IntegerField(min_value=-1, required=False)
class MemberQuotaSerializer(serializers.Serializer):
daily_generation_limit = serializers.IntegerField(min_value=-1)
monthly_generation_limit = serializers.IntegerField(min_value=-1)
spending_limit = serializers.DecimalField(max_digits=12, decimal_places=2, required=False)