|  | @@ -15,7 +15,7 @@ from libs.rsa import generate_key_pair
 | 
	
		
			
				|  |  |  from models.account import Tenant
 | 
	
		
			
				|  |  |  from models.dataset import Dataset, DatasetCollectionBinding, DocumentSegment
 | 
	
		
			
				|  |  |  from models.dataset import Document as DatasetDocument
 | 
	
		
			
				|  |  | -from models.model import Account
 | 
	
		
			
				|  |  | +from models.model import Account, App, AppAnnotationSetting, MessageAnnotation
 | 
	
		
			
				|  |  |  from models.provider import Provider, ProviderModel
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -125,7 +125,114 @@ def reset_encrypt_key_pair():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @click.command('vdb-migrate', help='migrate vector db.')
 | 
	
		
			
				|  |  | -def vdb_migrate():
 | 
	
		
			
				|  |  | +@click.option('--scope', default='all', prompt=False, help='The scope of vector database to migrate, Default is All.')
 | 
	
		
			
				|  |  | +def vdb_migrate(scope: str):
 | 
	
		
			
				|  |  | +    if scope in ['knowledge', 'all']:
 | 
	
		
			
				|  |  | +        migrate_knowledge_vector_database()
 | 
	
		
			
				|  |  | +    if scope in ['annotation', 'all']:
 | 
	
		
			
				|  |  | +        migrate_annotation_vector_database()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def migrate_annotation_vector_database():
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    Migrate annotation datas to target vector database .
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    click.echo(click.style('Start migrate annotation data.', fg='green'))
 | 
	
		
			
				|  |  | +    create_count = 0
 | 
	
		
			
				|  |  | +    skipped_count = 0
 | 
	
		
			
				|  |  | +    total_count = 0
 | 
	
		
			
				|  |  | +    page = 1
 | 
	
		
			
				|  |  | +    while True:
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            # get apps info
 | 
	
		
			
				|  |  | +            apps = db.session.query(App).filter(
 | 
	
		
			
				|  |  | +                App.status == 'normal'
 | 
	
		
			
				|  |  | +            ).order_by(App.created_at.desc()).paginate(page=page, per_page=50)
 | 
	
		
			
				|  |  | +        except NotFound:
 | 
	
		
			
				|  |  | +            break
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        page += 1
 | 
	
		
			
				|  |  | +        for app in apps:
 | 
	
		
			
				|  |  | +            total_count = total_count + 1
 | 
	
		
			
				|  |  | +            click.echo(f'Processing the {total_count} app {app.id}. '
 | 
	
		
			
				|  |  | +                       + f'{create_count} created, {skipped_count} skipped.')
 | 
	
		
			
				|  |  | +            try:
 | 
	
		
			
				|  |  | +                click.echo('Create app annotation index: {}'.format(app.id))
 | 
	
		
			
				|  |  | +                app_annotation_setting = db.session.query(AppAnnotationSetting).filter(
 | 
	
		
			
				|  |  | +                    AppAnnotationSetting.app_id == app.id
 | 
	
		
			
				|  |  | +                ).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if not app_annotation_setting:
 | 
	
		
			
				|  |  | +                    skipped_count = skipped_count + 1
 | 
	
		
			
				|  |  | +                    click.echo('App annotation setting is disabled: {}'.format(app.id))
 | 
	
		
			
				|  |  | +                    continue
 | 
	
		
			
				|  |  | +                # get dataset_collection_binding info
 | 
	
		
			
				|  |  | +                dataset_collection_binding = db.session.query(DatasetCollectionBinding).filter(
 | 
	
		
			
				|  |  | +                    DatasetCollectionBinding.id == app_annotation_setting.collection_binding_id
 | 
	
		
			
				|  |  | +                ).first()
 | 
	
		
			
				|  |  | +                if not dataset_collection_binding:
 | 
	
		
			
				|  |  | +                    click.echo('App annotation collection binding is not exist: {}'.format(app.id))
 | 
	
		
			
				|  |  | +                    continue
 | 
	
		
			
				|  |  | +                annotations = db.session.query(MessageAnnotation).filter(MessageAnnotation.app_id == app.id).all()
 | 
	
		
			
				|  |  | +                dataset = Dataset(
 | 
	
		
			
				|  |  | +                    id=app.id,
 | 
	
		
			
				|  |  | +                    tenant_id=app.tenant_id,
 | 
	
		
			
				|  |  | +                    indexing_technique='high_quality',
 | 
	
		
			
				|  |  | +                    embedding_model_provider=dataset_collection_binding.provider_name,
 | 
	
		
			
				|  |  | +                    embedding_model=dataset_collection_binding.model_name,
 | 
	
		
			
				|  |  | +                    collection_binding_id=dataset_collection_binding.id
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +                documents = []
 | 
	
		
			
				|  |  | +                if annotations:
 | 
	
		
			
				|  |  | +                    for annotation in annotations:
 | 
	
		
			
				|  |  | +                        document = Document(
 | 
	
		
			
				|  |  | +                            page_content=annotation.question,
 | 
	
		
			
				|  |  | +                            metadata={
 | 
	
		
			
				|  |  | +                                "annotation_id": annotation.id,
 | 
	
		
			
				|  |  | +                                "app_id": app.id,
 | 
	
		
			
				|  |  | +                                "doc_id": annotation.id
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        )
 | 
	
		
			
				|  |  | +                        documents.append(document)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                vector = Vector(dataset, attributes=['doc_id', 'annotation_id', 'app_id'])
 | 
	
		
			
				|  |  | +                click.echo(f"Start to migrate annotation, app_id: {app.id}.")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                try:
 | 
	
		
			
				|  |  | +                    vector.delete()
 | 
	
		
			
				|  |  | +                    click.echo(
 | 
	
		
			
				|  |  | +                        click.style(f'Successfully delete vector index for app: {app.id}.',
 | 
	
		
			
				|  |  | +                                    fg='green'))
 | 
	
		
			
				|  |  | +                except Exception as e:
 | 
	
		
			
				|  |  | +                    click.echo(
 | 
	
		
			
				|  |  | +                        click.style(f'Failed to delete vector index for app {app.id}.',
 | 
	
		
			
				|  |  | +                                    fg='red'))
 | 
	
		
			
				|  |  | +                    raise e
 | 
	
		
			
				|  |  | +                if documents:
 | 
	
		
			
				|  |  | +                    try:
 | 
	
		
			
				|  |  | +                        click.echo(click.style(
 | 
	
		
			
				|  |  | +                            f'Start to created vector index with {len(documents)} annotations for app {app.id}.',
 | 
	
		
			
				|  |  | +                            fg='green'))
 | 
	
		
			
				|  |  | +                        vector.create(documents)
 | 
	
		
			
				|  |  | +                        click.echo(
 | 
	
		
			
				|  |  | +                            click.style(f'Successfully created vector index for app {app.id}.', fg='green'))
 | 
	
		
			
				|  |  | +                    except Exception as e:
 | 
	
		
			
				|  |  | +                        click.echo(click.style(f'Failed to created vector index for app {app.id}.', fg='red'))
 | 
	
		
			
				|  |  | +                        raise e
 | 
	
		
			
				|  |  | +                click.echo(f'Successfully migrated app annotation {app.id}.')
 | 
	
		
			
				|  |  | +                create_count += 1
 | 
	
		
			
				|  |  | +            except Exception as e:
 | 
	
		
			
				|  |  | +                click.echo(
 | 
	
		
			
				|  |  | +                    click.style('Create app annotation index error: {} {}'.format(e.__class__.__name__, str(e)),
 | 
	
		
			
				|  |  | +                                fg='red'))
 | 
	
		
			
				|  |  | +                continue
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    click.echo(
 | 
	
		
			
				|  |  | +        click.style(f'Congratulations! Create {create_count} app annotation indexes, and skipped {skipped_count} apps.',
 | 
	
		
			
				|  |  | +                    fg='green'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def migrate_knowledge_vector_database():
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  |      Migrate vector database datas to target vector database .
 | 
	
		
			
				|  |  |      """
 |