diff --git a/lib/providers/ai_providers.dart b/lib/providers/ai_providers.dart index acef0246..52a9f407 100644 --- a/lib/providers/ai_providers.dart +++ b/lib/providers/ai_providers.dart @@ -1,5 +1,2 @@ -import 'package:apidash_core/apidash_core.dart'; -import 'package:riverpod/riverpod.dart'; - // final aiApiCredentialProvider = // StateProvider>((ref) => {}); diff --git a/lib/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart b/lib/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart index f687195c..ba634fe1 100644 --- a/lib/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart +++ b/lib/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart @@ -75,6 +75,7 @@ class _GenerateUIDialogState extends ConsumerState { backgroundColor: Colors.redAccent, )); Navigator.pop(context); + return null; } } diff --git a/lib/screens/common_widgets/agentic_ui_features/tool_generation/ai_toolgen_widgets.dart b/lib/screens/common_widgets/agentic_ui_features/tool_generation/ai_toolgen_widgets.dart deleted file mode 100644 index 48a9e867..00000000 --- a/lib/screens/common_widgets/agentic_ui_features/tool_generation/ai_toolgen_widgets.dart +++ /dev/null @@ -1,449 +0,0 @@ -import 'dart:convert'; -import 'package:apidash/apitoolgen/request_consolidator.dart'; -import 'package:apidash/apitoolgen/tool_templates.dart'; -import 'package:apidash/screens/common_widgets/ai/ai_model_selector_button.dart'; -import 'package:apidash/services/agentic_services/agent_caller.dart'; -import 'package:apidash/services/agentic_services/agents/apitool_bodygen.dart'; -import 'package:apidash/services/agentic_services/agents/apitool_funcgen.dart'; -import 'package:apidash/widgets/button_copy.dart'; -import 'package:apidash/widgets/previewer_code.dart'; -import 'package:apidash/widgets/widget_sending.dart'; -import 'package:apidash_core/apidash_core.dart'; -import 'package:apidash_design_system/tokens/tokens.dart'; -import 'package:apidash_design_system/widgets/popup_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../../../../providers/providers.dart'; -import '../ai_ui_designer/generate_ui_dialog.dart'; - -class GenerateToolDialog extends ConsumerStatefulWidget { - final APIDashRequestDescription requestDesc; - const GenerateToolDialog({ - super.key, - required this.requestDesc, - }); - - static show(BuildContext context, WidgetRef ref) { - final requestModel = ref.watch(selectedRequestModelProvider - .select((value) => value?.httpRequestModel)); - final responseModel = ref.watch(selectedRequestModelProvider - .select((value) => value?.httpResponseModel)); - - if (requestModel == null) return; - if (responseModel == null) return; - - String? bodyTXT; - Map? bodyJSON; - List? bodyFormData; - - if (requestModel.bodyContentType == ContentType.formdata) { - bodyFormData = requestModel.formDataMapList; - } else if (requestModel.bodyContentType == ContentType.json) { - bodyJSON = jsonDecode(requestModel.body.toString()); - } else { - bodyTXT = requestModel.body!; - } - - final reqDesModel = APIDashRequestDescription( - endpoint: requestModel.url, - method: requestModel.method.name.toUpperCase(), - responseType: responseModel.contentType.toString(), - headers: requestModel.headersMap, - response: responseModel.body, - formData: bodyFormData, - bodyTXT: bodyTXT, - bodyJSON: bodyJSON, - ); - - showCustomDialog( - context, - GenerateToolDialog( - requestDesc: reqDesModel, - ), - ); - } - - @override - ConsumerState createState() => _GenerateToolDialogState(); -} - -class _GenerateToolDialogState extends ConsumerState { - int index = 0; - TextEditingController controller = TextEditingController(); - - String selectedLanguage = 'PYTHON'; - String selectedAgent = 'GEMINI'; - String? generatedToolCode = ''; - - generateAPITool() async { - try { - setState(() { - generatedToolCode = null; - }); - final toolfuncRes = await APIDashAgentCaller.instance.call( - APIToolFunctionGenerator(), - ref: ref, - input: AgentInputs(variables: { - 'REQDATA': widget.requestDesc.generateREQDATA, - 'TARGET_LANGUAGE': selectedLanguage, - }), - ); - if (toolfuncRes == null) { - setState(() { - generatedToolCode = ''; - }); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - "API Tool generation failed!", - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.redAccent, - )); - return; - } - - String toolCode = toolfuncRes!['FUNC']; - - final toolres = await APIDashAgentCaller.instance.call( - ApiToolBodyGen(), - ref: ref, - input: AgentInputs(variables: { - 'TEMPLATE': APIToolGenTemplateSelector.getTemplate( - selectedLanguage, selectedAgent) - .substitutePromptVariable('FUNC', toolCode), - }), - ); - if (toolres == null) { - setState(() { - generatedToolCode = ''; - }); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - "API Tool generation failed!", - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.redAccent, - )); - return; - } - String toolDefinition = toolres!['TOOL']; - - setState(() { - generatedToolCode = toolDefinition; - }); - } catch (e) { - String errMsg = 'Unexpected Error Occured'; - if (e.toString().contains('NO_DEFAULT_LLM')) { - errMsg = "Please Select Default AI Model in Settings"; - } - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - errMsg, - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.redAccent, - )); - Navigator.pop(context); - } - } - - @override - Widget build(BuildContext context) { - return Container( - height: 600, - width: MediaQuery.of(context).size.width * 0.8, - child: Row( - children: [ - Expanded(child: ToolRequirementSelectorPage( - onGenerateCallback: (agent, lang) { - setState(() { - selectedLanguage = lang; - selectedAgent = agent; - }); - generateAPITool(); - }, - )), - GeneratedToolCodeCopyPage( - toolCode: generatedToolCode, - language: selectedLanguage.trim(), - ), - ], - ), - ); - } -} - -class ToolRequirementSelectorPage extends StatefulWidget { - final Function(String agent, String lang) onGenerateCallback; - const ToolRequirementSelectorPage( - {super.key, required this.onGenerateCallback}); - - @override - State createState() => - _ToolRequirementSelectorPageState(); -} - -class _ToolRequirementSelectorPageState - extends State { - String targetLanguage = 'PYTHON'; - String agentFramework = 'GEMINI'; - - Map frameworkMapping = { - 'GEMINI': 'Gemini', - 'OPENAI': 'OpenAI', - 'LANGCHAIN': 'LangChain', - 'MICROSOFT_AUTOGEN': 'Microsoft AutoGen', - 'MISTRAL': 'Mistral', - 'ANTRHOPIC': 'Anthropic', - }; - - Map languageMapping = { - 'PYTHON': 'Python 3', - 'JAVASCRIPT': 'JavaScript / NodeJS' - }; - - @override - Widget build(BuildContext context) { - final lightMode = Theme.of(context).brightness == Brightness.light; - - return Container( - width: MediaQuery.of(context).size.width * 0.4, // Large dialog - padding: EdgeInsets.all(30), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Generate API Tool", - style: TextStyle( - fontSize: 24, - ), - ), - kVSpacer5, - Padding( - padding: EdgeInsets.only(left: 3), - child: Text( - "Select an agent framework & language", - style: TextStyle( - color: lightMode ? Colors.black54 : Colors.white60, - fontSize: 15), - ), - ), - kVSpacer20, - Padding( - padding: EdgeInsets.only(left: 3), - child: Text( - "Agent Framework", - style: TextStyle( - color: lightMode ? Colors.black54 : Colors.white60, - ), - ), - ), - kVSpacer8, - ADPopupMenu( - value: frameworkMapping[agentFramework], - values: [ - ...frameworkMapping.keys - .map((e) => (e.toString(), frameworkMapping[e].toString())), - ], - width: MediaQuery.of(context).size.width * 0.35, - tooltip: '', - onChanged: (x) { - setState(() { - agentFramework = x ?? 'OPENAI'; - - //AutoGen is Python-Only - if (agentFramework == 'MICROSOFT_AUTOGEN') { - targetLanguage = 'PYTHON'; - } - }); - }, - isOutlined: true, - ), - kVSpacer20, - Padding( - padding: EdgeInsets.only(left: 3), - child: Text( - "Target Language", - style: TextStyle( - color: lightMode ? Colors.black54 : Colors.white60, - ), - ), - ), - kVSpacer8, - ADPopupMenu( - value: languageMapping[targetLanguage], - values: [ - ...languageMapping.keys - .map((e) => (e.toString(), languageMapping[e].toString())), - ], - width: MediaQuery.of(context).size.width * 0.35, - tooltip: '', - onChanged: (x) { - setState(() { - targetLanguage = x ?? 'PYTHON'; - - //AutoGen is Python-Only - if (agentFramework == 'MICROSOFT_AUTOGEN') { - targetLanguage = 'PYTHON'; - } - }); - }, - isOutlined: true, - ), - kVSpacer20, - Row( - children: [ - FilledButton.tonalIcon( - style: FilledButton.styleFrom( - padding: kPh12, - minimumSize: const Size(44, 44), - ), - onPressed: () { - widget.onGenerateCallback(agentFramework, targetLanguage); - }, - icon: Icon( - Icons.token_outlined, - ), - label: const SizedBox( - child: Text( - "Generate Tool", - ), - ), - ), - kHSpacer5, - DefaultLLModelSelectorWidget(), - ], - ), - ], - ), - ); - } -} - -class GeneratedToolCodeCopyPage extends StatelessWidget { - final String? toolCode; - final String language; - const GeneratedToolCodeCopyPage( - {super.key, required this.toolCode, required this.language}); - - @override - Widget build(BuildContext context) { - final lightMode = Theme.of(context).brightness == Brightness.light; - var codeTheme = lightMode ? kLightCodeTheme : kDarkCodeTheme; - - if (toolCode == null) { - return SendingWidget( - startSendingTime: DateTime.now(), - showTimeElapsed: false, - ); - } - - if (toolCode!.isEmpty) { - return Padding( - padding: const EdgeInsets.only(right: 40), - child: Center( - child: Icon( - Icons.token_outlined, - color: lightMode ? Colors.black12 : Colors.white12, - size: 500, - ), - ), - ); - } - - return Container( - color: const Color.fromARGB(26, 123, 123, 123), - padding: EdgeInsets.all(20), - width: MediaQuery.of(context).size.width * 0.50, - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - CopyButton( - toCopy: toolCode!, - showLabel: true, - ), - Expanded( - child: SingleChildScrollView( - child: Container( - width: double.infinity, - child: CodePreviewer( - code: toolCode!, - theme: codeTheme, - language: language.toLowerCase(), - textStyle: kCodeStyle, - ), - ), - ), - ), - ], - ), - ); - } -} - -class DefaultLLModelSelectorWidget extends ConsumerWidget { - const DefaultLLModelSelectorWidget({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final settings = ref.watch(settingsProvider); - return Opacity( - opacity: 0.8, - child: Row( - children: [ - Padding( - padding: EdgeInsets.only(left: 3), - child: Text( - "with", - style: TextStyle( - color: Theme.of(context).brightness == Brightness.light - ? Colors.black54 - : Colors.white60, - fontSize: 15), - ), - ), - SizedBox(width: 5), - AIModelSelectorButton( - aiRequestModel: - AIRequestModel.fromJson(settings.defaultAIModel ?? {}), - onModelUpdated: (d) { - ref.read(settingsProvider.notifier).update( - defaultAIModel: d.copyWith( - modelConfigs: [], - stream: null, - systemPrompt: '', - userPrompt: '').toJson()); - }, - ), - kVSpacer5, - ], - ), - ); - } -} - -class GenerateToolButton extends ConsumerWidget { - const GenerateToolButton({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return FilledButton.tonalIcon( - style: FilledButton.styleFrom( - padding: kPh12, - minimumSize: const Size(44, 44), - ), - onPressed: () async { - GenerateToolDialog.show(context, ref); - }, - icon: Icon( - Icons.token_outlined, - ), - label: const SizedBox( - child: Text( - "Generate Tool", - ), - ), - ); - } -} diff --git a/lib/screens/common_widgets/agentic_ui_features/tool_generation/generate_tool_dialog.dart b/lib/screens/common_widgets/agentic_ui_features/tool_generation/generate_tool_dialog.dart new file mode 100644 index 00000000..290e2f44 --- /dev/null +++ b/lib/screens/common_widgets/agentic_ui_features/tool_generation/generate_tool_dialog.dart @@ -0,0 +1,165 @@ +import 'dart:convert'; + +import 'package:apidash/apitoolgen/request_consolidator.dart'; +import 'package:apidash/providers/collection_providers.dart'; +import 'package:apidash/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart'; +import 'package:apidash/utils/agent_utils.dart'; +import 'package:apidash_core/apidash_core.dart'; +import 'package:apidash_design_system/apidash_design_system.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'generated_tool_codecopy.dart'; +import 'tool_requirements_selector.dart'; + +class GenerateToolButton extends ConsumerWidget { + const GenerateToolButton({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return FilledButton.tonalIcon( + style: FilledButton.styleFrom( + padding: kPh12, + minimumSize: const Size(44, 44), + ), + onPressed: () async { + GenerateToolDialog.show(context, ref); + }, + icon: Icon( + Icons.token_outlined, + ), + label: const SizedBox( + child: Text( + "Generate Tool", + ), + ), + ); + } +} + +class GenerateToolDialog extends ConsumerStatefulWidget { + final APIDashRequestDescription requestDesc; + const GenerateToolDialog({ + super.key, + required this.requestDesc, + }); + + static show(BuildContext context, WidgetRef ref) { + final requestModel = ref.watch(selectedRequestModelProvider + .select((value) => value?.httpRequestModel)); + final responseModel = ref.watch(selectedRequestModelProvider + .select((value) => value?.httpResponseModel)); + + if (requestModel == null) return; + if (responseModel == null) return; + + String? bodyTXT; + Map? bodyJSON; + List? bodyFormData; + + if (requestModel.bodyContentType == ContentType.formdata) { + bodyFormData = requestModel.formDataMapList; + } else if (requestModel.bodyContentType == ContentType.json) { + bodyJSON = jsonDecode(requestModel.body.toString()); + } else { + bodyTXT = requestModel.body!; + } + + final reqDesModel = APIDashRequestDescription( + endpoint: requestModel.url, + method: requestModel.method.name.toUpperCase(), + responseType: responseModel.contentType.toString(), + headers: requestModel.headersMap, + response: responseModel.body, + formData: bodyFormData, + bodyTXT: bodyTXT, + bodyJSON: bodyJSON, + ); + + showCustomDialog( + context, + GenerateToolDialog( + requestDesc: reqDesModel, + ), + ); + } + + @override + ConsumerState createState() => _GenerateToolDialogState(); +} + +class _GenerateToolDialogState extends ConsumerState { + int index = 0; + TextEditingController controller = TextEditingController(); + + String selectedLanguage = 'PYTHON'; + String selectedAgent = 'GEMINI'; + String? generatedToolCode = ''; + + generateAPITool() async { + try { + setState(() { + generatedToolCode = null; + }); + final res = await generateAPIToolUsingRequestData( + ref: ref, + requestData: widget.requestDesc.generateREQDATA, + targetLanguage: selectedLanguage, + selectedAgent: selectedAgent, + ); + if (res == null) { + setState(() { + generatedToolCode = ''; + }); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + "API Tool generation failed!", + style: TextStyle(color: Colors.white), + ), + backgroundColor: Colors.redAccent, + )); + return; + } + setState(() { + generatedToolCode = res; + }); + } catch (e) { + String errMsg = 'Unexpected Error Occured'; + if (e.toString().contains('NO_DEFAULT_LLM')) { + errMsg = "Please Select Default AI Model in Settings"; + } + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + errMsg, + style: TextStyle(color: Colors.white), + ), + backgroundColor: Colors.redAccent, + )); + Navigator.pop(context); + } + } + + @override + Widget build(BuildContext context) { + return Container( + height: 600, + width: MediaQuery.of(context).size.width * 0.8, + child: Row( + children: [ + Expanded(child: ToolRequirementSelectorPage( + onGenerateCallback: (agent, lang) { + setState(() { + selectedLanguage = lang; + selectedAgent = agent; + }); + generateAPITool(); + }, + )), + GeneratedToolCodeCopyPage( + toolCode: generatedToolCode, + language: selectedLanguage.trim(), + ), + ], + ), + ); + } +} diff --git a/lib/screens/common_widgets/agentic_ui_features/tool_generation/generated_tool_codecopy.dart b/lib/screens/common_widgets/agentic_ui_features/tool_generation/generated_tool_codecopy.dart new file mode 100644 index 00000000..33ef04c8 --- /dev/null +++ b/lib/screens/common_widgets/agentic_ui_features/tool_generation/generated_tool_codecopy.dart @@ -0,0 +1,66 @@ +import 'package:apidash/widgets/button_copy.dart'; +import 'package:apidash/widgets/previewer_code.dart'; +import 'package:apidash/widgets/widget_sending.dart'; +import 'package:apidash_design_system/tokens/tokens.dart'; +import 'package:flutter/material.dart'; + +class GeneratedToolCodeCopyPage extends StatelessWidget { + final String? toolCode; + final String language; + const GeneratedToolCodeCopyPage( + {super.key, required this.toolCode, required this.language}); + + @override + Widget build(BuildContext context) { + final lightMode = Theme.of(context).brightness == Brightness.light; + var codeTheme = lightMode ? kLightCodeTheme : kDarkCodeTheme; + + if (toolCode == null) { + return SendingWidget( + startSendingTime: DateTime.now(), + showTimeElapsed: false, + ); + } + + if (toolCode!.isEmpty) { + return Padding( + padding: const EdgeInsets.only(right: 40), + child: Center( + child: Icon( + Icons.token_outlined, + color: lightMode ? Colors.black12 : Colors.white12, + size: 500, + ), + ), + ); + } + + return Container( + color: const Color.fromARGB(26, 123, 123, 123), + padding: EdgeInsets.all(20), + width: MediaQuery.of(context).size.width * 0.50, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + CopyButton( + toCopy: toolCode!, + showLabel: true, + ), + Expanded( + child: SingleChildScrollView( + child: Container( + width: double.infinity, + child: CodePreviewer( + code: toolCode!, + theme: codeTheme, + language: language.toLowerCase(), + textStyle: kCodeStyle, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/screens/common_widgets/agentic_ui_features/tool_generation/tool_requirements_selector.dart b/lib/screens/common_widgets/agentic_ui_features/tool_generation/tool_requirements_selector.dart new file mode 100644 index 00000000..c69884d2 --- /dev/null +++ b/lib/screens/common_widgets/agentic_ui_features/tool_generation/tool_requirements_selector.dart @@ -0,0 +1,195 @@ +import 'package:apidash/providers/settings_providers.dart'; +import 'package:apidash/screens/common_widgets/ai/ai_model_selector_button.dart'; +import 'package:apidash_core/apidash_core.dart'; +import 'package:apidash_design_system/apidash_design_system.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class ToolRequirementSelectorPage extends StatefulWidget { + final Function(String agent, String lang) onGenerateCallback; + const ToolRequirementSelectorPage( + {super.key, required this.onGenerateCallback}); + + @override + State createState() => + _ToolRequirementSelectorPageState(); +} + +class _ToolRequirementSelectorPageState + extends State { + String targetLanguage = 'PYTHON'; + String agentFramework = 'GEMINI'; + + Map frameworkMapping = { + 'GEMINI': 'Gemini', + 'OPENAI': 'OpenAI', + 'LANGCHAIN': 'LangChain', + 'MICROSOFT_AUTOGEN': 'Microsoft AutoGen', + 'MISTRAL': 'Mistral', + 'ANTRHOPIC': 'Anthropic', + }; + + Map languageMapping = { + 'PYTHON': 'Python 3', + 'JAVASCRIPT': 'JavaScript / NodeJS' + }; + + @override + Widget build(BuildContext context) { + final lightMode = Theme.of(context).brightness == Brightness.light; + + return Container( + width: MediaQuery.of(context).size.width * 0.4, // Large dialog + padding: EdgeInsets.all(30), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Generate API Tool", + style: TextStyle( + fontSize: 24, + ), + ), + kVSpacer5, + Padding( + padding: EdgeInsets.only(left: 3), + child: Text( + "Select an agent framework & language", + style: TextStyle( + color: lightMode ? Colors.black54 : Colors.white60, + fontSize: 15), + ), + ), + kVSpacer20, + Padding( + padding: EdgeInsets.only(left: 3), + child: Text( + "Agent Framework", + style: TextStyle( + color: lightMode ? Colors.black54 : Colors.white60, + ), + ), + ), + kVSpacer8, + ADPopupMenu( + value: frameworkMapping[agentFramework], + values: [ + ...frameworkMapping.keys + .map((e) => (e.toString(), frameworkMapping[e].toString())), + ], + width: MediaQuery.of(context).size.width * 0.35, + tooltip: '', + onChanged: (x) { + setState(() { + agentFramework = x ?? 'OPENAI'; + + //AutoGen is Python-Only + if (agentFramework == 'MICROSOFT_AUTOGEN') { + targetLanguage = 'PYTHON'; + } + }); + }, + isOutlined: true, + ), + kVSpacer20, + Padding( + padding: EdgeInsets.only(left: 3), + child: Text( + "Target Language", + style: TextStyle( + color: lightMode ? Colors.black54 : Colors.white60, + ), + ), + ), + kVSpacer8, + ADPopupMenu( + value: languageMapping[targetLanguage], + values: [ + ...languageMapping.keys + .map((e) => (e.toString(), languageMapping[e].toString())), + ], + width: MediaQuery.of(context).size.width * 0.35, + tooltip: '', + onChanged: (x) { + setState(() { + targetLanguage = x ?? 'PYTHON'; + + //AutoGen is Python-Only + if (agentFramework == 'MICROSOFT_AUTOGEN') { + targetLanguage = 'PYTHON'; + } + }); + }, + isOutlined: true, + ), + kVSpacer20, + Row( + children: [ + FilledButton.tonalIcon( + style: FilledButton.styleFrom( + padding: kPh12, + minimumSize: const Size(44, 44), + ), + onPressed: () { + widget.onGenerateCallback(agentFramework, targetLanguage); + }, + icon: Icon( + Icons.token_outlined, + ), + label: const SizedBox( + child: Text( + "Generate Tool", + ), + ), + ), + kHSpacer5, + DefaultLLModelSelectorWidget(), + ], + ), + ], + ), + ); + } +} + +class DefaultLLModelSelectorWidget extends ConsumerWidget { + const DefaultLLModelSelectorWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final settings = ref.watch(settingsProvider); + return Opacity( + opacity: 0.8, + child: Row( + children: [ + Padding( + padding: EdgeInsets.only(left: 3), + child: Text( + "with", + style: TextStyle( + color: Theme.of(context).brightness == Brightness.light + ? Colors.black54 + : Colors.white60, + fontSize: 15), + ), + ), + SizedBox(width: 5), + AIModelSelectorButton( + aiRequestModel: + AIRequestModel.fromJson(settings.defaultAIModel ?? {}), + onModelUpdated: (d) { + ref.read(settingsProvider.notifier).update( + defaultAIModel: d.copyWith( + modelConfigs: [], + stream: null, + systemPrompt: '', + userPrompt: '').toJson()); + }, + ), + kVSpacer5, + ], + ), + ); + } +} diff --git a/lib/screens/common_widgets/ai/ai_model_selector_dialog.dart b/lib/screens/common_widgets/ai/ai_model_selector_dialog.dart index 91bfe8f2..553ba0b3 100644 --- a/lib/screens/common_widgets/ai/ai_model_selector_dialog.dart +++ b/lib/screens/common_widgets/ai/ai_model_selector_dialog.dart @@ -1,4 +1,3 @@ -import 'package:apidash/providers/providers.dart'; import 'package:apidash/widgets/widgets.dart'; import 'package:apidash_core/apidash_core.dart'; import 'package:apidash_design_system/apidash_design_system.dart'; diff --git a/lib/services/agentic_services/agents/intermediate_rep_gen.dart b/lib/services/agentic_services/agents/intermediate_rep_gen.dart index a9177258..4b61ea3e 100644 --- a/lib/services/agentic_services/agents/intermediate_rep_gen.dart +++ b/lib/services/agentic_services/agents/intermediate_rep_gen.dart @@ -52,6 +52,7 @@ API_RESPONSE: ```json ``` Return only the Schema and nothing else and MAKE SURE TO USE the Actual VALUES instead of text placeholders. this is very important +If you notice the content is too long then please include a Single Child Scroll Viewbut make sure you are handing cases wherein multiple scroll views are used and stuff """; class IntermediateRepresentationGen extends APIDashAIAgent { diff --git a/lib/utils/agent_utils.dart b/lib/utils/agent_utils.dart index b1f1fffa..8d90663d 100644 --- a/lib/utils/agent_utils.dart +++ b/lib/utils/agent_utils.dart @@ -1,3 +1,4 @@ +import 'package:apidash/apitoolgen/tool_templates.dart'; import 'package:apidash/services/agentic_services/agent_caller.dart'; import 'package:apidash/services/agentic_services/agents/agents.dart'; import 'package:apidash_core/apidash_core.dart'; @@ -64,3 +65,39 @@ Future modifySDUICodeUsingPrompt({ final SDUI = res?['STAC']; return SDUI; } + +Future generateAPIToolUsingRequestData({ + required WidgetRef ref, + required String requestData, + required String targetLanguage, + required String selectedAgent, +}) async { + final toolfuncRes = await APIDashAgentCaller.instance.call( + APIToolFunctionGenerator(), + ref: ref, + input: AgentInputs(variables: { + 'REQDATA': requestData, + 'TARGET_LANGUAGE': targetLanguage, + }), + ); + if (toolfuncRes == null) { + return null; + } + + String toolCode = toolfuncRes!['FUNC']; + + final toolres = await APIDashAgentCaller.instance.call( + ApiToolBodyGen(), + ref: ref, + input: AgentInputs(variables: { + 'TEMPLATE': + APIToolGenTemplateSelector.getTemplate(targetLanguage, selectedAgent) + .substitutePromptVariable('FUNC', toolCode), + }), + ); + if (toolres == null) { + return null; + } + String toolDefinition = toolres!['TOOL']; + return toolDefinition; +} diff --git a/lib/widgets/response_body_success.dart b/lib/widgets/response_body_success.dart index 3bc28660..4041470d 100644 --- a/lib/widgets/response_body_success.dart +++ b/lib/widgets/response_body_success.dart @@ -1,5 +1,5 @@ import 'package:apidash/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart'; -import 'package:apidash/screens/common_widgets/agentic_ui_features/tool_generation/ai_toolgen_widgets.dart'; +import 'package:apidash/screens/common_widgets/agentic_ui_features/tool_generation/generate_tool_dialog.dart'; import 'package:apidash_core/apidash_core.dart'; import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/foundation.dart'; diff --git a/packages/genai/test/genai_test.dart b/packages/genai/test/genai_test.dart index e5371074..ab73b3a2 100644 --- a/packages/genai/test/genai_test.dart +++ b/packages/genai/test/genai_test.dart @@ -1,5 +1 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:genai/genai.dart'; - -void main() { -} +void main() {}