AI Models - the models on the AI providers, each for a use case * (functions/ai.php aiUseCases()) with General the fallback. Above, which * model each use case lands on; in the list, a second model for a use case is * marked as not used, the provider each is on, its instructions and * temperature, and its use in the last 30 days. Add and Edit are one window * (modals/ai/ai_model_edit.php), with Try it; the rest are * admin/post/ai_models.php. */ // Default Column Sortby Filter $sort = "ai_model_name"; $order = "ASC"; require_once "includes/inc_all_admin.php"; $page_title = 'AI Models'; // Only these sort - an unknown column would take the page down $sortable_columns = [ 'ai_model_name' => "ai_model_name $order", 'ai_provider_name' => "ai_provider_name $order, ai_model_name ASC", 'ai_model_use_case' => "FIELD(ai_model_use_case, 'General', 'Tickets', 'Documentation', 'Billing') " . ($order === 'ASC' ? 'ASC' : 'DESC') . ", ai_model_id ASC", 'requests' => "requests $order, ai_model_name ASC", ]; if (!isset($sortable_columns[$sort])) { $sort = 'ai_model_name'; } $provider_filter = intval($_GET['provider'] ?? 0); $sql = mysqli_query($mysqli, "SELECT SQL_CALC_FOUND_ROWS ai_model_id, ai_model_name, ai_model_prompt, ai_model_use_case, ai_model_temperature, ai_provider_id, ai_provider_name, ai_provider_kind, COALESCE(used.requests, 0) AS requests, COALESCE(used.failed, 0) AS failed, COALESCE(used.tokens_in, 0) AS tokens_in, COALESCE(used.tokens_out, 0) AS tokens_out, used.last_used FROM ai_models JOIN ai_providers ON ai_model_ai_provider_id = ai_provider_id LEFT JOIN ( SELECT ai_usage_model_id, SUM(ai_usage_created_at >= NOW() - INTERVAL 30 DAY) AS requests, SUM(ai_usage_created_at >= NOW() - INTERVAL 30 DAY AND ai_usage_ok = 0) AS failed, SUM(IF(ai_usage_created_at >= NOW() - INTERVAL 30 DAY, ai_usage_tokens_in, 0)) AS tokens_in, SUM(IF(ai_usage_created_at >= NOW() - INTERVAL 30 DAY, ai_usage_tokens_out, 0)) AS tokens_out, MAX(ai_usage_created_at) AS last_used FROM ai_usage WHERE ai_usage_feature <> 'test' GROUP BY ai_usage_model_id ) used ON used.ai_usage_model_id = ai_model_id WHERE (ai_model_name LIKE '%$q%' OR ai_provider_name LIKE '%$q%' OR ai_model_use_case LIKE '%$q%' OR ai_model_prompt LIKE '%$q%') " . ($provider_filter ? "AND ai_provider_id = $provider_filter" : '') . " ORDER BY {$sortable_columns[$sort]}, ai_model_id ASC LIMIT $record_from, $record_to"); $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $unused = aiUseCaseMap()['unused']; $providers = mysqli_query($mysqli, "SELECT ai_provider_id, ai_provider_name, ai_provider_kind FROM ai_providers ORDER BY ai_provider_name"); $any_provider = mysqli_num_rows($providers) > 0; $sort_link = function ($column, $label) use ($url_query_strings_sort, $sort, $disp, $order_icon) { return '' . $label . ($sort === $column ? " $order_icon" : '') . ''; }; $add_url = 'modals/ai/ai_model_edit.php' . ($provider_filter ? "?provider=$provider_filter" : ''); $csrf = $_SESSION['csrf_token']; ?>
| = $sort_link('ai_model_name', 'Model') ?> | = $sort_link('ai_provider_name', 'Provider') ?> | = $sort_link('ai_model_use_case', 'For') ?> | Instructions | = $sort_link('requests', 'Last 30 days') ?> | |
|---|---|---|---|---|---|
|
= escapeHtml($name) ?>
">Not used
= escapeHtml($row['ai_provider_name']) ?>
Temperature = escapeHtml(aiTemperatureText($row['ai_model_temperature'])) ?>
|
= escapeHtml($row['ai_provider_name']) ?> |
= escapeHtml($use_case) ?>
= escapeHtml(aiUseCases()[$use_case] ?? '') ?>
|
= escapeHtml($prompt) ?>
None
|
= aiTokensText($row['tokens_in']) ?> in ยท = aiTokensText($row['tokens_out']) ?> out
= $row['last_used'] ? 'None' : 'Not used yet' ?>
Last = escapeHtml(timeAgo($row['last_used'])) ?>
|
|