| """Local passage retrieval and source-grounded claim validation.""" |
| import json |
| import re |
| from pathlib import Path |
| from .schema import Evidence, ToolResult |
|
|
|
|
| def search_local(path, query, limit=8): |
| """Rank source passages by query token overlap and retain complete records.""" |
| terms=set(re.findall(r"[a-z0-9]+",query.lower())) |
| records=[Evidence.model_validate(json.loads(x)) for x in Path(path).read_text().splitlines() if x.strip()] |
| scored=[(len(terms & set(re.findall(r"[a-z0-9]+",r.passage.lower()+" "+r.claim.lower()))),r) for r in records] |
| return [r for s,r in sorted(scored,key=lambda x:(-x[0],x[1].id))[:limit] if s>0] |
|
|
|
|
| def retrieval_tool(path): |
| def run(arguments,state): |
| records=search_local(path,arguments["query"],int(arguments.get("limit",8))) |
| return ToolResult(evidence=records,message=f"Retrieved {len(records)} source records") |
| return run |
|
|
|
|
| def validate_claim(evidence: Evidence, source_text: str): |
| """Require the stored passage to occur verbatim in its retained source.""" |
| if evidence.passage not in source_text: |
| raise ValueError("evidence passage is absent from the source snapshot") |
| return evidence |
|
|