diff options
Diffstat (limited to 'src/ui/ui_settings.cpp')
| -rw-r--r-- | src/ui/ui_settings.cpp | 55 |
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); + } } } |
