Skip to content

Commit

Permalink
feat: assistants
Browse files Browse the repository at this point in the history
  • Loading branch information
redevrx committed Jan 29, 2024
1 parent cf0ee74 commit fddf3f1
Show file tree
Hide file tree
Showing 10 changed files with 170 additions and 15 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/dart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -282,6 +283,27 @@ FutureBuilder<CTResponse?>(
}
```

## 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
Expand Down
15 changes: 15 additions & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,21 @@ class _TranslateScreenState extends State<TranslateScreen> {
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(
Expand Down
7 changes: 7 additions & 0 deletions lib/chat_gpt_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
84 changes: 80 additions & 4 deletions lib/src/assistants.dart
Original file line number Diff line number Diff line change
@@ -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';

Expand Down Expand Up @@ -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,
},
Expand All @@ -75,12 +77,86 @@ class Assistants {

///Returns a list of assistant files.
///[listFile]
Future<ListAssistantFile> listFile() {
///[assistantId]
///The ID of the assistant the file belongs to.
Future<ListAssistantFile> 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<AssistantData> retrieves({
required String assistantId,
}) {
return _client.get(
_client.apiUrl + kAssistants + "/$assistantId",
headers: _headers,
onSuccess: AssistantData.fromJson,
onCancel: (_) => null,
);
}

///Retrieves an AssistantFile.
/// [retrievesFile]
Future<AssistantFileData> 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<AssistantData> 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<DeleteAssistant> delete({
required String assistantId,
}) {
return _client.delete(
_client.apiUrl + kAssistants + "/$assistantId",
headers: _headers,
onSuccess: DeleteAssistant.fromJson,
onCancel: (_) => null,
);
}

///Delete an assistant file.
/// [deleteFile]
Future<DeleteAssistant> deleteFile({
required String fileId,
required String assistantId,
}) {
return _client.delete(
_client.apiUrl + kAssistants + "/$assistantId/files/$fileId",
headers: _headers,
onSuccess: DeleteAssistant.fromJson,
onCancel: (_) => null,
);
}
}
10 changes: 8 additions & 2 deletions lib/src/client/openai_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,20 @@ class OpenAIClient extends OpenAIWrapper {
String url, {
required T Function(Map<String, dynamic>) onSuccess,
required void Function(CancelData cancelData) onCancel,
Map<String, String>? 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 ==================");
Expand Down
16 changes: 10 additions & 6 deletions lib/src/model/assistant/enum/assistant_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
24 changes: 24 additions & 0 deletions lib/src/model/assistant/response/delete_assistant.dart
Original file line number Diff line number Diff line change
@@ -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<String, dynamic> json) =>
DeleteAssistant(
deleted: json["deleted"],
id: json["id"],
object: json["object"],
);

Map<String, dynamic> toJson() => {
"deleted": deleted,
"id": id,
"object": object,
};
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions test/client/openai_wrapper_test.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ class MockOpenAIClient extends _i1.Mock implements _i5.OpenAIClient {
String? url, {
required T Function(Map<String, dynamic>)? onSuccess,
required void Function(_i7.CancelData)? onCancel,
Map<String, String>? headers,
}) =>
(super.noSuchMethod(
Invocation.method(
Expand Down

0 comments on commit fddf3f1

Please sign in to comment.