From 7a368e8e970cfa152d29c03f187814b22647cc1c Mon Sep 17 00:00:00 2001 From: David Miguel Date: Wed, 26 Feb 2025 22:30:49 +0100 Subject: [PATCH] feat: Allow to pass a custom model in OpenAI RealtimeClient --- packages/openai_realtime_dart/README.md | 3 +++ .../example/openai_realtime_dart_example.dart | 2 ++ packages/openai_realtime_dart/lib/src/api.dart | 5 ++++- .../openai_realtime_dart/lib/src/client.dart | 9 +++++++-- .../openai_realtime_dart/lib/src/utils.dart | 3 +++ .../openai_realtime_dart/test/api_test.dart | 2 +- .../openai_realtime_dart/test/client_test.dart | 18 ++++++++++++++++++ 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/packages/openai_realtime_dart/README.md b/packages/openai_realtime_dart/README.md index 2d0287e5..8956901e 100644 --- a/packages/openai_realtime_dart/README.md +++ b/packages/openai_realtime_dart/README.md @@ -60,6 +60,9 @@ client.on(RealtimeEventType.conversationUpdated, (event) { // Connect to Realtime API await client.connect(); +// You can optionally specify a custom model +// await client.connect(model: 'gpt-4o-mini-realtime-preview'); + // Send a item and triggers a generation await client.sendUserMessageContent([ const ContentPart.inputText(text: 'How are you?'), diff --git a/packages/openai_realtime_dart/example/openai_realtime_dart_example.dart b/packages/openai_realtime_dart/example/openai_realtime_dart_example.dart index b830d92c..6c0b6e60 100644 --- a/packages/openai_realtime_dart/example/openai_realtime_dart_example.dart +++ b/packages/openai_realtime_dart/example/openai_realtime_dart_example.dart @@ -28,6 +28,8 @@ Future main() async { }); // Connect to Realtime API + // You can specify a custom model if needed + // await client.connect(model: 'gpt-4o-mini-realtime-preview'); await client.connect(); // Send a item and triggers a generation diff --git a/packages/openai_realtime_dart/lib/src/api.dart b/packages/openai_realtime_dart/lib/src/api.dart index eb7528ea..927349ab 100644 --- a/packages/openai_realtime_dart/lib/src/api.dart +++ b/packages/openai_realtime_dart/lib/src/api.dart @@ -54,8 +54,11 @@ class RealtimeAPI extends RealtimeEventHandler { bool isConnected() => _ws != null; /// Connects to Realtime API Websocket Server. + /// + /// [model] specifies which model to use. You can find the list of available + /// models [here](https://platform.openai.com/docs/models). Future connect({ - final String model = 'gpt-4o-realtime-preview-2024-10-01', + final String model = RealtimeUtils.defaultModel, }) async { if (isConnected()) { throw Exception('Already connected'); diff --git a/packages/openai_realtime_dart/lib/src/client.dart b/packages/openai_realtime_dart/lib/src/client.dart index 3aa6df7e..af30d4e1 100644 --- a/packages/openai_realtime_dart/lib/src/client.dart +++ b/packages/openai_realtime_dart/lib/src/client.dart @@ -245,11 +245,16 @@ class RealtimeClient extends RealtimeEventHandler { /// Connects to the Realtime WebSocket API. /// Updates session config and conversation config. - Future connect() async { + /// + /// [model] specifies which model to use. You can find the list of available + /// models [here](https://platform.openai.com/docs/models). + Future connect({ + final String model = RealtimeUtils.defaultModel, + }) async { if (isConnected()) { throw Exception('Already connected, use .disconnect() first'); } - final connected = await realtime.connect(); + final connected = await realtime.connect(model: model); if (connected) { await updateSession(); } diff --git a/packages/openai_realtime_dart/lib/src/utils.dart b/packages/openai_realtime_dart/lib/src/utils.dart index 376ff132..aa7cdf6d 100644 --- a/packages/openai_realtime_dart/lib/src/utils.dart +++ b/packages/openai_realtime_dart/lib/src/utils.dart @@ -3,6 +3,9 @@ import 'dart:math'; import 'dart:typed_data'; class RealtimeUtils { + /// Default model for OpenAI Realtime API. + static const String defaultModel = 'gpt-4o-realtime-preview'; + static Uint8List mergeUint8Lists(Uint8List left, Uint8List right) { final result = Uint8List(left.length + right.length); result.setRange(0, left.length, left); diff --git a/packages/openai_realtime_dart/test/api_test.dart b/packages/openai_realtime_dart/test/api_test.dart index 26b17494..04a62f6d 100644 --- a/packages/openai_realtime_dart/test/api_test.dart +++ b/packages/openai_realtime_dart/test/api_test.dart @@ -60,7 +60,7 @@ void main() { }); test('Should handle multiple connections and disconnections', () async { - for (int i = 0; i < 3; i++) { + for (var i = 0; i < 3; i++) { final isConnected = await realtime.connect(); expect(isConnected, isTrue, reason: 'Connection $i failed'); expect(realtime.isConnected(), isTrue, reason: 'Connection $i failed'); diff --git a/packages/openai_realtime_dart/test/client_test.dart b/packages/openai_realtime_dart/test/client_test.dart index 0da5bed5..3a3649b1 100644 --- a/packages/openai_realtime_dart/test/client_test.dart +++ b/packages/openai_realtime_dart/test/client_test.dart @@ -6,6 +6,24 @@ import 'package:test/test.dart'; void main() { group('RealtimeClient Tests', () { + test('RealtimeClient connect with custom model', () async { + final client = RealtimeClient( + apiKey: Platform.environment['OPENAI_API_KEY'], + debug: true, + ); + + // Connect with a custom model + const customModel = 'gpt-4o-mini-realtime-preview'; + final isConnected = await client.connect(model: customModel); + + expect(isConnected, isTrue); + expect(client.isConnected(), isTrue); + + // Clean up + await client.disconnect(); + expect(client.isConnected(), isFalse); + }); + test('RealtimeClient test', () async { final realtimeEvents = []; final client = RealtimeClient(