diff --git a/apps/devices/views.py b/apps/devices/views.py index fe6711a..c87c081 100644 --- a/apps/devices/views.py +++ b/apps/devices/views.py @@ -73,7 +73,7 @@ class DeviceViewSet(viewsets.ViewSet): UserDevice.objects.filter( user=request.user, is_active=True - ).select_related('device', 'device__device_type', 'spirit', 'role_memory') + ).select_related('device', 'device__device_type', 'spirit', 'role_memory', 'role_memory__device_type') .order_by('-bind_time')[:1] ) if not devices: @@ -132,7 +132,7 @@ class DeviceViewSet(viewsets.ViewSet): if existing and existing.user != request.user: return error(code=ErrorCode.DEVICE_ALREADY_BOUND, message='设备已被其他用户绑定') - # 创建角色记忆 + # 创建角色记忆(始终创建新的) role_memory = None if device.device_type: role_memory = RoleMemory.objects.create( @@ -175,7 +175,7 @@ class DeviceViewSet(viewsets.ViewSet): user_devices = UserDevice.objects.filter( user=request.user, is_active=True - ).select_related('device', 'device__device_type', 'spirit', 'role_memory') + ).select_related('device', 'device__device_type', 'spirit', 'role_memory', 'role_memory__device_type') serializer = UserDeviceSerializer(user_devices, many=True) return success(data=serializer.data) @@ -356,9 +356,9 @@ class DeviceViewSet(viewsets.ViewSet): # ==================== 角色记忆相关端点 ==================== @action(detail=True, methods=['get'], url_path='role-memory') - def get_role_memory(self, request, pk=None): + def role_memory_detail(self, request, pk=None): """ - 获取设备的角色记忆 + 获取当前设备的角色记忆 GET /api/v1/devices/{user_device_id}/role-memory/ """ try: @@ -369,12 +369,12 @@ class DeviceViewSet(viewsets.ViewSet): return error(code=ErrorCode.DEVICE_NOT_FOUND, message='绑定记录不存在') if not user_device.role_memory: - return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='角色记忆不存在') + return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='该设备暂无角色记忆') return success(data=RoleMemorySerializer(user_device.role_memory).data) @action(detail=True, methods=['put'], url_path='role-memory/settings') - def update_role_memory_settings(self, request, pk=None): + def role_memory_settings(self, request, pk=None): """ 更新角色记忆-设备设置 PUT /api/v1/devices/{user_device_id}/role-memory/settings/ @@ -387,7 +387,7 @@ class DeviceViewSet(viewsets.ViewSet): return error(code=ErrorCode.DEVICE_NOT_FOUND, message='绑定记录不存在') if not user_device.role_memory: - return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='角色记忆不存在') + return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='该设备暂无角色记忆') serializer = RoleMemorySettingsUpdateSerializer(data=request.data) if not serializer.is_valid(): @@ -401,9 +401,9 @@ class DeviceViewSet(viewsets.ViewSet): return success(data=RoleMemorySerializer(rm).data, message='设置已保存') @action(detail=True, methods=['put'], url_path='role-memory/agent') - def update_role_memory_agent(self, request, pk=None): + def role_memory_agent(self, request, pk=None): """ - 更新角色记忆-Agent信息(提示词、音色) + 更新角色记忆-Agent信息 PUT /api/v1/devices/{user_device_id}/role-memory/agent/ """ try: @@ -414,7 +414,7 @@ class DeviceViewSet(viewsets.ViewSet): return error(code=ErrorCode.DEVICE_NOT_FOUND, message='绑定记录不存在') if not user_device.role_memory: - return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='角色记忆不存在') + return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='该设备暂无角色记忆') serializer = RoleMemoryAgentUpdateSerializer(data=request.data) if not serializer.is_valid(): @@ -428,7 +428,7 @@ class DeviceViewSet(viewsets.ViewSet): return success(data=RoleMemorySerializer(rm).data, message='Agent信息已更新') @action(detail=True, methods=['put'], url_path='role-memory/memory') - def update_role_memory_summary(self, request, pk=None): + def role_memory_summary(self, request, pk=None): """ 更新角色记忆-聊天记忆摘要 PUT /api/v1/devices/{user_device_id}/role-memory/memory/ @@ -441,17 +441,16 @@ class DeviceViewSet(viewsets.ViewSet): return error(code=ErrorCode.DEVICE_NOT_FOUND, message='绑定记录不存在') if not user_device.role_memory: - return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='角色记忆不存在') + return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='该设备暂无角色记忆') serializer = RoleMemoryMemoryUpdateSerializer(data=request.data) if not serializer.is_valid(): return error(message=str(serializer.errors)) - rm = user_device.role_memory - rm.memory_summary = serializer.validated_data['memory_summary'] - rm.save(update_fields=['memory_summary', 'updated_at']) + user_device.role_memory.memory_summary = serializer.validated_data['memory_summary'] + user_device.role_memory.save(update_fields=['memory_summary', 'updated_at']) - return success(data=RoleMemorySerializer(rm).data, message='记忆摘要已更新') + return success(message='聊天记忆已更新') @action(detail=False, methods=['get'], url_path='role-memories') def role_memory_list(self, request): @@ -459,18 +458,13 @@ class DeviceViewSet(viewsets.ViewSet): 获取角色记忆列表 GET /api/v1/devices/role-memories/?device_type_id=1&is_bound=false """ - qs = RoleMemory.objects.filter( - user=request.user - ).select_related('device_type').order_by('-created_at') - + qs = RoleMemory.objects.filter(user=request.user).select_related('device_type') device_type_id = request.query_params.get('device_type_id') if device_type_id: qs = qs.filter(device_type_id=device_type_id) - is_bound = request.query_params.get('is_bound') if is_bound is not None: qs = qs.filter(is_bound=is_bound.lower() == 'true') - return success(data=RoleMemorySerializer(qs, many=True).data) @action(detail=True, methods=['put'], url_path='switch-role-memory') @@ -489,12 +483,12 @@ class DeviceViewSet(viewsets.ViewSet): role_memory_id = request.data.get('role_memory_id') if not role_memory_id: - return error(message='请指定角色记忆ID') + return error(message='role_memory_id 不能为空') try: new_rm = RoleMemory.objects.get(id=role_memory_id, user=request.user) except RoleMemory.DoesNotExist: - return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='角色记忆不存在') + return error(code=ErrorCode.ROLE_MEMORY_NOT_FOUND, message='该设备暂无角色记忆') # 校验: 目标记忆必须是同一设备类型 if user_device.device.device_type_id and new_rm.device_type_id != user_device.device.device_type_id: @@ -504,17 +498,15 @@ class DeviceViewSet(viewsets.ViewSet): if new_rm.is_bound: return error(code=ErrorCode.ROLE_MEMORY_ALREADY_BOUND, message='该角色记忆正在被其他设备使用') - # 旧记忆标记闲置 + # 执行切换:旧记忆标记闲置,新记忆标记绑定 old_rm = user_device.role_memory if old_rm: old_rm.is_bound = False old_rm.save(update_fields=['is_bound', 'updated_at']) - # 新记忆标记绑定 new_rm.is_bound = True new_rm.save(update_fields=['is_bound', 'updated_at']) - # 更新绑定关系 user_device.role_memory = new_rm user_device.save(update_fields=['role_memory'])