From effe414268a5f35045159c2bf7c82ebf770e9e93 Mon Sep 17 00:00:00 2001 From: Manas Hejmadi Date: Sun, 22 Jun 2025 23:01:06 +0530 Subject: [PATCH] genai: Created Package & implemented LLM Config, Manager & Request --- packages/genai/.gitignore | 30 +++++ packages/genai/CHANGELOG.md | 3 + packages/genai/LICENSE | 1 + packages/genai/README.md | 2 + packages/genai/analysis_options.yaml | 4 + packages/genai/lib/genai.dart | 7 + packages/genai/lib/llm_config.dart | 191 +++++++++++++++++++++++++++ packages/genai/lib/llm_manager.dart | 0 packages/genai/lib/llm_request.dart | 13 ++ packages/genai/pubspec.yaml | 26 ++++ packages/genai/test/genai_test.dart | 5 + 11 files changed, 282 insertions(+) create mode 100644 packages/genai/.gitignore create mode 100644 packages/genai/CHANGELOG.md create mode 100644 packages/genai/LICENSE create mode 100644 packages/genai/README.md create mode 100644 packages/genai/analysis_options.yaml create mode 100644 packages/genai/lib/genai.dart create mode 100644 packages/genai/lib/llm_config.dart create mode 100644 packages/genai/lib/llm_manager.dart create mode 100644 packages/genai/lib/llm_request.dart create mode 100644 packages/genai/pubspec.yaml create mode 100644 packages/genai/test/genai_test.dart diff --git a/packages/genai/.gitignore b/packages/genai/.gitignore new file mode 100644 index 00000000..96486fd9 --- /dev/null +++ b/packages/genai/.gitignore @@ -0,0 +1,30 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/genai/CHANGELOG.md b/packages/genai/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/genai/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/genai/LICENSE b/packages/genai/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/genai/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/genai/README.md b/packages/genai/README.md new file mode 100644 index 00000000..ea898451 --- /dev/null +++ b/packages/genai/README.md @@ -0,0 +1,2 @@ +# genai package +This Package contains all the code related to generative AI capabilities and is a foundational package that can be used in various projects \ No newline at end of file diff --git a/packages/genai/analysis_options.yaml b/packages/genai/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/genai/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/genai/lib/genai.dart b/packages/genai/lib/genai.dart new file mode 100644 index 00000000..83f90435 --- /dev/null +++ b/packages/genai/lib/genai.dart @@ -0,0 +1,7 @@ +library genai; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/packages/genai/lib/llm_config.dart b/packages/genai/lib/llm_config.dart new file mode 100644 index 00000000..2944bd0e --- /dev/null +++ b/packages/genai/lib/llm_config.dart @@ -0,0 +1,191 @@ +import 'dart:convert'; + +typedef LLMOutputFormatter = String? Function(Map); + +class LLMModelConfiguration { + final String configId; + final String configName; + final String configDescription; + final LLMModelConfigurationType configType; + final LLMModelConfigValue configValue; + + LLMModelConfiguration updateValue(LLMModelConfigValue value) { + return LLMModelConfiguration( + configId: configId, + configName: configName, + configDescription: configDescription, + configType: configType, + configValue: value, + ); + } + + LLMModelConfiguration({ + required this.configId, + required this.configName, + required this.configDescription, + required this.configType, + required this.configValue, + }) { + // Assert that the configuration type and value matches + switch (configType) { + case LLMModelConfigurationType.boolean: + assert(configValue is LLMConfigBooleanValue); + case LLMModelConfigurationType.slider: + assert(configValue is LLMConfigSliderValue); + case LLMModelConfigurationType.numeric: + assert(configValue is LLMConfigNumericValue); + case LLMModelConfigurationType.text: + assert(configValue is LLMConfigTextValue); + } + } + + factory LLMModelConfiguration.fromJson(Map x) { + LLMModelConfigurationType cT; + LLMModelConfigValue cV; + switch (x['configType']) { + case 'boolean': + cT = LLMModelConfigurationType.boolean; + cV = LLMConfigBooleanValue.deserialize(x['configValue']); + break; + case 'slider': + cT = LLMModelConfigurationType.slider; + cV = LLMConfigSliderValue.deserialize(x['configValue']); + break; + case 'numeric': + cT = LLMModelConfigurationType.numeric; + cV = LLMConfigNumericValue.deserialize(x['configValue']); + break; + case 'text': + cT = LLMModelConfigurationType.text; + cV = LLMConfigTextValue.deserialize(x['configValue']); + break; + default: + cT = LLMModelConfigurationType.text; + cV = LLMConfigTextValue.deserialize(x['configValue']); + } + return LLMModelConfiguration( + configId: x['configId'], + configName: x['configName'], + configDescription: x['configDescription'], + configType: cT, + configValue: cV, + ); + } + + Map toJson() { + return { + 'configId': configId, + 'configName': configName, + 'configDescription': configDescription, + 'configType': configType.name.toString(), + 'configValue': configValue.serialize(), + }; + } + + LLMModelConfiguration clone() { + return LLMModelConfiguration.fromJson(toJson()); + } +} + +enum LLMModelConfigurationType { boolean, slider, numeric, text } + +//----------------LLMConfigValues ------------ + +abstract class LLMModelConfigValue { + dynamic _value; + + // ignore: unnecessary_getters_setters + dynamic get value => _value; + + set value(dynamic newValue) => _value = newValue; + + String serialize(); + + LLMModelConfigValue(this._value); +} + +class LLMConfigBooleanValue extends LLMModelConfigValue { + LLMConfigBooleanValue({required bool value}) : super(value); + + @override + String serialize() { + return value.toString(); + } + + static LLMConfigBooleanValue deserialize(String x) { + return LLMConfigBooleanValue(value: x == 'true'); + } +} + +class LLMConfigNumericValue extends LLMModelConfigValue { + LLMConfigNumericValue({required num value}) : super(value); + + @override + String serialize() { + return value.toString(); + } + + static LLMConfigNumericValue deserialize(String x) { + return LLMConfigNumericValue(value: num.parse(x)); + } +} + +class LLMConfigSliderValue extends LLMModelConfigValue { + LLMConfigSliderValue({required (double, double, double) value}) + : super(value); + + @override + String serialize() { + final v = value as (double, double, double); + return jsonEncode([v.$1, v.$2, v.$3]); + } + + static LLMConfigSliderValue deserialize(String x) { + final z = jsonDecode(x) as List; + final val = ( + double.parse(z[0].toString()), + double.parse(z[1].toString()), + double.parse(z[2].toString()), + ); + return LLMConfigSliderValue(value: val); + } +} + +class LLMConfigTextValue extends LLMModelConfigValue { + LLMConfigTextValue({required String value}) : super(value); + + @override + String serialize() { + return value.toString(); + } + + static LLMConfigTextValue deserialize(String x) { + return LLMConfigTextValue(value: x); + } +} + +enum LLMConfigName { temperature, top_p, max_tokens, endpoint } + +Map defaultLLMConfigurations = { + LLMConfigName.temperature: LLMModelConfiguration( + configId: 'temperature', + configName: 'Temperature', + configDescription: 'The Temperature of the Model', + configType: LLMModelConfigurationType.slider, + configValue: LLMConfigSliderValue(value: (0, 0.5, 1)), + ), + LLMConfigName.top_p: LLMModelConfiguration( + configId: 'top_p', + configName: 'Top P', + configDescription: 'The Top P of the Model', + configType: LLMModelConfigurationType.slider, + configValue: LLMConfigSliderValue(value: (0, 0.95, 1)), + ), + LLMConfigName.max_tokens: LLMModelConfiguration( + configId: 'max_tokens', + configName: 'Maximum Tokens', + configDescription: 'The maximum number of tokens allowed in the output', + configType: LLMModelConfigurationType.numeric, + configValue: LLMConfigNumericValue(value: -1), + ), +}; diff --git a/packages/genai/lib/llm_manager.dart b/packages/genai/lib/llm_manager.dart new file mode 100644 index 00000000..e69de29b diff --git a/packages/genai/lib/llm_request.dart b/packages/genai/lib/llm_request.dart new file mode 100644 index 00000000..041fc381 --- /dev/null +++ b/packages/genai/lib/llm_request.dart @@ -0,0 +1,13 @@ +class LLMRequestDetails { + String endpoint; + Map headers; + String method; + Map body; + + LLMRequestDetails({ + required this.endpoint, + required this.headers, + required this.method, + required this.body, + }); +} diff --git a/packages/genai/pubspec.yaml b/packages/genai/pubspec.yaml new file mode 100644 index 00000000..b5b6f696 --- /dev/null +++ b/packages/genai/pubspec.yaml @@ -0,0 +1,26 @@ +name: genai +description: "Generative AI capabilities for flutter applications" +version: 0.0.1 +homepage: +publish_to: none + +environment: + sdk: ^3.8.0 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + shared_preferences: ^2.5.2 + better_networking: + path: ../better_networking + +dev_dependencies: + flutter_test: + sdk: flutter + build_runner: ^2.4.12 + flutter_lints: ^4.0.0 + freezed: ^2.5.7 + json_serializable: ^6.7.1 + +flutter: \ No newline at end of file diff --git a/packages/genai/test/genai_test.dart b/packages/genai/test/genai_test.dart new file mode 100644 index 00000000..e5371074 --- /dev/null +++ b/packages/genai/test/genai_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:genai/genai.dart'; + +void main() { +}