Dotprompt for Dart

Dart implementation of Dotprompt, an executable prompt template file format for Generative AI.

Overview

Dotprompt provides a structured way to create, manage, and render prompt templates for Large Language Models. This Dart implementation offers:

  • YAML frontmatter for configuration and metadata
  • Handlebars-style templating for dynamic content
  • Picoschema support for input/output validation
  • Tool and schema resolution for complex workflows
  • Cross-runtime conformance with JavaScript, Python, Go, Rust, and Java

Installation

Add to your pubspec.yaml:

dependencies:
  dotprompt: ^0.0.1

Quick Start

import 'package:dotprompt/dotprompt.dart';

void main() async {
  final dotprompt = Dotprompt();
  
  // Parse and render a prompt
  final result = await dotprompt.render('''
---
model: gemini-pro
config:
  temperature: 0.7
---
Hello {{name}}! You are a {{role}}.
''', DataArgument(
    input: {'name': 'World', 'role': 'helpful assistant'},
  ));
  
  print(result.messages.first.content);
  // Output: [TextPart(text: "Hello World! You are a helpful assistant.")]
}

Features

Template Parsing

final parsed = dotprompt.parse('''
---
model: gemini-pro
input:
  schema:
    name: string
    age: integer?
  default:
    name: User
---
Hello {{name}}!
''');

print(parsed.model);  // "gemini-pro"
print(parsed.input?.schema);  // Schema definition

Compiled Templates

For repeated rendering with different data:

final compiled = await dotprompt.compile(templateSource);

// Render multiple times
final result1 = await compiled.render(DataArgument(input: {'name': 'Alice'}));
final result2 = await compiled.render(DataArgument(input: {'name': 'Bob'}));

Partials

final dotprompt = Dotprompt(DotpromptOptions(
  partials: {
    'header': 'Welcome, {{user}}!',
    'footer': 'Best regards, {{sender}}',
  },
));

final result = await dotprompt.render('''
{{> header}}
Your message here.
{{> footer}}
''', DataArgument(
    input: {'user': 'Alice', 'sender': 'Bot'},
  ));

Role Markers

Control message roles in multi-turn conversations:

final result = await dotprompt.render('''
{{role "system"}}
You are a helpful assistant.

{{role "user"}}
Hello!

{{role "model"}}
Hi there! How can I help?
''', DataArgument());

// Results in 3 messages with appropriate roles

Media Embedding

final result = await dotprompt.render('''
Please analyze this image:
{{media url="https://example.com/image.png" contentType="image/png"}}
''', DataArgument());

API Reference

Core Classes

Class Description
Dotprompt Main entry point for parsing and rendering
ParsedPrompt Result of parsing a template
RenderedPrompt Result of rendering with data
Message A chat message with role and content
Part Message content (TextPart, MediaPart, etc.)

Configuration

final dotprompt = Dotprompt(DotpromptOptions(
  defaultModel: 'gemini-pro',
  modelConfigs: {
    'gemini-pro': {'temperature': 0.7},
  },
  partials: {'...': '...'},
  tools: {'...': ToolDefinition(...)},
  schemas: {'...': {...}},
  partialResolver: (name) async => '...',
  toolResolver: (name) async => {...},
  schemaResolver: (name) async => {...},
));

Built-in Helpers

Helper Usage Description
role {{role "system"}} Sets message role
media {{media url="..." contentType="..."}} Embeds media
history {{history}} Inserts conversation history
json {{json data}} JSON serialization
section {{#section "name"}}...{{/section}} Named sections
ifEquals {{#ifEquals a b}}...{{/ifEquals}} Conditional
unlessEquals {{#unlessEquals a b}}...{{/unlessEquals}} Inverse conditional

Building with Bazel

This package is built using rules_dart:

# Build the library
bazel build //dart/dotprompt

# Run tests
bazel test //dart/dotprompt/test:...

License

Apache 2.0 - See LICENSE for details.

Libraries

dotprompt
Dotprompt: Executable GenAI Prompt Templates for Dart.