prompt_template.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import re
  2. from typing import Any
  3. from langchain import PromptTemplate
  4. from langchain.formatting import StrictFormatter
  5. class OutLinePromptTemplate(PromptTemplate):
  6. @classmethod
  7. def from_template(cls, template: str, **kwargs: Any) -> PromptTemplate:
  8. """Load a prompt template from a template."""
  9. input_variables = {
  10. v for _, v, _, _ in OneLineFormatter().parse(template) if v is not None
  11. }
  12. return cls(
  13. input_variables=list(sorted(input_variables)), template=template, **kwargs
  14. )
  15. class OneLineFormatter(StrictFormatter):
  16. def parse(self, format_string):
  17. last_end = 0
  18. results = []
  19. for match in re.finditer(r"{([a-zA-Z_]\w*)}", format_string):
  20. field_name = match.group(1)
  21. start, end = match.span()
  22. literal_text = format_string[last_end:start]
  23. last_end = end
  24. results.append((literal_text, field_name, '', None))
  25. remaining_literal_text = format_string[last_end:]
  26. if remaining_literal_text:
  27. results.append((remaining_literal_text, None, None, None))
  28. return results