gemini-app/lib/bloc/gemini_state.dart
Dawid Pietrykowski 9f75adb929 first commit
2024-07-16 19:02:02 +02:00

95 lines
3.0 KiB
Dart

import 'package:bloc/bloc.dart';
import 'package:flutter/services.dart';
import 'package:google_generative_ai/google_generative_ai.dart';
enum GeminiStatus { initial, loading, success, error }
enum MessageType { text, image, audio, video }
enum MessageSource { user, agent }
class Message {
final String text;
final MessageType type;
final MessageSource source;
Message({
required this.text,
required this.type,
required this.source,
});
}
class GeminiState {
GeminiStatus status;
String error;
List<Content> messages;
GeminiState({
required this.status,
required this.error,
this.messages = const [],
});
static GeminiState get initialState => GeminiState(
status: GeminiStatus.initial,
// messages: [Message(text: "Hello, I'm Gemini Pro. How can I help you?", type: MessageType.text, source: MessageSource.agent)],
messages: [Content.model([TextPart("Hello, I'm Gemini Pro. How can I help you?")])],
error: '',
);
}
class GeminiCubit extends Cubit<GeminiState> {
GeminiCubit() : super(GeminiState.initialState);
void sendMessage(String prompt) async {
var messagesWithoutPrompt = state.messages;
var messagesWithPrompt = state.messages + [
Content.text(prompt)
];
emit(GeminiState(status: GeminiStatus.loading, messages: messagesWithPrompt, error: ''));
final safetySettings = [
SafetySetting(HarmCategory.harassment, HarmBlockThreshold.none),
SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.none),
SafetySetting(HarmCategory.sexuallyExplicit, HarmBlockThreshold.none),
SafetySetting(HarmCategory.dangerousContent, HarmBlockThreshold.none),
// SafetySetting(HarmCategory.unspecified, HarmBlockThreshold.none),
];
final String rjp = await rootBundle.loadString('assets/lessons/rjp.md');
const String systemPrmpt = """You are an AI tutor helping students understand topics with help of biometric data. You will be supplied with a json containing data extracted from an EEG device, use that data to modify your approach and help the student learn more effectively.
Write the response in two parts:
State analysis: <describe what is the state of the student and how to best approach them>
Tutor response: <continue with the lesson, respond to answers, etc>""";
final model = GenerativeModel(
model: 'gemini-1.5-pro-latest',
apiKey: '',
safetySettings: safetySettings,
systemInstruction: Content.system(systemPrmpt)
);
try {
final chat = model.startChat(history: messagesWithoutPrompt);
final stream = chat.sendMessageStream(Content.text(prompt));
String responseText = '';
await for (final chunk in stream) {
responseText += chunk.text ?? '';
emit(GeminiState(
status: GeminiStatus.success,
messages: messagesWithPrompt + [Content.model([TextPart(responseText)])],
error: '',
));
}
} catch (e) {
emit(GeminiState(
status: GeminiStatus.error,
messages: messagesWithPrompt,
error: e.toString(),
));
}
}
}