Merge branch 'ChatBotFeature'

This commit is contained in:
DhumalePrasad04
2025-02-23 10:46:35 +05:30
2 changed files with 203 additions and 260 deletions

View File

@ -37,15 +37,12 @@ final body = requestModel.httpRequestModel?.body;
// Process response // Process response
final rawResponse = responseModel.body; final rawResponse = responseModel.body;
final responseBody = rawResponse is String final responseBody = rawResponse is String;
? jsonDecode(rawResponse)
: rawResponse as Map<String, dynamic>?;
final statusCode = responseModel.statusCode ?? 0; final statusCode = responseModel.statusCode ?? 0;
final prompt = ''' final prompt = '''
Analyze this API interaction Analyze this API interaction following these examples:
Current API Request: Current API Request:
- Endpoint: $endpoint - Endpoint: $endpoint
- Method: $method - Method: $method
@ -55,11 +52,9 @@ Current API Request:
Current Response: Current Response:
- Status Code: $statusCode - Status Code: $statusCode
- Response Body: ${responseBody != null ? jsonEncode(responseBody) : rawResponse} - Response Body: ${jsonEncode(responseBody)}
Required Analysis Format: Required Analysis Format:
1. Start with overall status assessment 1. Start with overall status assessment
2. List validation/security issues 2. List validation/security issues
3. Highlight request/response mismatches 3. Highlight request/response mismatches
@ -71,7 +66,6 @@ API Request: [request details]
Response: [response details] Response: [response details]
Analysis: [structured analysis]'''; Analysis: [structured analysis]''';
return generateResponse(prompt); return generateResponse(prompt);
} }
@ -104,70 +98,59 @@ Format the response with clear headings and bullet points.
'''; ''';
return generateResponse(prompt); return generateResponse(prompt);
} }
Future<String> generateTestCases({required dynamic requestModel, required dynamic responseModel}) async { Future<String> generateTestCases({required dynamic requestModel, required dynamic responseModel}) async {
final method = requestModel.httpRequestModel?.method
.toString()
.split('.')
.last
.toUpperCase()
?? "GET";
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown endpoint"; final endpoint = requestModel.httpRequestModel?.url ?? "Unknown endpoint";
final headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {}; final headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {};
final parameters = requestModel.httpRequestModel?.enabledParamsMap ?? {}; final parameters = requestModel.httpRequestModel?.enabledParamsMap ?? {};
final body = requestModel.httpRequestModel?.body; final body = requestModel.httpRequestModel?.body;
final method = requestModel.httpRequestModel?.method.toString().split('.').last.toUpperCase() ?? "GET"; final responsebody=responseModel.body;
// Process response
// final rawResponse = responseModel.body;
// final responseBody = rawResponse is String
// ? jsonDecode(rawResponse)
// : rawResponse as Map<String, dynamic>?;
final statusCode = responseModel.statusCode ?? 0;
final exampleParams = await generateExampleParams( final exampleParams = await generateExampleParams(
requestModel: requestModel, requestModel: requestModel,
responseModel: responseModel, responseModel: responseModel,
); );
final prompt = ''' final prompt = '''
Generate test cases for the following API:
**API Request:** **API Request:**
- **Endpoint:** `$endpoint` - **Endpoint:** `$endpoint`
- **Method:** `$method` - **Method:** `$method`
- **Headers:** ${headers.isNotEmpty ? jsonEncode(headers) : "None"} - **Headers:** ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
- **Parameters:** ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"} - **Parameters:** ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
-**body:** ${body ?? "None"}
**Test Case Requirements:** here is an example test case for the given:$exampleParams
1. Normal case (valid input, expected success)
2. Edge case (unexpected or boundary values)
3. Missing required parameters
4. Invalid authentication (if applicable)
5. Error handling for different status codes
**Example Test Case Format:** **Instructions:**
@Test - Generate example parameter values for the request.
void testValidRequest() { -Generate the url of as i provided in the api reuest
final response = sendRequest("$endpoint", method: "$method", params: $exampleParams); -generate same to same type of test case url for test purpose
assert(response.status == 200);
}
\`\`\`
Generate test cases covering all scenarios.
'''; ''';
return generateResponse(prompt); return generateResponse(prompt);
} }
/// Generate example parameter values based on parameter names /// Generate example parameter values based on parameter names
Future<Map<String, dynamic>> generateExampleParams({ Future<Map<String, dynamic>> generateExampleParams({required dynamic requestModel, required dynamic responseModel,}) async {
required dynamic requestModel,
required dynamic responseModel,
}) async {
final ollamaService = OllamaService(); final ollamaService = OllamaService();
final String apiEndpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
final String apiMethod = requestModel.httpRequestModel?.method.name ?? "GET"; final method = requestModel.httpRequestModel?.method
final Map<String, String> apiHeaders = requestModel.httpRequestModel?.enabledHeadersMap ?? {}; .toString()
final Map<String, String> apiParams = requestModel.httpRequestModel?.enabledParamsMap ?? {}; .split('.')
final String? apiBody = requestModel.httpRequestModel?.body; .last
.toUpperCase()
?? "GET";
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown endpoint";
final headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {};
final parameters = requestModel.httpRequestModel?.enabledParamsMap ?? {};
final body = requestModel.httpRequestModel?.body;
final dynamic rawResponse = responseModel?.body; final dynamic rawResponse = responseModel?.body;
final Map<String, dynamic>? apiResponse = final Map<String, dynamic>? apiResponse =
@ -178,21 +161,18 @@ Generate test cases covering all scenarios.
Analyze the following API request and generate structured example parameters. Analyze the following API request and generate structured example parameters.
**API Request:** **API Request:**
- **Endpoint:** `$apiEndpoint` - **Endpoint:** `$endpoint`
- **Method:** `$apiMethod` - **Method:** `$method`
- **Headers:** ${apiHeaders.isNotEmpty ? jsonEncode(apiHeaders) : "None"} - **Headers:** ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
- **Parameters:** ${apiParams.isNotEmpty ? jsonEncode(apiParams) : "None"} - **Parameters:** ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
- **Body:** ${apiBody ?? "None"} - **Body:** ${body ?? "None"}
**Response:**
- **Status Code:** ${responseModel?.statusCode ?? "Unknown"}
- **Response Body:** ${apiResponse != null ? jsonEncode(apiResponse) : rawResponse}
### **Required Output Format** **Instructions:**
1. **Standard Example Values**: Assign the most appropriate example values for each parameter. - Generate example parameter values for the request.
2. **Edge Cases**: Provide at least 2 edge cases per parameter. -Generate the url of as i provided in the api reuest
3. **Invalid Cases**: Generate invalid inputs for error handling. generate same to same type of test case url for test purpose
4. **Output must be in valid JSON format.**
'''; ''';
// Force LLM to return structured JSON output // Force LLM to return structured JSON output
@ -205,5 +185,4 @@ Analyze the following API request and generate structured example parameters.
} }
} }
} }

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/providers/providers.dart'; import 'package:apidash/providers/providers.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
class ChatbotWidget extends ConsumerStatefulWidget { class ChatbotWidget extends ConsumerStatefulWidget {
const ChatbotWidget({Key? key}) : super(key: key); const ChatbotWidget({Key? key}) : super(key: key);
@ -34,17 +36,7 @@ try {
requestModel: requestModel, requestModel: requestModel,
responseModel: responseModel, responseModel: responseModel,
); );
} } else {
else if (message == "Debug API") {
response = await ollamaService.debugApi(
requestModel: requestModel,
responseModel: responseModel,
);
} else if (message == "Generate Test Case") {
response = await ollamaService.generateTestCases(requestModel: requestModel,
responseModel: responseModel,);
}
else {
response = await ollamaService.generateResponse(message); response = await ollamaService.generateResponse(message);
} }
@ -64,10 +56,6 @@ try {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final requestModel = ref.watch(selectedRequestModelProvider);
final statusCode = requestModel?.httpResponseModel?.statusCode;
final showDebugButton = statusCode != null && statusCode >= 400;
return Container( return Container(
height: 400, height: 400,
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
@ -87,27 +75,6 @@ return Container(
icon: const Icon(Icons.info_outline), icon: const Icon(Icons.info_outline),
label: const Text("Explain API"), label: const Text("Explain API"),
), ),
if (showDebugButton) ...[
const SizedBox(width: 8),
ElevatedButton.icon(
onPressed: () => _sendMessage("Debug API"),
icon: const Icon(Icons.bug_report),
label: const Text("Debug"),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.redAccent,
),
),
],
const SizedBox(width: 8),
ElevatedButton.icon(
onPressed: () => _sendMessage("Generate Test Case"),
icon: const Icon(Icons.developer_mode),
label: const Text("Test Case"),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blueAccent,
),
),
const Spacer(), const Spacer(),
], ],
), ),
@ -151,9 +118,6 @@ return Container(
], ],
), ),
); );
} }
} }