Harden MCP tool composition
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import asdict, dataclass
|
||||
from decimal import Decimal, ROUND_HALF_UP
|
||||
from difflib import SequenceMatcher
|
||||
import json
|
||||
import math
|
||||
@@ -738,6 +739,56 @@ def calculate_roll(
|
||||
}
|
||||
|
||||
|
||||
def transport_roll_inputs_from_roll_calculation(
|
||||
result: Any,
|
||||
) -> dict[str, float]:
|
||||
"""Derive browser-equivalent transport inputs from a roll calculation."""
|
||||
if not isinstance(result, dict) or result.get("status") != "success":
|
||||
raise ValueError("roll calculation result must have status success")
|
||||
|
||||
calculation = result.get("calculation")
|
||||
effective_inputs = result.get("effective_inputs")
|
||||
if not isinstance(calculation, dict) or not isinstance(effective_inputs, dict):
|
||||
raise ValueError("successful roll calculation result is incomplete")
|
||||
|
||||
def calculation_number(field: str) -> float:
|
||||
return _transport_roll_input_number(calculation.get(field), field)
|
||||
|
||||
def effective_number(field: str) -> float:
|
||||
entry = effective_inputs.get(field)
|
||||
if not isinstance(entry, dict):
|
||||
raise ValueError(f"successful roll calculation result is missing {field}")
|
||||
return _transport_roll_input_number(entry.get("value"), field)
|
||||
|
||||
return {
|
||||
"roll_diameter_mm": _browser_one_decimal(
|
||||
calculation_number("average_diameter_mm")
|
||||
),
|
||||
"core_diameter_mm": effective_number("core_diameter_mm"),
|
||||
"roll_width_m": effective_number("width_m"),
|
||||
"roll_weight_kg": _browser_one_decimal(
|
||||
calculation_number("roll_weight_kg")
|
||||
),
|
||||
"product_length_m": calculation_number("effective_roll_length_m"),
|
||||
}
|
||||
|
||||
|
||||
def _transport_roll_input_number(value: Any, field: str) -> float:
|
||||
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
||||
raise ValueError(f"successful roll calculation result is missing {field}")
|
||||
number = float(value)
|
||||
if not math.isfinite(number) or number <= 0:
|
||||
raise ValueError(f"successful roll calculation result has invalid {field}")
|
||||
return number
|
||||
|
||||
|
||||
def _browser_one_decimal(value: float) -> float:
|
||||
"""Match the browser's positive-number ``toFixed(1)`` transport values."""
|
||||
return float(
|
||||
Decimal.from_float(value).quantize(Decimal("0.1"), rounding=ROUND_HALF_UP)
|
||||
)
|
||||
|
||||
|
||||
def modify_calculation(
|
||||
state: CalculationState | dict[str, Any],
|
||||
changes: dict[str, Any],
|
||||
|
||||
Reference in New Issue
Block a user