langchain-ai/langchain · error · ChevronError
empty tag at line {_CURRENT_LINE}
Error message
empty tag at line {_CURRENT_LINE} What it means
Raised by the Mustache tokenizer in `langchain_core.utils.mustache` when a tag parses successfully (both delimiters found) but its body is empty or whitespace-only, e.g. `{{ }}` or `{{}}`. An empty tag has no variable name to look up, so it is rejected as malformed. The line number in the message is where the tag appears.
Source
Thrown at libs/core/langchain_core/utils/mustache.py:154
"^": "inverted section",
"/": "end",
">": "partial",
"=": "set delimiter?",
"{": "no escape?",
"&": "no escape",
}
# Get the tag
try:
tag, template = template.split(r_del, 1)
except ValueError as e:
msg = f"unclosed tag at line {_CURRENT_LINE}"
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
tag_type = tag_types.get(tag[0], "variable")
# If the type is not a variable
if tag_type != "variable":
# Then that first character is not needed
tag = tag[1:]
# If we might be a set delimiter tag
if tag_type == "set delimiter?":
# Double check to make sure we are
if tag.endswith("="):
tag_type = "set delimiter"
# Remove the equal sign
tag = tag[:-1]
# Otherwise we should complainView on GitHub (pinned to e32fa9a52e)
Solutions
- Find the empty tag on the reported line and either give it a name (`{{name}}`) or delete it.
- If the tag was produced by string substitution, guard that the substituted name is non-empty before building the template.
- Validate templates by tokenizing once at load time so malformed tags fail fast during development.
Example fix
# before
template = "Hello {{ }}!"
MustachePlaceholderFormatter().format(template) # ChevronError: empty tag
# after
template = "Hello {{name}}!"
MustachePlaceholderFormatter().format(template, name="Ada") Defensive patterns
Strategy: validation
Validate before calling
import re
def has_empty_tags(template: str) -> bool:
return bool(re.search(r"\{\{\s*\}\}", template))
if has_empty_tags(template):
raise ValueError("template contains an empty tag") Try / catch
try:
list(tokenize(template))
except ChevronError as e:
raise ValueError(f"invalid template: {e}") from e Prevention
- When generating tags by substitution, assert the name is non-empty before rendering.
- Lint templates for {{}} / {{ }} patterns in CI.
- Tokenize templates at load time.
When it happens
Trigger: Formatting a template with `MustachePlaceholderFormatter` that contains `{{}}`, `{{ }}`, or a tag whose name was removed by an editing mistake; frequently a leftover after deleting a variable name but leaving the braces.
Common situations: Editing prompt templates and deleting the variable name but not the braces; templating pipelines that substitute variable names with empty strings before rendering (`{{%s}} % var` with empty `var`); copy-pasted templates with placeholder braces meant to be filled in later.
Related errors
- unclosed tag at line {_CURRENT_LINE}
- unclosed set delimiter tag\nat line {_CURRENT_LINE}
- Trying to close tag "{tag_key}"\nLooks like it was not opene
- Unexpected EOF\nthe tag "{open_sections[-1]}" was never clos
- Jinja2 templates are not allowed during deserialization for
AI-assisted analysis of langchain-ai/langchain@e32fa9a52e (2026-08-14).
Data as JSON: /api/errors/794552bdc41dd0b6.
Report an issue: GitHub.