fix(core): better error message for empty var names (#32073)

Previously, we hit an index out of range error with empty variable names
(accessing tag[0]), now we through a slightly nicer error

---------

Co-authored-by: Mason Daugherty <mason@langchain.dev>
This commit is contained in:
Isaac Francisco 2025-07-18 14:00:02 -07:00 committed by GitHub
parent 427d2d6397
commit 98bfd57a76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 0 deletions

View File

@ -150,6 +150,11 @@ def parse_tag(template: str, l_del: str, r_del: str) -> tuple[tuple[str, str], s
msg = f"unclosed tag at line {_CURRENT_LINE}" msg = f"unclosed tag at line {_CURRENT_LINE}"
raise ChevronError(msg) from e raise ChevronError(msg) from e
# Check for empty tags
if not tag.strip():
msg = f"empty tag at line {_CURRENT_LINE}"
raise ChevronError(msg)
# Find the type meaning of the first character # Find the type meaning of the first character
tag_type = tag_types.get(tag[0], "variable") tag_type = tag_types.get(tag[0], "variable")

View File

@ -2,6 +2,7 @@ from functools import partial
from inspect import isclass from inspect import isclass
from typing import Any, Union, cast from typing import Any, Union, cast
import pytest
from pydantic import BaseModel from pydantic import BaseModel
from langchain_core.language_models import FakeListChatModel from langchain_core.language_models import FakeListChatModel
@ -10,6 +11,7 @@ from langchain_core.load.load import loads
from langchain_core.messages import HumanMessage from langchain_core.messages import HumanMessage
from langchain_core.prompts.structured import StructuredPrompt from langchain_core.prompts.structured import StructuredPrompt
from langchain_core.runnables.base import Runnable, RunnableLambda from langchain_core.runnables.base import Runnable, RunnableLambda
from langchain_core.utils.mustache import ChevronError
from langchain_core.utils.pydantic import is_basemodel_subclass from langchain_core.utils.pydantic import is_basemodel_subclass
@ -128,3 +130,8 @@ def test_structured_prompt_template_format() -> None:
assert prompt.invoke({"person": {"name": "foo"}}).to_messages() == [ assert prompt.invoke({"person": {"name": "foo"}}).to_messages() == [
HumanMessage("hi foo") HumanMessage("hi foo")
] ]
def test_structured_prompt_template_empty_vars() -> None:
with pytest.raises(ChevronError, match="empty tag"):
StructuredPrompt([("human", "hi {{}}")], schema={}, template_format="mustache")