Skip to content
Merged

Trigger #4669

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
8 changes: 8 additions & 0 deletions apps/common/auth/authenticate.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,11 @@ def authenticate(self, request):
AppApiException):
raise e
raise AppAuthenticationFailed(1002, _('Authentication information is incorrect! illegal user'))


class WebhookAuth(TokenAuthentication):
keyword = "Bearer"

# 重新 authenticate 方法,自定义认证规则
def authenticate(self, request):
return None, {}
1 change: 1 addition & 0 deletions apps/maxkb/settings/base/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
'application',
'chat',
'oss',
'trigger',
'django_apscheduler',
]

Expand Down
1 change: 1 addition & 0 deletions apps/maxkb/urls/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
path(admin_api_prefix, include("knowledge.urls")),
path(admin_api_prefix, include("system_manage.urls")),
path(admin_api_prefix, include("application.urls")),
path(admin_api_prefix, include("trigger.urls")),
path(admin_api_prefix, include("oss.urls")),
path(chat_api_prefix, include("oss.urls")),
path(chat_api_prefix, include("chat.urls")),
Expand Down
Empty file added apps/trigger/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions apps/trigger/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
8 changes: 8 additions & 0 deletions apps/trigger/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# coding=utf-8
"""
@project: MaxKB
@Author:niu
@file: __init__.py.py
@date:2026/1/14 15:48
@desc:
"""
94 changes: 94 additions & 0 deletions apps/trigger/api/trigger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# coding=utf-8
"""
@project: MaxKB
@Author:niu
@file: trigger.py
@date:2026/1/14 15:49
@desc:
"""
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter
from rest_framework import serializers

from common.mixins.api_mixin import APIMixin
from knowledge.serializers.common import BatchSerializer
from trigger.serializers.trigger import TriggerCreateRequest, TriggerResponse, BatchActiveSerializer


class TriggerCreateAPI(APIMixin):
@staticmethod
def get_parameters():
return [
OpenApiParameter(
name="workspace_id",
description="工作空间id",
type=OpenApiTypes.STR,
location='path',
required=True,
)
]

@staticmethod
def get_request():
return TriggerCreateRequest

@staticmethod
def get_response():
return TriggerResponse

class TriggerBatchDeleteAPI(APIMixin):
@staticmethod
def get_parameters():
return [
OpenApiParameter(
name="workspace_id",
description="工作空间id",
type=OpenApiTypes.STR,
location='path',
required=True,
)
]
@staticmethod
def get_request():
return BatchSerializer

class TriggerBatchActiveAPI(APIMixin):
@staticmethod
def get_request():
return BatchActiveSerializer


class TriggerOperateAPI(APIMixin):
@staticmethod
def get_parameters():
return [
OpenApiParameter(
name="workspace_id",
description="工作空间id",
type=OpenApiTypes.STR,
location='path',
required=True,
),
OpenApiParameter(
name="trigger_id",
description="触发器id",
type=OpenApiTypes.STR,
location='path',
required=True,
),
]

@staticmethod
def get_request():
return TriggerCreateRequest

@staticmethod
def get_response():
return TriggerResponse
class RequestSE(serializers.Serializer):
pass

class TriggerEditAPI(APIMixin):
@staticmethod
def get_request():
return TriggerCreateRequest
6 changes: 6 additions & 0 deletions apps/trigger/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class TriggerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'trigger'
23 changes: 23 additions & 0 deletions apps/trigger/handler/base_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# coding=utf-8
"""
@project: MaxKB
@Author:虎虎
@file: base_task.py
@date:2026/1/14 19:03
@desc:
"""
from abc import ABC, abstractmethod


class BaseTriggerTask(ABC):
"""
任务执行器抽象
"""

@abstractmethod
def support(self, trigger_task, **kwargs):
pass

@abstractmethod
def execute(self, trigger_task, **kwargs):
pass
33 changes: 33 additions & 0 deletions apps/trigger/handler/base_trigger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# coding=utf-8
"""
@project: MaxKB
@Author:虎虎
@file: Trigger.py
@date:2026/1/14 18:45
@desc:
"""

from abc import ABC, abstractmethod


class BaseTrigger(ABC):
"""
触发器抽象
"""

@abstractmethod
def support(self, trigger, **kwargs):
pass

@abstractmethod
def deploy(self, trigger, **kwargs):
pass

@abstractmethod
def undeploy(self, trigger, **kwargs):
pass

@staticmethod
@abstractmethod
def execute(trigger, **kwargs):
pass
82 changes: 82 additions & 0 deletions apps/trigger/handler/impl/task/application_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# coding=utf-8
"""
@project: MaxKB
@Author:虎虎
@file: application_task.py
@date:2026/1/14 19:14
@desc:
"""
import uuid

from application.models import ChatUserType, Chat
from chat.serializers.chat import ChatSerializers
from trigger.handler.base_task import BaseTriggerTask


def get_reference(fields, obj):
for field in fields:
value = obj.get(field)
if value is None:
return None
else:
obj = value
return obj


def get_field_value(value, kwargs):
source = value.get('source')
if source == 'custom':
return value.get('value')
else:
return get_reference(value.get('value'), kwargs)


def get_application_execute_parameters(parameter_setting, kwargs):
parameters = {'form_data': {}}
question_setting = parameter_setting.get('question')
if question_setting:
parameters['message'] = get_field_value(question_setting, kwargs)
filed_list = ['image_list', 'document_list', 'audio_list', 'video_list', 'other_list']
for field in filed_list:
field_setting = parameter_setting.get(field)
if field_setting:
parameters[field] = get_field_value(field_setting, kwargs)
api_input_field_list = parameter_setting.get('api_input_field_list')
if api_input_field_list:
for key, value in api_input_field_list.item():
parameters['form_data'][key] = get_field_value(value, kwargs)
user_input_field_list = parameter_setting.get('user_input_field_list')
if user_input_field_list:
for key, value in user_input_field_list.item():
parameters['form_data'][key] = get_field_value(value, kwargs)
return parameters


class ApplicationTask(BaseTriggerTask):
def support(self, trigger_task, **kwargs):
return trigger_task.get('source_type') == 'APPLICATION'

def execute(self, trigger_task, **kwargs):
parameter_setting = trigger_task.get('parameter')
parameters = get_application_execute_parameters(parameter_setting, kwargs)
parameters['re_chat'] = False
parameters['stream'] = True
chat_id = uuid.uuid1()
chat_user_id = str(uuid.uuid1())
application_id = trigger_task.get('source_id')
message = parameters.get('message')
Chat.objects.get_or_create(id=chat_id, defaults={
'application_id': application_id,
'abstract': message,
'chat_user_id': chat_user_id,
'chat_user_type': ChatUserType.ANONYMOUS_USER.value,
'asker': {'username': "游客"}
})

list(ChatSerializers(data={
"chat_id": chat_id,
"chat_user_id": chat_user_id,
'chat_user_type': ChatUserType.ANONYMOUS_USER.value,
'application_id': application_id,
'debug': False
}).chat(instance=parameters))
Loading