#macro #structured #llm #prompting #author #openai #promptkit

macro bin promptkit_rs_macros

LLM structured prompting library macros

1 unstable release

0.1.0 Oct 29, 2024

#10 in #prompting

Download history 166/week @ 2024-10-27 89/week @ 2024-11-03 13/week @ 2024-11-10

268 downloads per month
Used in promptkit_rs

MIT license

6KB
60 lines

promptkit-rs

Quick Start

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();

    // Will look something like this.
    // 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."
    // }
}

You can also add sub components.

use promptkit_rs::{Renderable, rsx_2};

struct AuthorReviewPrompt {
    authors: Vec<Author>
}

struct Author {
    name: String,
    age: u64
}

impl Renderable for Author {
    fn render(&self) -> String {
        rsx_2! { 
            "name" {self.name}
            "age" {self.age.to_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."

            // Unfortunately we can only auto render Vec<String>
            {self.authors.iter().map(Renderable::render).collect::<Vec<String>>()}
        }
    }
}

Dependencies

~235–680KB
~16K SLoC