Skip to content

Commit

Permalink
fix(openai_dart): Several fixes and improvments (#182)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidmigloz committed Nov 2, 2023
1 parent 4f676e8 commit 115e8be
Show file tree
Hide file tree
Showing 31 changed files with 3,023 additions and 2,044 deletions.
4 changes: 3 additions & 1 deletion examples/browser_summarizer/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# melos_managed_dependency_overrides: langchain,langchain_openai
# melos_managed_dependency_overrides: langchain,langchain_openai,openai_dart
dependency_overrides:
langchain:
path: ../../packages/langchain
langchain_openai:
path: ../../packages/langchain_openai
openai_dart:
path: ../../packages/openai_dart
4 changes: 3 additions & 1 deletion examples/docs_examples/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# melos_managed_dependency_overrides: langchain,langchain_openai,chromadb,langchain_chroma
# melos_managed_dependency_overrides: chromadb,langchain,langchain_chroma,langchain_openai,openai_dart
dependency_overrides:
chromadb:
path: ../../packages/chromadb
Expand All @@ -8,3 +8,5 @@ dependency_overrides:
path: ../../packages/langchain_chroma
langchain_openai:
path: ../../packages/langchain_openai
openai_dart:
path: ../../packages/openai_dart
4 changes: 3 additions & 1 deletion examples/hello_world_backend/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# melos_managed_dependency_overrides: langchain,langchain_openai
# melos_managed_dependency_overrides: langchain,langchain_openai,openai_dart
dependency_overrides:
langchain:
path: ../../packages/langchain
langchain_openai:
path: ../../packages/langchain_openai
openai_dart:
path: ../../packages/openai_dart
4 changes: 3 additions & 1 deletion examples/hello_world_cli/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# melos_managed_dependency_overrides: langchain,langchain_openai
# melos_managed_dependency_overrides: langchain,langchain_openai,openai_dart
dependency_overrides:
langchain:
path: ../../packages/langchain
langchain_openai:
path: ../../packages/langchain_openai
openai_dart:
path: ../../packages/openai_dart
4 changes: 3 additions & 1 deletion examples/hello_world_flutter/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# melos_managed_dependency_overrides: langchain,langchain_openai
# melos_managed_dependency_overrides: langchain,langchain_openai,openai_dart
dependency_overrides:
langchain:
path: ../../packages/langchain
langchain_openai:
path: ../../packages/langchain_openai
openai_dart:
path: ../../packages/openai_dart
4 changes: 3 additions & 1 deletion packages/langchain_chroma/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# melos_managed_dependency_overrides: langchain,chromadb,langchain_openai
# melos_managed_dependency_overrides: chromadb,langchain,langchain_openai,openai_dart
dependency_overrides:
chromadb:
path: ../chromadb
langchain:
path: ../langchain
langchain_openai:
path: ../langchain_openai
openai_dart:
path: ../openai_dart
4 changes: 3 additions & 1 deletion packages/langchain_openai/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# melos_managed_dependency_overrides: langchain
# melos_managed_dependency_overrides: langchain,openai_dart
dependency_overrides:
langchain:
path: ../langchain
openai_dart:
path: ../openai_dart
4 changes: 3 additions & 1 deletion packages/langchain_pinecone/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# melos_managed_dependency_overrides: langchain,langchain_openai
# melos_managed_dependency_overrides: langchain,langchain_openai,openai_dart
dependency_overrides:
langchain:
path: ../langchain
langchain_openai:
path: ../langchain_openai
openai_dart:
path: ../openai_dart
2 changes: 1 addition & 1 deletion packages/openai_dart/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ await for (final res in stream) {
**Function calling:**

```dart
const function = ChatCompletionFunctions(
const function = ChatCompletionFunction(
name: 'get_current_weather',
description: 'Get the current weather in a given location',
parameters: {
Expand Down
2 changes: 1 addition & 1 deletion packages/openai_dart/example/openai_dart_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'dart:io';
import 'package:openai_dart/openai_dart.dart';

Future<void> main() async {
final client = OpenAIClient(apiKey: Platform.environment['OPENAI_API_KEY']!);
final client = OpenAIClient(apiKey: Platform.environment['OPENAI_API_KEY']);

await _chatCompletions(client);
await _completions(client);
Expand Down
10 changes: 5 additions & 5 deletions packages/openai_dart/lib/src/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ class OpenAIClient extends g.OpenAIClient {
/// Advance configuration options:
/// - `baseUrl`: the base URL to use. Defaults to OpenAI's API URL. You can
/// override this to use a different API URL, or to use a proxy.
/// - `globalHeaders`: global headers to send with every request. You can use
/// - `headers`: global headers to send with every request. You can use
/// this to set custom headers, or to override the default headers.
/// - `client`: the HTTP client to use. You can set your own HTTP client if
/// you need further customization (e.g. to use a Socks5 proxy).
OpenAIClient({
final String apiKey = '',
final String? apiKey,
final String? organization,
final String? baseUrl,
final Map<String, String>? globalHeaders,
final Map<String, String>? headers,
final http.Client? client,
}) : super(
bearerToken: apiKey,
bearerToken: apiKey ?? '',
baseUrl: baseUrl,
headers: {
if (organization != null) 'OpenAI-Organization': organization,
...?globalHeaders,
...?headers,
},
client: client ?? createDefaultHttpClient(),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
part of open_a_i_schema;

// ==========================================
// CLASS: ChatCompletionFunctions
// CLASS: ChatCompletionFunction
// ==========================================

/// A function that the model may call.
@freezed
class ChatCompletionFunctions with _$ChatCompletionFunctions {
const ChatCompletionFunctions._();
class ChatCompletionFunction with _$ChatCompletionFunction {
const ChatCompletionFunction._();

/// Factory constructor for ChatCompletionFunctions
const factory ChatCompletionFunctions({
/// Factory constructor for ChatCompletionFunction
const factory ChatCompletionFunction({
/// The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.
required String name,

Expand All @@ -25,11 +25,11 @@ class ChatCompletionFunctions with _$ChatCompletionFunctions {
///
/// To describe a function that accepts no parameters, provide the value `{"type": "object", "properties": {}}`.
required ChatCompletionFunctionParameters parameters,
}) = _ChatCompletionFunctions;
}) = _ChatCompletionFunction;

/// Object construction from a JSON representation
factory ChatCompletionFunctions.fromJson(Map<String, dynamic> json) =>
_$ChatCompletionFunctionsFromJson(json);
factory ChatCompletionFunction.fromJson(Map<String, dynamic> json) =>
_$ChatCompletionFunctionFromJson(json);

/// List of all property names of schema
static const List<String> propertyNames = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ class CreateChatCompletionRequest with _$CreateChatCompletionRequest {
double? frequencyPenalty,

/// Controls how the model calls functions. "none" means the model will not call a function and instead generates a message. "auto" means the model can pick between generating a message or calling a function. Specifying a particular function via [ChatCompletionFunctionCallOption] forces the model to call that function. "none" is the default when no functions are present. "auto" is the default if functions are present.
@JsonKey(name: 'function_call', includeIfNull: false) dynamic functionCall,
@_ChatCompletionFunctionCallConverter()
@JsonKey(name: 'function_call', includeIfNull: false)
ChatCompletionFunctionCall? functionCall,

/// A list of functions the model may generate JSON inputs for.
@JsonKey(includeIfNull: false) List<ChatCompletionFunctions>? functions,
@JsonKey(includeIfNull: false) List<ChatCompletionFunction>? functions,

/// Modify the likelihood of specified tokens appearing in the completion.
///
Expand Down Expand Up @@ -213,14 +215,14 @@ enum ChatCompletionModels {
sealed class ChatCompletionModel with _$ChatCompletionModel {
const ChatCompletionModel._();

const factory ChatCompletionModel.string(
String value,
) = _UnionChatCompletionModelString;

const factory ChatCompletionModel.enumeration(
ChatCompletionModels value,
) = _UnionChatCompletionModelEnum;

const factory ChatCompletionModel.string(
String value,
) = _UnionChatCompletionModelString;

/// Object construction from a JSON representation
factory ChatCompletionModel.fromJson(Map<String, dynamic> json) =>
_$ChatCompletionModelFromJson(json);
Expand All @@ -243,18 +245,99 @@ class _ChatCompletionModelConverter
if (data is String) {
return ChatCompletionModel.string(data);
}
throw Exception('Unexpected value for ChatCompletionModel: $data');
throw Exception(
'Unexpected value for ChatCompletionModel: $data',
);
}

@override
Object? toJson(ChatCompletionModel data) {
return switch (data) {
_UnionChatCompletionModelString(value: final v) => v,
_UnionChatCompletionModelEnum(value: final v) =>
_$ChatCompletionModelsEnumMap[v]!,
_UnionChatCompletionModelString(value: final v) => v,
};
}
}

// ==========================================
// ENUM: ChatCompletionFunctionCallMode
// ==========================================

/// No Description
enum ChatCompletionFunctionCallMode {
@JsonValue('none')
none,
@JsonValue('auto')
auto,
}

// ==========================================
// CLASS: ChatCompletionFunctionCall
// ==========================================

/// Controls how the model calls functions. "none" means the model will not call a function and instead generates a message. "auto" means the model can pick between generating a message or calling a function. Specifying a particular function via [ChatCompletionFunctionCallOption] forces the model to call that function. "none" is the default when no functions are present. "auto" is the default if functions are present.
@freezed
sealed class ChatCompletionFunctionCall with _$ChatCompletionFunctionCall {
const ChatCompletionFunctionCall._();

const factory ChatCompletionFunctionCall.enumeration(
ChatCompletionFunctionCallMode value,
) = _UnionChatCompletionFunctionCallEnum;

const factory ChatCompletionFunctionCall.chatCompletionFunctionCallOption(
ChatCompletionFunctionCallOption value,
) = _UnionChatCompletionFunctionCallChatCompletionFunctionCallOption;

/// Object construction from a JSON representation
factory ChatCompletionFunctionCall.fromJson(Map<String, dynamic> json) =>
_$ChatCompletionFunctionCallFromJson(json);
}

/// Custom JSON converter for [ChatCompletionFunctionCall]
class _ChatCompletionFunctionCallConverter
implements JsonConverter<ChatCompletionFunctionCall?, Object?> {
const _ChatCompletionFunctionCallConverter();

@override
ChatCompletionFunctionCall? fromJson(Object? data) {
if (data == null) {
return null;
}
if (data is String &&
_$ChatCompletionFunctionCallModeEnumMap.values.contains(data)) {
return ChatCompletionFunctionCall.enumeration(
_$ChatCompletionFunctionCallModeEnumMap.keys.elementAt(
_$ChatCompletionFunctionCallModeEnumMap.values.toList().indexOf(data),
),
);
}
if (data is Map<String, dynamic>) {
try {
return ChatCompletionFunctionCall.chatCompletionFunctionCallOption(
ChatCompletionFunctionCallOption.fromJson(data),
);
} catch (e) {}
}
throw Exception(
'Unexpected value for ChatCompletionFunctionCall: $data',
);
}

@override
Object? toJson(ChatCompletionFunctionCall? data) {
return switch (data) {
_UnionChatCompletionFunctionCallEnum(value: final v) =>
_$ChatCompletionFunctionCallModeEnumMap[v]!,
_UnionChatCompletionFunctionCallChatCompletionFunctionCallOption(
value: final v
) =>
v.toJson(),
null => null,
};
}
}

// ==========================================
// CLASS: ChatCompletionStop
// ==========================================
Expand All @@ -264,40 +347,46 @@ class _ChatCompletionModelConverter
sealed class ChatCompletionStop with _$ChatCompletionStop {
const ChatCompletionStop._();

const factory ChatCompletionStop.string(
String value,
) = _UnionChatCompletionStopString;

const factory ChatCompletionStop.arrayString(
List<String> value,
) = _UnionChatCompletionStopArrayString;

const factory ChatCompletionStop.string(
String value,
) = _UnionChatCompletionStopString;

/// Object construction from a JSON representation
factory ChatCompletionStop.fromJson(Map<String, dynamic> json) =>
_$ChatCompletionStopFromJson(json);
}

/// Custom JSON converter for [ChatCompletionStop]
class _ChatCompletionStopConverter
implements JsonConverter<ChatCompletionStop, Object?> {
implements JsonConverter<ChatCompletionStop?, Object?> {
const _ChatCompletionStopConverter();

@override
ChatCompletionStop fromJson(Object? data) {
if (data is String) {
return ChatCompletionStop.string(data);
ChatCompletionStop? fromJson(Object? data) {
if (data == null) {
return null;
}
if (data is List && data.every((item) => item is String)) {
return ChatCompletionStop.arrayString(data.cast());
}
throw Exception('Unexpected value for ChatCompletionStop: $data');
if (data is String) {
return ChatCompletionStop.string(data);
}
throw Exception(
'Unexpected value for ChatCompletionStop: $data',
);
}

@override
Object? toJson(ChatCompletionStop data) {
Object? toJson(ChatCompletionStop? data) {
return switch (data) {
_UnionChatCompletionStopString(value: final v) => v,
_UnionChatCompletionStopArrayString(value: final v) => v,
_UnionChatCompletionStopString(value: final v) => v,
null => null,
};
}
}

0 comments on commit 115e8be

Please sign in to comment.