Skip to content

Commit 9e7279e

Browse files
authored
feat: application model (#3146)
1 parent b7843fd commit 9e7279e

File tree

2 files changed

+103
-4
lines changed

2 files changed

+103
-4
lines changed

apps/application/models/application.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,103 @@
66
@date:2025/5/7 15:29
77
@desc:
88
"""
9+
import uuid_utils.compat as uuid
10+
from django.db import models
11+
from mptt.fields import TreeForeignKey
12+
from mptt.models import MPTTModel
13+
14+
from common.mixins.app_model_mixin import AppModelMixin
15+
from models_provider.models import Model
16+
from users.models import User
17+
18+
19+
class ApplicationFolder(MPTTModel, AppModelMixin):
20+
id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id")
21+
name = models.CharField(max_length=64, verbose_name="文件夹名称")
22+
desc = models.CharField(max_length=200, null=True, blank=True, verbose_name="描述")
23+
user = models.ForeignKey(User, on_delete=models.DO_NOTHING, verbose_name="用户id")
24+
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
25+
parent = TreeForeignKey('self', on_delete=models.DO_NOTHING, null=True, blank=True, related_name='children')
26+
27+
class Meta:
28+
db_table = "application_folder"
29+
30+
class MPTTMeta:
31+
order_insertion_by = ['name']
32+
33+
34+
class ApplicationTypeChoices(models.TextChoices):
35+
"""订单类型"""
36+
SIMPLE = 'SIMPLE', '简易'
37+
WORK_FLOW = 'WORK_FLOW', '工作流'
38+
39+
40+
def get_dataset_setting_dict():
41+
return {'top_n': 3, 'similarity': 0.6, 'max_paragraph_char_number': 5000, 'search_mode': 'embedding',
42+
'no_references_setting': {
43+
'status': 'ai_questioning',
44+
'value': '{question}'
45+
}}
46+
47+
48+
def get_model_setting_dict():
49+
return {
50+
'prompt': Application.get_default_model_prompt(),
51+
'no_references_prompt': '{question}',
52+
'reasoning_content_start': '<think>',
53+
'reasoning_content_end': '</think>',
54+
'reasoning_content_enable': False,
55+
}
56+
57+
58+
class Application(AppModelMixin):
59+
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
60+
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
61+
folder = models.ForeignKey(ApplicationFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id", default='root')
62+
name = models.CharField(max_length=128, verbose_name="应用名称")
63+
desc = models.CharField(max_length=512, verbose_name="引用描述", default="")
64+
prologue = models.CharField(max_length=40960, verbose_name="开场白", default="")
65+
dialogue_number = models.IntegerField(default=0, verbose_name="会话数量")
66+
user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
67+
model = models.ForeignKey(Model, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
68+
dataset_setting = models.JSONField(verbose_name="数据集参数设置", default=get_dataset_setting_dict)
69+
model_setting = models.JSONField(verbose_name="模型参数相关设置", default=get_model_setting_dict)
70+
model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
71+
tts_model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
72+
problem_optimization = models.BooleanField(verbose_name="问题优化", default=False)
73+
icon = models.CharField(max_length=256, verbose_name="应用icon", default="/ui/favicon.ico")
74+
work_flow = models.JSONField(verbose_name="工作流数据", default=dict)
75+
type = models.CharField(verbose_name="应用类型", choices=ApplicationTypeChoices.choices,
76+
default=ApplicationTypeChoices.SIMPLE, max_length=256)
77+
problem_optimization_prompt = models.CharField(verbose_name="问题优化提示词", max_length=102400, blank=True,
78+
null=True,
79+
default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中")
80+
tts_model = models.ForeignKey(Model, related_name='tts_model_id', on_delete=models.SET_NULL, db_constraint=False,
81+
blank=True, null=True)
82+
stt_model = models.ForeignKey(Model, related_name='stt_model_id', on_delete=models.SET_NULL, db_constraint=False,
83+
blank=True, null=True)
84+
tts_model_enable = models.BooleanField(verbose_name="语音合成模型是否启用", default=False)
85+
stt_model_enable = models.BooleanField(verbose_name="语音识别模型是否启用", default=False)
86+
tts_type = models.CharField(verbose_name="语音播放类型", max_length=20, default="BROWSER")
87+
tts_autoplay = models.BooleanField(verbose_name="自动播放", default=False)
88+
stt_autosend = models.BooleanField(verbose_name="自动发送", default=False)
89+
clean_time = models.IntegerField(verbose_name="清理时间", default=180)
90+
file_upload_enable = models.BooleanField(verbose_name="文件上传是否启用", default=False)
91+
file_upload_setting = models.JSONField(verbose_name="文件上传相关设置", default=dict)
92+
93+
@staticmethod
94+
def get_default_model_prompt():
95+
return ('已知信息:'
96+
'\n{data}'
97+
'\n回答要求:'
98+
'\n- 如果你不知道答案或者没有从获取答案,请回答“没有在知识库中查找到相关信息,建议咨询相关技术支持或参考官方文档进行操作”。'
99+
'\n- 避免提及你是从<data></data>中获得的知识。'
100+
'\n- 请保持答案与<data></data>中描述的一致。'
101+
'\n- 请使用markdown 语法优化答案的格式。'
102+
'\n- <data></data>中的图片链接、链接地址和脚本语言请完整返回。'
103+
'\n- 请使用与问题相同的语言来回答。'
104+
'\n问题:'
105+
'\n{question}')
106+
107+
class Meta:
108+
db_table = "application"

apps/folders/serializers/folder.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.utils.translation import gettext_lazy as _
77
from rest_framework import serializers
88

9+
from application.models.application import Application, ApplicationFolder
910
from common.constants.permission_constants import Group
1011
from folders.api.folder import FolderCreateRequest
1112
from knowledge.models import KnowledgeFolder, Knowledge
@@ -18,8 +19,7 @@ def get_source_type(source):
1819
if source == Group.TOOL.name:
1920
return Tool
2021
elif source == Group.APPLICATION.name:
21-
# todo app folder
22-
return None
22+
return Application
2323
elif source == Group.KNOWLEDGE.name:
2424
return Knowledge
2525
else:
@@ -30,8 +30,7 @@ def get_folder_type(source):
3030
if source == Group.TOOL.name:
3131
return ToolFolder
3232
elif source == Group.APPLICATION.name:
33-
# todo app folder
34-
return None
33+
return ApplicationFolder
3534
# return ApplicationFolder
3635
elif source == Group.KNOWLEDGE.name:
3736
return KnowledgeFolder

0 commit comments

Comments
 (0)