from __future__ import annotations from typing import Any, Dict, Literal from paper2lab.inference.nemotron_refiner import refine_with_nemotron RefinementMode = Literal["none", "local", "nemotron"] def refine_optional( paper_card: Dict[str, Any], mode: RefinementMode = "none", return_comparison: bool = True, ) -> Dict[str, Any]: """ none/local: keep local rule-based extraction. nemotron: refine the candidate with Nemotron. """ mode = (mode or "none").lower().strip() if mode in {"none", "local"}: return { "status": "skipped", "mode": mode, "before_refinement": paper_card, "after_refinement": paper_card, "diff_summary": { "changed_fields": [], "added_fields": [], "removed_fields": [], }, } if mode == "nemotron": pack = paper_card.get("llm_evidence_pack") if not pack: return { "status": "error", "mode": "nemotron", "error": "Missing llm_evidence_pack in paper_card.", "before_refinement": paper_card, "after_refinement": paper_card, "diff_summary": { "changed_fields": [], "added_fields": [], "removed_fields": [], }, } try: return refine_with_nemotron( llm_evidence_pack=pack, return_comparison=return_comparison, ) except Exception as exc: return { "status": "error", "mode": "nemotron", "error": str(exc), "before_refinement": paper_card, "after_refinement": paper_card, "diff_summary": { "changed_fields": [], "added_fields": [], "removed_fields": [], }, } return { "status": "error", "mode": mode, "error": f"Unsupported refinement mode: {mode}", "before_refinement": paper_card, "after_refinement": paper_card, "diff_summary": { "changed_fields": [], "added_fields": [], "removed_fields": [], }, }