ai_sdk_flutter_ui 1.0.0
ai_sdk_flutter_ui: ^1.0.0 copied to clipboard
Flutter UI hooks for the AI SDK Dart port.
ai_sdk_flutter #
Flutter UI controllers for AI SDK Dart — the Dart/Flutter equivalent of the Vercel AI SDK React hooks (useChat, useCompletion, useObject).
Installation #
dependencies:
ai: ^0.1.0
ai_sdk_flutter: ^0.1.0
ai_sdk_openai: ^0.1.0 # or another provider
Controllers #
ChatController — streaming chat #
import 'package:ai_sdk_flutter/ai_sdk_flutter.dart';
import 'package:ai_sdk_openai/ai_sdk_openai.dart';
import 'package:flutter/material.dart';
class ChatPage extends StatefulWidget {
@override
State<ChatPage> createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {
late final ChatController _chat;
@override
void initState() {
super.initState();
_chat = ChatController(
model: openai('gpt-4.1-mini'),
onFinish: (event) => print('Done: ${event.text}'),
onError: (error) => print('Error: $error'),
);
}
@override
void dispose() {
_chat.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: _chat,
builder: (context, _) {
return Column(
children: [
Expanded(
child: ListView.builder(
itemCount: _chat.messages.length,
itemBuilder: (context, i) {
final msg = _chat.messages[i];
return ListTile(
title: Text(msg.role.name),
subtitle: Text(msg.content),
);
},
),
),
if (_chat.isStreaming) const LinearProgressIndicator(),
ElevatedButton(
onPressed: () => _chat.append('Tell me a joke'),
child: const Text('Ask'),
),
],
);
},
);
}
}
CompletionController — single-turn completion #
final completion = CompletionController(model: openai('gpt-4.1-mini'));
// Start streaming a completion
await completion.complete('Explain async/await in Dart.');
print(completion.text); // streamed result
completion.dispose();
ObjectStreamController — live structured output #
final controller = ObjectStreamController<Map<String, dynamic>>(
model: openai('gpt-4.1-mini'),
schema: Schema<Map<String, dynamic>>(
jsonSchema: const {'type': 'object', 'properties': {'title': {'type': 'string'}}},
fromJson: (json) => json,
),
);
await controller.submit('Give me a book title');
print(controller.object); // partially streamed object
controller.dispose();
License #
MIT