| 
					
				 | 
			
			
				@@ -448,9 +448,64 @@ def convert_to_agent_apps(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     click.echo(click.style('Congratulations! Converted {} agent apps.'.format(len(proceeded_app_ids)), fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@click.command('add-qdrant-doc-id-index', help='add qdrant doc_id index.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@click.option('--field', default='metadata.doc_id', prompt=False, help='index field , default is metadata.doc_id.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def add_qdrant_doc_id_index(field: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    click.echo(click.style('Start add qdrant doc_id index.', fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    config = current_app.config 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    vector_type = config.get('VECTOR_STORE') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if vector_type != "qdrant": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        click.echo(click.style('Sorry, only support qdrant vector store.', fg='red')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    create_count = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bindings = db.session.query(DatasetCollectionBinding).all() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not bindings: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            click.echo(click.style('Sorry, no dataset collection bindings found.', fg='red')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        import qdrant_client 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        from qdrant_client.http.exceptions import UnexpectedResponse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        from qdrant_client.http.models import PayloadSchemaType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        from core.rag.datasource.vdb.qdrant.qdrant_vector import QdrantConfig 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for binding in bindings: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            qdrant_config = QdrantConfig( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                endpoint=config.get('QDRANT_URL'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                api_key=config.get('QDRANT_API_KEY'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                root_path=current_app.root_path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                timeout=config.get('QDRANT_CLIENT_TIMEOUT'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                grpc_port=config.get('QDRANT_GRPC_PORT'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                prefer_grpc=config.get('QDRANT_GRPC_ENABLED') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                client = qdrant_client.QdrantClient(**qdrant_config.to_qdrant_params()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # create payload index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                client.create_payload_index(binding.collection_name, field, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            field_schema=PayloadSchemaType.KEYWORD) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                create_count += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            except UnexpectedResponse as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # Collection does not exist, so return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if e.status_code == 404: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    click.echo(click.style(f'Collection not found, collection_name:{binding.collection_name}.', fg='red')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # Some other error occurred, so re-raise the exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    click.echo(click.style(f'Failed to create qdrant index, collection_name:{binding.collection_name}.', fg='red')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        click.echo(click.style('Failed to create qdrant client.', fg='red')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    click.echo( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        click.style(f'Congratulations! Create {create_count} collection indexes.', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def register_commands(app): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(reset_password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(reset_email) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(reset_encrypt_key_pair) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(vdb_migrate) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(convert_to_agent_apps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    app.cli.add_command(add_qdrant_doc_id_index) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |