daren/apps/rlhf/serializers.py
2025-06-10 18:18:28 +08:00

136 lines
5.3 KiB
Python

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