You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
from rest_framework import serializers
|
|
|
|
from .models import AgentPrompt, AgentSettings, EmbeddingSession
|
|
|
|
|
|
class AgentPromptSerializer(serializers.ModelSerializer):
|
|
id = serializers.IntegerField(required=False)
|
|
|
|
class Meta:
|
|
model = AgentPrompt
|
|
fields = ["id", "content", "is_active"]
|
|
|
|
|
|
class AgentSettingsSerializer(serializers.ModelSerializer):
|
|
prompts = AgentPromptSerializer(many=True)
|
|
|
|
class Meta:
|
|
model = AgentSettings
|
|
fields = ["id", "updated_at", "prompts"]
|
|
read_only_fields = ["id", "updated_at"]
|
|
|
|
def update(self, instance, validated_data):
|
|
prompts_data = validated_data.pop("prompts", [])
|
|
instance = super().update(instance, validated_data)
|
|
|
|
existing_prompts = {prompt.id: prompt for prompt in instance.prompts.all()}
|
|
kept_prompt_ids: list[int] = []
|
|
|
|
for prompt_data in prompts_data:
|
|
prompt_id = prompt_data.pop("id", None)
|
|
if prompt_id and prompt_id in existing_prompts:
|
|
prompt = existing_prompts[prompt_id]
|
|
prompt.content = prompt_data.get("content", prompt.content)
|
|
prompt.is_active = prompt_data.get("is_active", prompt.is_active)
|
|
prompt.save(update_fields=["content", "is_active"])
|
|
kept_prompt_ids.append(prompt.id)
|
|
else:
|
|
prompt = AgentPrompt.objects.create(settings=instance, **prompt_data)
|
|
kept_prompt_ids.append(prompt.id)
|
|
|
|
instance.prompts.exclude(id__in=kept_prompt_ids).delete()
|
|
instance.save()
|
|
return instance
|
|
|
|
|
|
class EmbeddingSessionSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = EmbeddingSession
|
|
fields = [
|
|
"id",
|
|
"status",
|
|
"progress",
|
|
"processed_items",
|
|
"total_items",
|
|
"error_message",
|
|
"created_at",
|
|
]
|
|
read_only_fields = fields
|