from rest_framework import serializers from .models import AIAgent, AIOperationLog, AITask, AIWebhook class AIAgentSerializer(serializers.ModelSerializer): """AI 代理序列化器""" permissions = serializers.ListField( child=serializers.CharField(), required=False ) class Meta: model = AIAgent fields = [ 'id', 'agent_id', 'name', 'description', 'permissions', 'rate_limit', 'rate_limit_window', 'is_active', 'last_seen', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at', 'last_seen'] extra_kwargs = { 'secret_key': {'write_only': True} } class AIAgentAuthSerializer(serializers.Serializer): """AI 代理认证序列化器""" agent_id = serializers.CharField() agent_secret = serializers.CharField() def validate(self, data): try: agent = AIAgent.objects.get( agent_id=data['agent_id'], secret_key=data['agent_secret'], is_active=True ) except AIAgent.DoesNotExist: raise serializers.ValidationError("Invalid agent credentials") # 更新最后活跃时间 from django.utils import timezone agent.last_seen = timezone.now() agent.save() self.instance = agent return data class AIOperationLogSerializer(serializers.ModelSerializer): """AI 操作日志序列化器""" agent_id = serializers.CharField(source='agent.agent_id', read_only=True) agent_name = serializers.CharField(source='agent.name', read_only=True) class Meta: model = AIOperationLog fields = [ 'id', 'agent_id', 'agent_name', 'action', 'resource_type', 'resource_id', 'status', 'confidence', 'reasoning', 'execution_time_ms', 'created_at' ] read_only_fields = ['id', 'created_at'] class AITaskSerializer(serializers.ModelSerializer): """AI 任务序列化器""" agent_id = serializers.CharField(source='agent.agent_id', read_only=True) class Meta: model = AITask fields = [ 'id', 'task_id', 'agent_id', 'task_type', 'status', 'progress', 'processed_items', 'total_items', 'result', 'error_message', 'callback_url', 'created_at', 'started_at', 'completed_at' ] read_only_fields = ['id', 'created_at', 'started_at', 'completed_at'] class AITaskCreateSerializer(serializers.Serializer): """AI 任务创建序列化器""" task_type = serializers.CharField() operations = serializers.ListField(required=False) callback_url = serializers.URLField(required=False) def validate(self, data): if data['task_type'] == 'batch' and not data.get('operations'): raise serializers.ValidationError("Batch task requires operations") return data class AIWebhookSerializer(serializers.ModelSerializer): """AI Webhook 序列化器""" agent_id = serializers.CharField(source='agent.agent_id', read_only=True) class Meta: model = AIWebhook fields = [ 'id', 'agent_id', 'event', 'url', 'is_active', 'last_triggered', 'failure_count', 'created_at' ] read_only_fields = ['id', 'created_at', 'last_triggered', 'failure_count'] extra_kwargs = { 'secret': {'write_only': True} } class BatchOperationSerializer(serializers.Serializer): """批量操作序列化器""" operations = serializers.ListField( child=serializers.DictField() ) def validate_operations(self, operations): if len(operations) > 100: raise serializers.ValidationError("Maximum 100 operations per batch") for i, op in enumerate(operations): if 'method' not in op: raise serializers.ValidationError(f"Operation {i}: missing 'method'") if op['method'] not in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']: raise serializers.ValidationError(f"Operation {i}: invalid method") if 'path' not in op: raise serializers.ValidationError(f"Operation {i}: missing 'path'") return operations