diff --git a/crates/goose-server/src/routes/config_management.rs b/crates/goose-server/src/routes/config_management.rs index 45cbfd72c2eb..cf47e79f9a89 100644 --- a/crates/goose-server/src/routes/config_management.rs +++ b/crates/goose-server/src/routes/config_management.rs @@ -37,7 +37,7 @@ pub struct UpsertConfigQuery { pub is_secret: bool, } -#[derive(Deserialize, ToSchema)] +#[derive(Deserialize, Serialize, ToSchema)] pub struct ConfigKeyQuery { pub key: String, pub is_secret: bool, @@ -123,9 +123,9 @@ pub async fn remove_config( } #[utoipa::path( - get, + post, // Change from get to post path = "/config/read", - request_body = ConfigKeyQuery, + request_body = ConfigKeyQuery, // Switch back to request_body responses( (status = 200, description = "Configuration value retrieved successfully", body = Value), (status = 404, description = "Configuration key not found") diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index b4edcd90e23e..6df1387ea80e 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -161,7 +161,7 @@ } }, "/config/read": { - "get": { + "post": { "tags": [ "super::routes::config_management" ], diff --git a/ui/desktop/src/api/sdk.gen.ts b/ui/desktop/src/api/sdk.gen.ts index 99fe1693fdd5..652926772e99 100644 --- a/ui/desktop/src/api/sdk.gen.ts +++ b/ui/desktop/src/api/sdk.gen.ts @@ -66,7 +66,7 @@ export const providers = (options?: Option }; export const readConfig = (options: Options) => { - return (options.client ?? _heyApiClient).get({ + return (options.client ?? _heyApiClient).post({ url: '/config/read', ...options, headers: { diff --git a/ui/desktop/src/components/ConfigContext.tsx b/ui/desktop/src/components/ConfigContext.tsx index 5ca7c47e68b1..4afe78633466 100644 --- a/ui/desktop/src/components/ConfigContext.tsx +++ b/ui/desktop/src/components/ConfigContext.tsx @@ -72,7 +72,6 @@ export const ConfigProvider: React.FC = ({ children }) => { }; const upsert = async (key: string, value: unknown, isSecret: boolean = false) => { - console.log('trying to upsert', key, value, isSecret); const query: UpsertConfigQuery = { key: key, value: value, diff --git a/ui/desktop/src/components/settings_v2/providers/modal/subcomponents/forms/DefaultProviderSetupForm.tsx b/ui/desktop/src/components/settings_v2/providers/modal/subcomponents/forms/DefaultProviderSetupForm.tsx index 3fc5a2a16031..9ab49509b562 100644 --- a/ui/desktop/src/components/settings_v2/providers/modal/subcomponents/forms/DefaultProviderSetupForm.tsx +++ b/ui/desktop/src/components/settings_v2/providers/modal/subcomponents/forms/DefaultProviderSetupForm.tsx @@ -1,5 +1,6 @@ -import React, { useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { Input } from '../../../../../ui/input'; +import { useConfig } from '../../../../../ConfigContext'; // Adjust this import path as needed interface DefaultProviderSetupFormProps { configValues: Record; @@ -13,29 +14,59 @@ export default function DefaultProviderSetupForm({ provider, }: DefaultProviderSetupFormProps) { const parameters = provider.metadata.config_keys || []; + const [isLoading, setIsLoading] = useState(true); + const { read } = useConfig(); - // Initialize default values when the component mounts or provider changes + // Initialize values when the component mounts or provider changes useEffect(() => { - const defaultValues = {}; - parameters.forEach((parameter) => { - if ( - parameter.required && - parameter.default !== undefined && - parameter.default !== null && - !configValues[parameter.name] - ) { - defaultValues[parameter.name] = parameter.default; + const loadConfigValues = async () => { + setIsLoading(true); + const newValues = { ...configValues }; + + // Try to load actual values from config for each parameter that is not secret + for (const parameter of parameters) { + if (parameter.required && !parameter.secret) { + try { + // Check if there's a stored value in the config system + const configKey = `${parameter.name}`; + const configResponse = await read(configKey, parameter.secret || false); + console.log('configResponse', configResponse); + + if (configResponse) { + // Use the value from the config provider + newValues[parameter.name] = configResponse; + } else if ( + parameter.default !== undefined && + parameter.default !== null && + !configValues[parameter.name] + ) { + // Fall back to default value if no config value exists + newValues[parameter.name] = parameter.default; + } + } catch (error) { + console.error(`Failed to load config for ${parameter.name}:`, error); + // Fall back to default if read operation fails + if ( + parameter.default !== undefined && + parameter.default !== null && + !configValues[parameter.name] + ) { + newValues[parameter.name] = parameter.default; + } + } + } } - }); - // Only update if there are default values to add - if (Object.keys(defaultValues).length > 0) { + // Update state with loaded values setConfigValues((prev) => ({ ...prev, - ...defaultValues, + ...newValues, })); - } - }, [provider.name, parameters, setConfigValues, configValues]); + setIsLoading(false); + }; + + loadConfigValues(); + }, [provider.name, parameters, setConfigValues, read]); // Filter parameters to only show required ones const requiredParameters = useMemo(() => { @@ -53,6 +84,10 @@ export default function DefaultProviderSetupForm({ return parameter.name.toUpperCase(); }; + if (isLoading) { + return
Loading configuration values...
; + } + return (
{requiredParameters.length === 0 ? (