""" title: Smart Matcher author: nerdur version: 0.1 description: Sparuje stavke iz dvije liste i vraća ranking s confidence scorom. """ from pydantic import BaseModel from typing import Optional import difflib class Tools: class Valves(BaseModel): threshold: float = 0.3 def __init__(self): self.valves = self.Valves() def match_items( self, list_a: str, list_b: str, __user__: Optional[dict] = None, ) -> str: """ Match items between two comma-separated lists and return ranked pairs with confidence scores. :param list_a: First list of items, comma-separated :param list_b: Second list of items, comma-separated :return: Markdown table with matched pairs and confidence scores """ items_a = [x.strip() for x in list_a.split(",") if x.strip()] items_b = [x.strip() for x in list_b.split(",") if x.strip()] if not items_a or not items_b: return "❌ Both lists must have at least one item." results = [] used_b = set() for a in items_a: best_match = None best_score = 0.0 for b in items_b: if b in used_b: continue score = difflib.SequenceMatcher(None, a.lower(), b.lower()).ratio() if score > best_score: best_score = score best_match = b if best_match and best_score >= self.valves.threshold: results.append((a, best_match, best_score)) used_b.add(best_match) else: results.append((a, "— no match —", 0.0)) results.sort(key=lambda x: x[2], reverse=True) lines = ["| | Item A | Item B | Confidence |", "|---|---|---|---|"] for i, (a, b, score) in enumerate(results): star = "⭐" if i == 0 and score > 0 else "" pct = f"{int(score * 100)}%" lines.append(f"| {star} | **{a}** | {b} | {pct} |") return "\n".join(lines)