Llama.Grammar is a C# class library that allows you to define JSON Schemas, C# objects dynamically and convert them to GBNF (Grammar-Based Next-Token Format) grammars. It is useful for working with structured outputs in AI models like LLaMA, Mistral, or GPT when paired with inference runtimes that support GBNF grammars.
- 🧱 Fluent builder API for creating JSON Schema objects in C#
- 🧠 Converts JSON Schema to GBNF
- ✅ Supports complex schema features like:
- Nested objects
- Arrays and array constraints
- Enums and constants
- Required fields
- Pattern matching
- Nullable types
Add the library to your project:
dotnet add package Llama.Grammar
You can create JSON Schemas using the fluent API and convert them to GBNF grammars. Here's an example of how to do this
using Llama.Grammar.Helper;
using Llama.Grammar.Service;
var schemaBuilder = new SchemaBuilder()
.Type("object")
.Properties(p => p
.Add("name", s => s.Type("string"))
.Add("age", s => s.Type("integer"))
.Add("nicknames", s => s.Type("array")
.MinItems(1)
.MaxItems(3)
.Items(i => i.Type("string"))))
.Required("name", "age");
string json = schemaBuilder.ToJson();
IGbnfGrammar grammar = new GbnfGrammar();
var gbnf = grammar.ConvertJsonSchemaToGbnf(json);
Console.WriteLine(gbnf);
You can generate GBNF grammars directly from C# types, including nested objects and collections
public class TestPerson
{
public string Name { get; set; } = string.Empty;
public int Age { get; set; }
public List<string> Nicknames { get; set; } = new();
public Address? HomeAddress { get; set; }
}
public class Address
{
public string Street { get; set; } = string.Empty;
public string City { get; set; } = string.Empty;
public string? ZipCode { get; set; }
}
IGbnfGrammar grammar = new GbnfGrammar();
var gbnf = grammar.ConvertTypeToGbnf<TestPerson>();
Console.WriteLine(gbnf);
🌐 Interactive Web App - Try the library functionality directly in your browser!
The web app provides an easy-to-use interface for:
- Converting JSON schemas to GBNF
- Converting C# types to GBNF
- Converting regular expressions to GBNF
- Interactive examples and documentation
This project is based on the excellent work by Adrien Brault, porting and wrapping his TypeScript logic for use in .NET.
MIT License. See LICENSE. for details.