[ English | 简体中文 ]
promptc-go
is a go implementation of promptc
. It uses
promptc
specification to generate, analyse, build, compile & run
promptc
files and aims to generalise the way to do Prompt Engineering.
promptc
is a OpenAPI
-like specification for Prompt Engineering.
Above prompt file is adapted from zinccat/zkit, licensed under GPLv3
# As simple as it should be
$ promptc $prompt $input
$ promptc chat
More info about promptc-cli, please refer to docs/cli.md.
Structured Prompt File:
// [Optional] meta info
project: test
author: KevinZonda
license: MIT
version: 0.0.1
// [Optional] define configs
conf: {
provider: openai
model: gpt-3.5-turbo
temperature: 0.5
stop: ['Hello', '4.0']
}
// [Optional] define variable constraint
vars: {
x: int
// var x with int type
y: int {min: 0, max: 10}
z: int {min: 0, max: 10, default: '5'}
}
// [Optional] Birmingham-style define var
a: int {min: 0, max: 10}
// [Required] define prompts
prompts: [
// role: 'user' is meta info for ChatGPT
// to make it empty, use {}
'''role: 'user'
You Entered: {x}
Prompt Compiled: {%
if (x == "1") {
result = "Hello";
} else {
result = "Word!";
}
%}
{%Q%}
'''
]
Single-line Prompt FileExperimental:
You Entered: {x}
Note
Single-line prompt file currently is an experimental feature.
It's not recommended to use it in production environment.
You can write the single-line prompt file without structured.
Current promptc-go
supports string
, int
, float
types.
// declare a variable
myName : string { minLen: 3, maxLen: 10, default: "John" }
// a var named `myName` of type `string`
// with default value "John"
// min length 3, max length 10
myAge : int { min: 18, max: 100, default: '18' }
// a var named `myAge` of type `int`
// with default value 18
// min value 18, max value 100
thisPrice : float { min: 0.01, default: '0.01' }
// a var named `thisPrice` of type `float`
// with default value 0.01
// min value 0.01, and unlimited max value
string
minLen
: intmaxLen
: int
int
min
: int64max
: int64
float
min
: float64max
: float64
- Shared
default
: string
{role: 'user'}
xx{x} {{x}} {%
if (x > 12) {
result = "good";
} else {
result = "bad";
}
%}
Anything in {}
will be variable, e.g. {x}
in previous example
Anything in {%%}
will be js scripts
If you want to show {
or }
, use {{
or }}
instead
The first line of prompt is special, it provides some extra info for this prompt.
i.e. role info for ChatGPT. e.g.
role: 'user'
Show me more about {x}
If you want to provide empty extra info, use {}
as your first line is extremely recommended.
Although it's not required, because once hjson parse failed, the promptc
will prepend first
line to your prompt, but it might cause plenty of undefined behaviour.
We reserved {%Q%}
for '''
which cannot be easy done in multiline text syntax of hjson.
e.g.
This is reserved {%Q%} {{%Q%}}
Will be compiled to
This is reserved ''' {%Q%}
Note
Use JavaScript in prompt is an experimental feature.
promptc-go
uses otto as its JavaScript runtime
Warning
Use JavaScript in prompt could make prompt vulnerable and cause potential security breach.
promptc-go
will NOT take any responsibility about it.
promptc
supports embedding JavaScript scripts in prompt with {%%}
syntax. And it supports 2 modes:
- Standard
- Easy
In standard mode, after running the js script, the promptc will get the result from result
variable.
You Entered: {x}
Prompt Compiled: {%
if (x == "1") {
result = "Hello";
} else {
result = "Word!";
}
%}
If enter x = 1
, the result will be:
You Entered: 1
Prompt Compiled: Hello
In easy mode, the promptc will get the result from returned value of js script. And it will
add an E
at the beginning of the prompt. ({%E /*script here*/ %}
)
You Entered: {x}
Prompt Compiled: {%E
if (x == "1") {
return "Hello";
} else {
return "Word!";
}
%}
If enter x = 1
, the result will be:
You Entered: 1
Prompt Compiled: Hello
In easy mode, the script will be wrapped in a function in order to enable return
statement.
e.g. the actual script that will be run in previous example:
result = (function(){
if (x == "1") {
return "Hello"
} else {
return "Word!";
}
}()
Meta info would be act as special wild-way defined variables (but it will not be treated as variable).
Current supported meta info:
project: test
author: KevinZonda
license: MIT
version: 0.0.1
You can define same name in vars
section if you want.
// prompt1.promptc
project: test
author: KevinZonda
license: MIT
version: 0.0.1
vars: {
x: int
}
// VarList:
// - x: string
// prompt2.promptc
project: test
author: KevinZonda
license: MIT
version: 0.0.1
vars: {
x: int
project: string
license: string {minLen: 12}
}
// VarList:
// - x: string
// - project: string
// - license: string
// prompt3.promptc
project: test
author: KevinZonda
license: MIT
version: 0.0.1
prompts: [
'''{}
{%
console.log(project); // will print nothing
%}
'''
]
// VarList:
// - project: string