QOL: Mzansi AI Enhancement pt1
This commit is contained in:
@@ -98,14 +98,19 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Theme(
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Theme(
|
||||||
data: Theme.of(context).copyWith(
|
data: Theme.of(context).copyWith(
|
||||||
textSelectionTheme: TextSelectionThemeData(
|
textSelectionTheme: TextSelectionThemeData(
|
||||||
cursorColor: MihColors.getPrimaryColor(
|
cursorColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
selectionColor: MihColors.getPrimaryColor(
|
selectionColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark")
|
"Dark")
|
||||||
.withValues(alpha: 0.3),
|
.withValues(alpha: 0.3),
|
||||||
selectionHandleColor: MihColors.getPrimaryColor(
|
selectionHandleColor: MihColors.getPrimaryColor(
|
||||||
@@ -143,18 +148,19 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
),
|
),
|
||||||
leadingIcon: IconButton(
|
// leadingIcon:
|
||||||
onPressed: () {
|
// IconButton(
|
||||||
widget.controller.clear();
|
// onPressed: () {
|
||||||
field.didChange('');
|
// widget.controller.clear();
|
||||||
},
|
// field.didChange('');
|
||||||
icon: Icon(
|
// },
|
||||||
Icons.delete_outline_rounded,
|
// icon: Icon(
|
||||||
color: MihColors.getPrimaryColor(
|
// Icons.delete_outline_rounded,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
// color: MihColors.getPrimaryColor(
|
||||||
"Dark"),
|
// MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
),
|
// "Dark"),
|
||||||
),
|
// ),
|
||||||
|
// ),
|
||||||
onSelected: (String? selectedValue) {
|
onSelected: (String? selectedValue) {
|
||||||
field.didChange(selectedValue);
|
field.didChange(selectedValue);
|
||||||
widget.onSelected?.call(selectedValue);
|
widget.onSelected?.call(selectedValue);
|
||||||
@@ -162,12 +168,16 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
menuStyle: MenuStyle(
|
menuStyle: MenuStyle(
|
||||||
backgroundColor: WidgetStatePropertyAll(
|
backgroundColor: WidgetStatePropertyAll(
|
||||||
MihColors.getSecondaryColor(
|
MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark")),
|
"Dark")),
|
||||||
side: WidgetStatePropertyAll(
|
side: WidgetStatePropertyAll(
|
||||||
BorderSide(
|
BorderSide(
|
||||||
color: MihColors.getPrimaryColor(
|
color: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
width: 1.0),
|
width: 1.0),
|
||||||
),
|
),
|
||||||
@@ -195,10 +205,14 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: field.hasError
|
color: field.hasError
|
||||||
? MihColors.getRedColor(
|
? MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark")
|
"Dark")
|
||||||
: MihColors.getSecondaryColor(
|
: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
width: 3.0,
|
width: 3.0,
|
||||||
),
|
),
|
||||||
@@ -207,7 +221,9 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
borderRadius: BorderRadius.circular(8.0),
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: MihColors.getRedColor(
|
color: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
width: 3.0,
|
width: 3.0,
|
||||||
),
|
),
|
||||||
@@ -216,7 +232,9 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
borderRadius: BorderRadius.circular(8.0),
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: MihColors.getRedColor(
|
color: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
width: 3.0,
|
width: 3.0,
|
||||||
),
|
),
|
||||||
@@ -224,6 +242,23 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 8),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
widget.controller.clear();
|
||||||
|
field.didChange('');
|
||||||
|
},
|
||||||
|
child: Icon(
|
||||||
|
size: 35,
|
||||||
|
Icons.delete_rounded,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
if (field.hasError)
|
if (field.hasError)
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 8.0, top: 4.0),
|
padding: const EdgeInsets.only(left: 8.0, top: 4.0),
|
||||||
|
|||||||
@@ -228,10 +228,11 @@ class _MihAiChatState extends State<MihAiChat> with WidgetsBindingObserver {
|
|||||||
LlmChatView(
|
LlmChatView(
|
||||||
provider: aiProvider.ollamaProvider,
|
provider: aiProvider.ollamaProvider,
|
||||||
messageSender: aiProvider.ollamaProvider.sendMessageStream,
|
messageSender: aiProvider.ollamaProvider.sendMessageStream,
|
||||||
|
speechToText: aiProvider.ollamaProvider.speechToText,
|
||||||
// welcomeMessage:
|
// welcomeMessage:
|
||||||
// "Mzansi AI is here to help. Send us a messahe and we'll try our best to assist you.",
|
// "Mzansi AI is here to help. Send us a messahe and we'll try our best to assist you.",
|
||||||
autofocus: false,
|
autofocus: false,
|
||||||
enableAttachments: false,
|
enableAttachments: true,
|
||||||
enableVoiceNotes: false,
|
enableVoiceNotes: false,
|
||||||
style: aiProvider.getChatStyle(context),
|
style: aiProvider.getChatStyle(context),
|
||||||
suggestions: [
|
suggestions: [
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ class MzansiAiProvider extends ChangeNotifier {
|
|||||||
}) {
|
}) {
|
||||||
ollamaProvider = OllamaProvider(
|
ollamaProvider = OllamaProvider(
|
||||||
baseUrl: "${AppEnviroment.baseAiUrl}/api",
|
baseUrl: "${AppEnviroment.baseAiUrl}/api",
|
||||||
model: AppEnviroment.getEnv() == "Prod" ? 'gemma3n:e4b' : "gemma3:1b",
|
model: AppEnviroment.getEnv() == "Prod"
|
||||||
|
? 'gemma3n:e4b'
|
||||||
|
: "qwen3-vl:2b-instruct",
|
||||||
|
think: false,
|
||||||
systemPrompt: "You are Mzansi AI, a helpful and friendly AI assistant running on the 'MIH App'.\n" +
|
systemPrompt: "You are Mzansi AI, a helpful and friendly AI assistant running on the 'MIH App'.\n" +
|
||||||
"The MIH App was created by 'Mzansi Innovation Hub', a South African-based startup company." +
|
"The MIH App was created by 'Mzansi Innovation Hub', a South African-based startup company." +
|
||||||
"Your primary purpose is to assist users by answering general questions and helping with creative writing tasks or any other task a user might have for you.\n" +
|
"Your primary purpose is to assist users by answering general questions and helping with creative writing tasks or any other task a user might have for you.\n" +
|
||||||
@@ -147,9 +150,6 @@ class MzansiAiProvider extends ChangeNotifier {
|
|||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
progressIndicatorColor: MihColors.getPrimaryColor(
|
progressIndicatorColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
menuColor: Colors.black,
|
|
||||||
// MihColors.getGreenColor(
|
|
||||||
// MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
disabledButtonStyle: ActionButtonStyle(
|
disabledButtonStyle: ActionButtonStyle(
|
||||||
icon: MihIcons.mzansiAi,
|
icon: MihIcons.mzansiAi,
|
||||||
iconColor: MihColors.getSecondaryColor(
|
iconColor: MihColors.getSecondaryColor(
|
||||||
@@ -323,6 +323,21 @@ class MzansiAiProvider extends ChangeNotifier {
|
|||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
addButtonStyle: ActionButtonStyle(
|
||||||
|
iconDecoration: BoxDecoration(
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
borderRadius: BorderRadius.circular(25),
|
||||||
|
),
|
||||||
|
iconColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
textStyle: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
menuColor: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,16 @@ import 'package:flutter/foundation.dart';
|
|||||||
import 'package:flutter_ai_toolkit/flutter_ai_toolkit.dart';
|
import 'package:flutter_ai_toolkit/flutter_ai_toolkit.dart';
|
||||||
import 'package:ken_logger/ken_logger.dart';
|
import 'package:ken_logger/ken_logger.dart';
|
||||||
import 'package:ollama_dart/ollama_dart.dart';
|
import 'package:ollama_dart/ollama_dart.dart';
|
||||||
|
import 'package:cross_file/cross_file.dart';
|
||||||
|
|
||||||
class OllamaProvider extends LlmProvider with ChangeNotifier {
|
class OllamaProvider extends LlmProvider with ChangeNotifier {
|
||||||
OllamaProvider({
|
OllamaProvider({
|
||||||
String? baseUrl,
|
String? baseUrl,
|
||||||
Map<String, String>? headers,
|
Map<String, String>? headers,
|
||||||
Map<String, String>? queryParams,
|
Map<String, dynamic>? queryParams,
|
||||||
required String model,
|
required String model,
|
||||||
String? systemPrompt,
|
String? systemPrompt,
|
||||||
|
bool? think,
|
||||||
}) : _client = OllamaClient(
|
}) : _client = OllamaClient(
|
||||||
baseUrl: baseUrl,
|
baseUrl: baseUrl,
|
||||||
headers: headers,
|
headers: headers,
|
||||||
@@ -19,11 +21,13 @@ class OllamaProvider extends LlmProvider with ChangeNotifier {
|
|||||||
),
|
),
|
||||||
_model = model,
|
_model = model,
|
||||||
_systemPrompt = systemPrompt,
|
_systemPrompt = systemPrompt,
|
||||||
|
_think = think,
|
||||||
_history = [];
|
_history = [];
|
||||||
final OllamaClient _client;
|
final OllamaClient _client;
|
||||||
final String _model;
|
final String _model;
|
||||||
final List<ChatMessage> _history;
|
final List<ChatMessage> _history;
|
||||||
final String? _systemPrompt;
|
final String? _systemPrompt;
|
||||||
|
final bool? _think;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<String> generateStream(
|
Stream<String> generateStream(
|
||||||
@@ -36,6 +40,29 @@ class OllamaProvider extends LlmProvider with ChangeNotifier {
|
|||||||
yield* _generateStream(messages);
|
yield* _generateStream(messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stream<String> speechToText(XFile audioFile) async* {
|
||||||
|
KenLogger.success("Inside Custom speechToText funtion");
|
||||||
|
// 1. Convert the XFile to the attachment format needed for the LLM.
|
||||||
|
final attachments = [await FileAttachment.fromFile(audioFile)];
|
||||||
|
KenLogger.success("added attachment for audio file");
|
||||||
|
|
||||||
|
// 2. Define the transcription prompt, mirroring the logic from LlmChatView.
|
||||||
|
const prompt =
|
||||||
|
'translate the attached audio to text; provide the result of that '
|
||||||
|
'translation as just the text of the translation itself. be careful to '
|
||||||
|
'separate the background audio from the foreground audio and only '
|
||||||
|
'provide the result of translating the foreground audio.';
|
||||||
|
|
||||||
|
KenLogger.success("Created Prompt");
|
||||||
|
// 3. Use your existing Ollama API call to process the prompt and attachment.
|
||||||
|
// We are essentially running a new, one-off chat session for transcription.
|
||||||
|
yield* generateStream(
|
||||||
|
prompt,
|
||||||
|
attachments: attachments,
|
||||||
|
);
|
||||||
|
KenLogger.success("done");
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<String> sendMessageStream(
|
Stream<String> sendMessageStream(
|
||||||
String prompt, {
|
String prompt, {
|
||||||
@@ -76,6 +103,7 @@ class OllamaProvider extends LlmProvider with ChangeNotifier {
|
|||||||
Stream<String> _generateStream(List<Message> messages) async* {
|
Stream<String> _generateStream(List<Message> messages) async* {
|
||||||
final allMessages = <Message>[];
|
final allMessages = <Message>[];
|
||||||
if (_systemPrompt != null && _systemPrompt.isNotEmpty) {
|
if (_systemPrompt != null && _systemPrompt.isNotEmpty) {
|
||||||
|
KenLogger.success("Adding system prompt to the conversation");
|
||||||
allMessages.add(Message(
|
allMessages.add(Message(
|
||||||
role: MessageRole.system,
|
role: MessageRole.system,
|
||||||
content: _systemPrompt,
|
content: _systemPrompt,
|
||||||
@@ -87,6 +115,7 @@ class OllamaProvider extends LlmProvider with ChangeNotifier {
|
|||||||
request: GenerateChatCompletionRequest(
|
request: GenerateChatCompletionRequest(
|
||||||
model: _model,
|
model: _model,
|
||||||
messages: allMessages,
|
messages: allMessages,
|
||||||
|
think: _think,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
// final stream = _client.generateChatCompletionStream(
|
// final stream = _client.generateChatCompletionStream(
|
||||||
@@ -109,19 +138,32 @@ class OllamaProvider extends LlmProvider with ChangeNotifier {
|
|||||||
content: message.text ?? '',
|
content: message.text ?? '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
final imageAttachments = <String>[];
|
||||||
return Message(
|
final docAttachments = <String>[];
|
||||||
role: MessageRole.user,
|
if (message.text != null && message.text!.isNotEmpty) {
|
||||||
content: message.text ?? '',
|
docAttachments.add(message.text!);
|
||||||
images: [
|
}
|
||||||
for (final attachment in message.attachments)
|
for (final attachment in message.attachments) {
|
||||||
if (attachment is ImageFileAttachment)
|
if (attachment is FileAttachment) {
|
||||||
base64Encode(attachment.bytes)
|
final mimeType = attachment.mimeType.toLowerCase();
|
||||||
else
|
if (mimeType.startsWith('image/')) {
|
||||||
|
imageAttachments.add(base64Encode(attachment.bytes));
|
||||||
|
} else if (mimeType == 'application/pdf' ||
|
||||||
|
mimeType.startsWith('text/')) {
|
||||||
|
throw LlmFailureException(
|
||||||
|
"\n\nAww, that file is a little too advanced for us right now ($mimeType)! We're still learning, but we'll get there! Please try sending us a different file type.\n\nHint: We can handle images quite well!",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
throw LlmFailureException(
|
throw LlmFailureException(
|
||||||
'Unsupported attachment type: $attachment',
|
'Unsupported attachment type: $attachment',
|
||||||
),
|
);
|
||||||
],
|
}
|
||||||
|
}
|
||||||
|
return Message(
|
||||||
|
role: MessageRole.user,
|
||||||
|
content: docAttachments.join(' '),
|
||||||
|
images: imageAttachments,
|
||||||
);
|
);
|
||||||
|
|
||||||
case MessageOrigin.llm:
|
case MessageOrigin.llm:
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import record_macos
|
|||||||
import screen_brightness_macos
|
import screen_brightness_macos
|
||||||
import share_plus
|
import share_plus
|
||||||
import shared_preferences_foundation
|
import shared_preferences_foundation
|
||||||
import speech_to_text
|
|
||||||
import sqflite_darwin
|
import sqflite_darwin
|
||||||
import syncfusion_pdfviewer_macos
|
import syncfusion_pdfviewer_macos
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
@@ -50,7 +49,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin"))
|
ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin"))
|
||||||
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
||||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
SpeechToTextPlugin.register(with: registry.registrar(forPlugin: "SpeechToTextPlugin"))
|
|
||||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin"))
|
SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
|
|||||||
@@ -322,13 +322,13 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "3.3.0"
|
version: "3.3.0"
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cross_file
|
name: cross_file
|
||||||
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
|
sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.4+2"
|
version: "0.3.5+1"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1336,14 +1336,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.4"
|
version: "1.0.4"
|
||||||
pedantic:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: pedantic
|
|
||||||
sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.11.1"
|
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1757,30 +1749,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.1"
|
version: "1.10.1"
|
||||||
speech_to_text:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: speech_to_text
|
|
||||||
sha256: c07557664974afa061f221d0d4186935bea4220728ea9446702825e8b988db04
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "7.3.0"
|
|
||||||
speech_to_text_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: speech_to_text_platform_interface
|
|
||||||
sha256: a1935847704e41ee468aad83181ddd2423d0833abe55d769c59afca07adb5114
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.3.0"
|
|
||||||
speech_to_text_windows:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: speech_to_text_windows
|
|
||||||
sha256: "2c9846d18253c7bbe059a276297ef9f27e8a2745dead32192525beb208195072"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.0+beta.8"
|
|
||||||
sprintf:
|
sprintf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ dependencies:
|
|||||||
provider: ^6.1.5+1
|
provider: ^6.1.5+1
|
||||||
flutter_ai_toolkit: ^0.10.0
|
flutter_ai_toolkit: ^0.10.0
|
||||||
flutter_markdown_plus: ^1.0.5
|
flutter_markdown_plus: ^1.0.5
|
||||||
speech_to_text: ^7.3.0
|
cross_file: ^0.3.5+1
|
||||||
quick_actions: ^1.1.0
|
quick_actions: ^1.1.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
#include <record_windows/record_windows_plugin_c_api.h>
|
#include <record_windows/record_windows_plugin_c_api.h>
|
||||||
#include <screen_brightness_windows/screen_brightness_windows_plugin.h>
|
#include <screen_brightness_windows/screen_brightness_windows_plugin.h>
|
||||||
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
||||||
#include <speech_to_text_windows/speech_to_text_windows.h>
|
|
||||||
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
|
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
|
|
||||||
@@ -47,8 +46,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
|||||||
registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin"));
|
registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin"));
|
||||||
SharePlusWindowsPluginCApiRegisterWithRegistrar(
|
SharePlusWindowsPluginCApiRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
|
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
|
||||||
SpeechToTextWindowsRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("SpeechToTextWindows"));
|
|
||||||
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
|
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
|
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||||||
record_windows
|
record_windows
|
||||||
screen_brightness_windows
|
screen_brightness_windows
|
||||||
share_plus
|
share_plus
|
||||||
speech_to_text_windows
|
|
||||||
syncfusion_pdfviewer_windows
|
syncfusion_pdfviewer_windows
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
)
|
)
|
||||||
|
|||||||
BIN
backend/.DS_Store
vendored
BIN
backend/.DS_Store
vendored
Binary file not shown.
Reference in New Issue
Block a user