multi-tool-agent / multitool /tools /unit_convert.py
laharikarumanchi's picture
fix(tools): code-review polish — 4 fixes from PR #4 reviewer
907a373
Raw
History Blame Contribute Delete
1.39 kB
"""Unit conversion tool using pint.
Pint's UnitRegistry loads ~1000 unit definitions on construction (~50ms),
so we use the same lazy + cached pattern as tavily_search and wikipedia:
module-level _ureg, _get_ureg() initializes on first call.
Errors returned as Observation strings.
"""
from . import tool
_ureg = None
def _get_ureg():
"""Lazy-initialize the pint UnitRegistry. The `import pint` is deferred
to first call so pytest collection works without pint installed."""
global _ureg
if _ureg is None:
import pint
_ureg = pint.UnitRegistry()
return _ureg
@tool
def unit_convert(value: float, from_unit: str, to_unit: str) -> str:
"""Convert a value from one unit to another.
Accepts most physical units pint knows: meter, mile, kilometer, second,
minute, hour, kilogram, pound, celsius, fahrenheit, and combinations
like meter/second, kilogram*meter/second**2.
Examples:
unit_convert(60, "mile/hour", "meter/second") -> "26.82..."
unit_convert(100, "kilometer", "mile") -> "62.14..."
unit_convert(212, "fahrenheit", "celsius") -> "100.0..."
"""
try:
ureg = _get_ureg()
quantity = value * ureg(from_unit)
converted = quantity.to(to_unit)
return str(converted.magnitude)
except Exception as e:
return f"Unit convert error: {type(e).__name__}: {e}"