Crates.io | promptkit_rs |
lib.rs | promptkit_rs |
version | 0.1.5 |
source | src |
created_at | 2024-10-29 16:05:24.820403 |
updated_at | 2024-12-10 15:03:11.840665 |
description | LLM structured prompting library. |
homepage | |
repository | |
max_upload_size | |
id | 1427162 |
size | 72,190 |
promptkit-rs
is a Rust library for structured prompting, designed to create expressive, reusable prompts and structured output, ideal for AI model interactions.
Features
use promptkit_rs::{
executors::{Executor, OpenAI},
Prompt, Renderable, rsx_2
};
#[derive(Clone)]
struct AuthorReviewPrompt {
authors: Vec<String>,
}
#[derive(Clone, Serialize, Deserialize, JsonSchema)]
struct AuthorReviewResult {
#[schemars(description = "...")]
best_author_name: String,
#[schemars(description = "Rationale for description in a short sentence.")]
reason: String,
}
impl Prompt for AuthorReviewPrompt {
type Output = AuthorReviewResult;
fn render(&self) -> String {
rsx_2! {
"You're a turbo book worm. You live in a hole with nothing but books. "
"I'm going to give you a list of authors and their books. "
"Your job is to determine who is best."
{self.authors}
}
}
}
fn main() {
let input_data = AuthorReviewPrompt { authors: vec!["J.K. Rowling".to_string(), "George R.R. Martin".to_string()]};
let author_review: AuthorReviewResult = OpenAI::execute(input_data).await.unwrap();
let expected = AuthorReviewResult {
best_author_name: "George R.R. Martin",
reason: "George R.R. Martin wins for his intricate world-building and morally complex characters, creating a narrative depth that keeps readers hooked."
};
assert_eq!(author_review, expected);
}
Anything that implements promptkit_rs::Renderable
can be automatically rendered from brackets. By default all the primitives, String
, Vec<impl Renderable>
, &[impl Renderable]
are all also Renderable
.
Use Renderable to create structured sub-components, then include them in prompts:
use promptkit_rs::{Renderable, rsx_2};
struct Author {
name: String,
age: u64,
}
impl Renderable for Author {
fn render(&self) -> String {
rsx_2! {
"<name>" {self.name} "</name>"
"<age>" {self.age} "</age>"
}
}
}
Combine Author components into a prompt:
struct AuthorReviewPrompt {
authors: Vec<Author>,
}
impl Prompt for AuthorReviewPrompt {
type Output = AuthorReviewResult;
fn render(&self) -> String {
rsx_2! {
"You're a turbo book worm. You live in a hole with nothing but books. "
"I'm going to give you a list of authors and their books. "
"Your job is to determine who is best."
{self.authors}
}
}
}
With the prompt ready, execute it using OpenAI or any custom executor:
#[tokio::main]
async fn main() {
let authors = vec![
Author { name: "J.K. Rowling".to_string(), age: 55 },
Author { name: "George R.R. Martin".to_string(), age: 72 },
];
let input_data = AuthorReviewPrompt { authors };
let author_review: AuthorReviewResult = OpenAI::execute(input_data).await.unwrap();
println!("{:?}", author_review);
}