A comprehensive Dart/Flutter client for OpenAI's powerful AI models
Quick Start β’ Documentation β’ Examples β’ API Coverage β’ Contributing
Dart OpenAI is an unofficial but comprehensive client package that allows developers to easily integrate OpenAI's state-of-the-art AI models into their Dart/Flutter applications. The package provides simple, intuitive methods for making requests to OpenAI's various APIs, including GPT models, DALL-E image generation, Whisper audio processing, and more.
β οΈ Note: This is an unofficial package. OpenAI does not have an official Dart library.
- π Easy Integration - Simple, intuitive API that mirrors OpenAI's documentation
- π Secure Authentication - One-time setup, use anywhere in your application
- π‘ Streaming Support - Real-time streaming for completions, chat, and fine-tune events
- π οΈ Developer Friendly - Comprehensive error handling and logging
- π Rich Examples - Ready-to-use examples for every implemented feature
- π¨ Modern UI Support - Optimized for Flutter applications
- π Custom APIs - Additional custom endpoints for enhanced functionality
Add the package to your pubspec.yaml
:
dependencies:
dart_openai: ^6.0.0
import 'package:dart_openai/dart_openai.dart';
void main() {
// Set your API key
OpenAI.apiKey = "your-api-key-here";
// Optional: Set organization ID
OpenAI.organization = "your-org-id";
// Optional: Configure timeout
OpenAI.requestsTimeOut = Duration(seconds: 60);
// Optional: Enable logging
OpenAI.showLogs = true;
runApp(MyApp());
}
// Simple chat completion
final chatCompletion = await OpenAI.instance.chat.create(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "Hello, how are you?",
),
],
);
print(chatCompletion.choices.first.message.content);
API Category | Status | Features |
---|---|---|
π€ Models | β Complete | List, Retrieve, Delete fine-tuned models |
π¬ Chat Completions | β Complete | Create, Stream, Tools/Functions, Vision, JSON Mode |
π Completions | β Complete | Create, Stream, Log probabilities |
π¨ Images | β Complete | Generate, Edit, Variations |
π΅ Audio | β Complete | Speech, Transcription, Translation |
π Files | β Complete | Upload, List, Retrieve, Delete, Content |
π§ Fine-tunes (Legacy) | β Complete | Create, List, Retrieve, Cancel, Events, Stream |
π‘οΈ Moderation | β Complete | Content policy classification |
βοΈ Edits | β Complete | Text editing (deprecated by OpenAI) |
API Category | Status | Description |
---|---|---|
π Responses | β Complete | OpenAI Responses API with input-items support |
π Conversations | β Complete | Custom conversation handling system |
π Graders | β Complete | Custom grading system |
π€ Uploads | β Complete | Custom upload management system |
API Category | Status | Priority |
---|---|---|
π Evals | High - All methods throw UnimplementedError |
|
π¦ Batch | High - All methods throw UnimplementedError |
|
ποΈ Vector Stores | High - All methods throw UnimplementedError |
API Category | Status | Priority |
---|---|---|
π€ Assistants | β Missing | Critical - Core AI assistant functionality |
π§΅ Threads | β Missing | Critical - Conversation management |
π¬ Messages | β Missing | Critical - Message handling within threads |
π Runs | β Missing | Critical - Assistant execution |
π§ Fine-tuning (New) | β Missing | High - New fine-tuning API |
π οΈ Tools | β Missing | Medium - Tool management |
π Run Steps | β Missing | Medium - Run step tracking |
π Message Files | β Missing | Medium - File attachments in messages |
// List all available models
List<OpenAIModelModel> models = await OpenAI.instance.model.list();
// Retrieve specific model
OpenAIModelModel model = await OpenAI.instance.model.retrieve("gpt-3.5-turbo");
// Delete fine-tuned model
bool deleted = await OpenAI.instance.model.delete("fine-tuned-model-id");
// Basic chat completion
OpenAIChatCompletionModel chat = await OpenAI.instance.chat.create(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "Hello, how can you help me?",
),
],
temperature: 0.7,
maxTokens: 150,
);
// Streaming chat completion
Stream<OpenAIStreamChatCompletionModel> chatStream = OpenAI.instance.chat.createStream(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "Tell me a story",
),
],
);
chatStream.listen((event) {
print(event.choices.first.delta.content);
});
// Generate image
OpenAIImageModel image = await OpenAI.instance.image.create(
prompt: "A beautiful sunset over mountains",
n: 1,
size: OpenAIImageSize.size1024,
responseFormat: OpenAIImageResponseFormat.url,
);
// Edit image
OpenAIImageModel editedImage = await OpenAI.instance.image.edit(
prompt: "Add a rainbow to the sky",
image: File("path/to/image.png"),
mask: File("path/to/mask.png"),
n: 1,
size: OpenAIImageSize.size1024,
);
// Create variation
OpenAIImageModel variation = await OpenAI.instance.image.variation(
image: File("path/to/image.png"),
n: 3,
size: OpenAIImageSize.size512,
);
// Create speech
File speechFile = await OpenAI.instance.audio.createSpeech(
model: "tts-1",
input: "Hello, this is a test",
voice: "nova",
responseFormat: OpenAIAudioSpeechResponseFormat.mp3,
outputDirectory: Directory("output"),
outputFileName: "speech",
);
// Transcribe audio
OpenAIAudioModel transcription = await OpenAI.instance.audio.createTranscription(
file: File("path/to/audio.mp3"),
model: "whisper-1",
responseFormat: OpenAIAudioResponseFormat.json,
);
// Translate audio
OpenAIAudioModel translation = await OpenAI.instance.audio.createTranslation(
file: File("path/to/audio.mp3"),
model: "whisper-1",
responseFormat: OpenAIAudioResponseFormat.text,
);
// Create response
OpenAIResponseModel response = await OpenAI.instance.responses.create(
// ... response parameters
);
// List responses
List<OpenAIResponseModel> responses = await OpenAI.instance.responses.list();
// Retrieve response
OpenAIResponseModel response = await OpenAI.instance.responses.retrieve("response-id");
// Update response
OpenAIResponseModel updatedResponse = await OpenAI.instance.responses.update(
"response-id",
// ... update parameters
);
// Delete response
bool deleted = await OpenAI.instance.responses.delete("response-id");
// Create conversation
OpenAIConversationModel conversation = await OpenAI.instance.conversations.create(
// ... conversation parameters
);
// List conversations
List<OpenAIConversationModel> conversations = await OpenAI.instance.conversations.list();
// Retrieve conversation
OpenAIConversationModel conversation = await OpenAI.instance.conversations.retrieve("conversation-id");
// Create grader
OpenAIGraderModel grader = await OpenAI.instance.graders.create(
// ... grader parameters
);
// List graders
List<OpenAIGraderModel> graders = await OpenAI.instance.graders.list();
// Create upload
OpenAIUploadModel upload = await OpenAI.instance.uploads.create(
// ... upload parameters
);
// List uploads
List<OpenAIUploadModel> uploads = await OpenAI.instance.uploads.list();
// Define a tool
final weatherTool = OpenAIToolModel(
type: "function",
function: OpenAIFunctionModel.withParameters(
name: "get_weather",
parameters: [
OpenAIFunctionProperty.string(
name: "location",
description: "The city to get weather for",
),
],
),
);
// Use tool in chat
final chat = await OpenAI.instance.chat.create(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "What's the weather like in New York?",
),
],
tools: [weatherTool],
);
final chat = await OpenAI.instance.chat.create(
model: "gpt-4-vision-preview",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: [
OpenAIChatCompletionChoiceMessageContentItemModel.text("What's in this image?"),
OpenAIChatCompletionChoiceMessageContentItemModel.imageUrl("https://example.com/image.jpg"),
],
),
],
);
final chat = await OpenAI.instance.chat.create(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "Return user data as JSON",
),
],
responseFormat: {"type": "json_object"},
);
// Using envied package
@Envied(path: ".env")
abstract class Env {
@EnviedField(varName: 'OPEN_AI_API_KEY')
static const apiKey = _Env.apiKey;
}
void main() {
OpenAI.apiKey = Env.apiKey;
runApp(MyApp());
}
void main() {
// Set API key
OpenAI.apiKey = "your-api-key";
// Set organization (optional)
OpenAI.organization = "your-org-id";
// Set custom base URL (optional)
OpenAI.baseUrl = "https://api.openai.com/v1";
// Set request timeout (optional)
OpenAI.requestsTimeOut = Duration(seconds: 60);
// Enable logging (optional)
OpenAI.showLogs = true;
OpenAI.showResponsesLogs = true;
runApp(MyApp());
}
try {
final chat = await OpenAI.instance.chat.create(
model: "gpt-3.5-turbo",
messages: [
OpenAIChatCompletionChoiceMessageModel(
role: OpenAIChatMessageRole.user,
content: "Hello",
),
],
);
} on RequestFailedException catch (e) {
print("Request failed: ${e.message}");
print("Status code: ${e.statusCode}");
} on MissingApiKeyException catch (e) {
print("API key not set: ${e.message}");
} on UnexpectedException catch (e) {
print("Unexpected error: ${e.message}");
}
- β Core APIs: 100% Complete
- β Legacy APIs: 100% Complete
β οΈ Newer APIs: 20% Complete (stub implementations)- β Latest APIs: 0% Complete (missing)
- π§ Custom APIs: 100% Complete
- π₯ Critical: Implement Assistants, Threads, Messages, Runs APIs
- π¨ High: Complete Batch, Vector Stores, Evals implementations
β οΈ Medium: Add new Fine-tuning API, Tools management- π Low: Add Run Steps, Message Files, Fine-tuning Checkpoints
We welcome contributions! Here's how you can help:
- Use GitHub Issues to report bugs
- Include reproduction steps and environment details
- Suggest new features via GitHub Issues
- Check existing issues before creating new ones
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
- Help improve documentation
- Add examples for missing features
- Fix typos and improve clarity
- Sponsor the project
- Help maintain and improve the package
This project is licensed under the MIT License - see the LICENSE file for details.
- OpenAI for providing the amazing AI models and APIs
- Contributors who help maintain and improve this package
- Sponsors who support the project financially
- Community for feedback and suggestions
- π Full Documentation
- π Report Issues
- π¬ Discussions
- π§ Contact
Made with β€οΈ by the Dart OpenAI community
β Star this repo β’ π Report Bug β’ π‘ Request Feature β’ π Documentation