From b6c222cdc2c91dc4fa28f382127b5e62ca7da0fe Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Thu, 9 Jul 2026 10:36:00 -0700 Subject: [PATCH] [planner] cache primitive offers --- masque/builder/planner/planner.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/masque/builder/planner/planner.py b/masque/builder/planner/planner.py index 5cc83b1..2b68c45 100644 --- a/masque/builder/planner/planner.py +++ b/masque/builder/planner/planner.py @@ -288,6 +288,10 @@ class Solver: def __init__(self, request: RouteRequest) -> None: self.request = request self.eval_cache: dict[tuple[int, float, str | None, str | None, str, str, PrimitiveKind | None], SelectedPrimitive] = {} + self.offer_cache: dict[ + tuple[PrimitiveKind, str | None, str | None, tuple[tuple[str, Any], ...]], + tuple[PrimitiveOffer, ...], + ] = {} self.order = 0 def solve(self) -> Candidate: @@ -384,7 +388,18 @@ class Solver: kwargs.pop('out_ptype', None) if extra: kwargs.update(extra) - return self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs) + try: + cache_key = (kind, in_ptype, out_ptype, tuple(sorted(kwargs.items()))) + hash(cache_key) + except TypeError: + return self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs) + + cached = self.offer_cache.get(cache_key) + if cached is not None: + return cached + offers = self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs) + self.offer_cache[cache_key] = offers + return offers def evaluate( self,