From 3092267b04bdb7e2cce2410de48e9d68f6d9042e Mon Sep 17 00:00:00 2001 From: siddu015 <116783967+siddu015@users.noreply.github.com> Date: Sun, 23 Feb 2025 12:24:41 +0530 Subject: [PATCH] Generate Codes for different Languages based on API --- lib/services/ollama_service.dart | 68 ++++++++++++++++++++++++++++++++ lib/widgets/chatbot_widget.dart | 63 ++++++++++++++++++++++++++--- 2 files changed, 125 insertions(+), 6 deletions(-) diff --git a/lib/services/ollama_service.dart b/lib/services/ollama_service.dart index 0bfd4d30..2ff45a18 100644 --- a/lib/services/ollama_service.dart +++ b/lib/services/ollama_service.dart @@ -184,4 +184,72 @@ generate same to same type of test case url for test purpose } } + + Future generateCode({ + required dynamic requestModel, + required dynamic responseModel, + required String language + }) async { + final method = requestModel.httpRequestModel?.method + ?.toString() + ?.split('.') + ?.last + ?.toUpperCase() ?? "GET"; + final endpoint = requestModel.httpRequestModel?.url ?? "Unknown endpoint"; + final headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {}; + final params = requestModel.httpRequestModel?.enabledParamsMap ?? {}; + final body = requestModel.httpRequestModel?.body; + final responseBody = responseModel.body; + + final prompt = ''' +Generate complete $language code for this API integration: + +API Request: +- URL: $endpoint +- Method: $method +- Headers: ${headers.isEmpty ? 'None' : jsonEncode(headers)} +- Params: ${params.isEmpty ? 'None' : jsonEncode(params)} +- Body: ${body ?? 'None'} + +Response Structure: +${_formatResponse(responseBody)} + +Requirements: +1. Single-file solution with no external config +2. Direct API URL implementation +3. Error handling for network/status errors +4. UI components matching response data +5. Ready-to-run code with example data display + +Generate complete implementation code only. +'''; + + return generateResponse(prompt); + } + + String _formatResponse(dynamic response) { + if (response is Map) { + return response.entries + .map((e) => '${e.key}: ${_valueType(e.value)}') + .join('\n'); + } + return response?.toString() ?? 'No response body'; + } + + String _valueType(dynamic value) { + if (value is List) return 'List[${value.isNotEmpty ? _valueType(value.first) : '?'}]'; + if (value is Map) return 'Object'; + return value.runtimeType.toString(); + } + +// Simplified UI detection + List _detectUIElements(dynamic response) { + final elements = []; + if (response is Map) { + if (response.containsKey('image') || response.containsKey('imageUrl')) elements.add('image'); + if (response.containsKey('items') || response.containsKey('list')) elements.add('list'); + if (response.containsKey('title') || response.containsKey('name')) elements.add('title'); + } + return elements; + } } diff --git a/lib/widgets/chatbot_widget.dart b/lib/widgets/chatbot_widget.dart index bc685ccc..00a73bd3 100644 --- a/lib/widgets/chatbot_widget.dart +++ b/lib/widgets/chatbot_widget.dart @@ -1,9 +1,10 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:apidash/providers/providers.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; - class ChatbotWidget extends ConsumerStatefulWidget { const ChatbotWidget({Key? key}) : super(key: key); @@ -16,6 +17,40 @@ class _ChatbotWidgetState extends ConsumerState { final List> _messages = []; bool _isLoading = false; + Future _handleCodeGeneration() async { + final language = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Select Language'), + content: SizedBox( + width: 300, + child: ListView( + shrinkWrap: true, + children: [ + _buildLanguageTile('Dart'), + _buildLanguageTile('Flutter'), + _buildLanguageTile('React'), + _buildLanguageTile('Python'), + _buildLanguageTile('JavaScript'), + _buildLanguageTile('Node.js'), + ], + ), + ), + ), + ); + + if (language != null) { + _sendMessage("Generate $language Code"); + } + } + + ListTile _buildLanguageTile(String language) { + return ListTile( + title: Text(language), + onTap: () => Navigator.pop(context, language), + ); + } + void _sendMessage(String message) async { if (message.trim().isEmpty) return; final ollamaService = ref.read(ollamaServiceProvider); @@ -30,6 +65,7 @@ class _ChatbotWidgetState extends ConsumerState { try { String response; + if (message == "Explain API") { response = await ollamaService.explainLatestApi( requestModel: requestModel, @@ -42,15 +78,25 @@ class _ChatbotWidgetState extends ConsumerState { ); } else if (message == "Generate Test Case") { response = await ollamaService.generateTestCases( - requestModel: requestModel, - responseModel: responseModel + requestModel: requestModel, + responseModel: responseModel, + ); + } else if (message.startsWith("Generate ") && message.endsWith(" Code")) { + final language = message.replaceAll("Generate ", "").replaceAll(" Code", ""); + response = await ollamaService.generateCode( + requestModel: requestModel, + responseModel: responseModel, + language: language, ); } else { response = await ollamaService.generateResponse(message); } setState(() { - _messages.add({'role': 'bot', 'message': response}); + _messages.add({ + 'role': 'bot', + 'message': response.contains("```") ? response : "```$response```" + }); }); } catch (error) { setState(() { @@ -100,7 +146,12 @@ class _ChatbotWidgetState extends ConsumerState { icon: const Icon(Icons.developer_mode), label: const Text("Test Case"), ), - + const SizedBox(width: 8), + ElevatedButton.icon( + onPressed: _handleCodeGeneration, + icon: const Icon(Icons.code), + label: const Text("Generate Code"), + ), const Spacer(), ], ), @@ -168,7 +219,7 @@ class ChatBubble extends StatelessWidget { ), child: MarkdownBody( data: message, - selectable: true, // Allows copying text + selectable: true, ), ), );