From fddf3f1901106e37972c1743d61606dc6e54e0f2 Mon Sep 17 00:00:00 2001 From: "redev.rx" Date: Mon, 29 Jan 2024 17:28:37 +0700 Subject: [PATCH] feat: assistants --- .github/workflows/dart.yml | 2 +- README.md | 24 +++++- example/lib/main.dart | 15 ++++ lib/chat_gpt_sdk.dart | 7 ++ lib/src/assistants.dart | 84 ++++++++++++++++++- lib/src/client/openai_client.dart | 10 ++- .../model/assistant/enum/assistant_model.dart | 16 ++-- .../assistant/response/delete_assistant.dart | 24 ++++++ pubspec.yaml | 2 +- test/client/openai_wrapper_test.mocks.dart | 1 + 10 files changed, 170 insertions(+), 15 deletions(-) create mode 100644 lib/src/model/assistant/response/delete_assistant.dart diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index a0ff602..054f9e7 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -25,7 +25,7 @@ jobs: java-version: '11' - uses: subosito/flutter-action@v1 with: - flutter-version: '3.16.8' + flutter-version: '3.16.9' # - name: run analyze # run: flutter analyze diff --git a/README.md b/README.md index a54e849..fd1173c 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ supervised and reinforcement learning techniques. - Support GPT3.5 and GPT-4 - Support Server Sent Event - Support Function Calling -- [x] [Assistants API] +- [x] [Assistants API](#assistants) + - CRUD - [x] [Error Handle](#error-handle) - [x] [Example Q&A](#qa) - [x] [Generate Image With Prompt](#generate-image-with-prompt) @@ -282,6 +283,27 @@ FutureBuilder( } ``` +## Assistants +- Create Assistant +```dart + void createAssistant() async { + final assistant = Assistant( + model: Gpt4AModel(), + name: 'Math Tutor', + instructions: + 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.', + tools: [ + { + "type": "code_interpreter", + } + ], + ); + await openAI.assistant.create(assistant: assistant); +} + +``` + + ## Error Handle ```dart diff --git a/example/lib/main.dart b/example/lib/main.dart index 708d410..185c02d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -117,6 +117,21 @@ class _TranslateScreenState extends State { await openAI.onChatCompletion(request: request); } + void createAssistant() async { + final assistant = Assistant( + model: Gpt4AModel(), + name: 'Math Tutor', + instructions: + 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.', + tools: [ + { + "type": "code_interpreter", + } + ], + ); + await openAI.assistant.create(assistant: assistant); + } + @override void initState() { openAI = OpenAI.instance.build( diff --git a/lib/chat_gpt_sdk.dart b/lib/chat_gpt_sdk.dart index ec94cf2..1d50670 100644 --- a/lib/chat_gpt_sdk.dart +++ b/lib/chat_gpt_sdk.dart @@ -46,3 +46,10 @@ export 'src/model/chat_complete/request/messages.dart'; export 'src/model/chat_complete/request/function_data.dart'; export 'src/model/chat_complete/request/response_format.dart'; export 'src/model/gen_image/enum/generate_image_model.dart'; +export 'src/model/assistant/enum/assistant_model.dart'; +export 'src/model/assistant/request/assistant.dart'; +export 'src/model/assistant/response/assistant_data.dart'; +export 'src/model/assistant/response/assistant_file_data.dart'; +export 'src/model/assistant/response/delete_assistant.dart'; +export 'src/model/assistant/response/list_assistant_file.dart'; +export 'src/model/assistant/response/tool.dart'; diff --git a/lib/src/assistants.dart b/lib/src/assistants.dart index 57a78cf..ee59f3d 100644 --- a/lib/src/assistants.dart +++ b/lib/src/assistants.dart @@ -1,8 +1,10 @@ -import 'package:chat_gpt_sdk/chat_gpt_sdk.dart'; import 'package:chat_gpt_sdk/src/model/assistant/request/assistant.dart'; import 'package:chat_gpt_sdk/src/model/assistant/response/assistant_data.dart'; import 'package:chat_gpt_sdk/src/model/assistant/response/assistant_file_data.dart'; +import 'package:chat_gpt_sdk/src/model/assistant/response/delete_assistant.dart'; import 'package:chat_gpt_sdk/src/model/assistant/response/list_assistant_file.dart'; +import 'package:chat_gpt_sdk/src/model/cancel/cancel_data.dart'; +import 'package:chat_gpt_sdk/src/utils/constants.dart'; import 'client/client.dart'; @@ -48,7 +50,7 @@ class Assistants { void Function(CancelData cancelData)? onCancel, }) { return _client.post( - _client.apiUrl + kAssistants + "/$assistantId/file", + _client.apiUrl + kAssistants + "/$assistantId/files", { 'file_id': fileId, }, @@ -75,12 +77,86 @@ class Assistants { ///Returns a list of assistant files. ///[listFile] - Future listFile() { + ///[assistantId] + ///The ID of the assistant the file belongs to. + Future listFile({ + required String assistantId, + }) { return _client.get( - _client.apiUrl + kAssistants, + _client.apiUrl + kAssistants + "/$assistantId/files", headers: _headers, onSuccess: ListAssistantFile.fromJson, onCancel: (_) => null, ); } + + ///Retrieves an assistant. + ///[retrieves] + Future retrieves({ + required String assistantId, + }) { + return _client.get( + _client.apiUrl + kAssistants + "/$assistantId", + headers: _headers, + onSuccess: AssistantData.fromJson, + onCancel: (_) => null, + ); + } + + ///Retrieves an AssistantFile. + /// [retrievesFile] + Future retrievesFile({ + required String fileId, + required String assistantId, + }) { + return _client.get( + _client.apiUrl + kAssistants + "/$assistantId/files/$fileId", + headers: _headers, + onSuccess: AssistantFileData.fromJson, + onCancel: (_) => null, + ); + } + + ///Modifies an assistant. + /// [modifies] + Future modifies({ + required String assistantId, + required Assistant assistant, + void Function(CancelData cancelData)? onCancel, + }) { + return _client.post( + _client.apiUrl + kAssistants + "/$assistantId", + assistant.toJson(), + headers: _headers, + onSuccess: AssistantData.fromJson, + onCancel: (it) => onCancel != null ? onCancel(it) : null, + ); + } + + ///Delete an assistant. + ///[delete] + Future delete({ + required String assistantId, + }) { + return _client.delete( + _client.apiUrl + kAssistants + "/$assistantId", + headers: _headers, + onSuccess: DeleteAssistant.fromJson, + onCancel: (_) => null, + ); + } + + ///Delete an assistant file. + /// [deleteFile] + Future deleteFile({ + required String fileId, + required String assistantId, + }) { + return _client.delete( + _client.apiUrl + kAssistants + "/$assistantId/files/$fileId", + headers: _headers, + onSuccess: DeleteAssistant.fromJson, + onCancel: (_) => null, + ); + } } diff --git a/lib/src/client/openai_client.dart b/lib/src/client/openai_client.dart index 989de66..17d9928 100644 --- a/lib/src/client/openai_client.dart +++ b/lib/src/client/openai_client.dart @@ -150,14 +150,20 @@ class OpenAIClient extends OpenAIWrapper { String url, { required T Function(Map) onSuccess, required void Function(CancelData cancelData) onCancel, + Map? headers, }) async { try { final cancelData = CancelData(cancelToken: CancelToken()); onCancel(cancelData); log.log("starting request"); - final rawData = - await _dio.delete(url, cancelToken: cancelData.cancelToken); + final rawData = await _dio.delete( + url, + cancelToken: cancelData.cancelToken, + options: Options( + headers: headers ?? {}, + ), + ); if (rawData.statusCode == HttpStatus.ok) { log.log("============= success =================="); diff --git a/lib/src/model/assistant/enum/assistant_model.dart b/lib/src/model/assistant/enum/assistant_model.dart index f90e86a..a2ca375 100644 --- a/lib/src/model/assistant/enum/assistant_model.dart +++ b/lib/src/model/assistant/enum/assistant_model.dart @@ -6,14 +6,18 @@ sealed class AssistantModel { AssistantModel({required this.model}); } -class GptTurbo0301Model extends AssistantModel { - GptTurbo0301Model() : super(model: kChatGptTurbo0301Model); +class Gpt4AModel extends AssistantModel { + Gpt4AModel() : super(model: kChatGpt4); } -class GptTurbo1106Model extends AssistantModel { - GptTurbo1106Model() : super(model: kChatGptTurbo1106); +class GptTurbo0301AModel extends AssistantModel { + GptTurbo0301AModel() : super(model: kChatGptTurbo0301Model); } -class Gpt41106PreviewModel extends AssistantModel { - Gpt41106PreviewModel() : super(model: kGpt41106Preview); +class GptTurbo1106AModel extends AssistantModel { + GptTurbo1106AModel() : super(model: kChatGptTurbo1106); +} + +class Gpt41106PreviewAModel extends AssistantModel { + Gpt41106PreviewAModel() : super(model: kGpt41106Preview); } diff --git a/lib/src/model/assistant/response/delete_assistant.dart b/lib/src/model/assistant/response/delete_assistant.dart new file mode 100644 index 0000000..139e525 --- /dev/null +++ b/lib/src/model/assistant/response/delete_assistant.dart @@ -0,0 +1,24 @@ +class DeleteAssistant { + DeleteAssistant({ + required this.deleted, + required this.id, + required this.object, + }); + + bool deleted; + String id; + String object; + + factory DeleteAssistant.fromJson(Map json) => + DeleteAssistant( + deleted: json["deleted"], + id: json["id"], + object: json["object"], + ); + + Map toJson() => { + "deleted": deleted, + "id": id, + "object": object, + }; +} diff --git a/pubspec.yaml b/pubspec.yaml index 9871d34..6d3ada9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://www.facebook.com/REDEVRX repository: https://github.com/redevRx/Flutter-ChatGPT environment: - sdk: '>=3.2.5 <4.0.0' + sdk: '>=3.2.6 <4.0.0' dependencies: dio: ^5.4.0 diff --git a/test/client/openai_wrapper_test.mocks.dart b/test/client/openai_wrapper_test.mocks.dart index 7285ab9..2e29e53 100644 --- a/test/client/openai_wrapper_test.mocks.dart +++ b/test/client/openai_wrapper_test.mocks.dart @@ -202,6 +202,7 @@ class MockOpenAIClient extends _i1.Mock implements _i5.OpenAIClient { String? url, { required T Function(Map)? onSuccess, required void Function(_i7.CancelData)? onCancel, + Map? headers, }) => (super.noSuchMethod( Invocation.method(