application.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: application.py
  6. @date:2025/5/7 15:29
  7. @desc:
  8. """
  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. from common.mixins.app_model_mixin import AppModelMixin
  14. from knowledge.models import Knowledge
  15. from models_provider.models import Model
  16. from users.models import User
  17. class ApplicationFolder(MPTTModel, AppModelMixin):
  18. id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id")
  19. name = models.CharField(max_length=64, verbose_name="文件夹名称", db_index=True)
  20. desc = models.CharField(max_length=200, null=True, blank=True, verbose_name="描述")
  21. user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
  22. workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
  23. parent = TreeForeignKey('self', on_delete=models.DO_NOTHING, null=True, blank=True, related_name='children')
  24. class Meta:
  25. db_table = "application_folder"
  26. class MPTTMeta:
  27. order_insertion_by = ['name']
  28. class ApplicationTypeChoices(models.TextChoices):
  29. """订单类型"""
  30. SIMPLE = 'SIMPLE', '简易'
  31. WORK_FLOW = 'WORK_FLOW', '工作流'
  32. def get_dataset_setting_dict():
  33. return {'top_n': 3, 'similarity': 0.6, 'max_paragraph_char_number': 5000, 'search_mode': 'embedding',
  34. 'no_references_setting': {
  35. 'status': 'ai_questioning',
  36. 'value': '{question}'
  37. }}
  38. def get_model_setting_dict():
  39. return {
  40. 'prompt': Application.get_default_model_prompt(),
  41. 'no_references_prompt': '{question}',
  42. 'reasoning_content_start': '<think>',
  43. 'reasoning_content_end': '</think>',
  44. 'reasoning_content_enable': False,
  45. }
  46. class Application(AppModelMixin):
  47. id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
  48. workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
  49. folder = models.ForeignKey(ApplicationFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id",
  50. default='default')
  51. is_publish = models.BooleanField(verbose_name="是否发布", default=False)
  52. name = models.CharField(max_length=128, verbose_name="应用名称", db_index=True)
  53. desc = models.CharField(max_length=512, verbose_name="引用描述", default="")
  54. prologue = models.CharField(max_length=40960, verbose_name="开场白", default="")
  55. dialogue_number = models.IntegerField(default=0, verbose_name="会话数量")
  56. user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
  57. model = models.ForeignKey(Model, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
  58. knowledge_setting = models.JSONField(verbose_name="数据集参数设置", default=get_dataset_setting_dict)
  59. model_setting = models.JSONField(verbose_name="模型参数相关设置", default=get_model_setting_dict)
  60. model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
  61. tts_model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
  62. stt_model_params_setting = models.JSONField(verbose_name="STT模型参数相关设置", default=dict)
  63. problem_optimization = models.BooleanField(verbose_name="问题优化", default=False)
  64. icon = models.CharField(max_length=256, verbose_name="应用icon", default="./favicon.ico")
  65. work_flow = models.JSONField(verbose_name="工作流数据", default=dict)
  66. type = models.CharField(verbose_name="应用类型", choices=ApplicationTypeChoices.choices,
  67. default=ApplicationTypeChoices.SIMPLE, max_length=256)
  68. problem_optimization_prompt = models.CharField(verbose_name="问题优化提示词", max_length=102400, blank=True,
  69. null=True,
  70. default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中")
  71. tts_model = models.ForeignKey(Model, related_name='tts_model_id', on_delete=models.SET_NULL, db_constraint=False,
  72. blank=True, null=True)
  73. stt_model = models.ForeignKey(Model, related_name='stt_model_id', on_delete=models.SET_NULL, db_constraint=False,
  74. blank=True, null=True)
  75. tts_model_enable = models.BooleanField(verbose_name="语音合成模型是否启用", default=False)
  76. stt_model_enable = models.BooleanField(verbose_name="语音识别模型是否启用", default=False)
  77. tts_type = models.CharField(verbose_name="语音播放类型", max_length=20, default="BROWSER")
  78. tts_autoplay = models.BooleanField(verbose_name="自动播放", default=False)
  79. stt_autosend = models.BooleanField(verbose_name="自动发送", default=False)
  80. clean_time = models.IntegerField(verbose_name="清理时间", default=180)
  81. publish_time = models.DateTimeField(verbose_name="发布时间", default=None, null=True, blank=True)
  82. file_upload_enable = models.BooleanField(verbose_name="文件上传是否启用", default=False)
  83. file_upload_setting = models.JSONField(verbose_name="文件上传相关设置", default=dict)
  84. mcp_enable = models.BooleanField(verbose_name="MCP否启用", default=False)
  85. mcp_tool_ids = models.JSONField(verbose_name="MCP工具ID列表", default=list)
  86. mcp_servers = models.JSONField(verbose_name="MCP服务列表", default=dict)
  87. mcp_source = models.CharField(verbose_name="MCP Source", max_length=20, default="referencing")
  88. tool_enable = models.BooleanField(verbose_name="工具是否启用", default=False)
  89. tool_ids = models.JSONField(verbose_name="工具ID列表", default=list)
  90. application_enable = models.BooleanField(verbose_name="应用是否启用", default=False)
  91. application_ids = models.JSONField(verbose_name="应用ID列表", default=list)
  92. skill_tool_ids = models.JSONField(verbose_name="技能ID列表", default=list)
  93. mcp_output_enable = models.BooleanField(verbose_name="MCP输出是否启用", default=True)
  94. file_clean_time = models.IntegerField(verbose_name="文件清理时间", default=180)
  95. memory_enable = models.BooleanField(verbose_name="记忆是否启用", default=False)
  96. memory_config = models.JSONField(verbose_name="记忆配置", default=dict)
  97. @staticmethod
  98. def get_default_model_prompt():
  99. return ('已知信息:'
  100. '\n{data}'
  101. '\n回答要求:'
  102. '\n- 如果你不知道答案或者没有从获取答案,请回答“没有在知识库中查找到相关信息,建议咨询相关技术支持或参考官方文档进行操作”。'
  103. '\n- 避免提及你是从<data></data>中获得的知识。'
  104. '\n- 请保持答案与<data></data>中描述的一致。'
  105. '\n- 请使用markdown 语法优化答案的格式。'
  106. '\n- <data></data>中的图片链接、链接地址和脚本语言请完整返回。'
  107. '\n- 请使用与问题相同的语言来回答。'
  108. '\n问题:'
  109. '\n{question}')
  110. class Meta:
  111. db_table = "application"
  112. class ApplicationKnowledgeMapping(AppModelMixin):
  113. id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
  114. application = models.ForeignKey(Application, on_delete=models.DO_NOTHING)
  115. knowledge = models.ForeignKey(Knowledge, on_delete=models.DO_NOTHING)
  116. class Meta:
  117. db_table = "application_knowledge_mapping"
  118. class ApplicationVersion(AppModelMixin):
  119. id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
  120. application = models.ForeignKey(Application, on_delete=models.CASCADE)
  121. name = models.CharField(verbose_name="版本名称", max_length=128, default="")
  122. publish_user_id = models.UUIDField(verbose_name="发布者id", max_length=128, default=None, null=True)
  123. publish_user_name = models.CharField(verbose_name="发布者名称", max_length=128, default="")
  124. workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
  125. application_name = models.CharField(max_length=128, verbose_name="应用名称")
  126. desc = models.CharField(max_length=512, verbose_name="引用描述", default="")
  127. prologue = models.CharField(max_length=40960, verbose_name="开场白", default="")
  128. dialogue_number = models.IntegerField(default=0, verbose_name="会话数量")
  129. user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
  130. model_id = models.UUIDField(verbose_name="大语言模型", blank=True, null=True)
  131. knowledge_setting = models.JSONField(verbose_name="数据集参数设置", default=get_dataset_setting_dict)
  132. model_setting = models.JSONField(verbose_name="模型参数相关设置", default=get_model_setting_dict)
  133. model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
  134. tts_model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
  135. stt_model_params_setting = models.JSONField(verbose_name="STT模型参数相关设置", default=dict)
  136. problem_optimization = models.BooleanField(verbose_name="问题优化", default=False)
  137. icon = models.CharField(max_length=256, verbose_name="应用icon", default="./favicon.ico")
  138. work_flow = models.JSONField(verbose_name="工作流数据", default=dict)
  139. type = models.CharField(verbose_name="应用类型", choices=ApplicationTypeChoices.choices,
  140. default=ApplicationTypeChoices.SIMPLE, max_length=256)
  141. problem_optimization_prompt = models.CharField(verbose_name="问题优化提示词", max_length=102400, blank=True,
  142. null=True,
  143. default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中")
  144. tts_model_id = models.UUIDField(verbose_name="文本转语音模型id",
  145. blank=True, null=True)
  146. stt_model_id = models.UUIDField(verbose_name="语音转文本模型id",
  147. blank=True, null=True)
  148. tts_model_enable = models.BooleanField(verbose_name="语音合成模型是否启用", default=False)
  149. stt_model_enable = models.BooleanField(verbose_name="语音识别模型是否启用", default=False)
  150. tts_type = models.CharField(verbose_name="语音播放类型", max_length=20, default="BROWSER")
  151. tts_autoplay = models.BooleanField(verbose_name="自动播放", default=False)
  152. stt_autosend = models.BooleanField(verbose_name="自动发送", default=False)
  153. clean_time = models.IntegerField(verbose_name="清理时间", default=180)
  154. file_upload_enable = models.BooleanField(verbose_name="文件上传是否启用", default=False)
  155. file_upload_setting = models.JSONField(verbose_name="文件上传相关设置", default=dict)
  156. mcp_enable = models.BooleanField(verbose_name="MCP否启用", default=False)
  157. mcp_tool_ids = models.JSONField(verbose_name="MCP工具ID列表", default=list)
  158. mcp_servers = models.JSONField(verbose_name="MCP服务列表", default=dict)
  159. mcp_source = models.CharField(verbose_name="MCP Source", max_length=20, default="referencing")
  160. tool_enable = models.BooleanField(verbose_name="工具是否启用", default=False)
  161. tool_ids = models.JSONField(verbose_name="工具ID列表", default=list)
  162. application_enable = models.BooleanField(verbose_name="应用是否启用", default=False)
  163. application_ids = models.JSONField(verbose_name="应用ID列表", default=list)
  164. skill_tool_ids = models.JSONField(verbose_name="技能ID列表", default=list)
  165. mcp_output_enable = models.BooleanField(verbose_name="MCP输出是否启用", default=True)
  166. class Meta:
  167. db_table = "application_version"