Skip to content

Commit 3f1fbb1

Browse files
authored
Merge pull request #699 from siddu015/Dashbot_v2
DashBot Update
2 parents 330e1b8 + bfd85c8 commit 3f1fbb1

16 files changed

+893
-128
lines changed

lib/dashbot/consts.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const kModel = 'llama3.2:3b';
2+
const kOllamaEndpoint = 'http://127.0.0.1:11434/api';

lib/dashbot/features/debug.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'dart:convert';
2-
import '../services/dashbot_service.dart';
3-
import 'package:apidash/models/request_model.dart';
2+
import '../services/services.dart';
3+
import '../../models/models.dart';
44

55
class DebugFeature {
66
final DashBotService _service;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import 'dart:convert';
2+
import '../services/services.dart';
3+
import '../../models/models.dart';
4+
5+
class DocumentationFeature {
6+
final DashBotService _service;
7+
8+
DocumentationFeature(this._service);
9+
10+
Future<String> generateApiDocumentation({
11+
required RequestModel? requestModel,
12+
required dynamic responseModel,
13+
}) async {
14+
if (requestModel == null || responseModel == null) {
15+
return "No recent API requests found.";
16+
}
17+
18+
final method = requestModel.httpRequestModel?.method
19+
.toString()
20+
.split('.')
21+
.last
22+
.toUpperCase() ??
23+
"GET";
24+
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
25+
final headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {};
26+
final parameters = requestModel.httpRequestModel?.enabledParamsMap ?? {};
27+
final body = requestModel.httpRequestModel?.body;
28+
final rawResponse = responseModel.body;
29+
final responseBody =
30+
rawResponse is String ? rawResponse : jsonEncode(rawResponse);
31+
final statusCode = responseModel.statusCode ?? 0;
32+
33+
final prompt = """
34+
API DOCUMENTATION GENERATION
35+
36+
**API Details:**
37+
- Endpoint: $endpoint
38+
- Method: $method
39+
- Status Code: $statusCode
40+
41+
**Request Components:**
42+
- Headers: ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
43+
- Query Parameters: ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
44+
- Request Body: ${body != null && body.isNotEmpty ? body : "None"}
45+
46+
**Response Example:**
47+
```
48+
$responseBody
49+
```
50+
51+
**Documentation Instructions:**
52+
Create comprehensive API documentation that includes:
53+
54+
1. **Overview**: A clear, concise description of what this API endpoint does
55+
2. **Authentication**: Required authentication method based on headers
56+
3. **Request Details**: All required and optional parameters with descriptions
57+
4. **Response Structure**: Breakdown of response fields and their meanings
58+
5. **Error Handling**: Possible error codes and troubleshooting
59+
6. **Example Usage**: A complete code example showing how to call this API
60+
61+
Format in clean markdown with proper sections and code blocks where appropriate.
62+
""";
63+
64+
return _service.generateResponse(prompt);
65+
}
66+
}

lib/dashbot/features/explain.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import '../services/dashbot_service.dart';
2-
import 'package:apidash/models/request_model.dart';
1+
import '../services/services.dart';
2+
import '../../models/models.dart';
33

44
class ExplainFeature {
55
final DashBotService _service;

lib/dashbot/features/features.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export 'debug.dart';
2+
export 'documentation.dart';
3+
export 'explain.dart';
4+
export 'general_query.dart';
5+
export 'test_generator.dart';
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import 'package:ollama_dart/ollama_dart.dart';
2+
import '../../models/models.dart';
3+
import '../consts.dart';
4+
5+
class GeneralQueryFeature {
6+
final OllamaClient _client;
7+
8+
GeneralQueryFeature(this._client);
9+
10+
Future<String> generateResponse(String prompt,
11+
{RequestModel? requestModel, dynamic responseModel}) async {
12+
String enhancedPrompt = prompt;
13+
14+
if (requestModel != null && responseModel != null) {
15+
final method = requestModel.httpRequestModel?.method
16+
.toString()
17+
.split('.')
18+
.last
19+
.toUpperCase() ??
20+
"GET";
21+
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
22+
final statusCode = responseModel.statusCode ?? 0;
23+
24+
enhancedPrompt = '''
25+
CONTEXT-AWARE RESPONSE
26+
27+
**User Question:**
28+
$prompt
29+
30+
**Related API Context:**
31+
- Endpoint: $endpoint
32+
- Method: $method
33+
- Status Code: $statusCode
34+
35+
**Instructions:**
36+
1. Directly address the user's specific question
37+
2. Provide relevant, concise information
38+
3. Reference the API context when helpful
39+
4. Focus on practical, actionable insights
40+
5. Avoid generic explanations or documentation
41+
42+
Respond in a helpful, direct manner that specifically answers what was asked.
43+
''';
44+
}
45+
46+
final response = await _client.generateCompletion(
47+
request: GenerateCompletionRequest(
48+
model: kModel,
49+
prompt: enhancedPrompt,
50+
),
51+
);
52+
return response.response.toString();
53+
}
54+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import 'dart:convert';
2+
import '../services/services.dart';
3+
import '../../models/models.dart';
4+
5+
class TestGeneratorFeature {
6+
final DashBotService _service;
7+
8+
TestGeneratorFeature(this._service);
9+
10+
Future<String> generateApiTests({
11+
required RequestModel? requestModel,
12+
required dynamic responseModel,
13+
}) async {
14+
if (requestModel == null || responseModel == null) {
15+
return "No recent API requests found.";
16+
}
17+
18+
final method = requestModel.httpRequestModel?.method
19+
.toString()
20+
.split('.')
21+
.last
22+
.toUpperCase() ??
23+
"GET";
24+
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
25+
final rawResponse = responseModel.body;
26+
final responseBody =
27+
rawResponse is String ? rawResponse : jsonEncode(rawResponse);
28+
final statusCode = responseModel.statusCode ?? 0;
29+
30+
Uri uri = Uri.parse(endpoint);
31+
final baseUrl = "${uri.scheme}://${uri.host}";
32+
final path = uri.path;
33+
34+
final parameterAnalysis = _analyzeParameters(uri.queryParameters);
35+
36+
final prompt = """
37+
EXECUTABLE API TEST CASES GENERATOR
38+
39+
**API Analysis:**
40+
- Base URL: $baseUrl
41+
- Endpoint: $path
42+
- Method: $method
43+
- Current Parameters: ${uri.queryParameters}
44+
- Current Response: $responseBody (Status: $statusCode)
45+
- Parameter Types: $parameterAnalysis
46+
47+
**Test Generation Task:**
48+
Generate practical, ready-to-use test cases for this API in cURL format. Each test should be executable immediately.
49+
50+
Include these test categories:
51+
1. **Valid Cases**: Different valid parameter values (use real-world examples like other country codes if this is a country API)
52+
2. **Invalid Parameter Tests**: Missing parameters, empty values, incorrect formats
53+
3. **Edge Cases**: Special characters, long values, unexpected inputs
54+
4. **Validation Tests**: Test input validation and error handling
55+
56+
For each test case:
57+
1. Provide a brief description of what the test verifies
58+
2. Include a complete, executable cURL command
59+
3. Show the expected outcome (status code and sample response)
60+
4. Organize tests in a way that's easy to copy and run
61+
62+
Focus on creating realistic test values based on the API context (e.g., for a country flag API, use real country codes, invalid codes, etc.)
63+
""";
64+
65+
final testCases = await _service.generateResponse(prompt);
66+
return "TEST_CASES_HIDDEN\n$testCases";
67+
}
68+
69+
String _analyzeParameters(Map<String, String> parameters) {
70+
if (parameters.isEmpty) {
71+
return "No parameters detected";
72+
}
73+
74+
Map<String, String> analysis = {};
75+
76+
parameters.forEach((key, value) {
77+
if (RegExp(r'^[A-Z]{3}$').hasMatch(value)) {
78+
analysis[key] =
79+
"Appears to be a 3-letter country code (ISO 3166-1 alpha-3)";
80+
} else if (RegExp(r'^[A-Z]{2}$').hasMatch(value)) {
81+
analysis[key] =
82+
"Appears to be a 2-letter country code (ISO 3166-1 alpha-2)";
83+
} else if (RegExp(r'^\d+$').hasMatch(value)) {
84+
analysis[key] = "Numeric value";
85+
} else if (RegExp(r'^[a-zA-Z]+$').hasMatch(value)) {
86+
analysis[key] = "Alphabetic string";
87+
} else {
88+
analysis[key] = "Unknown format: $value";
89+
}
90+
});
91+
92+
return jsonEncode(analysis);
93+
}
94+
}

lib/dashbot/providers/dashbot_providers.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import 'dart:convert';
2+
import 'package:apidash/services/services.dart';
23
import 'package:flutter_riverpod/flutter_riverpod.dart';
3-
import 'package:shared_preferences/shared_preferences.dart';
4-
import '../services/dashbot_service.dart';
4+
import '../services/services.dart';
5+
6+
final dashBotMinimizedProvider = StateProvider<bool>((ref) {
7+
return true;
8+
});
59

610
final chatMessagesProvider =
711
StateNotifierProvider<ChatMessagesNotifier, List<Map<String, dynamic>>>(
@@ -17,19 +21,16 @@ class ChatMessagesNotifier extends StateNotifier<List<Map<String, dynamic>>> {
1721
_loadMessages();
1822
}
1923

20-
static const _storageKey = 'chatMessages';
21-
2224
Future<void> _loadMessages() async {
23-
final prefs = await SharedPreferences.getInstance();
24-
final messages = prefs.getString(_storageKey);
25+
final messages = await hiveHandler.getDashbotMessages();
2526
if (messages != null) {
2627
state = List<Map<String, dynamic>>.from(json.decode(messages));
2728
}
2829
}
2930

3031
Future<void> _saveMessages() async {
31-
final prefs = await SharedPreferences.getInstance();
32-
await prefs.setString(_storageKey, json.encode(state));
32+
final messages = json.encode(state);
33+
await hiveHandler.saveDashbotMessages(messages);
3334
}
3435

3536
void addMessage(Map<String, dynamic> message) {
Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,61 @@
1-
import 'package:apidash/dashbot/features/debug.dart';
21
import 'package:ollama_dart/ollama_dart.dart';
3-
import '../features/explain.dart';
42
import 'package:apidash/models/request_model.dart';
3+
import '../consts.dart';
4+
import '../features/features.dart';
55

66
class DashBotService {
77
final OllamaClient _client;
88
late final ExplainFeature _explainFeature;
99
late final DebugFeature _debugFeature;
10+
late final DocumentationFeature _documentationFeature;
11+
late final TestGeneratorFeature _testGeneratorFeature;
12+
final GeneralQueryFeature _generalQueryFeature;
1013

1114
DashBotService()
12-
: _client = OllamaClient(baseUrl: 'http://127.0.0.1:11434/api') {
15+
: _client = OllamaClient(baseUrl: kOllamaEndpoint),
16+
_generalQueryFeature =
17+
GeneralQueryFeature(OllamaClient(baseUrl: kOllamaEndpoint)) {
1318
_explainFeature = ExplainFeature(this);
1419
_debugFeature = DebugFeature(this);
20+
_documentationFeature = DocumentationFeature(this);
21+
_testGeneratorFeature = TestGeneratorFeature(this);
1522
}
1623

1724
Future<String> generateResponse(String prompt) async {
18-
final response = await _client.generateCompletion(
19-
request: GenerateCompletionRequest(model: 'llama3.2:3b', prompt: prompt),
20-
);
21-
return response.response.toString();
25+
return _generalQueryFeature.generateResponse(prompt);
2226
}
2327

2428
Future<String> handleRequest(
25-
String input, RequestModel? requestModel, dynamic responseModel) async {
29+
String input,
30+
RequestModel? requestModel,
31+
dynamic responseModel,
32+
) async {
2633
if (input == "Explain API") {
2734
return _explainFeature.explainLatestApi(
28-
requestModel: requestModel, responseModel: responseModel);
35+
requestModel: requestModel,
36+
responseModel: responseModel,
37+
);
2938
} else if (input == "Debug API") {
3039
return _debugFeature.debugApi(
31-
requestModel: requestModel, responseModel: responseModel);
40+
requestModel: requestModel,
41+
responseModel: responseModel,
42+
);
43+
} else if (input == "Document API") {
44+
return _documentationFeature.generateApiDocumentation(
45+
requestModel: requestModel,
46+
responseModel: responseModel,
47+
);
48+
} else if (input == "Test API") {
49+
return _testGeneratorFeature.generateApiTests(
50+
requestModel: requestModel,
51+
responseModel: responseModel,
52+
);
3253
}
3354

34-
return generateResponse(input);
55+
return _generalQueryFeature.generateResponse(
56+
input,
57+
requestModel: requestModel,
58+
responseModel: responseModel,
59+
);
3560
}
3661
}

lib/dashbot/services/services.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'dashbot_service.dart';

0 commit comments

Comments
 (0)