Compare commits
2 Commits
cbfa704299
...
8dcef0cff2
| Author | SHA1 | Date | |
|---|---|---|---|
| 8dcef0cff2 | |||
| 59b178f8f4 |
@ -173,7 +173,35 @@
|
|||||||
"Bash(ls c:/Users/admin/Desktop/Lila-Server/qy_lty/settings*)",
|
"Bash(ls c:/Users/admin/Desktop/Lila-Server/qy_lty/settings*)",
|
||||||
"Bash(python manage.py makemigrations card)",
|
"Bash(python manage.py makemigrations card)",
|
||||||
"Bash(python manage.py runserver)",
|
"Bash(python manage.py runserver)",
|
||||||
"Bash(start cmd:*)"
|
"Bash(start cmd:*)",
|
||||||
|
"Bash(redis-cli ping:*)",
|
||||||
|
"Bash(where redis-cli:*)",
|
||||||
|
"Bash(cmd //c \"where redis-cli\")",
|
||||||
|
"Bash(cmd //c \"where redis-server\")",
|
||||||
|
"Read(//c//**)",
|
||||||
|
"Bash(cmd //c \"where /R C:\\\\\\\\Program Files redis-server.exe\")",
|
||||||
|
"Bash(cmd //c \"where /R C:\\\\\\\\Users\\\\\\\\admin redis-server.exe\")",
|
||||||
|
"Read(//c/Redis/**)",
|
||||||
|
"Read(//c/Program Files/Redis/**)",
|
||||||
|
"Bash(docker info:*)",
|
||||||
|
"Bash(cmd //c \"sc query Redis\")",
|
||||||
|
"Bash(conda run:*)",
|
||||||
|
"Bash(cmd //c \"conda activate fengye && pip show django-redis\")",
|
||||||
|
"Bash(conda env:*)",
|
||||||
|
"Bash(cmd //c \"conda env list\")",
|
||||||
|
"Read(//c/Users/admin/anaconda3/Scripts/**)",
|
||||||
|
"Read(//c/Users/admin/miniconda3/Scripts/**)",
|
||||||
|
"Read(//c/ProgramData/anaconda3/Scripts/**)",
|
||||||
|
"Read(//c/ProgramData/miniconda3/Scripts/**)",
|
||||||
|
"Bash(cmd //c \"where python\")",
|
||||||
|
"Bash(cmd //c \"C:\\\\python\\\\python.exe -c \\\\\"import django; print\\(django.get_version\\(\\)\\)\\\\\"\")",
|
||||||
|
"Bash(cmd //c \"C:\\\\python\\\\python.exe -m pip list\")",
|
||||||
|
"Bash(cmd //c \"netstat -ano | findstr :8000 | findstr LISTENING\")",
|
||||||
|
"Bash(cmd //c \"netstat -ano | findstr :3000 | findstr LISTENING\")",
|
||||||
|
"Bash(cmd //c \"netstat -ano | findstr LISTENING | findstr /R \\\\\"8000 3000\\\\\"\")",
|
||||||
|
"Bash(cmd //c \"netstat -ano\")",
|
||||||
|
"Bash(/c/python/python.exe -m daphne -b 0.0.0.0 -p 8000 qy_lty.asgi:application)",
|
||||||
|
"Bash(kill %1)"
|
||||||
],
|
],
|
||||||
"additionalDirectories": [
|
"additionalDirectories": [
|
||||||
"C:\\Users\\admin\\.claude"
|
"C:\\Users\\admin\\.claude"
|
||||||
|
|||||||
25
qy_lty/aiapp/migrations/0003_create_rtc_bot.py
Normal file
25
qy_lty/aiapp/migrations/0003_create_rtc_bot.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
def create_rtc_bot(apps, schema_editor):
|
||||||
|
Bot = apps.get_model('aiapp', 'Bot')
|
||||||
|
Bot.objects.get_or_create(
|
||||||
|
name='RTC_Voice_Agent',
|
||||||
|
defaults={'description': 'RTC实时语音智能体'}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def remove_rtc_bot(apps, schema_editor):
|
||||||
|
Bot = apps.get_model('aiapp', 'Bot')
|
||||||
|
Bot.objects.filter(name='RTC_Voice_Agent').delete()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('aiapp', '0002_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(create_rtc_bot, remove_rtc_bot),
|
||||||
|
]
|
||||||
@ -1,6 +1,6 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
from .views import ChatBotAPIView, MultiChatAPIView, BotViewSet
|
from .views import ChatBotAPIView, MultiChatAPIView, BotViewSet, RTCChatHistoryAPIView
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register(r'bots', BotViewSet, basename='bot')
|
router.register(r'bots', BotViewSet, basename='bot')
|
||||||
@ -9,4 +9,5 @@ urlpatterns = [
|
|||||||
path('', include(router.urls)),
|
path('', include(router.urls)),
|
||||||
path('chat/<int:bot_id>/', ChatBotAPIView.as_view(), name='chat-bot'),
|
path('chat/<int:bot_id>/', ChatBotAPIView.as_view(), name='chat-bot'),
|
||||||
path('multichat/', MultiChatAPIView.as_view(), name='multi-chat'),
|
path('multichat/', MultiChatAPIView.as_view(), name='multi-chat'),
|
||||||
|
path('rtc-chat-history/', RTCChatHistoryAPIView.as_view(), name='rtc-chat-history'),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -9,6 +9,7 @@ from rest_framework.permissions import IsAuthenticated
|
|||||||
from userapp.authentication import RedisTokenAuthentication
|
from userapp.authentication import RedisTokenAuthentication
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from common.swagger_utils import swagger_schema
|
from common.swagger_utils import swagger_schema
|
||||||
|
from common.responses import success_response, created_response, error_response
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
import logging
|
import logging
|
||||||
@ -427,4 +428,89 @@ def create_user_message(user: ParadiseUser, bot: Bot, message_type: str, user_me
|
|||||||
logger.info(f"Created video message for user {user.id} and bot {bot.id}")
|
logger.info(f"Created video message for user {user.id} and bot {bot.id}")
|
||||||
return user_chat_message
|
return user_chat_message
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class RTCChatHistoryAPIView(APIView):
|
||||||
|
"""
|
||||||
|
RTC 语音智能体聊天记录接口
|
||||||
|
|
||||||
|
GET: 获取当前用户的 RTC 聊天历史
|
||||||
|
POST: 保存一条 RTC 聊天消息
|
||||||
|
DELETE: 清空当前用户的 RTC 聊天记录
|
||||||
|
"""
|
||||||
|
authentication_classes = [RedisTokenAuthentication]
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
RTC_BOT_NAME = 'RTC_Voice_Agent'
|
||||||
|
|
||||||
|
def _get_rtc_bot(self):
|
||||||
|
try:
|
||||||
|
return Bot.objects.get(name=self.RTC_BOT_NAME)
|
||||||
|
except Bot.DoesNotExist:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
bot = self._get_rtc_bot()
|
||||||
|
if bot is None:
|
||||||
|
return error_response(message='RTC Bot 未配置', code=500, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
|
|
||||||
|
page_size = int(request.query_params.get('page_size', 50))
|
||||||
|
page_size = min(page_size, 200)
|
||||||
|
|
||||||
|
queryset = ChatMessage.objects.filter(
|
||||||
|
user=request.user,
|
||||||
|
bot=bot
|
||||||
|
).order_by('timestamp')
|
||||||
|
|
||||||
|
total = queryset.count()
|
||||||
|
messages = queryset[max(0, total - page_size):]
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'messages': [
|
||||||
|
{
|
||||||
|
'id': msg.id,
|
||||||
|
'message': msg.message,
|
||||||
|
'sender': msg.sender,
|
||||||
|
'timestamp': msg.timestamp.isoformat(),
|
||||||
|
}
|
||||||
|
for msg in messages
|
||||||
|
],
|
||||||
|
'total': total,
|
||||||
|
'has_more': total > page_size,
|
||||||
|
}
|
||||||
|
return success_response(data=data)
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
bot = self._get_rtc_bot()
|
||||||
|
if bot is None:
|
||||||
|
return error_response(message='RTC Bot 未配置', code=500, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
|
|
||||||
|
message_text = request.data.get('message', '').strip()
|
||||||
|
sender = request.data.get('sender', '').strip()
|
||||||
|
|
||||||
|
if not message_text:
|
||||||
|
return error_response(message='消息内容不能为空')
|
||||||
|
if sender not in ('user', 'assistant'):
|
||||||
|
return error_response(message='sender 必须是 user 或 assistant')
|
||||||
|
|
||||||
|
chat_msg = ChatMessage.objects.create(
|
||||||
|
user=request.user,
|
||||||
|
bot=bot,
|
||||||
|
message=message_text,
|
||||||
|
sender=sender,
|
||||||
|
message_type=ChatMessage.MESSAGE_TYPE_TEXT,
|
||||||
|
)
|
||||||
|
|
||||||
|
return created_response(data={
|
||||||
|
'id': chat_msg.id,
|
||||||
|
'timestamp': chat_msg.timestamp.isoformat(),
|
||||||
|
})
|
||||||
|
|
||||||
|
def delete(self, request):
|
||||||
|
bot = self._get_rtc_bot()
|
||||||
|
if bot is None:
|
||||||
|
return error_response(message='RTC Bot 未配置', code=500, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
|
|
||||||
|
count, _ = ChatMessage.objects.filter(user=request.user, bot=bot).delete()
|
||||||
|
return success_response(data={'deleted': count}, message=f'已删除 {count} 条记录')
|
||||||
Loading…
x
Reference in New Issue
Block a user