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']; ?>

AI Models

Usage
"> $model_id]); $then = $is_unused ? null : aiUseCaseMap(['model' => $model_id])['map'][$use_case] ?? null; if ($is_unused) { $delete_text = 'Nothing uses it - ' . ($unused[$model_id] ? $unused[$model_id]['ai_model_name'] . " is the one used for $use_case." : "$use_case isn't a use case."); } elseif ($stopping) { $delete_text = 'AI stops for ' . implode(' and ', $stopping) . ' until another model is set up.'; } else { $delete_text = "$use_case uses " . ($then && $then['model'] ? $then['model']['ai_model_name'] . ($then['own'] ? '' : ' (General)') : 'nothing') . ' instead.'; } ?>
Instructions
">Not used
Temperature
None
in ยท out
Last
'AI models', 'icon' => 'fa-brain', 'text' => $any_provider ? 'The model on each provider that ITFlow uses - one for everything (General), and others for tickets or documents if you like.' : 'Add an AI provider first - then the models on it ITFlow uses.', 'actions' => $any_provider ? [['label' => 'Add Model', 'modal' => $add_url]] : [['label' => 'AI Providers', 'href' => 'ai_providers.php', 'icon' => 'fa-robot']], ]; ?>