From 293c41f039db1d91dea66717fe01aff7d32cf372 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Tue, 21 Jul 2026 11:24:26 +0800 Subject: [PATCH 1/2] cache --- apps/application/urls.py | 3 + apps/application/views/application_chat.py | 68 ++- ui/src/components/conversation/api/index.ts | 68 ++- .../conversation/chat-panel/index.vue | 489 +++++++++--------- .../components/conversation/common/types.ts | 22 + .../common/use-chat-store/chat/index.ts | 130 +++++ .../common/use-chat-store/debug/index.ts | 135 +++++ .../common/use-chat-store/index.ts | 6 + .../shared/use-conversation-crud.ts | 44 ++ .../shared/use-message-pagination.ts | 72 +++ .../shared/use-stream-manager.ts | 63 +++ ui/src/components/conversation/composable.ts | 353 ------------- .../components/conversation/content/index.vue | 4 +- .../conversation/content/items/question.vue | 148 ++++++ ui/src/components/conversation/index.vue | 324 ++++++------ .../components/conversation/sidebar/index.vue | 3 - ui/src/views/application-workflow/index.vue | 2 - 17 files changed, 1157 insertions(+), 777 deletions(-) create mode 100644 ui/src/components/conversation/common/types.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/chat/index.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/debug/index.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/index.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/shared/use-conversation-crud.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/shared/use-message-pagination.ts create mode 100644 ui/src/components/conversation/common/use-chat-store/shared/use-stream-manager.ts delete mode 100644 ui/src/components/conversation/composable.ts create mode 100644 ui/src/components/conversation/content/items/question.vue diff --git a/apps/application/urls.py b/apps/application/urls.py index 1c473b63935..976fb1fbb0c 100644 --- a/apps/application/urls.py +++ b/apps/application/urls.py @@ -44,4 +44,7 @@ path('workspace//application//mcp_tools', views.McpServers.as_view()), path('workspace//application//model//prompt_generate', views.PromptGenerateView.as_view()), path('chat_message/', views.ChatView.as_view()), + path('workspace//application//historical_conversation//', views.DebugHistoricalConversation.PageView.as_view()), + path('workspace//application//historical_conversation/', views.DebugHistoricalConversation.Operate.as_view()), + path('workspace//application//historical_conversation_record///', views.DebugHistoricalConversation.RecordPageView.as_view()), ] diff --git a/apps/application/views/application_chat.py b/apps/application/views/application_chat.py index d60206ded5a..664f3c37eac 100644 --- a/apps/application/views/application_chat.py +++ b/apps/application/views/application_chat.py @@ -176,4 +176,70 @@ class PromptGenerateView(APIView): @log(menu='Application', operate='Generate prompt', get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def post(self, request: Request, workspace_id: str, model_id:str, application_id: str): - return PromptGenerateSerializer(data={'workspace_id': workspace_id, 'model_id': model_id, 'application_id': application_id}).generate_prompt(instance=request.data) \ No newline at end of file + return PromptGenerateSerializer(data={'workspace_id': workspace_id, 'model_id': model_id, 'application_id': application_id}).generate_prompt(instance=request.data) + + +class DebugHistoricalConversation(APIView): + authentication_classes = [TokenAuth] + + class PageView(APIView): + authentication_classes = [TokenAuth] + + def get(self, request: Request, workspace_id: str, application_id: str, current_page: int, page_size: int): + from chat.serializers.chat_record import HistoricalConversationSerializer, page_search, HistoryChatModel + from django.db.models import QuerySet + from application.models import Chat + + queryset = QuerySet(Chat).filter( + application_id=application_id, + is_deleted=False + ).order_by('-update_time', 'id') + + return result.success( + page_search(current_page, page_size, queryset, lambda r: HistoryChatModel(r).data) + ) + + class RecordPageView(APIView): + authentication_classes = [TokenAuth] + + def get(self, request: Request, workspace_id: str, application_id: str, chat_id: str, current_page: int, page_size: int): + from chat.serializers.chat_record import HistoricalConversationRecordSerializer + + serializer = HistoricalConversationRecordSerializer( + data={ + 'application_id': application_id, + 'chat_id': chat_id, + 'chat_user_id': str(uuid.uuid7()), + } + ) + try: + return result.success(serializer.page(current_page, page_size)) + except Exception: + from django.db.models import QuerySet + from application.models import ChatRecord + from common.db.search import page_search + from application.serializers.application_chat_record import ChatRecordSerializerModel + + queryset = QuerySet(ChatRecord).filter( + chat_id=chat_id, + ).order_by('create_time', 'id') + + return result.success( + page_search(current_page, page_size, queryset, lambda r: ChatRecordSerializerModel(r).data) + ) + + class Operate(APIView): + authentication_classes = [TokenAuth] + + def delete(self, request: Request, workspace_id: str, application_id: str, chat_id: str): + from django.db.models import QuerySet + from application.models import Chat + QuerySet(Chat).filter(id=chat_id, application_id=application_id).update(is_deleted=True) + return result.success(True) + + def put(self, request: Request, workspace_id: str, application_id: str, chat_id: str): + from django.db.models import QuerySet + from application.models import Chat + abstract = request.data.get('abstract', '') + QuerySet(Chat).filter(id=chat_id, application_id=application_id).update(abstract=abstract) + return result.success(True) \ No newline at end of file diff --git a/ui/src/components/conversation/api/index.ts b/ui/src/components/conversation/api/index.ts index 382b6bc97bb..b8f4f5771ff 100644 --- a/ui/src/components/conversation/api/index.ts +++ b/ui/src/components/conversation/api/index.ts @@ -1,5 +1,5 @@ -import { get as adminGet, postStream as adminPostStream, del as adminDel, put as adminPut } from '@/request/index' -import { get as chatGet, postStream as chatPostStream, del as chatDel, put as chatPut } from '@/request/chat/index' +import { get as adminGet, postStream as adminPostStream, del as adminDel, put as adminPut, post as adminPost } from '@/request/index' +import { get as chatGet, postStream as chatPostStream, del as chatDel, put as chatPut, post as chatPost } from '@/request/chat/index' import useStore from '@/stores' const adminPrefix = (window.MaxKB?.prefix || '/admin') + '/api' @@ -14,17 +14,52 @@ export const debugApi = { chat: (chatId: string, data: any) => adminPostStream(`${adminPrefix}/chat_message/${chatId}`, data), - history: (page: number, size: number) => - adminGet(`/historical_conversation/${page}/${size}`), + history: (page: number, size: number, applicationId?: string) => { + const { user } = useStore() + const wsId = user.getWorkspaceId() + if (applicationId) { + return adminGet(`/workspace/${wsId}/application/${applicationId}/historical_conversation/${page}/${size}`) + } + return adminGet(`/historical_conversation/${page}/${size}`) + }, - records: (chatId: string, page: number, size: number) => - adminGet(`/historical_conversation_record/${chatId}/${page}/${size}`), + records: (chatId: string, page: number, size: number, applicationId?: string) => { + const { user } = useStore() + const wsId = user.getWorkspaceId() + if (applicationId) { + return adminGet(`/workspace/${wsId}/application/${applicationId}/historical_conversation_record/${chatId}/${page}/${size}`) + } + return adminGet(`/historical_conversation_record/${chatId}/${page}/${size}`) + }, - deleteChat: (chatId: string) => - adminDel(`/historical_conversation/${chatId}`), + deleteChat: (chatId: string, applicationId?: string) => { + const { user } = useStore() + const wsId = user.getWorkspaceId() + if (applicationId) { + return adminDel(`/workspace/${wsId}/application/${applicationId}/historical_conversation/${chatId}`) + } + return adminDel(`/historical_conversation/${chatId}`) + }, - modifyChat: (chatId: string, data: any) => - adminPut(`/historical_conversation/${chatId}`, data) + modifyChat: (chatId: string, data: any, applicationId?: string) => { + const { user } = useStore() + const wsId = user.getWorkspaceId() + if (applicationId) { + return adminPut(`/workspace/${wsId}/application/${applicationId}/historical_conversation/${chatId}`, data) + } + return adminPut(`/historical_conversation/${chatId}`, data) + }, + + uploadFile: (file: File, chatId: string) => { + const fd = new FormData() + fd.append('file', file) + fd.append('source_id', chatId) + fd.append('source_type', 'CHAT') + return adminPost('/oss/file', fd) + }, + + speechToText: (data: any) => + adminPost(`/speech_to_text`, data), } export const chatApi = { @@ -44,7 +79,18 @@ export const chatApi = { chatDel(`/historical_conversation/${chatId}`), modifyChat: (chatId: string, data: any) => - chatPut(`/historical_conversation/${chatId}`, data) + chatPut(`/historical_conversation/${chatId}`, data), + + uploadFile: (file: File, chatId: string) => { + const fd = new FormData() + fd.append('file', file) + fd.append('source_id', chatId) + fd.append('source_type', 'CHAT') + return chatPost('/oss/file', fd) + }, + + speechToText: (data: any) => + chatPost(`/speech_to_text`, data), } export type ChatType = 'CHAT' | 'DEBUG' diff --git a/ui/src/components/conversation/chat-panel/index.vue b/ui/src/components/conversation/chat-panel/index.vue index af280128128..ff50e1595dc 100644 --- a/ui/src/components/conversation/chat-panel/index.vue +++ b/ui/src/components/conversation/chat-panel/index.vue @@ -1,63 +1,93 @@