summaryrefslogtreecommitdiff
path: root/src/ui/ui_settings.cpp
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-10-17 19:02:21 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-10-17 19:02:21 +0200
commita8799cfee2de8ac53cc07c571c56ae5d9c98cbbd (patch)
treebfbff345e11ce8d75b7a86a611367bdc63c6dcfd /src/ui/ui_settings.cpp
parent18b9e47b88ab483b8f6fa0b133519546846fbb5e (diff)
model selection for ai service
Diffstat (limited to 'src/ui/ui_settings.cpp')
-rw-r--r--src/ui/ui_settings.cpp55
1 files changed, 53 insertions, 2 deletions
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index dd59323..cf27b49 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -335,6 +335,9 @@ static void draw_cost_centers()
static void draw_services()
{
+ static importer::model_list_request* model_request = 0;
+ static bool set_model_on_load = false;
+
// AI service
if (ImGui::CollapsingHeader(locale::get("settings.services.ai_service")))
{
@@ -350,6 +353,8 @@ static void draw_services()
bool is_selected = n == (uint32_t)new_service.provider;
if (ImGui::Selectable(ai_service_names[n], is_selected)) {
new_service.provider = (ai_provider)n;
+ model_request = 0;
+ set_model_on_load = true;
}
}
ImGui::EndCombo();
@@ -357,10 +362,56 @@ static void draw_services()
ImGui::InputTextWithHint(locale::get("settings.services.ai_service.pubkey"), locale::get("settings.services.ai_service.pubkey"),
new_service.api_key_public, sizeof(new_service.api_key_public));
+
+ if (!model_request) {
+ model_request = importer::ai_get_available_models(new_service.provider);
+ }
+
+ // Default to first result in model list, or hardcoded default model.
+ if (model_request->status == importer::status::IMPORT_DONE) {
+ if (set_model_on_load) {
+ set_model_on_load = false;
+
+ if (model_request->result_count > 0) {
+ strops::copy(new_service.model_name, model_request->result[0], sizeof(new_service.model_name));
+ }
+ else {
+ strops::copy(new_service.model_name, importer::get_ai_provider_implementation(new_service.provider).default_model, sizeof(new_service.model_name));
+ }
+ }
+ }
+
+ if (model_request->status == importer::status::IMPORT_DONE && model_request->error == I_ERR_SUCCESS) {
+ if (ImGui::BeginCombo(locale::get("settings.services.ai_service.model"), new_service.model_name))
+ {
+ for (u32 n = 0; n < model_request->result_count; n++)
+ {
+ bool is_selected = strops::equals(new_service.model_name, model_request->result[n]);
+ if (ImGui::Selectable(model_request->result[n], is_selected)) {
+ strops::copy(new_service.model_name, model_request->result[n], sizeof(new_service.model_name));
+ }
+ }
+ ImGui::EndCombo();
+ }
+ }
+ else {
+ ImGui::BeginDisabled();
+ if (ImGui::BeginCombo(locale::get("settings.services.ai_service.model"), new_service.model_name))
+ {
+ ImGui::EndCombo();
+ }
+ if (model_request->status != importer::status::IMPORT_DONE) {
+ ImGui::SameLine();
+
+ // TODO replace with LoadingIndicatorCircle
+ ImGui::Text("%c", "|/-\\"[(int)(ImGui::GetTime() / 0.05f) & 3]);
+ }
+ ImGui::EndDisabled();
+ }
if (ImGui::Button(locale::get("form.save"))) {
- administration::set_ai_service(new_service);
- }
+ administration::set_ai_service(new_service);
+ }
}
}