diff --git a/apps/application/migrations/0001_initial.py b/apps/application/migrations/0001_initial.py index 4c6dd91a6..707f30322 100644 --- a/apps/application/migrations/0001_initial.py +++ b/apps/application/migrations/0001_initial.py @@ -1,8 +1,10 @@ -# Generated by Django 5.2.1 on 2025-05-26 10:19 +# Generated by Django 5.2.1 on 2025-05-27 06:42 import application.models.application +import django.contrib.postgres.fields import django.db.models.deletion import mptt.fields +import uuid import uuid_utils.compat from django.db import migrations, models @@ -17,26 +19,6 @@ class Migration(migrations.Migration): ] operations = [ - migrations.CreateModel( - name='ApplicationFolder', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), - ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), - ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), - ('lft', models.PositiveIntegerField(editable=False)), - ('rght', models.PositiveIntegerField(editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(editable=False)), - ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='application.applicationfolder')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='用户id')), - ], - options={ - 'db_table': 'application_folder', - }, - ), migrations.CreateModel( name='Application', fields=[ @@ -44,6 +26,7 @@ class Migration(migrations.Migration): ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('is_publish', models.BooleanField(default=False, verbose_name='是否发布')), ('name', models.CharField(max_length=128, verbose_name='应用名称')), ('desc', models.CharField(default='', max_length=512, verbose_name='引用描述')), ('prologue', models.CharField(default='', max_length=40960, verbose_name='开场白')), @@ -69,10 +52,82 @@ class Migration(migrations.Migration): ('stt_model', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stt_model_id', to='models_provider.model')), ('tts_model', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tts_model_id', to='models_provider.model')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user')), - ('folder', models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, to='application.applicationfolder', verbose_name='文件夹id')), ], options={ 'db_table': 'application', }, ), + migrations.CreateModel( + name='ApplicationAccessToken', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('application', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='application.application', verbose_name='应用id')), + ('access_token', models.CharField(max_length=128, unique=True, verbose_name='用户公开访问 认证token')), + ('is_active', models.BooleanField(default=True, verbose_name='是否开启公开访问')), + ('access_num', models.IntegerField(default=100, verbose_name='访问次数')), + ('white_active', models.BooleanField(default=False, verbose_name='是否开启白名单')), + ('white_list', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=128), default=list, size=None, verbose_name='白名单列表')), + ('show_source', models.BooleanField(default=False, verbose_name='是否显示知识来源')), + ('language', models.CharField(default=None, max_length=10, null=True, verbose_name='语言')), + ], + options={ + 'db_table': 'application_access_token', + }, + ), + migrations.CreateModel( + name='ApplicationApiKey', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('secret_key', models.CharField(max_length=1024, unique=True, verbose_name='秘钥')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('is_active', models.BooleanField(default=True, verbose_name='是否开启')), + ('allow_cross_domain', models.BooleanField(default=False, verbose_name='是否允许跨域')), + ('cross_domain_list', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=128), default=list, size=None, verbose_name='跨域列表')), + ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.application', verbose_name='应用id')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.user', verbose_name='用户id')), + ], + options={ + 'db_table': 'application_api_key', + }, + ), + migrations.CreateModel( + name='ApplicationFolder', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), + ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), + ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('lft', models.PositiveIntegerField(editable=False)), + ('rght', models.PositiveIntegerField(editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='application.applicationfolder')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='用户id')), + ], + options={ + 'db_table': 'application_folder', + }, + ), + migrations.AddField( + model_name='application', + name='folder', + field=models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, to='application.applicationfolder', verbose_name='文件夹id'), + ), + migrations.CreateModel( + name='ApplicationKnowledgeMapping', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('application', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='application.application')), + ], + options={ + 'db_table': 'application_knowledge_mapping', + }, + ), ] diff --git a/apps/application/migrations/0002_applicationapikey.py b/apps/application/migrations/0002_applicationapikey.py deleted file mode 100644 index 8629039fb..000000000 --- a/apps/application/migrations/0002_applicationapikey.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.2.1 on 2025-05-26 10:21 - -import django.contrib.postgres.fields -import django.db.models.deletion -import uuid -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('application', '0001_initial'), - ('users', '0002_alter_user_nick_name'), - ] - - operations = [ - migrations.CreateModel( - name='ApplicationApiKey', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('secret_key', models.CharField(max_length=1024, unique=True, verbose_name='秘钥')), - ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), - ('is_active', models.BooleanField(default=True, verbose_name='是否开启')), - ('allow_cross_domain', models.BooleanField(default=False, verbose_name='是否允许跨域')), - ('cross_domain_list', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=128), default=list, size=None, verbose_name='跨域列表')), - ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.application', verbose_name='应用id')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.user', verbose_name='用户id')), - ], - options={ - 'db_table': 'application_api_key', - }, - ), - ] diff --git a/apps/application/migrations/0002_initial.py b/apps/application/migrations/0002_initial.py new file mode 100644 index 000000000..fbec8994e --- /dev/null +++ b/apps/application/migrations/0002_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 5.2.1 on 2025-05-27 06:42 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('application', '0001_initial'), + ('knowledge', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='applicationknowledgemapping', + name='knowledge', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge'), + ), + ] diff --git a/apps/application/migrations/0003_applicationaccesstoken_application_is_publish_and_more.py b/apps/application/migrations/0003_applicationaccesstoken_application_is_publish_and_more.py deleted file mode 100644 index d25859aff..000000000 --- a/apps/application/migrations/0003_applicationaccesstoken_application_is_publish_and_more.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 5.2 on 2025-05-27 03:05 - -import django.contrib.postgres.fields -import django.db.models.deletion -import uuid_utils.compat -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('application', '0002_applicationapikey'), - ('knowledge', '0007_alter_document_status_alter_paragraph_status_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='ApplicationAccessToken', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('application', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='application.application', verbose_name='应用id')), - ('access_token', models.CharField(max_length=128, unique=True, verbose_name='用户公开访问 认证token')), - ('is_active', models.BooleanField(default=True, verbose_name='是否开启公开访问')), - ('access_num', models.IntegerField(default=100, verbose_name='访问次数')), - ('white_active', models.BooleanField(default=False, verbose_name='是否开启白名单')), - ('white_list', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=128), default=list, size=None, verbose_name='白名单列表')), - ('show_source', models.BooleanField(default=False, verbose_name='是否显示知识来源')), - ('language', models.CharField(default=None, max_length=10, null=True, verbose_name='语言')), - ], - options={ - 'db_table': 'application_access_token', - }, - ), - migrations.AddField( - model_name='application', - name='is_publish', - field=models.BooleanField(default=False, verbose_name='是否发布'), - ), - migrations.CreateModel( - name='ApplicationKnowledgeMapping', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('application', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='application.application')), - ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), - ], - options={ - 'db_table': 'application_knowledge_mapping', - }, - ), - ] diff --git a/apps/knowledge/migrations/0001_initial.py b/apps/knowledge/migrations/0001_initial.py index 6df42ecab..fcac6c11b 100644 --- a/apps/knowledge/migrations/0001_initial.py +++ b/apps/knowledge/migrations/0001_initial.py @@ -1,25 +1,20 @@ -# Generated by Django 5.2 on 2025-04-25 06:42 +# Generated by Django 5.2.1 on 2025-05-27 06:42 +import django.contrib.postgres.search import django.db.models.deletion import knowledge.models.knowledge import mptt.fields import uuid_utils.compat from django.db import migrations, models -from knowledge.models import KnowledgeFolder - - -def insert_default_data(apps, schema_editor): - # 创建一个根模块(没有父节点) - KnowledgeFolder.objects.create(id='root', name='根目录', user_id='f0dd8f71-e4ee-11ee-8c84-a8a1595801ab') - class Migration(migrations.Migration): + initial = True dependencies = [ ('models_provider', '0001_initial'), - ('users', '0001_initial'), + ('users', '0002_alter_user_nick_name'), ] operations = [ @@ -28,12 +23,12 @@ class Migration(migrations.Migration): fields=[ ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', - models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, - verbose_name='主键id')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('file_name', models.CharField(default='', max_length=256, verbose_name='文件名称')), - ('workspace_id', - models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('file_size', models.IntegerField(default=0, verbose_name='文件大小')), + ('sha256_hash', models.CharField(default='', verbose_name='文件sha256_hash标识')), + ('source_type', models.CharField(choices=[('KNOWLEDGE', 'Knowledge'), ('APPLICATION', 'Application'), ('TEMPORARY_30_MINUTE', 'Temporary 30 Minute'), ('TEMPORARY_100_MINUTE', 'Temporary 120 Minute'), ('TEMPORARY_1_DAY', 'Temporary 1 Day')], default='TEMPORARY_100_MINUTE', verbose_name='资源类型')), + ('source_id', models.CharField(default='TEMPORARY_100_MINUTE', verbose_name='资源id')), ('loid', models.IntegerField(verbose_name='loid')), ('meta', models.JSONField(default=dict, verbose_name='文件关联数据')), ], @@ -41,62 +36,136 @@ class Migration(migrations.Migration): 'db_table': 'file', }, ), - migrations.CreateModel( - name='KnowledgeFolder', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, - verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), - ('workspace_id', - models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), - ('lft', models.PositiveIntegerField(editable=False)), - ('rght', models.PositiveIntegerField(editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(editable=False)), - ('parent', - mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, - related_name='children', to='knowledge.knowledgefolder')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', - verbose_name='用户id')), - ], - options={ - 'db_table': 'knowledge_folder', - }, - ), migrations.CreateModel( name='Knowledge', fields=[ ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', - models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, - verbose_name='主键id')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('name', models.CharField(max_length=150, verbose_name='知识库名称')), - ('workspace_id', - models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('desc', models.CharField(max_length=256, verbose_name='描述')), - ('type', - models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], - default=0, verbose_name='类型')), + ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')), + ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE', max_length=20, verbose_name='可用范围')), + ('file_size_limit', models.IntegerField(default=100, verbose_name='文件大小限制')), ('meta', models.JSONField(default=dict, verbose_name='元数据')), - ('scope', - models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE', - max_length=20, verbose_name='可用范围')), - ('folder', - models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, - to='knowledge.knowledgefolder', - verbose_name='文件夹id')), - ('embedding_model', models.ForeignKey(default=knowledge.models.knowledge.default_model, - on_delete=django.db.models.deletion.DO_NOTHING, - to='models_provider.model', verbose_name='向量模型')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', - verbose_name='所属用户')), + ('embedding_model', models.ForeignKey(default=knowledge.models.knowledge.default_model, on_delete=django.db.models.deletion.DO_NOTHING, to='models_provider.model', verbose_name='向量模型')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='所属用户')), ], options={ 'db_table': 'knowledge', }, ), - migrations.RunPython(insert_default_data), + migrations.CreateModel( + name='Document', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('name', models.CharField(max_length=150, verbose_name='文档名称')), + ('char_length', models.IntegerField(verbose_name='文档字符数 冗余字段')), + ('status', models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态')), + ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态统计数据')), + ('is_active', models.BooleanField(default=True)), + ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')), + ('hit_handling_method', models.CharField(choices=[('optimization', '模型优化'), ('directly_return', '直接返回')], default='optimization', max_length=20, verbose_name='命中处理方式')), + ('directly_return_similarity', models.FloatField(default=0.9, verbose_name='直接回答相似度')), + ('meta', models.JSONField(default=dict, verbose_name='元数据')), + ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge', verbose_name='知识库id')), + ], + options={ + 'db_table': 'document', + }, + ), + migrations.CreateModel( + name='KnowledgeFolder', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), + ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), + ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('lft', models.PositiveIntegerField(editable=False)), + ('rght', models.PositiveIntegerField(editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='knowledge.knowledgefolder')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='用户id')), + ], + options={ + 'db_table': 'knowledge_folder', + }, + ), + migrations.AddField( + model_name='knowledge', + name='folder', + field=models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledgefolder', verbose_name='文件夹id'), + ), + migrations.CreateModel( + name='Paragraph', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('content', models.CharField(max_length=102400, verbose_name='段落内容')), + ('title', models.CharField(default='', max_length=256, verbose_name='标题')), + ('status', models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态')), + ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态数据')), + ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), + ('is_active', models.BooleanField(default=True)), + ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), + ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), + ], + options={ + 'db_table': 'paragraph', + }, + ), + migrations.CreateModel( + name='Embedding', + fields=[ + ('id', models.CharField(max_length=128, primary_key=True, serialize=False, verbose_name='主键id')), + ('source_id', models.CharField(max_length=128, verbose_name='资源id')), + ('source_type', models.CharField(choices=[(0, '问题'), (1, '段落'), (2, '标题')], default=0, max_length=5, verbose_name='资源类型')), + ('is_active', models.BooleanField(default=True, max_length=1, verbose_name='是否可用')), + ('embedding', knowledge.models.knowledge.VectorField(verbose_name='向量')), + ('search_vector', django.contrib.postgres.search.SearchVectorField(default='', verbose_name='分词')), + ('meta', models.JSONField(default=dict, verbose_name='元数据')), + ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document', verbose_name='文档关联')), + ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge', verbose_name='文档关联')), + ('paragraph', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.paragraph', verbose_name='段落关联')), + ], + options={ + 'db_table': 'embedding', + }, + ), + migrations.CreateModel( + name='Problem', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('content', models.CharField(max_length=256, verbose_name='问题内容')), + ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), + ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), + ], + options={ + 'db_table': 'problem', + }, + ), + migrations.CreateModel( + name='ProblemParagraphMapping', + fields=[ + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), + ('document', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), + ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), + ('paragraph', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.paragraph')), + ('problem', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.problem')), + ], + options={ + 'db_table': 'problem_paragraph_mapping', + }, + ), ] diff --git a/apps/knowledge/migrations/0002_document_paragraph_embedding_problem_and_more.py b/apps/knowledge/migrations/0002_document_paragraph_embedding_problem_and_more.py deleted file mode 100644 index cfe94b5f8..000000000 --- a/apps/knowledge/migrations/0002_document_paragraph_embedding_problem_and_more.py +++ /dev/null @@ -1,104 +0,0 @@ -# Generated by Django 5.2 on 2025-04-29 03:28 - -import django.contrib.postgres.search -import django.db.models.deletion -import knowledge.models.knowledge -import uuid_utils.compat -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Document', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=150, verbose_name='文档名称')), - ('char_length', models.IntegerField(verbose_name='文档字符数 冗余字段')), - ('status', models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态')), - ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态统计数据')), - ('is_active', models.BooleanField(default=True)), - ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')), - ('hit_handling_method', models.CharField(choices=[('optimization', '模型优化'), ('directly_return', '直接返回')], default='optimization', max_length=20, verbose_name='命中处理方式')), - ('directly_return_similarity', models.FloatField(default=0.9, verbose_name='直接回答相似度')), - ('meta', models.JSONField(default=dict, verbose_name='元数据')), - ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge', verbose_name='知识库id')), - ], - options={ - 'db_table': 'document', - }, - ), - migrations.CreateModel( - name='Paragraph', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('content', models.CharField(max_length=102400, verbose_name='段落内容')), - ('title', models.CharField(default='', max_length=256, verbose_name='标题')), - ('status', models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态')), - ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态数据')), - ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), - ('is_active', models.BooleanField(default=True)), - ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), - ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), - ], - options={ - 'db_table': 'paragraph', - }, - ), - migrations.CreateModel( - name='Embedding', - fields=[ - ('id', models.CharField(max_length=128, primary_key=True, serialize=False, verbose_name='主键id')), - ('source_id', models.CharField(max_length=128, verbose_name='资源id')), - ('source_type', models.CharField(choices=[(0, '问题'), (1, '段落'), (2, '标题')], default=0, max_length=5, verbose_name='资源类型')), - ('is_active', models.BooleanField(default=True, max_length=1, verbose_name='是否可用')), - ('embedding', knowledge.models.knowledge.VectorField(verbose_name='向量')), - ('search_vector', django.contrib.postgres.search.SearchVectorField(default='', verbose_name='分词')), - ('meta', models.JSONField(default=dict, verbose_name='元数据')), - ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document', verbose_name='文档关联')), - ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge', verbose_name='文档关联')), - ('paragraph', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.paragraph', verbose_name='段落关联')), - ], - options={ - 'db_table': 'embedding', - }, - ), - migrations.CreateModel( - name='Problem', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('content', models.CharField(max_length=256, verbose_name='问题内容')), - ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), - ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), - ], - options={ - 'db_table': 'problem', - }, - ), - migrations.CreateModel( - name='ProblemParagraphMapping', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('document', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), - ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), - ('paragraph', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.paragraph')), - ('problem', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.problem')), - ], - options={ - 'db_table': 'problem_paragraph_mapping', - }, - ), - ] diff --git a/apps/knowledge/migrations/0003_alter_document_status_alter_paragraph_status_and_more.py b/apps/knowledge/migrations/0003_alter_document_status_alter_paragraph_status_and_more.py deleted file mode 100644 index 76dfcdcdf..000000000 --- a/apps/knowledge/migrations/0003_alter_document_status_alter_paragraph_status_and_more.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 5.2 on 2025-04-29 08:02 - -import django.db.models.deletion -import knowledge.models.knowledge -import uuid_utils.compat -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0002_document_paragraph_embedding_problem_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='document', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.AlterField( - model_name='paragraph', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.CreateModel( - name='ApplicationKnowledgeMapping', - fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='knowledge.knowledge')), - ], - options={ - 'db_table': 'application_knowledge_mapping', - }, - ), - ] diff --git a/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py b/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py deleted file mode 100644 index da3059704..000000000 --- a/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 5.2 on 2025-05-06 09:05 - -import knowledge.models.knowledge -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0003_alter_document_status_alter_paragraph_status_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='knowledge', - name='file_size_limit', - field=models.IntegerField(default=100, verbose_name='文件大小限制'), - ), - migrations.AlterField( - model_name='document', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.AlterField( - model_name='paragraph', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - ] diff --git a/apps/knowledge/migrations/0005_remove_file_workspace_id_file_file_size_and_more.py b/apps/knowledge/migrations/0005_remove_file_workspace_id_file_file_size_and_more.py deleted file mode 100644 index 4d4b3ee44..000000000 --- a/apps/knowledge/migrations/0005_remove_file_workspace_id_file_file_size_and_more.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 5.2 on 2025-05-07 03:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0004_knowledge_file_size_limit_alter_document_status_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='file', - name='workspace_id', - ), - migrations.AddField( - model_name='file', - name='file_size', - field=models.IntegerField(default=0, verbose_name='文件大小'), - ), - migrations.AddField( - model_name='file', - name='sha256_hash', - field=models.CharField(default='', verbose_name='文件sha256_hash标识'), - ), - migrations.AddField( - model_name='file', - name='source_id', - field=models.CharField(default='TEMPORARY_100_MINUTE', verbose_name='资源id'), - ), - migrations.AddField( - model_name='file', - name='source_type', - field=models.CharField(choices=[('KNOWLEDGE', 'Knowledge'), ('APPLICATION', 'Application'), ('TEMPORARY_30_MINUTE', 'Temporary 30 Minute'), ('TEMPORARY_100_MINUTE', 'Temporary 120 Minute'), ('TEMPORARY_1_DAY', 'Temporary 1 Day')], default='TEMPORARY_100_MINUTE', verbose_name='资源类型'), - ) - ] diff --git a/apps/knowledge/migrations/0006_knowledgefolder_desc_and_more.py b/apps/knowledge/migrations/0006_knowledgefolder_desc_and_more.py deleted file mode 100644 index 8263556b8..000000000 --- a/apps/knowledge/migrations/0006_knowledgefolder_desc_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.2.1 on 2025-05-14 03:27 - -import django.db.models.deletion -import knowledge.models.knowledge -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0005_remove_file_workspace_id_file_file_size_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='knowledgefolder', - name='desc', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='描述'), - ), - migrations.AlterField( - model_name='applicationknowledgemapping', - name='knowledge', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge'), - ), - migrations.AlterField( - model_name='document', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.AlterField( - model_name='paragraph', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - ] diff --git a/apps/knowledge/migrations/0007_alter_document_status_alter_paragraph_status_and_more.py b/apps/knowledge/migrations/0007_alter_document_status_alter_paragraph_status_and_more.py deleted file mode 100644 index 023794628..000000000 --- a/apps/knowledge/migrations/0007_alter_document_status_alter_paragraph_status_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 5.2 on 2025-05-27 03:05 - -import knowledge.models.knowledge -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('knowledge', '0006_knowledgefolder_desc_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='document', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.AlterField( - model_name='paragraph', - name='status', - field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), - ), - migrations.DeleteModel( - name='ApplicationKnowledgeMapping', - ), - ] diff --git a/apps/tools/migrations/0001_initial.py b/apps/tools/migrations/0001_initial.py index a10e17fdc..1b4760be4 100644 --- a/apps/tools/migrations/0001_initial.py +++ b/apps/tools/migrations/0001_initial.py @@ -1,22 +1,13 @@ -# Generated by Django 5.2 on 2025-04-18 04:07 -import os +# Generated by Django 5.2 on 2025-05-15 04:04 import django.db.models.deletion import mptt.fields import uuid_utils.compat from django.db import migrations, models -from common.utils.common import get_file_content -from maxkb.conf import PROJECT_DIR -from tools.models import ToolFolder - - -def insert_default_data(apps, schema_editor): - # 创建一个根模块(没有父节点) - ToolFolder.objects.create(id='root', name='根目录', user_id='f0dd8f71-e4ee-11ee-8c84-a8a1595801ab') - class Migration(migrations.Migration): + initial = True dependencies = [ @@ -29,34 +20,27 @@ class Migration(migrations.Migration): fields=[ ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, - verbose_name='主键id')), + ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), - ('workspace_id', - models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), + ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('lft', models.PositiveIntegerField(editable=False)), ('rght', models.PositiveIntegerField(editable=False)), ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), ('level', models.PositiveIntegerField(editable=False)), - ('parent', - mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, - related_name='children', to='tools.toolfolder')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', - verbose_name='用户id')), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='tools.toolfolder')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='用户id')), ], options={ 'db_table': 'tool_folder', }, ), - migrations.RunPython(insert_default_data), migrations.CreateModel( name='Tool', fields=[ ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', - models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, - verbose_name='主键id')), + ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('name', models.CharField(max_length=64, verbose_name='工具名称')), ('desc', models.CharField(max_length=128, verbose_name='描述')), ('code', models.CharField(max_length=102400, verbose_name='python代码')), @@ -64,24 +48,16 @@ class Migration(migrations.Migration): ('init_field_list', models.JSONField(default=list, verbose_name='启动字段列表')), ('icon', models.CharField(default='/ui/favicon.ico', max_length=256, verbose_name='工具库icon')), ('is_active', models.BooleanField(default=True)), - ('scope', - models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE', - max_length=20, verbose_name='可用范围')), - ('tool_type', - models.CharField(choices=[('INTERNAL', '内置'), ('CUSTOM', '自定义')], default='CUSTOM', - max_length=20, verbose_name='工具类型', db_index=True)), + ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE', max_length=20, verbose_name='可用范围')), + ('tool_type', models.CharField(choices=[('INTERNAL', '内置'), ('CUSTOM', '自定义')], db_index=True, default='CUSTOM', max_length=20, verbose_name='工具类型')), ('template_id', models.UUIDField(default=None, null=True, verbose_name='模版id')), - ('workspace_id', models.CharField(default='default', max_length=64, verbose_name='工作空间id', db_index=True)), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('init_params', models.CharField(max_length=102400, null=True, verbose_name='初始化参数')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', - verbose_name='用户id')), - ('folder', - models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, to='tools.toolfolder', - verbose_name='文件夹id')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='用户id')), + ('folder', models.ForeignKey(default='root', on_delete=django.db.models.deletion.DO_NOTHING, to='tools.toolfolder', verbose_name='文件夹id')), ], options={ 'db_table': 'tool', }, ), - migrations.RunSQL(get_file_content(os.path.join(PROJECT_DIR, "apps", "tools", 'migrations', 'internal_tool.sql'))) ] diff --git a/apps/tools/migrations/0002_toolfolder_desc.py b/apps/tools/migrations/0002_toolfolder_desc.py deleted file mode 100644 index a4a2e1fb7..000000000 --- a/apps/tools/migrations/0002_toolfolder_desc.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.1 on 2025-05-14 03:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('tools', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='toolfolder', - name='desc', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='描述'), - ), - ]