Skip to content

Commit 4d4d01e

Browse files
committed
[ Edit ] exposed logging functionality fot full responses, moved the web enabling to be set dynamically without user interaction
1 parent 6823c68 commit 4d4d01e

File tree

12 files changed

+121
-45
lines changed

12 files changed

+121
-45
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:dart_openai/dart_openai.dart';
2+
import 'package:example/env/env.dart';
3+
4+
void main() {
5+
OpenAI.showLogs = true;
6+
OpenAI.showResponsesLogs = true;
7+
OpenAI.apiKey = Env.apiKey;
8+
9+
final models = OpenAI.instance.model.list();
10+
11+
print(models);
12+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import 'package:dart_openai/dart_openai.dart';
1+
// import 'package:dart_openai/dart_openai.dart';
22

3-
void main() {
4-
OpenAI.isWeb = true;
3+
// void main() {
4+
// OpenAI.isWeb = true;
55

6-
print(OpenAI.isWeb);
7-
}
6+
// print(OpenAI.isWeb);
7+
// }

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ packages:
159159
path: ".."
160160
relative: true
161161
source: path
162-
version: "4.0.0"
162+
version: "4.1.4"
163163
dart_style:
164164
dependency: transitive
165165
description:

lib/src/core/constants/config.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ abstract class OpenAIConfig {
2121
/// {@endtemplate}
2222
static String? _baseUrl;
2323

24-
/// {@template openai_config_is_web}
25-
/// This is a flag that indicates if the library is running on the web or not.
26-
/// {@endtemplate}
27-
static bool _isWeb = false;
24+
// /// {@template openai_config_is_web}
25+
// /// This is a flag that indicates if the library is running on the web or not.
26+
// /// {@endtemplate}
27+
// static bool _isWeb = false;
2828

2929
/// This is the version of the API.
3030
static String get version => OpenAIStrings.version;
@@ -35,18 +35,18 @@ abstract class OpenAIConfig {
3535
return _baseUrl ?? OpenAIStrings.defaultBaseUrl;
3636
}
3737

38-
/// {@macro openai_config_is_web}
39-
static bool get isWeb => _isWeb;
38+
// /// {@macro openai_config_is_web}
39+
// static bool get isWeb => _isWeb;
4040

4141
@internal
4242
static set baseUrl(String? baseUrl) {
4343
_baseUrl = baseUrl;
4444
OpenAILogger.logBaseUrl(_baseUrl);
4545
}
4646

47-
@internal
48-
static set isWeb(bool isWeb) {
49-
_isWeb = isWeb;
50-
OpenAILogger.logIsWeb(_isWeb);
51-
}
47+
// @internal
48+
// static set isWeb(bool isWeb) {
49+
// _isWeb = isWeb;
50+
// OpenAILogger.logIsWeb(_isWeb);
51+
// }
5252
}

lib/src/core/networking/client.dart

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import "package:http/http.dart" as http;
1111
import "package:meta/meta.dart";
1212

1313
import '../constants/strings.dart';
14-
import "../utils/streaming_http_client.dart";
14+
15+
import "../utils/streaming_http_client_default.dart"
16+
if (dart.library.js) 'package:dart_openai/src/core/utils/streaming_http_client_web.dart'
17+
if (dart.library.io) 'package:dart_openai/src/core/utils/streaming_http_client_io.dart';
1518

1619
/// Handling exceptions returned by OpenAI Stream API.
1720
final class _OpenAIChatStreamSink implements EventSink<String> {
@@ -99,6 +102,8 @@ abstract class OpenAINetworkingClient {
99102
.timeout(OpenAIConfig.requestsTimeOut)
100103
: await client.get(uri, headers: headers);
101104

105+
OpenAILogger.logResponseBody(response);
106+
102107
if (returnRawResponse) {
103108
return response.body as T;
104109
}
@@ -295,6 +300,8 @@ abstract class OpenAINetworkingClient {
295300
.timeout(OpenAIConfig.requestsTimeOut)
296301
: await client.post(uri, headers: headers, body: handledBody);
297302

303+
OpenAILogger.logResponseBody(response);
304+
298305
OpenAILogger.requestToWithStatusCode(to, response.statusCode);
299306

300307
OpenAILogger.startingDecoding();
@@ -467,6 +474,8 @@ abstract class OpenAINetworkingClient {
467474

468475
final String encodedBody = await response.stream.bytesToString();
469476

477+
OpenAILogger.logResponseBody(response);
478+
470479
final Map<String, dynamic> decodedBody = decodeToMap(encodedBody);
471480

472481
OpenAILogger.decodedSuccessfully();
@@ -518,6 +527,8 @@ abstract class OpenAINetworkingClient {
518527

519528
final String encodedBody = await response.stream.bytesToString();
520529

530+
OpenAILogger.logResponseBody(response);
531+
521532
final Map<String, dynamic> decodedBody = decodeToMap(encodedBody);
522533

523534
OpenAILogger.decodedSuccessfully();
@@ -564,6 +575,8 @@ abstract class OpenAINetworkingClient {
564575
final http.StreamedResponse response =
565576
await request.send().timeout(OpenAIConfig.requestsTimeOut);
566577

578+
OpenAILogger.logResponseBody(response);
579+
567580
OpenAILogger.requestToWithStatusCode(to, response.statusCode);
568581

569582
OpenAILogger.startingDecoding();
@@ -612,6 +625,8 @@ abstract class OpenAINetworkingClient {
612625
.timeout(OpenAIConfig.requestsTimeOut)
613626
: await client.delete(uri, headers: headers);
614627

628+
OpenAILogger.logResponseBody(response);
629+
615630
OpenAILogger.requestToWithStatusCode(from, response.statusCode);
616631

617632
OpenAILogger.startingDecoding();
@@ -660,10 +675,6 @@ abstract class OpenAINetworkingClient {
660675
}
661676

662677
static http.Client _streamingHttpClient() {
663-
if (OpenAIConfig.isWeb) {
664-
return createWebClient();
665-
} else {
666-
return createIoClient();
667-
}
678+
return createClient();
668679
}
669680
}

lib/src/core/utils/logger.dart

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:developer' as dev;
22

3+
import 'package:http/http.dart';
34
import 'package:meta/meta.dart';
45

56
import '../constants/strings.dart';
@@ -8,28 +9,65 @@ import '../constants/strings.dart';
89
@immutable
910
@internal
1011
abstract final class OpenAILogger {
11-
/// This represents the default value of the logger active state.
12+
/// {@template openai_logger_is_active}
13+
/// Wether the to show operations flow logger is active or not.
14+
/// {@endtemplate}
1215
static bool _isActive = true;
1316

17+
/// {@template openai_logger_show_responses_logs}
18+
/// Wether to show operations response bodies in logs or not.
19+
/// {@endtemplate}
20+
static bool _showResponsesLogs = false;
21+
22+
/// {@macro openai_logger_is_active}
1423
static bool get isActive => _isActive;
1524

25+
/// {@macro openai_logger_show_responses_logs}
26+
static bool get showResponsesLogs => _showResponsesLogs;
27+
1628
/// Changes the logger active state.
1729
///
1830
/// if true, the logger will log messages.
1931
/// If false, the logger will not log messages.
2032
///
21-
/// The default value is [_isActive].
33+
/// The default value is [true].
2234
static set isActive(bool newValue) {
2335
_isActive = newValue;
2436
}
2537

38+
/// Changes the logger show responses logs state.
39+
///
40+
/// if true, the logger will log responses bodies.
41+
/// If false, the logger will not log responses bodies.
42+
///
43+
/// The default value is [false].
44+
static set showResponsesLogs(bool newValue) {
45+
_showResponsesLogs = newValue;
46+
}
47+
2648
/// Logs a message, if the logger is active.
2749
static void log(String message, [Object? error]) {
2850
if (_isActive) {
2951
dev.log(message, name: OpenAIStrings.openai, error: error);
3052
}
3153
}
3254

55+
/// Logs the response of a request, if the logger is active.
56+
static Future<void> logResponseBody(response) async {
57+
if (_isActive && _showResponsesLogs) {
58+
if (response is Response) {
59+
dev.log(response.body.toString(), name: OpenAIStrings.openai);
60+
} else if (response is StreamedResponse) {
61+
final asString = await response.stream.bytesToString();
62+
63+
dev.log(
64+
asString,
65+
name: OpenAIStrings.openai,
66+
);
67+
}
68+
}
69+
}
70+
3371
/// Logs that a request to an [endpoint] is being made, if the logger is active.
3472
static void logEndpoint(String endpoint) {
3573
log("accessing endpoint: $endpoint");

lib/src/core/utils/streaming_http_client.dart

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
createClient() =>
2+
UnsupportedError('Cannot create a client without dart:html or dart:io.');
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import 'package:http/http.dart' as http;
2+
3+
http.Client createClient() => http.Client();
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import 'package:fetch_client/fetch_client.dart' as fetch;
2+
3+
fetch.FetchClient createClient() =>
4+
fetch.FetchClient(mode: fetch.RequestMode.cors);

0 commit comments

Comments
 (0)