148 lines
6.3 KiB
JavaScript
148 lines
6.3 KiB
JavaScript
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
||
|
import { FINISH_NAME } from "./schema.js";
|
||
|
/**
|
||
|
* Class that generates prompts for generative agents. It maintains a list
|
||
|
* of constraints, commands, resources, and performance evaluations.
|
||
|
*/
|
||
|
export class PromptGenerator {
|
||
|
constructor() {
|
||
|
Object.defineProperty(this, "constraints", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "commands", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "resources", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "performance_evaluation", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "response_format", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
this.constraints = [];
|
||
|
this.commands = [];
|
||
|
this.resources = [];
|
||
|
this.performance_evaluation = [];
|
||
|
this.response_format = {
|
||
|
thoughts: {
|
||
|
text: "thought",
|
||
|
reasoning: "reasoning",
|
||
|
plan: "- short bulleted\n- list that conveys\n- long-term plan",
|
||
|
criticism: "constructive self-criticism",
|
||
|
speak: "thoughts summary to say to user",
|
||
|
},
|
||
|
command: { name: "command name", args: { "arg name": "value" } },
|
||
|
};
|
||
|
}
|
||
|
/**
|
||
|
* Adds a constraint to the list of constraints.
|
||
|
* @param constraint The constraint to add.
|
||
|
* @returns void
|
||
|
*/
|
||
|
add_constraint(constraint) {
|
||
|
this.constraints.push(constraint);
|
||
|
}
|
||
|
/**
|
||
|
* Adds a tool to the list of commands.
|
||
|
* @param tool The tool to add.
|
||
|
* @returns void
|
||
|
*/
|
||
|
add_tool(tool) {
|
||
|
this.commands.push(tool);
|
||
|
}
|
||
|
_generate_command_string(tool) {
|
||
|
let output = `"${tool.name}": ${tool.description}`;
|
||
|
output += `, args json schema: ${JSON.stringify(zodToJsonSchema(tool.schema).properties)}`;
|
||
|
return output;
|
||
|
}
|
||
|
/**
|
||
|
* Adds a resource to the list of resources.
|
||
|
* @param resource The resource to add.
|
||
|
* @returns void
|
||
|
*/
|
||
|
add_resource(resource) {
|
||
|
this.resources.push(resource);
|
||
|
}
|
||
|
/**
|
||
|
* Adds a performance evaluation to the list of performance evaluations.
|
||
|
* @param evaluation The performance evaluation to add.
|
||
|
* @returns void
|
||
|
*/
|
||
|
add_performance_evaluation(evaluation) {
|
||
|
this.performance_evaluation.push(evaluation);
|
||
|
}
|
||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||
|
_generate_numbered_list(items, item_type = "list") {
|
||
|
if (item_type === "command") {
|
||
|
const command_strings = items.map((item, i) => `${i + 1}. ${this._generate_command_string(item)}`);
|
||
|
const finish_description = "use this to signal that you have finished all your objectives";
|
||
|
const finish_args = '"response": "final response to let people know you have finished your objectives"';
|
||
|
const finish_string = `${items.length + 1}. ${FINISH_NAME}: ${finish_description}, args: ${finish_args}`;
|
||
|
return command_strings.concat([finish_string]).join("\n");
|
||
|
}
|
||
|
return items.map((item, i) => `${i + 1}. ${item}`).join("\n");
|
||
|
}
|
||
|
/**
|
||
|
* Generates a prompt string that includes the constraints, commands,
|
||
|
* resources, performance evaluations, and response format.
|
||
|
* @returns A string representing the prompt.
|
||
|
*/
|
||
|
generate_prompt_string() {
|
||
|
const formatted_response_format = JSON.stringify(this.response_format, null, 4);
|
||
|
const prompt_string = `Constraints:\n${this._generate_numbered_list(this.constraints)}\n\n` +
|
||
|
`Commands:\n${this._generate_numbered_list(this.commands, "command")}\n\n` +
|
||
|
`Resources:\n${this._generate_numbered_list(this.resources)}\n\n` +
|
||
|
`Performance Evaluation:\n${this._generate_numbered_list(this.performance_evaluation)}\n\n` +
|
||
|
`You should only respond in JSON format as described below ` +
|
||
|
`\nResponse Format: \n${formatted_response_format} ` +
|
||
|
`\nEnsure the response can be parsed by Python json.loads`;
|
||
|
return prompt_string;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Function that generates a prompt string for a given list of tools.
|
||
|
*/
|
||
|
export function getPrompt(tools) {
|
||
|
const prompt_generator = new PromptGenerator();
|
||
|
prompt_generator.add_constraint("~4000 word limit for short term memory. " +
|
||
|
"Your short term memory is short, " +
|
||
|
"so immediately save important information to files.");
|
||
|
prompt_generator.add_constraint("If you are unsure how you previously did something " +
|
||
|
"or want to recall past events, " +
|
||
|
"thinking about similar events will help you remember.");
|
||
|
prompt_generator.add_constraint("No user assistance");
|
||
|
prompt_generator.add_constraint('Exclusively use the commands listed in double quotes e.g. "command name"');
|
||
|
for (const tool of tools) {
|
||
|
prompt_generator.add_tool(tool);
|
||
|
}
|
||
|
prompt_generator.add_resource("Internet access for searches and information gathering.");
|
||
|
prompt_generator.add_resource("Long Term memory management.");
|
||
|
prompt_generator.add_resource("GPT-3.5 powered Agents for delegation of simple tasks.");
|
||
|
prompt_generator.add_resource("File output.");
|
||
|
prompt_generator.add_performance_evaluation("Continuously review and analyze your actions " +
|
||
|
"to ensure you are performing to the best of your abilities.");
|
||
|
prompt_generator.add_performance_evaluation("Constructively self-criticize your big-picture behavior constantly.");
|
||
|
prompt_generator.add_performance_evaluation("Reflect on past decisions and strategies to refine your approach.");
|
||
|
prompt_generator.add_performance_evaluation("Every command has a cost, so be smart and efficient. " +
|
||
|
"Aim to complete tasks in the least number of steps.");
|
||
|
const prompt_string = prompt_generator.generate_prompt_string();
|
||
|
return prompt_string;
|
||
|
}
|