Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions apps/application/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@
path('workspace/<str:workspace_id>/application/<str:application_id>/play_demo_text', views.PlayDemoText.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/mcp_tools', views.McpServers.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/model/<str:model_id>/prompt_generate', views.PromptGenerateView.as_view()),
path('chat_message/<str:chat_id>', views.ChatView.as_view()),
path('chat_message/<str:chat_id>/cancel', views.CancelWorkflowView.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/chat/<str:chat_id>/chat_message', views.ChatView.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/chat/<str:chat_id>/cancel_chat_message', views.CancelWorkflowView.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/chat/<str:chat_id>/chat_record/<str:chat_record_id>/resume_chat_message', views.ResumeStreamView.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/historical_conversation/<int:current_page>/<int:page_size>', views.DebugHistoricalConversation.PageView.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/historical_conversation/<str:chat_id>', views.DebugHistoricalConversation.Operate.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/historical_conversation_record/<str:chat_id>/<int:current_page>/<int:page_size>', views.DebugHistoricalConversation.RecordPageView.as_view()),
Expand Down
43 changes: 37 additions & 6 deletions apps/application/views/application_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@
@date:2025/6/10 11:00
@desc:
"""
import uuid_utils.compat as uuid
from django.db.models import QuerySet

from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema
from rest_framework.request import Request
Expand All @@ -20,7 +19,7 @@
from application.serializers.application_chat import ApplicationChatQuerySerializers
from chat.api.chat_api import ChatAPI, PromptGenerateAPI, PageHistoricalConversationAPI, HistoricalConversationRecordAPI
from chat.api.chat_authentication_api import ChatOpenAPI
from chat.serializers.chat import OpenChatSerializers, ChatSerializers, DebugChatSerializers, PromptGenerateSerializer
from chat.serializers.chat import OpenChatSerializers, DebugChatSerializers, PromptGenerateSerializer, ResumeSerializers
from common.auth import TokenAuth
from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
Expand Down Expand Up @@ -157,7 +156,13 @@ class ChatView(APIView):
responses=None,
tags=[_('Application')] # type: ignore
)
def post(self, request: Request, chat_id: str):
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
ViewPermission([RoleConstants.USER.get_workspace_role()],
[PermissionConstants.APPLICATION.get_workspace_application_permission()],
CompareConstants.AND),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
def post(self, request: Request, workspace_id: str, application_id: str, chat_id: str):
return DebugChatSerializers(data={'chat_id': chat_id}).chat(request.data)


Expand All @@ -171,15 +176,41 @@ class CancelWorkflowView(APIView):
operation_id=_("Cancel running workflow"), # type: ignore
tags=[_('Application')] # type: ignore
)
def post(self, request: Request, chat_id: str):
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
ViewPermission([RoleConstants.USER.get_workspace_role()],
[PermissionConstants.APPLICATION.get_workspace_application_permission()],
CompareConstants.AND),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
def post(self, request: Request, workspace_id: str, application_id: str, chat_id: str):
from application.workflow.workflow_run_registry import WorkflowRunRegistry, CancelResult
result_enum = WorkflowRunRegistry.cancel_by_chat_id(chat_id)
if result_enum == CancelResult.CANCELLED:
return result.success({'status': 'cancelled', 'chat_id': chat_id})
elif result_enum == CancelResult.NOT_FOUND:
return result.success({'status': 'not_found', 'chat_id': chat_id})
else:
return result.fail(500, _('Failed to cancel workflow'))
return result.error(_('Failed to cancel workflow'))


class ResumeStreamView(APIView):
authentication_classes = [TokenAuth]

@extend_schema(
methods=['POST'],
description=_("Resume stream for workflow"),
summary=_("Resume stream for workflow"),
operation_id=_("Resume stream for workflow"), # type: ignore
tags=[_('Application')] # type: ignore
)
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
ViewPermission([RoleConstants.USER.get_workspace_role()],
[PermissionConstants.APPLICATION.get_workspace_application_permission()],
CompareConstants.AND),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
def post(self, request: Request, workspace_id: str, application_id: str, chat_id: str, chat_record_id: str):
return ResumeSerializers(data={'chat_id': chat_id, 'chat_record_id': chat_record_id}).resume(request)


class PromptGenerateView(APIView):
Expand Down
25 changes: 25 additions & 0 deletions apps/application/workflow/message/struct/failure_content.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# coding=utf-8
"""
@project: MaxKB
@Author:虎虎虎
@file: failure_content.py
@date:2026/7/27 11:14
@desc:
"""
from typing import Optional

from application.workflow.content_type import ContentType
from application.workflow.message.struct.content import Content, NodeInfo, Position
from application.workflow.status import Status


class FailureContent(Content):
def __init__(self, _id, content: str, status: Status, node_info: Optional[NodeInfo], position: Optional[Position],
**kwargs):
self.content = content
super().__init__(_id, status, ContentType.FAILURE, node_info, position, **kwargs)

def to_dict(self):
result = super().to_dict()
result['content'] = self.content
return result
Loading
Loading