| 
					
				 | 
			
			
				@@ -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 . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     """ 
			 |