This commit is contained in:
Flatlogic Bot 2026-01-02 11:46:11 +00:00
parent e1227cfbcd
commit 6d001f8a7f
2 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,33 @@
<?php
header('Content-Type: application/json');
require_once __DIR__ . '/../ai/LocalAIApi.php';
$keyword = $_GET['keyword'] ?? 'new process';
$prompt = "Generate a creative and concise name and a short description for a process related to '" . htmlspecialchars($keyword) . "'. Respond in JSON format with 'name' and 'description' keys. Example: {"name": "Automated Workflow Orchestrator", "description": "Manages and streamlines complex business workflows."}";
$params = [
'input' => [
['role' => 'system', 'content' => 'You are a helpful assistant that generates process names and descriptions.'],
['role' => 'user', 'content' => $prompt],
],
'model' => 'gpt-5-mini', // Using the default model from ai/config.php
];
$response = LocalAIApi::createResponse($params);
if (!empty($response['success'])) {
$decoded = LocalAIApi::decodeJsonFromResponse($response);
if ($decoded && isset($decoded['name']) && isset($decoded['description'])) {
echo json_encode(['success' => true, 'data' => $decoded]);
} else {
// Fallback if AI didn't return valid JSON or missing keys
$text = LocalAIApi::extractText($response);
echo json_encode(['success' => false, 'error' => 'AI response not in expected JSON format: ' . substr($text, 0, 200)]);
}
} else {
$error_message = $response['error'] ?? 'Unknown AI error';
echo json_encode(['success' => false, 'error' => $error_message]);
}
?>

View File

@ -107,6 +107,12 @@ $project_image_url = htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? '');
<label for="description" class="form-label">Description</label>
<textarea class="form-control" id="description" name="description" rows="4" required></textarea>
</div>
<div class="mb-3 text-end">
<button type="button" class="btn btn-sm btn-outline-secondary" id="aiSuggestBtn">
<span id="aiSuggestSpinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
Suggest with AI
</button>
</div>
<button type="submit" class="btn btn-primary w-100">Add Process</button>
</form>
</div>
@ -179,6 +185,43 @@ $project_image_url = htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? '');
});
feather.replace()
// AI Suggestion Feature
const aiSuggestBtn = document.getElementById('aiSuggestBtn');
const aiSuggestSpinner = document.getElementById('aiSuggestSpinner');
const processNameInput = document.getElementById('name');
const processDescriptionInput = document.getElementById('description');
const messageArea = document.getElementById('message-area');
if (aiSuggestBtn) {
aiSuggestBtn.addEventListener('click', async () => {
aiSuggestBtn.disabled = true;
aiSuggestSpinner.classList.remove('d-none');
messageArea.innerHTML = ''; // Clear previous messages
const keyword = processNameInput.value.trim();
const queryParam = keyword ? `?keyword=${encodeURIComponent(keyword)}` : '';
try {
const response = await fetch(`api/generate_process_suggestion.php${queryParam}`);
const data = await response.json();
if (data.success) {
processNameInput.value = data.data.name;
processDescriptionInput.value = data.data.description;
messageArea.innerHTML = '<div class="alert alert-success alert-dismissible fade show" role="alert">AI suggestion generated successfully!<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>';
} else {
messageArea.innerHTML = `<div class="alert alert-danger alert-dismissible fade show" role="alert">Failed to get AI suggestion: ${data.error}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>`;
}
} catch (error) {
console.error('Error fetching AI suggestion:', error);
messageArea.innerHTML = '<div class="alert alert-danger alert-dismissible fade show" role="alert">An error occurred while fetching AI suggestion. Please try again.<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>';
} finally {
aiSuggestBtn.disabled = false;
aiSuggestSpinner.classList.add('d-none');
}
});
}
</script>
</body>
</html>