From eb0f4f5c741882a5bc071cfd2322b7ebb1a29c2c Mon Sep 17 00:00:00 2001 From: Udhay-Adithya Date: Mon, 8 Sep 2025 23:47:38 +0530 Subject: [PATCH] feat: implement code generation method --- .../features/chat/models/chat_models.dart | 1 + .../chat/viewmodel/chat_viewmodel.dart | 64 +++++++++++++++++-- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/lib/dashbot/features/chat/models/chat_models.dart b/lib/dashbot/features/chat/models/chat_models.dart index 12e995a8..bb80a340 100644 --- a/lib/dashbot/features/chat/models/chat_models.dart +++ b/lib/dashbot/features/chat/models/chat_models.dart @@ -89,6 +89,7 @@ enum ChatMessageType { debugError, generateTest, generateDoc, + generateCode, general } diff --git a/lib/dashbot/features/chat/viewmodel/chat_viewmodel.dart b/lib/dashbot/features/chat/viewmodel/chat_viewmodel.dart index c5eb87fd..517fbb12 100644 --- a/lib/dashbot/features/chat/viewmodel/chat_viewmodel.dart +++ b/lib/dashbot/features/chat/viewmodel/chat_viewmodel.dart @@ -72,7 +72,21 @@ class ChatViewmodel extends StateNotifier { ); } - final systemPrompt = _composeSystemPrompt(_currentRequest, type); + // Special handling: generateCode flow has two steps + String? systemPrompt; + if (type == ChatMessageType.generateCode) { + // If the user message includes a language (heuristic), go straight to code gen; else show intro + language choices + final detectedLang = _detectLanguageFromText(text); + systemPrompt = _composeSystemPrompt( + _currentRequest, + detectedLang == null + ? ChatMessageType.generateCode + : ChatMessageType.generateCode, + overrideLanguage: detectedLang, + ); + } else { + systemPrompt = _composeSystemPrompt(_currentRequest, type); + } final userPrompt = (text.trim().isEmpty && !countAsUser) ? 'Please complete the task based on the provided context.' : text; @@ -403,11 +417,13 @@ class ChatViewmodel extends StateNotifier { String _composeSystemPrompt( RequestModel? req, - ChatMessageType type, - ) { + ChatMessageType type, { + String? overrideLanguage, + }) { final history = _buildHistoryBlock(); final contextBlock = _buildContextBlock(req); - final task = _buildTaskPrompt(req, type); + final task = + _buildTaskPrompt(req, type, overrideLanguage: overrideLanguage); return [ if (task != null) task, if (contextBlock != null) contextBlock, @@ -450,7 +466,8 @@ class ChatViewmodel extends StateNotifier { '''; } - String? _buildTaskPrompt(RequestModel? req, ChatMessageType type) { + String? _buildTaskPrompt(RequestModel? req, ChatMessageType type, + {String? overrideLanguage}) { if (req == null) return null; final http = req.httpRequestModel; final resp = req.httpResponseModel; @@ -493,10 +510,47 @@ class ChatViewmodel extends StateNotifier { headersMap: http?.headersMap, body: http?.body, ); + case ChatMessageType.generateCode: + // If a language is provided, go for code generation; else ask for language first + if (overrideLanguage == null || overrideLanguage.isEmpty) { + return prompts.codeGenerationIntroPrompt( + url: http?.url, + method: http?.method.name.toUpperCase(), + headersMap: http?.headersMap, + body: http?.body, + bodyContentType: http?.bodyContentType.name, + paramsMap: http?.paramsMap, + authType: http?.authModel?.type.name, + ); + } else { + return prompts.generateCodePrompt( + url: http?.url, + method: http?.method.name.toUpperCase(), + headersMap: http?.headersMap, + body: http?.body, + bodyContentType: http?.bodyContentType.name, + paramsMap: http?.paramsMap, + authType: http?.authModel?.type.name, + language: overrideLanguage, + ); + } case ChatMessageType.general: return prompts.generalInteractionPrompt(); } } + + // Very light heuristic to detect language keywords in user text + String? _detectLanguageFromText(String text) { + final t = text.toLowerCase(); + if (t.contains('python')) return 'Python (requests)'; + if (t.contains('dart')) return 'Dart (http)'; + if (t.contains('golang') || t.contains('go ')) return 'Go (net/http)'; + if (t.contains('javascript') || t.contains('js') || t.contains('fetch')) { + return 'JavaScript (fetch)'; + } + if (t.contains('curl')) return 'cURL'; + return null; + } } final chatViewmodelProvider = StateNotifierProvider((