1818def parse_testcase (testcase_str : str ) -> tuple [str , str ]:
1919 """
2020 Parse testcase string to extract framework and mode
21-
21+
2222 Args:
2323 testcase_str: testcase string, e.g., "infer.InfiniLM.Direct"
24-
24+
2525 Returns:
26- tuple: (mode, framework) where mode is "direct" or "service",
26+ tuple: (mode, framework) where mode is "direct" or "service",
2727 framework is lowercase framework name
28-
28+
2929 Raises:
3030 ValueError: if cannot determine framework
3131 """
3232 testcase_lower = testcase_str .lower ()
33-
33+
3434 # Determine mode
3535 if "service" in testcase_lower :
3636 mode = "service"
3737 elif "direct" in testcase_lower :
3838 mode = "direct"
3939 else :
4040 mode = "direct" # default mode
41-
41+
4242 # Determine framework (more flexible parsing)
4343 if "vllm" in testcase_lower :
4444 framework = "vllm"
@@ -50,27 +50,37 @@ def parse_testcase(testcase_str: str) -> tuple[str, str]:
5050 framework = "infinitrain"
5151 else :
5252 # Try to extract from dot-separated parts
53- parts = testcase_str .split ('.' )
53+ parts = testcase_str .split ("." )
5454 if len (parts ) < 2 :
55- raise ValueError (f"Cannot determine framework from testcase: { testcase_str } " )
56-
55+ raise ValueError (
56+ f"Cannot determine framework from testcase: { testcase_str } "
57+ )
58+
5759 framework_candidate = parts [- 2 ].lower ()
58- if framework_candidate not in ["infinilm" , "vllm" , "bmtrain" , "megatron" , "infinitrain" ]:
59- raise ValueError (f"Cannot determine framework from testcase: { testcase_str } " )
60-
60+ if framework_candidate not in [
61+ "infinilm" ,
62+ "vllm" ,
63+ "bmtrain" ,
64+ "megatron" ,
65+ "infinitrain" ,
66+ ]:
67+ raise ValueError (
68+ f"Cannot determine framework from testcase: { testcase_str } "
69+ )
70+
6171 framework = framework_candidate
62-
72+
6373 return mode , framework
6474
6575
6676def generate_run_id (testcase : str , user_run_id : Optional [str ] = None ) -> str :
6777 """
6878 Generate or enhance run_id
69-
79+
7080 Args:
7181 testcase: testcase string
7282 user_run_id: user-provided run_id (optional)
73-
83+
7484 Returns:
7585 Generated run_id
7686 """
@@ -79,12 +89,13 @@ def generate_run_id(testcase: str, user_run_id: Optional[str] = None) -> str:
7989 else :
8090 return generate_auto_run_id (testcase )
8191
92+
8293def generate_run_id_from_config (config_dict : Dict [str , Any ]) -> str :
8394 """Generate run_id from configuration dictionary"""
8495 outer_run_id = config_dict .get ("run_id" )
8596 outer_testcase = config_dict .get ("testcase" )
8697 config_data = config_dict .get ("config" , {})
87-
98+
8899 # Validate testcase position
89100 inner_testcase = config_data .get ("testcase" )
90101 if outer_testcase :
@@ -97,24 +108,27 @@ def generate_run_id_from_config(config_dict: Dict[str, Any]) -> str:
97108 )
98109 else :
99110 raise ValueError ("testcase is required at the outer level of the config." )
100-
111+
101112 # Validate run_id position
102113 inner_run_id = config_data .get ("run_id" )
103114 if inner_run_id :
104115 raise ValueError (
105116 "run_id must be at the outer level, not inside 'config'. "
106117 f"Found: '{ inner_run_id } ' inside 'config'."
107118 )
108-
119+
109120 # Generate run_id using the existing function
110121 return generate_run_id (outer_testcase , outer_run_id )
111122
123+
112124def enhance_user_run_id (user_run_id : str ) -> str :
113125 """Enhance user-provided run_id by adding timestamp and random code"""
114126 # If already contains timestamp and random code, return directly
115- timestamp_pattern = r' \.\d{8}_\d{6}\.[a-z0-9]{8}$'
127+ timestamp_pattern = r" \.\d{8}_\d{6}\.[a-z0-9]{8}$"
116128 if re .search (timestamp_pattern , user_run_id ):
117- logger .info (f"User run_id already contains timestamp and random code: { user_run_id } " )
129+ logger .info (
130+ f"User run_id already contains timestamp and random code: { user_run_id } "
131+ )
118132 return user_run_id
119133
120134 # Clean user run_id
@@ -124,7 +138,7 @@ def enhance_user_run_id(user_run_id: str) -> str:
124138 timestamp = datetime .now ().strftime ("%Y%m%d_%H%M%S" )
125139
126140 # 8-character random code
127- random_suffix = '' .join (random .choices (string .ascii_lowercase + string .digits , k = 8 ))
141+ random_suffix = "" .join (random .choices (string .ascii_lowercase + string .digits , k = 8 ))
128142
129143 # Combine
130144 enhanced_run_id = f"{ cleaned_user_id } .{ timestamp } .{ random_suffix } "
@@ -142,7 +156,7 @@ def generate_auto_run_id(testcase: str) -> str:
142156 timestamp = datetime .now ().strftime ("%Y%m%d_%H%M%S" )
143157
144158 # 8-character random code
145- random_suffix = '' .join (random .choices (string .ascii_lowercase + string .digits , k = 8 ))
159+ random_suffix = "" .join (random .choices (string .ascii_lowercase + string .digits , k = 8 ))
146160
147161 # Combine
148162 run_id = f"{ cleaned_testcase } .{ timestamp } .{ random_suffix } "
@@ -153,28 +167,28 @@ def generate_auto_run_id(testcase: str) -> str:
153167def validate_testcase_format (testcase : str ) -> bool :
154168 """Validate testcase format"""
155169 # Basic validation: should contain at least 2 parts separated by dots
156- parts = testcase .split ('.' )
170+ parts = testcase .split ("." )
157171 if len (parts ) < 2 :
158172 return False
159-
173+
160174 # Should contain valid mode
161175 testcase_lower = testcase .lower ()
162176 if not ("direct" in testcase_lower or "service" in testcase_lower ):
163177 return False
164-
178+
165179 return True
166180
167181
168182def extract_testcase_components (testcase : str ) -> dict :
169183 """Extract components from testcase string"""
170- parts = testcase .split ('.' )
171-
184+ parts = testcase .split ("." )
185+
172186 result = {
173187 "full" : testcase ,
174188 "parts" : parts ,
175189 "domain" : parts [0 ] if len (parts ) > 0 else "" ,
176190 "framework" : parts [1 ] if len (parts ) > 1 else "" ,
177- "mode" : "service" if "service" in testcase .lower () else "direct"
191+ "mode" : "service" if "service" in testcase .lower () else "direct" ,
178192 }
179-
193+
180194 return result
0 commit comments