from ai_agent.retriever.software_doc import SoftwareDoc def format_tool_card(doc: SoftwareDoc, accuracy: float, why: str, rank: int) -> str: """Format a tool recommendation as a rich card.""" modality = ", ".join(doc.modality) if getattr(doc, "modality", None) else "" dims = " / ".join(f"{x}D" for x in (getattr(doc, "dims", None) or [])) license_ = getattr(doc, "license", "") or "" tags = [] if getattr(doc, "tasks", None): tags.extend(doc.tasks) if getattr(doc, "keywords", None): tags.extend(doc.keywords) tags_str = ", ".join(sorted(set(t for t in tags if t)))[:160] desc = getattr(doc, "description", "") or "" short_desc = (desc[:200] + "…") if len(desc) > 200 else desc card = f"### {rank}. {doc.name} — {accuracy:.1f}% match\n\n" meta_parts = [] if modality: meta_parts.append(f"**Modality:** {modality}") if dims: meta_parts.append(f"**Dimensions:** {dims}") if license_: meta_parts.append(f"**License:** {license_}") if meta_parts: card += " • ".join(meta_parts) + "\n\n" if short_desc: card += f"_{short_desc}_\n\n" if why: card += f"**Why:** {why}\n\n" if tags_str: card += f"**Tags:** `{tags_str}`\n\n" return card