mvp.5
This commit is contained in:
parent
e1227cfbcd
commit
6d001f8a7f
33
api/generate_process_suggestion.php
Normal file
33
api/generate_process_suggestion.php
Normal 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]);
|
||||||
|
}
|
||||||
|
?>
|
||||||
43
index.php
43
index.php
@ -107,6 +107,12 @@ $project_image_url = htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? '');
|
|||||||
<label for="description" class="form-label">Description</label>
|
<label for="description" class="form-label">Description</label>
|
||||||
<textarea class="form-control" id="description" name="description" rows="4" required></textarea>
|
<textarea class="form-control" id="description" name="description" rows="4" required></textarea>
|
||||||
</div>
|
</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>
|
<button type="submit" class="btn btn-primary w-100">Add Process</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@ -179,6 +185,43 @@ $project_image_url = htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? '');
|
|||||||
});
|
});
|
||||||
|
|
||||||
feather.replace()
|
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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user