pub trait OpenAISchema: for<'de> Deserialize<'de> {
// Required method
fn openai_schema() -> GeneratedOpenAISchema;
}
Expand description
Any type that can be used as a structured chat completion.
Docstrings on the top level of a type will automatically be consumed and provided to the schema, as well as any docstrings on fields of said struct.
Additionally, serde(skip)
and serde(rename)
on fields works perfectly fine.
For example:
#[derive(Deserialize, OpenAISchema)]
/// Hello friends
struct SuperComplexSchema {
// The first one.
optional_string: Option<String>,
#[serde(rename = "not_so_regular_string")]
regular_string: String,
#[serde(skip)]
regular_string_2: String,
int: i32,
basic_enum: BasicEnum,
}
#[derive(Deserialize, OpenAISchema)]
/// A basic enum.
enum BasicEnum {
#[serde(rename = "variant1")]
Variant1,
#[serde(skip)]
Variant4,
Variant2,
}
Will produce the following schema:
{
"name": "SuperComplexSchema",
"description": "Hello friends",
"strict": true,
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"optional_string": {
"description": "The first one.",
"type": ["string", "null"]
},
"not_so_regular_string": { "type": "string" },
"int": { "type": "integer" },
"basic_enum": { "enum": ["variant1", "Variant2"], "type": "string" }
},
"required": ["optional_string", "not_so_regular_string", "int", "basic_enum"]
}
}
OpenAI’s JSON schema implements a stricter and more limited subset of the JSON schema spec to make it easier for the model to interpret. In addition to that, the proc macro implementation is not 100% complete so there are still some things that are supported that we need to implement, too.
As such, there are some rules which must be followed (most of which are caught by compiler errors. If they aren’t, please file an issue!):
- The derive can be used on both structs and enums, but only structs can be provided to a structured completion; enums must be used as a field in a containing struct.
- Enums must be unit variants. Enums with int descriminants (for example
enum MyEnum { Variant1 = 1, Variant2 = 2 }
) are also allowed, but they must be annotated withrepr(i32)
or similar, and deriveDeserialize_repr
fromserde_repr
. - Struct fields are allowed to be any of the following types:
String
- All int types, (
i32
,i64
,u32
,u64
,isize
,usize
, etc.) f32
andf64
bool
- Any unit enum type which also derives
OpenAISchema
Vec<T>
whereT
is any of the above typesOption<T>
whereT
is any of the above types
Required Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.