ats-resume-api / frontend /components /skill_validation.py
Maaz2002's picture
Deploy ATS Resume API to Hugging Face Space
dc95236
Raw
History Blame Contribute Delete
1.62 kB
from typing import Any, Dict
import streamlit as st
def display_skill_validation(analysis: Dict[str, Any]) -> None:
details = analysis.get("skill_validation_details") or {}
validated = details.get("validated", [])
unvalidated = details.get("unvalidated", [])
total = details.get("total", len(validated) + len(unvalidated))
pct = details.get("validation_pct", 0.0)
st.markdown("### βœ… Skill Validation")
if total == 0:
st.info("No skills detected on the resume.")
return
c1, c2, c3 = st.columns(3)
c1.metric("Total Skills", total)
c2.metric("Validated", len(validated))
c3.metric("Validation %", f"{pct:.0f}%")
st.progress(min(max(pct / 100.0, 0.0), 1.0))
if validated:
with st.expander(f"βœ… Validated skills ({len(validated)})", expanded=False):
for entry in validated:
skill = entry.get("skill", "?")
projects = entry.get("projects", []) or []
similarity = entry.get("similarity")
project_text = ", ".join(projects[:3]) if projects else "experience section"
sim_text = f" ({similarity * 100:.0f}% match)" if isinstance(similarity, (int, float)) else ""
st.markdown(f"- **{skill}**{sim_text} β€” demonstrated in: {project_text}")
if unvalidated:
with st.expander(f"⚠️ Unvalidated skills ({len(unvalidated)})", expanded=False):
st.caption("These skills are listed but not tied to a project or experience bullet.")
for skill in unvalidated:
st.markdown(f"- ❌ {skill}")