fix(core): handle parent/child mustache vars (#33345)

**Description:**

currently `mustache_schema("{{x.y}} {{x}}")` will error. pr fixes

**Issue:** na
**Dependencies:**na

---------

Co-authored-by: Bagatur <baskaryan@gmail.com>
This commit is contained in:
Anika
2025-10-09 15:45:32 -07:00
committed by GitHub
parent c99773b652
commit 0e80291804
2 changed files with 48 additions and 4 deletions

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import warnings
from abc import ABC
from collections.abc import Callable
from collections.abc import Callable, Sequence
from string import Formatter
from typing import Any, Literal
@@ -149,9 +149,7 @@ def mustache_template_vars(
Defs = dict[str, "Defs"]
def mustache_schema(
template: str,
) -> type[BaseModel]:
def mustache_schema(template: str) -> type[BaseModel]:
"""Get the variables from a mustache template.
Args:
@@ -175,6 +173,11 @@ def mustache_schema(
fields[prefix] = False
elif type_ in {"variable", "no escape"}:
fields[prefix + tuple(key.split("."))] = True
for fkey, fval in fields.items():
fields[fkey] = fval and not any(
is_subsequence(fkey, k) for k in fields if k != fkey
)
defs: Defs = {} # None means leaf node
while fields:
field, is_leaf = fields.popitem()
@@ -327,3 +330,12 @@ class StringPromptTemplate(BasePromptTemplate, ABC):
def pretty_print(self) -> None:
"""Print a pretty representation of the prompt."""
print(self.pretty_repr(html=is_interactive_env())) # noqa: T201
def is_subsequence(child: Sequence, parent: Sequence) -> bool:
"""Return True if child is subsequence of parent."""
if len(child) == 0 or len(parent) == 0:
return False
if len(parent) < len(child):
return False
return all(child[i] == parent[i] for i in range(len(child)))