From 50db3fa7b21f154a05b4912882897ee9e7cb45ba Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sat, 4 Apr 2026 23:34:00 +0800 Subject: [PATCH] refactor(config): adjust method init and onReload to support polymorphic config loading --- .../interaction/WebSocketGatewayRegistry.java | 3 +- .../api/agent/model/ModelRuntimeRegistry.kt | 28 +++++++++++++++---- .../api/agent/runtime/config/ConfigCenter.kt | 25 +++++++++-------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/WebSocketGatewayRegistry.java b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/WebSocketGatewayRegistry.java index b76c7e5e..3a56dbd1 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/WebSocketGatewayRegistry.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/WebSocketGatewayRegistry.java @@ -1,5 +1,6 @@ package work.slhaf.partner.runtime.interaction; +import com.alibaba.fastjson2.JSONObject; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import work.slhaf.partner.api.agent.runtime.config.Config; @@ -26,7 +27,7 @@ public class WebSocketGatewayRegistry implements Configurable { } @Override - public void init(@NotNull WebSocketConfig config) { + public void init(@NotNull WebSocketConfig config, JSONObject json) { new WebSocketGateway(config.port, config.heartbeatInterval); } diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/model/ModelRuntimeRegistry.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/model/ModelRuntimeRegistry.kt index eee8e081..da5b8f45 100644 --- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/model/ModelRuntimeRegistry.kt +++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/model/ModelRuntimeRegistry.kt @@ -1,6 +1,8 @@ package work.slhaf.partner.api.agent.model +import com.alibaba.fastjson2.JSONObject import org.slf4j.LoggerFactory +import work.slhaf.partner.api.agent.model.ProviderConfig.ProviderType.OPENAI_COMPATIBLE import work.slhaf.partner.api.agent.model.provider.ModelProvider import work.slhaf.partner.api.agent.model.provider.ProviderOverride import work.slhaf.partner.api.agent.model.provider.openai.OpenAiCompatibleProvider @@ -9,6 +11,7 @@ import work.slhaf.partner.api.agent.runtime.config.ConfigDoc import work.slhaf.partner.api.agent.runtime.config.ConfigRegistration import work.slhaf.partner.api.agent.runtime.config.Configurable import java.nio.file.Path +import java.util.Locale.getDefault import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock @@ -62,17 +65,30 @@ object ModelRuntimeRegistry : Configurable, ConfigRegistration = ModelRuntimeRegistryConfig::class.java - override fun init(config: ModelRuntimeRegistryConfig) = providerLock.withLock { + override fun init(config: ModelRuntimeRegistryConfig, json: JSONObject?) = providerLock.withLock { config.providerConfigSet.forEach { registerProvider(it) } config.runtimeConfigSet.forEach { forkProvider(it) } } - override fun onReload(config: ModelRuntimeRegistryConfig) = providerLock.withLock { + override fun onReload(config: ModelRuntimeRegistryConfig, json: JSONObject?) = providerLock.withLock { + val root = json ?: return@withLock val baseProviderSnapshot = baseProvider.toMap() val runtimeProviderSnapshot = runtimeProvider.toMap() try { + val providerSetJson = root.getJSONArray("providerConfigSet") + ?: throw IllegalStateException("providerConfigSet is missing or not an array") baseProvider.clear() - config.providerConfigSet.forEach { registerProvider(it) } + for (i in providerSetJson.indices) { + val providerJson = providerSetJson.getJSONObject(i) + ?: throw IllegalStateException("providerConfigSet[$i] is not an object") + val typeText = providerJson.getString("type") + ?: throw IllegalStateException("providerConfigSet[$i].type is missing") + val providerType = ProviderConfig.ProviderType.valueOf(typeText.uppercase(getDefault())) + val concreteProviderConfig = when (providerType) { + OPENAI_COMPATIBLE -> providerJson.toJavaObject(OpenAiCompatibleProviderConfig::class.java) + } + registerProvider(concreteProviderConfig) + } runtimeProvider.clear() config.runtimeConfigSet.forEach { forkProvider(it) } } catch (e: Exception) { @@ -92,7 +108,7 @@ object ModelRuntimeRegistry : Configurable, ConfigRegistration - val config = loadConfig(path, registration) - if (config != null) { - (registration as ConfigRegistration).init(config) + val pair = loadConfig(path, registration) + if (pair != null) { + (registration as ConfigRegistration).init(pair.first, pair.second) return } val defaultConfig = registration.defaultConfig() if (defaultConfig != null) { - (registration as ConfigRegistration).init(defaultConfig) + (registration as ConfigRegistration).init(defaultConfig, null) } val configDoc = resolveConfigDoc(registration.type()) throw AgentLaunchFailedException("Failed to init config, related path: $path, config definition: $configDoc") @@ -184,18 +185,20 @@ object ConfigCenter : AutoCloseable { val relativePath = toRelativeConfigPath(file) ?: return val registration = registrations[relativePath] ?: return try { - val config = loadConfig(file, registration) - if (config != null) { - (registration as ConfigRegistration).onReload(config) + val pair = loadConfig(file, registration) + if (pair != null) { + (registration as ConfigRegistration).onReload(pair.first, pair.second) } } catch (e: Exception) { log.error("Config reload failed: {}", relativePath, e) } } - private fun loadConfig(file: Path, registration: ConfigRegistration): Config? { + private fun loadConfig(file: Path, registration: ConfigRegistration): Pair? { return try { - JSON.parseObject(Files.readString(file, StandardCharsets.UTF_8), registration.type()) as Config + val json = JSON.parseObject(Files.readString(file, StandardCharsets.UTF_8)) + val config = json.toJavaObject(registration.type()) + config to json } catch (e: Exception) { log.error("Config reload failed: {}", file, e) null @@ -247,8 +250,8 @@ interface Configurable { interface ConfigRegistration { fun type(): Class - fun init(config: T) - fun onReload(config: T) {} + fun init(config: T, json: JSONObject?) + fun onReload(config: T, json: JSONObject?) {} fun defaultConfig(): T? }