大量优化修改扣积分规则
This commit is contained in:
@@ -4,6 +4,7 @@ from rest_framework import serializers
|
||||
|
||||
from apps.accounts.models import Team, TeamMember, User
|
||||
from apps.ai.model_routing import model_metadata_errors, provider_metadata_errors
|
||||
from apps.billing.points_rules import normalize_points_pricing_for_save, points_pricing_errors
|
||||
from apps.ai.models import AIModelAttempt, AITask, ModelConfig, ModelProvider, PromptTemplate, QualityWord
|
||||
from apps.assets.models import Asset
|
||||
from apps.billing.models import CreditLedger, QuotaPolicy
|
||||
@@ -247,12 +248,35 @@ class AdminModelConfigSerializer(serializers.ModelSerializer):
|
||||
|
||||
def validate(self, attrs):
|
||||
attrs = super().validate(attrs)
|
||||
if self.instance is None or "metadata" in attrs or "capability" in attrs:
|
||||
if self.instance is None or "metadata" in attrs or "capability" in attrs or "unit_price" in attrs:
|
||||
capability = attrs.get("capability", getattr(self.instance, "capability", ""))
|
||||
metadata = attrs.get("metadata", getattr(self.instance, "metadata", {}))
|
||||
errors = model_metadata_errors(capability, metadata)
|
||||
if not isinstance(metadata, dict):
|
||||
metadata = {}
|
||||
metadata = normalize_points_pricing_for_save(capability, metadata)
|
||||
# 图片/文本:表单 unit_price 与挂牌积分同步
|
||||
if "unit_price" in attrs and capability in {"image", "text", "vision"}:
|
||||
from decimal import Decimal
|
||||
try:
|
||||
pts = int(Decimal(str(attrs.get("unit_price") or 0)))
|
||||
except Exception:
|
||||
pts = 0
|
||||
pricing = dict(metadata.get("points_pricing") or {})
|
||||
if capability == "image":
|
||||
pricing.update({"mode": "per_image", "points_per_image": max(pts, 0)})
|
||||
else:
|
||||
pricing.update({"mode": "per_call", "points_per_call": max(pts, 0)})
|
||||
metadata["points_pricing"] = pricing
|
||||
attrs["metadata"] = metadata
|
||||
# 视频有挂牌秒价时,把展示用 unit_price 写成最低档秒积分,列表更好读
|
||||
if capability == "video":
|
||||
tiers = (metadata.get("points_pricing") or {}).get("tiers") or []
|
||||
secs = [t.get("points_per_second") for t in tiers if isinstance(t, dict) and t.get("points_per_second") is not None]
|
||||
if secs:
|
||||
attrs["unit_price"] = min(int(x) for x in secs)
|
||||
errors = list(model_metadata_errors(capability, metadata)) + list(points_pricing_errors(capability, metadata))
|
||||
if errors:
|
||||
raise serializers.ValidationError({"metadata": list(errors)})
|
||||
raise serializers.ValidationError({"metadata": errors})
|
||||
return attrs
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user