@@ -209,8 +209,21 @@ def _init_local_persona_classes(self) -> None:
209
209
dotjupyter_dir = self .get_dotjupyter_dir ()
210
210
if dotjupyter_dir is None :
211
211
self .log .info ("No .jupyter directory found for loading local personas." )
212
- else :
213
- self ._local_persona_classes = load_from_dir (dotjupyter_dir , self .log )
212
+ return
213
+
214
+ if find_persona_files (dotjupyter_dir ):
215
+ self .send_system_message (
216
+ "Found persona files in `.jupyter` directory. Please move them to `.jupyter/personas/` subdirectory."
217
+ )
218
+
219
+ personas_subdir = os .path .join (dotjupyter_dir , "personas" )
220
+ if not os .path .exists (personas_subdir ):
221
+ self .log .info (
222
+ "No `personas` subdirectory found in `.jupyter` directory for loading local personas."
223
+ )
224
+ return
225
+
226
+ self ._local_persona_classes = load_from_dir (personas_subdir , self .log )
214
227
215
228
def _init_personas (self ) -> dict [str , BasePersona ]:
216
229
"""
@@ -562,6 +575,25 @@ def is_persona(username: str):
562
575
return username .startswith ("jupyter-ai-personas" )
563
576
564
577
578
+ def find_persona_files (dir : str ) -> list [str ]:
579
+ """Find persona Python files in a directory without loading them."""
580
+ if not os .path .exists (dir ):
581
+ return []
582
+
583
+ try :
584
+ all_py_files = glob (os .path .join (dir , "*.py" ))
585
+ py_files = []
586
+ for f in all_py_files :
587
+ fname_lower = Path (f ).stem .lower ()
588
+ if "persona" in fname_lower and not (
589
+ fname_lower .startswith ("_" ) or fname_lower .startswith ("." )
590
+ ):
591
+ py_files .append (f )
592
+ return py_files
593
+ except Exception :
594
+ return []
595
+
596
+
565
597
def load_from_dir (dir : str , log : Logger ) -> list [dict ]:
566
598
"""
567
599
Load _persona class declarations_ from Python files in the local filesystem.
@@ -583,31 +615,11 @@ def load_from_dir(dir: str, log: Logger) -> list[dict]:
583
615
"""
584
616
persona_classes : list [dict ] = []
585
617
586
- log .info (f"Searching for persona files in { dir } " )
587
- # Check if root directory exists
588
- if not os .path .exists (dir ):
589
- return persona_classes
590
-
591
- # Find all .py files in the root directory that contain "persona" in the name
592
- try :
593
- all_py_files = glob (os .path .join (dir , "*.py" ))
594
- py_files = []
595
- for f in all_py_files :
596
- fname_lower = Path (f ).stem .lower ()
597
- if "persona" in fname_lower and not (
598
- fname_lower .startswith ("_" ) or fname_lower .startswith ("." )
599
- ):
600
- py_files .append (f )
601
-
602
- except Exception as e :
603
- # On exception with glob operation, return empty list
604
- log .error (
605
- f"{ type (e ).__name__ } occurred while searching for Python files in { dir } "
606
- )
618
+ py_files = find_persona_files (dir )
619
+ if not py_files :
607
620
return persona_classes
608
621
609
- if py_files :
610
- log .info (f"Found files from { dir } : { [Path (f ).name for f in py_files ]} " )
622
+ log .info (f"Loading persona files from { dir } : { [Path (f ).name for f in py_files ]} " )
611
623
612
624
# Temporarily add root_dir to sys.path for imports
613
625
dir_in_path = dir in sys .path
0 commit comments