|
6 | 6 | @date:2025/5/7 15:29
|
7 | 7 | @desc:
|
8 | 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 | + |
| 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" |
0 commit comments