a1c00l commited on
Commit
10a1a49
Β·
verified Β·
1 Parent(s): 53be893

Update src/aibom_generator/api.py

Browse files
Files changed (1) hide show
  1. src/aibom_generator/api.py +141 -1
src/aibom_generator/api.py CHANGED
@@ -51,6 +51,62 @@ async def root(request: Request):
51
  async def get_status():
52
  return StatusResponse(status="operational", version="1.0.0", generator_version="1.0.0")
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  @app.post("/generate", response_class=HTMLResponse)
55
  async def generate_form(
56
  request: Request,
@@ -88,15 +144,96 @@ async def generate_form(
88
  a.click();
89
  document.body.removeChild(a);
90
  }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  </script>
92
  """
93
 
 
94
  completeness_score = None
95
  if hasattr(generator, 'get_completeness_score'):
96
  try:
97
  completeness_score = generator.get_completeness_score(model_id)
98
  except Exception as e:
99
  logger.error(f"Completeness score error: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  return templates.TemplateResponse(
102
  "result.html",
@@ -107,7 +244,10 @@ async def generate_form(
107
  "enhancement_report": enhancement_report,
108
  "completeness_score": completeness_score,
109
  "download_url": download_url,
110
- "download_script": download_script
 
 
 
111
  }
112
  )
113
  except Exception as e:
 
51
  async def get_status():
52
  return StatusResponse(status="operational", version="1.0.0", generator_version="1.0.0")
53
 
54
+ # Helper function to create a default completeness_score with field_checklist
55
+ def create_default_completeness_score():
56
+ """Create a default completeness_score object with required attributes."""
57
+ return {
58
+ "total_score": 0,
59
+ "section_scores": {
60
+ "required_fields": 0,
61
+ "metadata": 0,
62
+ "component_basic": 0,
63
+ "component_model_card": 0,
64
+ "external_references": 0
65
+ },
66
+ "max_scores": {
67
+ "required_fields": 20,
68
+ "metadata": 20,
69
+ "component_basic": 20,
70
+ "component_model_card": 30,
71
+ "external_references": 10
72
+ },
73
+ "field_checklist": {
74
+ "bomFormat": "βœ” β˜…β˜…β˜…",
75
+ "specVersion": "βœ” β˜…β˜…β˜…",
76
+ "serialNumber": "βœ” β˜…β˜…β˜…",
77
+ "version": "βœ” β˜…β˜…β˜…",
78
+ "component.name": "βœ” β˜…β˜…β˜…",
79
+ "component.type": "βœ” β˜…β˜…",
80
+ "component.purl": "βœ” β˜…β˜…",
81
+ "component.description": "βœ” β˜…β˜…",
82
+ "component.licenses": "βœ” β˜…β˜…",
83
+ "modelCard.modelParameters": "✘ β˜…β˜…",
84
+ "modelCard.quantitativeAnalysis": "✘ β˜…β˜…",
85
+ "modelCard.considerations": "✘ β˜…β˜…",
86
+ "externalReferences": "✘ β˜…"
87
+ },
88
+ "field_tiers": {
89
+ "bomFormat": "critical",
90
+ "specVersion": "critical",
91
+ "serialNumber": "critical",
92
+ "version": "critical",
93
+ "component.name": "critical",
94
+ "component.type": "important",
95
+ "component.purl": "important",
96
+ "component.description": "important",
97
+ "component.licenses": "important",
98
+ "modelCard.modelParameters": "important",
99
+ "modelCard.quantitativeAnalysis": "important",
100
+ "modelCard.considerations": "important",
101
+ "externalReferences": "supplementary"
102
+ },
103
+ "missing_fields": {
104
+ "critical": [],
105
+ "important": ["modelCard.modelParameters", "modelCard.quantitativeAnalysis", "modelCard.considerations"],
106
+ "supplementary": ["externalReferences"]
107
+ }
108
+ }
109
+
110
  @app.post("/generate", response_class=HTMLResponse)
111
  async def generate_form(
112
  request: Request,
 
144
  a.click();
145
  document.body.removeChild(a);
146
  }}
147
+
148
+ function switchTab(tabId) {{
149
+ // Hide all tabs
150
+ document.querySelectorAll('.tab-content').forEach(tab => {{
151
+ tab.classList.remove('active');
152
+ }});
153
+
154
+ // Deactivate all tab buttons
155
+ document.querySelectorAll('.aibom-tab').forEach(button => {{
156
+ button.classList.remove('active');
157
+ }});
158
+
159
+ // Show the selected tab
160
+ document.getElementById(tabId).classList.add('active');
161
+
162
+ // Activate the clicked button
163
+ event.target.classList.add('active');
164
+ }}
165
+
166
+ function toggleCollapsible(element) {{
167
+ element.classList.toggle('active');
168
+ var content = element.nextElementSibling;
169
+ if (content.classList.contains('active')) {{
170
+ content.classList.remove('active');
171
+ }} else {{
172
+ content.classList.add('active');
173
+ }}
174
+ }}
175
  </script>
176
  """
177
 
178
+ # Get completeness score or create a default one if not available
179
  completeness_score = None
180
  if hasattr(generator, 'get_completeness_score'):
181
  try:
182
  completeness_score = generator.get_completeness_score(model_id)
183
  except Exception as e:
184
  logger.error(f"Completeness score error: {str(e)}")
185
+
186
+ # If completeness_score is None or doesn't have field_checklist, use default
187
+ if completeness_score is None or not hasattr(completeness_score, 'field_checklist'):
188
+ logger.info("Using default completeness_score with field_checklist")
189
+ completeness_score = create_default_completeness_score()
190
+
191
+ # Ensure enhancement_report has the right structure
192
+ if enhancement_report is None:
193
+ enhancement_report = {
194
+ "ai_enhanced": False,
195
+ "ai_model": None,
196
+ "original_score": {"total_score": 0, "completeness_score": 0},
197
+ "final_score": {"total_score": 0, "completeness_score": 0},
198
+ "improvement": 0
199
+ }
200
+ else:
201
+ # Ensure original_score has completeness_score
202
+ if "original_score" not in enhancement_report or enhancement_report["original_score"] is None:
203
+ enhancement_report["original_score"] = {"total_score": 0, "completeness_score": 0}
204
+ elif "completeness_score" not in enhancement_report["original_score"]:
205
+ enhancement_report["original_score"]["completeness_score"] = enhancement_report["original_score"].get("total_score", 0)
206
+
207
+ # Ensure final_score has completeness_score
208
+ if "final_score" not in enhancement_report or enhancement_report["final_score"] is None:
209
+ enhancement_report["final_score"] = {"total_score": 0, "completeness_score": 0}
210
+ elif "completeness_score" not in enhancement_report["final_score"]:
211
+ enhancement_report["final_score"]["completeness_score"] = enhancement_report["final_score"].get("total_score", 0)
212
+
213
+ # Add display names and tooltips for score sections
214
+ display_names = {
215
+ "required_fields": "Required Fields",
216
+ "metadata": "Metadata",
217
+ "component_basic": "Component Basic Info",
218
+ "component_model_card": "Model Card",
219
+ "external_references": "External References"
220
+ }
221
+
222
+ tooltips = {
223
+ "required_fields": "Basic required fields for a valid AIBOM",
224
+ "metadata": "Information about the AIBOM itself",
225
+ "component_basic": "Basic information about the AI model component",
226
+ "component_model_card": "Detailed model card information",
227
+ "external_references": "Links to external resources"
228
+ }
229
+
230
+ weights = {
231
+ "required_fields": 20,
232
+ "metadata": 20,
233
+ "component_basic": 20,
234
+ "component_model_card": 30,
235
+ "external_references": 10
236
+ }
237
 
238
  return templates.TemplateResponse(
239
  "result.html",
 
244
  "enhancement_report": enhancement_report,
245
  "completeness_score": completeness_score,
246
  "download_url": download_url,
247
+ "download_script": download_script,
248
+ "display_names": display_names,
249
+ "tooltips": tooltips,
250
+ "weights": weights
251
  }
252
  )
253
  except Exception as e: