Save new model to global config
(&mut self, result: ModelFormResult)
| 1370 | |
| 1371 | /// Save new model to global config |
| 1372 | fn save_new_model(&mut self, result: ModelFormResult) { |
| 1373 | let model_id = format!( |
| 1374 | "model_{}", |
| 1375 | std::time::SystemTime::now() |
| 1376 | .duration_since(std::time::UNIX_EPOCH) |
| 1377 | .unwrap_or_default() |
| 1378 | .as_millis() |
| 1379 | ); |
| 1380 | |
| 1381 | let custom_headers: Option<std::collections::HashMap<String, String>> = |
| 1382 | if result.custom_headers.is_empty() { |
| 1383 | None |
| 1384 | } else { |
| 1385 | serde_json::from_str(&result.custom_headers).ok() |
| 1386 | }; |
| 1387 | |
| 1388 | let custom_request_body: Option<String> = if result.custom_request_body.is_empty() { |
| 1389 | None |
| 1390 | } else { |
| 1391 | Some(result.custom_request_body.clone()) |
| 1392 | }; |
| 1393 | |
| 1394 | let model_config = bitfun_core::service::config::AIModelConfig { |
| 1395 | id: model_id.clone(), |
| 1396 | name: result.name.clone(), |
| 1397 | provider: result.provider_format.clone(), |
| 1398 | model_name: result.model_name.clone(), |
| 1399 | base_url: result.base_url.clone(), |
| 1400 | api_key: result.api_key.clone(), |
| 1401 | context_window: Some(result.context_window), |
| 1402 | max_tokens: Some(result.max_tokens), |
| 1403 | enabled: true, |
| 1404 | enable_thinking_process: result.enable_thinking || result.support_preserved_thinking, |
| 1405 | skip_ssl_verify: result.skip_ssl_verify, |
| 1406 | custom_headers, |
| 1407 | custom_headers_mode: if result.custom_headers_mode.is_empty() |
| 1408 | || result.custom_headers_mode == "merge" |
| 1409 | { |
| 1410 | None |
| 1411 | } else { |
| 1412 | Some(result.custom_headers_mode.clone()) |
| 1413 | }, |
| 1414 | custom_request_body, |
| 1415 | ..Default::default() |
| 1416 | }; |
| 1417 | |
| 1418 | let result_name = result.name.clone(); |
| 1419 | let result_model_display = format!("{} / {}", result.model_name, result.name); |
| 1420 | |
| 1421 | let success = tokio::task::block_in_place(|| { |
| 1422 | tokio::runtime::Handle::current().block_on(async { |
| 1423 | let config_service = match GlobalConfigManager::get_service().await { |
| 1424 | Ok(s) => s, |
| 1425 | Err(e) => { |
| 1426 | tracing::error!("Failed to get config service: {}", e); |
| 1427 | return false; |
| 1428 | } |
| 1429 | }; |
no test coverage detected