"use client"; import { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Settings } from "lucide-react"; import { ConfigField } from "@/components/configuration/config-field"; import { useConfigStore, DEFAULT_CONFIG_KEY } from "@/hooks/useConfigStore"; import { Skeleton } from "@/components/ui/skeleton"; import { Button } from "@/components/ui/button"; import type { ConfigurableFieldUIMetadata } from "@open-swe/shared/configurable-metadata"; import { GraphConfigurationMetadata } from "@open-swe/shared/open-swe/types"; import { cn } from "@/lib/utils"; /** * Extract configuration metadata from the GraphConfiguration Zod schema */ function extractConfigurationsFromSchema( configurable: Record, ): ConfigurableFieldUIMetadata[] { const configurations: ConfigurableFieldUIMetadata[] = []; for (const [label, { x_open_swe_ui_config: metadata }] of Object.entries( GraphConfigurationMetadata, )) { if (metadata.type === "hidden") { continue; } configurations.push({ label, type: metadata.type, default: configurable[label] || metadata.default, description: metadata.description, placeholder: metadata.placeholder, options: metadata.options, min: metadata.min, max: metadata.max, step: metadata.step, }); } return configurations; } export function ConfigManager() { const { configs, updateConfig, getConfig } = useConfigStore(); const [defaultConfig, setDefaultConfig] = useState< ConfigurableFieldUIMetadata[] >([]); const [configurations, setConfigurations] = useState< ConfigurableFieldUIMetadata[] >([]); const [loading, setLoading] = useState(false); const loadConfigurations = async () => { // TODO: If we implement a concept of users and start storing config on assistants, // we will need to update this to fetch configs from the assistant first. setLoading(true); setDefaultConfig(extractConfigurationsFromSchema({})); if (getConfig(DEFAULT_CONFIG_KEY)) { const actualConfigs = extractConfigurationsFromSchema( getConfig(DEFAULT_CONFIG_KEY), ); setConfigurations(actualConfigs); setLoading(false); return; } const actualConfigs = extractConfigurationsFromSchema({}); actualConfigs.forEach((c) => { updateConfig(DEFAULT_CONFIG_KEY, c.label, c.default); }); setConfigurations(actualConfigs); setLoading(false); }; useEffect(() => { loadConfigurations(); }, []); const hasConfiguredValues = configurations.some((config) => { const currentValue = configs[DEFAULT_CONFIG_KEY]?.[config.label]; const defaultValue = defaultConfig.find( (c) => c.label === config.label, )?.default; return currentValue !== undefined && currentValue !== defaultValue; }); return (
Agent Configuration Configure agent behavior and model parameters. Will auto-save changes.
{hasConfiguredValues && ( Customized )}
{loading ? (
) : configurations.length > 0 ? ( configurations.map( (config: ConfigurableFieldUIMetadata, index: number) => (
{(() => { const currentValue = configs[DEFAULT_CONFIG_KEY]?.[config.label]; const defaultValue = defaultConfig.find( (c) => c.label === config.label, )?.default; const isModified = currentValue !== undefined && currentValue !== defaultValue; return ( isModified && ( Modified ) ); })()}
{ console.log("setting value!", value); updateConfig(DEFAULT_CONFIG_KEY, config.label, value); }} />
{(() => { const currentValue = configs[DEFAULT_CONFIG_KEY]?.[config.label]; const defaultValue = defaultConfig.find( (c) => c.label === config.label, )?.default; const isModified = currentValue !== undefined && currentValue !== defaultValue; return ( isModified && ( ) ); })()}
), ) ) : (

No Configuration Available

No configurable parameters found for the current context.

)}
); }