@@ -253,7 +253,7 @@ def generate_enhanced_annex_iv_html(
253
253
</tr>
254
254
</table>
255
255
256
- { generate_previous_versions_table (metadata .get (' pipeline_runs' , []))}
256
+ { generate_previous_versions_table (metadata .get (" pipeline_runs" , []))}
257
257
258
258
<p><strong>Intended Purpose:</strong> To evaluate credit risk for loan applicants by providing an objective, fair, and transparent score based on financial history and demographic data.</p>
259
259
</div>
@@ -262,22 +262,22 @@ def generate_enhanced_annex_iv_html(
262
262
<h3>1(b) System Interactions</h3>
263
263
<div class="info-grid">
264
264
<div class="info-label">Stack Name:</div>
265
- <div class="info-value">{ stack_info .get (' name' , ' Unknown' )} </div>
265
+ <div class="info-value">{ stack_info .get (" name" , " Unknown" )} </div>
266
266
<div class="info-label">Stack ID:</div>
267
- <div class="info-value">{ stack_info .get ('id' , ' Unknown' )} </div>
267
+ <div class="info-value">{ stack_info .get ("id" , " Unknown" )} </div>
268
268
<div class="info-label">Created:</div>
269
- <div class="info-value">{ stack_info .get (' created' , ' Unknown' )} </div>
269
+ <div class="info-value">{ stack_info .get (" created" , " Unknown" )} </div>
270
270
</div>
271
- { generate_stack_components_table (metadata .get (' stack_components' , {}))}
271
+ { generate_stack_components_table (metadata .get (" stack_components" , {}))}
272
272
</div>
273
273
274
274
<div class="subsection">
275
275
<h3>1(c) Software Versions</h3>
276
276
<div class="info-grid">
277
277
<div class="info-label">Pipeline Commit:</div>
278
- <div class="info-value">{ git_info .get (' commit' , ' Unknown' )} </div>
278
+ <div class="info-value">{ git_info .get (" commit" , " Unknown" )} </div>
279
279
<div class="info-label">Repository:</div>
280
- <div class="info-value">{ git_info .get (' repository' , ' Unknown' )} </div>
280
+ <div class="info-value">{ git_info .get (" repository" , " Unknown" )} </div>
281
281
</div>
282
282
{ generate_framework_versions_table (frameworks )}
283
283
</div>
@@ -288,7 +288,7 @@ def generate_enhanced_annex_iv_html(
288
288
<div class="info-label">Type:</div>
289
289
<div class="info-value">Modal + FastAPI (Serverless API deployment with auto-scaling)</div>
290
290
<div class="info-label">Environment:</div>
291
- <div class="info-value">{ deployment_info .get (' environment' , ' Production' ) if deployment_info else ' Production' } </div>
291
+ <div class="info-value">{ deployment_info .get (" environment" , " Production" ) if deployment_info else " Production" } </div>
292
292
<div class="info-label">Scaling:</div>
293
293
<div class="info-value">Automatic</div>
294
294
</div>
@@ -308,12 +308,12 @@ def generate_enhanced_annex_iv_html(
308
308
<div class="subsection">
309
309
<h3>2(a) Development Methods and Third-party Tools</h3>
310
310
311
- { generate_pipeline_execution_history (metadata .get (' pipeline_execution_history' , []))}
311
+ { generate_pipeline_execution_history (metadata .get (" pipeline_execution_history" , []))}
312
312
313
313
<h4 style="margin-top: 2rem;">Development Environment</h4>
314
314
<div class="info-grid">
315
315
<div class="info-label">Source Repository:</div>
316
- <div class="info-value">{ git_info .get (' repository' , ' [email protected] :zenml-io/zenml-projects.git' )} </div>
316
+ <div class="info-value">{ git_info .get (" repository" , " [email protected] :zenml-io/zenml-projects.git" )} </div>
317
317
<div class="info-label">Version Control:</div>
318
318
<div class="info-value">Git</div>
319
319
<div class="info-label">CI/CD Platform:</div>
@@ -348,19 +348,19 @@ def generate_enhanced_annex_iv_html(
348
348
<div class="metric-label">Accuracy</div>
349
349
</div>
350
350
<div class="metric-card">
351
- <div class="metric-value text-success">{ model_metrics .get (' f1_score' , 0 ):.3f} </div>
351
+ <div class="metric-value text-success">{ model_metrics .get (" f1_score" , 0 ):.3f} </div>
352
352
<div class="metric-label">F1 Score</div>
353
353
</div>
354
354
<div class="metric-card">
355
- <div class="metric-value">{ model_metrics .get (' auc_roc' , 0 ):.3f} </div>
355
+ <div class="metric-value">{ model_metrics .get (" auc_roc" , 0 ):.3f} </div>
356
356
<div class="metric-label">AUC-ROC</div>
357
357
</div>
358
358
<div class="metric-card">
359
- <div class="metric-value text-warning">{ model_metrics .get (' precision' , 0 ):.3f} </div>
359
+ <div class="metric-value text-warning">{ model_metrics .get (" precision" , 0 ):.3f} </div>
360
360
<div class="metric-label">Precision</div>
361
361
</div>
362
362
<div class="metric-card">
363
- <div class="metric-value text-danger">{ model_metrics .get (' recall' , 0 ):.3f} </div>
363
+ <div class="metric-value text-danger">{ model_metrics .get (" recall" , 0 ):.3f} </div>
364
364
<div class="metric-label">Recall</div>
365
365
</div>
366
366
</div>
@@ -393,7 +393,7 @@ def generate_enhanced_annex_iv_html(
393
393
<div class="card-header">
394
394
<h2 class="card-title">4. Appropriateness of Performance Metrics</h2>
395
395
</div>
396
- <p>The selected metrics provide a balanced assessment: Accuracy ({ accuracy :.1%} ) measures overall predictive capability, AUC ({ model_metrics .get (' auc_roc' , 0 ):.3f} ) assesses discrimination ability, and fairness metrics ensure consistent performance across demographic groups.</p>
396
+ <p>The selected metrics provide a balanced assessment: Accuracy ({ accuracy :.1%} ) measures overall predictive capability, AUC ({ model_metrics .get (" auc_roc" , 0 ):.3f} ) assesses discrimination ability, and fairness metrics ensure consistent performance across demographic groups.</p>
397
397
</div>
398
398
399
399
<!-- 5. Risk Management -->
@@ -403,19 +403,19 @@ def generate_enhanced_annex_iv_html(
403
403
</div>
404
404
<div class="metrics-container">
405
405
<div class="metric-card">
406
- <div class="metric-value text-danger">{ risk_data .get (' overall' , 0 ):.3f} </div>
406
+ <div class="metric-value text-danger">{ risk_data .get (" overall" , 0 ):.3f} </div>
407
407
<div class="metric-label">Overall Risk</div>
408
408
</div>
409
409
<div class="metric-card">
410
- <div class="metric-value text-warning">{ risk_data .get (' technical' , 0 ):.3f} </div>
410
+ <div class="metric-value text-warning">{ risk_data .get (" technical" , 0 ):.3f} </div>
411
411
<div class="metric-label">Technical Risk</div>
412
412
</div>
413
413
<div class="metric-card">
414
- <div class="metric-value">{ risk_data .get (' operational' , 0 ):.3f} </div>
414
+ <div class="metric-value">{ risk_data .get (" operational" , 0 ):.3f} </div>
415
415
<div class="metric-label">Operational Risk</div>
416
416
</div>
417
417
<div class="metric-card">
418
- <div class="metric-value text-success">{ risk_data .get (' compliance' , 0 ):.3f} </div>
418
+ <div class="metric-value text-success">{ risk_data .get (" compliance" , 0 ):.3f} </div>
419
419
<div class="metric-label">Compliance Risk</div>
420
420
</div>
421
421
</div>
@@ -561,10 +561,10 @@ def generate_previous_versions_table(pipeline_runs: list) -> str:
561
561
)
562
562
html += f"""
563
563
<tr>
564
- <td>{ run .get (' name' , ' Unknown' )} </td>
565
- <td><span class="monospace">{ run .get ('id' , ' Unknown' )[:8 ]} </span></td>
566
- <td>{ run .get (' created' , ' Unknown' )} </td>
567
- <td><span class="status-indicator { status_class } "></span> { run .get (' status' , ' Unknown' )} </td>
564
+ <td>{ run .get (" name" , " Unknown" )} </td>
565
+ <td><span class="monospace">{ run .get ("id" , " Unknown" )[:8 ]} </span></td>
566
+ <td>{ run .get (" created" , " Unknown" )} </td>
567
+ <td><span class="status-indicator { status_class } "></span> { run .get (" status" , " Unknown" )} </td>
568
568
</tr>
569
569
"""
570
570
@@ -780,10 +780,10 @@ def generate_stack_components_table(stack_components: Dict[str, Any]) -> str:
780
780
for component in components :
781
781
html += f"""
782
782
<tr>
783
- <td>{ component_type .replace ('_' , ' ' ).title ()} </td>
784
- <td>{ component .get (' name' , ' Unknown' )} </td>
785
- <td>{ component .get (' flavor' , ' Unknown' )} </td>
786
- <td>{ component .get (' integration' , ' Built-in' )} </td>
783
+ <td>{ component_type .replace ("_" , " " ).title ()} </td>
784
+ <td>{ component .get (" name" , " Unknown" )} </td>
785
+ <td>{ component .get (" flavor" , " Unknown" )} </td>
786
+ <td>{ component .get (" integration" , " Built-in" )} </td>
787
787
</tr>
788
788
"""
789
789
@@ -877,11 +877,11 @@ def generate_deployment_info_section(deployment_info: Dict[str, Any]) -> str:
877
877
<div class="info-label">Deployment Status:</div>
878
878
<div class="info-value">{ status_indicator } </div>
879
879
<div class="info-label">Environment:</div>
880
- <div class="info-value">{ deployment_info .get (' environment' , ' Unknown' )} </div>
880
+ <div class="info-value">{ deployment_info .get (" environment" , " Unknown" )} </div>
881
881
<div class="info-label">API Endpoint:</div>
882
- <div class="info-value">{ deployment_info .get (' api_url' , ' Not Available' )} </div>
882
+ <div class="info-value">{ deployment_info .get (" api_url" , " Not Available" )} </div>
883
883
<div class="info-label">Deployment Time:</div>
884
- <div class="info-value">{ deployment_info .get (' deployment_time' , ' Unknown' )} </div>
884
+ <div class="info-value">{ deployment_info .get (" deployment_time" , " Unknown" )} </div>
885
885
</div>
886
886
</div>
887
887
"""
@@ -914,7 +914,7 @@ def generate_fairness_table(fairness_metrics: Dict[str, Any]) -> str:
914
914
915
915
html += f"""
916
916
<tr>
917
- <td>{ attr .replace ('_' , ' ' ).title ()} </td>
917
+ <td>{ attr .replace ("_" , " " ).title ()} </td>
918
918
<td>{ di_ratio :.3f} </td>
919
919
<td>{ status_indicator } </td>
920
920
</tr>
0 commit comments