| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | 
							- import re
 
- from typing import Any
 
- from jinja2 import Environment, meta
 
- from langchain import PromptTemplate
 
- from langchain.formatting import StrictFormatter
 
- class JinjaPromptTemplate(PromptTemplate):
 
-     template_format: str = "jinja2"
 
-     """The format of the prompt template. Options are: 'f-string', 'jinja2'."""
 
-     @classmethod
 
-     def from_template(cls, template: str, **kwargs: Any) -> PromptTemplate:
 
-         """Load a prompt template from a template."""
 
-         env = Environment()
 
-         template = template.replace("{{}}", "{}")
 
-         ast = env.parse(template)
 
-         input_variables = meta.find_undeclared_variables(ast)
 
-         if "partial_variables" in kwargs:
 
-             partial_variables = kwargs["partial_variables"]
 
-             input_variables = {
 
-                 var for var in input_variables if var not in partial_variables
 
-             }
 
-         return cls(
 
-             input_variables=list(sorted(input_variables)), template=template, **kwargs
 
-         )
 
- class OutLinePromptTemplate(PromptTemplate):
 
-     @classmethod
 
-     def from_template(cls, template: str, **kwargs: Any) -> PromptTemplate:
 
-         """Load a prompt template from a template."""
 
-         input_variables = {
 
-             v for _, v, _, _ in OneLineFormatter().parse(template) if v is not None
 
-         }
 
-         return cls(
 
-             input_variables=list(sorted(input_variables)), template=template, **kwargs
 
-         )
 
-     def format(self, **kwargs: Any) -> str:
 
-         """Format the prompt with the inputs.
 
-         Args:
 
-             kwargs: Any arguments to be passed to the prompt template.
 
-         Returns:
 
-             A formatted string.
 
-         Example:
 
-         .. code-block:: python
 
-             prompt.format(variable1="foo")
 
-         """
 
-         kwargs = self._merge_partial_and_user_variables(**kwargs)
 
-         return OneLineFormatter().format(self.template, **kwargs)
 
- class OneLineFormatter(StrictFormatter):
 
-     def parse(self, format_string):
 
-         last_end = 0
 
-         results = []
 
-         for match in re.finditer(r"{([a-zA-Z_]\w*)}", format_string):
 
-             field_name = match.group(1)
 
-             start, end = match.span()
 
-             literal_text = format_string[last_end:start]
 
-             last_end = end
 
-             results.append((literal_text, field_name, '', None))
 
-         remaining_literal_text = format_string[last_end:]
 
-         if remaining_literal_text:
 
-             results.append((remaining_literal_text, None, None, None))
 
-         return results
 
 
  |