Spaces:
Running
Running
Update src/aibom_generator/api.py
Browse files- 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:
|