Skip to content

germangb/ai-bindgen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Caution

This Rust crate is potentially dangerous so there is a chance it will cause harm to you or your computer. Run at you own risk (ideally in a sandbox).

ai bindgen

This is a procedural macro that generates Rust code at compile-time using the OpenAI (or compatible) API. Simply add the dependency to your Cargo.toml and follow the example usage.

[dependencies]
ai-bindgen = { git = "https://github.com/germangb/ai-bindgen.git" }

Example usage

You must have a valid API token and define the following two variables in your environment, so the macro can connect to the OpenAI API, and select a model of your choosing:

export OPENAI_API_KEY="<your-api-token>"
export OPENAI_API_MODEL="gpt-5"

Note

By default the macro will send requests to https://api.openai.com/v1/ endpoint. You can override this with the OPENAI_API_URL environment variable.

The macro must be added to the top of an extern block, and the functions within, like this:

use ai_bindgen::ai;

#[ai]
extern "C" {
    #[ai(prompt = "return the n-th prime number, please")]
    fn prime(n: i32) -> i32;

    // no prompt parameter (the signature should be self explanatory :)
    #[ai]
    fn max(a: i32, b: i32) -> i32;
}

fn main() {
    println!("The 15th prime number is {}", prime(15)); // 47 (hopefully)
    println!("max(4, 6) = {}", max(4, 6)); // 6
}

(Refer to the parameters.rs example for a list of supported parameters)

Tip

You can run cargo expand to get an idea of what the compiler will generate. This is what it came up with for me when I ran it last time:

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2024::*;
#[macro_use]
extern crate std;
use ai_bindgen::ai;
#[allow(warnings)]
fn prime(n: i32) -> i32 {
    if n <= 0 {
        return 0;
    }
    let target = n as usize;
    let mut primes: Vec<i32> = Vec::with_capacity(target);
    let mut candidate: i32 = 2;
    while primes.len() < target {
        let mut is_prime = true;
        let cand64 = candidate as i64;
        for &p in primes.iter() {
            let p64 = p as i64;
            if p64 * p64 > cand64 {
                break;
            }
            if candidate % p == 0 {
                is_prime = false;
                break;
            }
        }
        if is_prime {
            primes.push(candidate);
        }
        if candidate == 2 {
            candidate = 3;
        } else {
            if candidate >= i32::MAX - 2 {
                break;
            }
            candidate += 2;
        }
    }
    if primes.len() == target { primes[target - 1] } else { 0 }
}
#[allow(warnings)]
fn max(a: i32, b: i32) -> i32 {
    if a >= b { a } else { b }
}
fn main() {
    {
        ::std::io::_print(format_args!("The 15th prime number is {0}\n", prime(15)));
    };
    {
        ::std::io::_print(format_args!("max(4, 6) = {0}\n", max(4, 6)));
    };
}

About

🦆 Rust procedural macro that generates code using OpenAI-compatible models at compile-time

Topics

Resources

License

Stars

Watchers

Forks

Languages