Feat: API Documentation & process general queries

This commit is contained in:
siddu015
2025-03-12 02:34:48 +05:30
parent 08040d2efb
commit 8edf981628
5 changed files with 145 additions and 18 deletions

View File

@@ -0,0 +1,66 @@
import 'dart:convert';
import '../services/dashbot_service.dart';
import 'package:apidash/models/request_model.dart';
class DocumentationFeature {
final DashBotService _service;
DocumentationFeature(this._service);
Future<String> generateApiDocumentation({
required RequestModel? requestModel,
required dynamic responseModel,
}) async {
if (requestModel == null || responseModel == null) {
return "No recent API requests found.";
}
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 rawResponse = responseModel.body;
final responseBody =
rawResponse is String ? rawResponse : jsonEncode(rawResponse);
final statusCode = responseModel.statusCode ?? 0;
final prompt = """
API DOCUMENTATION GENERATION
**API Details:**
- Endpoint: $endpoint
- Method: $method
- Status Code: $statusCode
**Request Components:**
- Headers: ${headers.isNotEmpty ? jsonEncode(headers) : "None"}
- Query Parameters: ${parameters.isNotEmpty ? jsonEncode(parameters) : "None"}
- Request Body: ${body != null && body.isNotEmpty ? body : "None"}
**Response Example:**
```
$responseBody
```
**Documentation Instructions:**
Create comprehensive API documentation that includes:
1. **Overview**: A clear, concise description of what this API endpoint does
2. **Authentication**: Required authentication method based on headers
3. **Request Details**: All required and optional parameters with descriptions
4. **Response Structure**: Breakdown of response fields and their meanings
5. **Error Handling**: Possible error codes and troubleshooting
6. **Example Usage**: A complete code example showing how to call this API
Format in clean markdown with proper sections and code blocks where appropriate.
""";
return _service.generateResponse(prompt);
}
}

View File

@@ -0,0 +1,45 @@
import 'package:ollama_dart/ollama_dart.dart';
import 'package:apidash/models/request_model.dart';
class GeneralQueryFeature {
final OllamaClient _client;
GeneralQueryFeature(this._client);
Future<String> generateResponse(String prompt, {RequestModel? requestModel, dynamic responseModel}) async {
// Create a more focused prompt that incorporates request/response context if available
String enhancedPrompt = prompt;
if (requestModel != null && responseModel != null) {
final method = requestModel.httpRequestModel?.method.toString().split('.').last.toUpperCase() ?? "GET";
final endpoint = requestModel.httpRequestModel?.url ?? "Unknown Endpoint";
final statusCode = responseModel.statusCode ?? 0;
enhancedPrompt = '''
CONTEXT-AWARE RESPONSE
**User Question:**
$prompt
**Related API Context:**
- Endpoint: $endpoint
- Method: $method
- Status Code: $statusCode
**Instructions:**
1. Directly address the user's specific question
2. Provide relevant, concise information
3. Reference the API context when helpful
4. Focus on practical, actionable insights
5. Avoid generic explanations or documentation
Respond in a helpful, direct manner that specifically answers what was asked.
''';
}
final response = await _client.generateCompletion(
request: GenerateCompletionRequest(model: 'llama3.2:3b', prompt: enhancedPrompt),
);
return response.response.toString();
}
}

View File

@@ -1,24 +1,29 @@
import 'package:apidash/dashbot/features/debug.dart'; import 'package:apidash/dashbot/features/debug.dart';
import 'package:apidash/dashbot/features/documentation.dart';
import 'package:ollama_dart/ollama_dart.dart'; import 'package:ollama_dart/ollama_dart.dart';
import '../features/explain.dart'; import 'package:apidash/dashbot/features/explain.dart';
import 'package:apidash/models/request_model.dart'; import 'package:apidash/models/request_model.dart';
import 'package:apidash/dashbot/features/general_query.dart';
class DashBotService { class DashBotService {
final OllamaClient _client; final OllamaClient _client;
late final ExplainFeature _explainFeature; late final ExplainFeature _explainFeature;
late final DebugFeature _debugFeature; late final DebugFeature _debugFeature;
late final DocumentationFeature _documentationFeature;
final GeneralQueryFeature _generalQueryFeature;
DashBotService() DashBotService()
: _client = OllamaClient(baseUrl: 'http://127.0.0.1:11434/api') { : _client = OllamaClient(baseUrl: 'http://127.0.0.1:11434/api'),
_generalQueryFeature = GeneralQueryFeature(OllamaClient(baseUrl: 'http://127.0.0.1:11434/api')) {
_explainFeature = ExplainFeature(this); _explainFeature = ExplainFeature(this);
_debugFeature = DebugFeature(this); _debugFeature = DebugFeature(this);
_documentationFeature = DocumentationFeature(this);
} }
Future<String> generateResponse(String prompt) async { Future<String> generateResponse(String prompt) async {
final response = await _client.generateCompletion( return _generalQueryFeature.generateResponse(prompt);
request: GenerateCompletionRequest(model: 'llama3.2:3b', prompt: prompt),
);
return response.response.toString();
} }
Future<String> handleRequest( Future<String> handleRequest(
@@ -29,8 +34,11 @@ class DashBotService {
} else if (input == "Debug API") { } else if (input == "Debug API") {
return _debugFeature.debugApi( return _debugFeature.debugApi(
requestModel: requestModel, responseModel: responseModel); requestModel: requestModel, responseModel: responseModel);
} else if (input == "Document API") {
return _documentationFeature.generateApiDocumentation(
requestModel: requestModel, responseModel: responseModel);
} }
return generateResponse(input); return _generalQueryFeature.generateResponse(input, requestModel: requestModel, responseModel: responseModel);
} }
} }

View File

@@ -143,6 +143,14 @@ class _DashBotWidgetState extends ConsumerState<DashBotWidget> {
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
), ),
), ),
ElevatedButton.icon(
onPressed: () => _sendMessage("Document API"),
icon: const Icon(Icons.description_outlined),
label: const Text("Document"),
style: ElevatedButton.styleFrom (
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
),
),
], ],
); );
} }

View File

@@ -126,17 +126,17 @@ class Dashboard extends ConsumerWidget {
), ),
), ),
// TODO: Release DashBot // TODO: Release DashBot
// floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
// onPressed: () => showModalBottomSheet( onPressed: () => showModalBottomSheet(
// context: context, context: context,
// isScrollControlled: true, isScrollControlled: true,
// builder: (context) => const Padding( builder: (context) => const Padding(
// padding: EdgeInsets.all(16.0), padding: EdgeInsets.all(16.0),
// child: DashBotWidget(), child: DashBotWidget(),
// ), ),
// ), ),
// child: const Icon(Icons.help_outline), child: const Icon(Icons.help_outline),
// ), ),
); );
} }
} }