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
final rawResponse = responseModel.body;
final responseBody = rawResponse is String
? jsonDecode(rawResponse)
: rawResponse as Map<String, dynamic>?;
final responseBody = rawResponse is String;
final statusCode = responseModel.statusCode ?? 0;
final prompt = '''
Analyze this API interaction
Analyze this API interaction following these examples:
Current API Request:
- Endpoint: $endpoint
- Method: $method
@ -55,11 +52,9 @@ Current API Request:
Current Response:
- Status Code: $statusCode
- Response Body: ${responseBody != null ? jsonEncode(responseBody) : rawResponse}
- Response Body: ${jsonEncode(responseBody)}
Required Analysis Format:
1. Start with overall status assessment
2. List validation/security issues
3. Highlight request/response mismatches
@ -71,7 +66,6 @@ API Request: [request details]
Response: [response details]
Analysis: [structured analysis]''';
return generateResponse(prompt);
}
@ -104,70 +98,59 @@ Format the response with clear headings and bullet points.
''';
return generateResponse(prompt);
}
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 headers = requestModel.httpRequestModel?.enabledHeadersMap ?? {};
final parameters = requestModel.httpRequestModel?.enabledParamsMap ?? {};
final body = requestModel.httpRequestModel?.body;
final method = requestModel.httpRequestModel?.method.toString().split('.').last.toUpperCase() ?? "GET";
// Process response
// final rawResponse = responseModel.body;
// final responseBody = rawResponse is String
// ? jsonDecode(rawResponse)
// : rawResponse as Map<String, dynamic>?;
final statusCode = responseModel.statusCode ?? 0;
final responsebody=responseModel.body;
final exampleParams = await generateExampleParams(
requestModel: requestModel,
responseModel: responseModel,
);
final prompt = '''
Generate test cases for the following API:
**API Request:**
- **Endpoint:** `$endpoint`
- **Method:** `$method`
- **Headers:** ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
- **Parameters:** ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
-**body:** ${body ?? "None"}
**Test Case Requirements:**
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
here is an example test case for the given:$exampleParams
**Example Test Case Format:**
@Test
void testValidRequest() {
final response = sendRequest("$endpoint", method: "$method", params: $exampleParams);
assert(response.status == 200);
}
\`\`\`
Generate test cases covering all scenarios.
**Instructions:**
- Generate example parameter values for the request.
-Generate the url of as i provided in the api reuest
-generate same to same type of test case url for test purpose
''';
return generateResponse(prompt);
}
/// Generate example parameter values based on parameter names
Future<Map<String, dynamic>> generateExampleParams({
required dynamic requestModel,
required dynamic responseModel,
}) async {
Future<Map<String, dynamic>> generateExampleParams({required dynamic requestModel, required dynamic responseModel,}) async {
final ollamaService = OllamaService();
final String apiEndpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
final String apiMethod = requestModel.httpRequestModel?.method.name ?? "GET";
final Map<String, String> apiHeaders = requestModel.httpRequestModel?.enabledHeadersMap ?? {};
final Map<String, String> apiParams = requestModel.httpRequestModel?.enabledParamsMap ?? {};
final String? apiBody = requestModel.httpRequestModel?.body;
final method = requestModel.httpRequestModel?.method
.toString()
.split('.')
.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 Map<String, dynamic>? apiResponse =
@ -178,21 +161,18 @@ Generate test cases covering all scenarios.
Analyze the following API request and generate structured example parameters.
**API Request:**
- **Endpoint:** `$apiEndpoint`
- **Method:** `$apiMethod`
- **Headers:** ${apiHeaders.isNotEmpty ? jsonEncode(apiHeaders) : "None"}
- **Parameters:** ${apiParams.isNotEmpty ? jsonEncode(apiParams) : "None"}
- **Body:** ${apiBody ?? "None"}
- **Endpoint:** `$endpoint`
- **Method:** `$method`
- **Headers:** ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
- **Parameters:** ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
- **Body:** ${body ?? "None"}
**Response:**
- **Status Code:** ${responseModel?.statusCode ?? "Unknown"}
- **Response Body:** ${apiResponse != null ? jsonEncode(apiResponse) : rawResponse}
### **Required Output Format**
1. **Standard Example Values**: Assign the most appropriate example values for each parameter.
2. **Edge Cases**: Provide at least 2 edge cases per parameter.
3. **Invalid Cases**: Generate invalid inputs for error handling.
4. **Output must be in valid JSON format.**
**Instructions:**
- Generate example parameter values for the request.
-Generate the url of as i provided in the api reuest
generate same to same type of test case url for test purpose
''';
// 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_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);
@ -34,17 +36,7 @@ try {
requestModel: requestModel,
responseModel: responseModel,
);
}
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 {
} else {
response = await ollamaService.generateResponse(message);
}
@ -64,10 +56,6 @@ try {
@override
Widget build(BuildContext context) {
final requestModel = ref.watch(selectedRequestModelProvider);
final statusCode = requestModel?.httpResponseModel?.statusCode;
final showDebugButton = statusCode != null && statusCode >= 400;
return Container(
height: 400,
padding: const EdgeInsets.all(16),
@ -87,27 +75,6 @@ return Container(
icon: const Icon(Icons.info_outline),
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(),
],
),
@ -151,9 +118,6 @@ return Container(
],
),
);
}
}