Welcome to Promplate#
Promplate is a templating framework that progressively enhances your prompt engineering workflow with minimal dependency.
Promplate runs well on python 3.8 - 3.14, and is well-tested on CPython and PyPy.
A simple example#
Let's say I need to greet in foreign language. Let's compose two simple prompts that just work.
from promplate.llm.openai import ChatComplete
from promplate import Node
reply = Node.read("reply.j2")
translate = Node.read("translate.j2")
translate.run_config["temperature"] = 0
chain = reply + translate
complete = ChatComplete().bind(model="gpt-3.5-turbo")
context = {"lang": "chinese"}
{# import time #}
<|system|>
current time: {{ time.localtime() }}
<|user|>
Say happy new year to me in no more than 5 words.
Note that you must include the year in the message.
Note
This shows some special markup syntax in promplate:
- Inside
{# ... #}are python codes to run in the context. In this case, we want to usetime.localtime()to get the current time. So we import it in the template. <|user|>and<|assistant|>are chat markups. It will be formatted into alist[Message]object before being passed to the LLM.- Inside
{{ ... }}can be any python expressions.
Then call chain.invoke({"lang": "chinese"}, complete).result to get a Chinese greeting relating with the time now.
Why promplate?#
I am a prompt engineer who suffered from the following problems:
Problems#
Writing prompts inside scripts is not elegant#
- There is no syntax highlighting, no auto completion, no linting, etc.
- the indenting is ugly, or you have to bare with lots of spaces/tabs in your prompts
- Some characters must be escaped, like
"""inside a python string, or`inside a JavaScript string.
So in promplate, we support writing prompts in separate files. Of course, you can still write prompts inside scripts too.
details
- writing prompts in separate files
The template name will be their filenames.
- writing short prompt through literals
The template name will be the variable name.
- (new in
v0.3) writing chat prompts through magic
Chaining prompts is somehow difficult#
Often we need several LLM calls in a process. LCEL is langchain's solution.
Ours is like that, but everything unit is a promplate.Node instance. Router are implemented with 2-3 lines in callback functions through raise Jump(...) statements.
Promplate Nodes are just state machines.
Chat templates are hard to read#
Usually you need to manually construct the message list if you are using a chat model. In promplate, you can write chat templates in separate files, and use a render it as a list.
Identical prompts are hard to reuse & maintain#
Promplate has a component system (same meaning as in frontend ecosystem), which enable you to reuse prompt template fragments in different prompts.
Callbacks and output parsers are hard to bind#
In langchain, you can bind callback to a variety of event types. Promplate has a flexible callback system similarly, but you can bind simple callbacks through decorators like @node.pre_process.
Features#
- more than templating: components, chat markup
- more than LLM: callbacks, state machines
- developer experience: full typing, good printing ...
- flexibility: underlying ecosystem power
Further reading#
You can the quick-start tutorial, which is a more detailed explanation. If you have any questions, feel free to ask on GitHub Discussions!