(state: State<'_, AppState>)
| 1091 | |
| 1092 | #[tauri::command] |
| 1093 | pub async fn initialize_ai(state: State<'_, AppState>) -> Result<String, String> { |
| 1094 | let config_service = &state.config_service; |
| 1095 | let global_config: bitfun_core::service::config::GlobalConfig = config_service |
| 1096 | .get_config(None) |
| 1097 | .await |
| 1098 | .map_err(|e| format!("Failed to get configuration: {}", e))?; |
| 1099 | let primary_model_id = global_config |
| 1100 | .ai |
| 1101 | .default_models |
| 1102 | .primary |
| 1103 | .clone() |
| 1104 | .ok_or_else(|| { |
| 1105 | "Primary model not configured, please configure it in settings".to_string() |
| 1106 | })?; |
| 1107 | let model_config = global_config |
| 1108 | .ai |
| 1109 | .models |
| 1110 | .iter() |
| 1111 | .find(|m| m.id == primary_model_id) |
| 1112 | .ok_or_else(|| format!("Primary model '{}' does not exist", primary_model_id))?; |
| 1113 | let stream_options = bitfun_core::infrastructure::ai::build_stream_options_for_model( |
| 1114 | &global_config.ai, |
| 1115 | Some(model_config), |
| 1116 | ); |
| 1117 | |
| 1118 | let ai_config = bitfun_core::util::types::AIConfig::try_from(model_config.clone()) |
| 1119 | .map_err(|e| format!("Failed to convert AI configuration: {}", e))?; |
| 1120 | let ai_client = bitfun_core::infrastructure::ai::AIClient::new_with_runtime_options( |
| 1121 | ai_config, |
| 1122 | None, |
| 1123 | stream_options, |
| 1124 | ); |
| 1125 | |
| 1126 | { |
| 1127 | let mut ai_client_guard = state.ai_client.write().await; |
| 1128 | *ai_client_guard = Some(ai_client); |
| 1129 | } |
| 1130 | |
| 1131 | info!("AI client initialized: model={}", model_config.name); |
| 1132 | Ok(format!( |
| 1133 | "AI client initialized successfully: {}", |
| 1134 | model_config.name |
| 1135 | )) |
| 1136 | } |
| 1137 | |
| 1138 | async fn create_transient_ai_client_for_config( |
| 1139 | state: &State<'_, AppState>, |
nothing calls this directly
no test coverage detected