from rest_framework import serializers from .models import ( Feedback, FeedbackTag, DetailedFeedback, ConversationSubmission, ConversationEvaluation, SystemConfig, RLHFConversation, NegotiationChat, ChatHistory ) from apps.user.serializers import UserSerializer class ConversationSerializer(serializers.ModelSerializer): id = serializers.CharField(source='conversation_id', read_only=True) user = serializers.PrimaryKeyRelatedField(source='negotiation.user', read_only=True) is_submitted = serializers.SerializerMethodField() created_at = serializers.DateTimeField(source='created_at', read_only=True) class Meta: model = NegotiationChat fields = ['id', 'user', 'is_submitted', 'created_at'] def get_is_submitted(self, obj): # 尝试获取RLHF扩展 try: return obj.rlhf_extension.is_submitted except RLHFConversation.DoesNotExist: return False class MessageSerializer(serializers.ModelSerializer): conversation = serializers.CharField(source='conversation_id', read_only=True) timestamp = serializers.DateTimeField(source='created_at', read_only=True) class Meta: model = ChatHistory fields = ['id', 'conversation', 'role', 'content', 'timestamp'] class FeedbackSerializer(serializers.ModelSerializer): class Meta: model = Feedback fields = ['id', 'message', 'conversation_id', 'user', 'feedback_value', 'timestamp'] read_only_fields = ['id', 'timestamp'] class FeedbackTagSerializer(serializers.ModelSerializer): class Meta: model = FeedbackTag fields = ['id', 'tag_name', 'tag_type', 'description', 'created_at'] read_only_fields = ['id', 'created_at'] class DetailedFeedbackSerializer(serializers.ModelSerializer): class Meta: model = DetailedFeedback fields = [ 'id', 'message', 'conversation_id', 'user', 'feedback_type', 'feedback_tags', 'custom_tags', 'custom_content', 'is_inline', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] class ConversationSubmissionSerializer(serializers.ModelSerializer): user_details = UserSerializer(source='user', read_only=True) reviewer_details = UserSerializer(source='reviewer', read_only=True) class Meta: model = ConversationSubmission fields = [ 'id', 'conversation_id', 'user', 'title', 'description', 'status', 'quality_score', 'reviewer', 'reviewer_details', 'reviewer_notes', 'submitted_at', 'reviewed_at', 'created_at', 'updated_at' ] read_only_fields = ['id', 'submitted_at', 'reviewed_at', 'created_at', 'updated_at'] class ConversationEvaluationSerializer(serializers.ModelSerializer): class Meta: model = ConversationEvaluation fields = [ 'id', 'conversation_id', 'user', 'overall_feeling', 'has_logical_issues', 'needs_satisfied', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] class SystemConfigSerializer(serializers.ModelSerializer): class Meta: model = SystemConfig fields = [ 'id', 'config_key', 'config_value', 'config_type', 'description', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] class ConversationWithMessagesSerializer(serializers.ModelSerializer): id = serializers.CharField(source='conversation_id', read_only=True) user = serializers.PrimaryKeyRelatedField(source='negotiation.user', read_only=True) is_submitted = serializers.SerializerMethodField() created_at = serializers.DateTimeField(source='created_at', read_only=True) messages = serializers.SerializerMethodField() class Meta: model = NegotiationChat fields = ['id', 'user', 'is_submitted', 'created_at', 'messages'] def get_is_submitted(self, obj): try: return obj.rlhf_extension.is_submitted except RLHFConversation.DoesNotExist: return False def get_messages(self, obj): messages = ChatHistory.objects.filter( conversation_id=obj.conversation_id ).order_by('created_at') return MessageSerializer(messages, many=True).data class MessageWithFeedbackSerializer(serializers.ModelSerializer): conversation = serializers.CharField(source='conversation_id', read_only=True) timestamp = serializers.DateTimeField(source='created_at', read_only=True) feedback = serializers.SerializerMethodField() detailed_feedback = serializers.SerializerMethodField() class Meta: model = ChatHistory fields = ['id', 'conversation', 'role', 'content', 'timestamp', 'feedback', 'detailed_feedback'] def get_feedback(self, obj): feedback = Feedback.objects.filter(message=obj) return FeedbackSerializer(feedback, many=True).data def get_detailed_feedback(self, obj): detailed_feedback = DetailedFeedback.objects.filter(message=obj) return DetailedFeedbackSerializer(detailed_feedback, many=True).data