feat(runtime): support mask assigned modules; and remove legacy module record in agent context

This commit is contained in:
2026-04-09 16:13:04 +08:00
parent 56daaf0b60
commit 3e5d6ebeb4
3 changed files with 50 additions and 6 deletions

View File

@@ -84,8 +84,7 @@ class ComponentRegisterFactory : AgentBaseFactory() {
instance = module, instance = module,
launchTime = launchTime, launchTime = launchTime,
modelInfo = modelInfo, modelInfo = modelInfo,
order = module.order(), order = module.order()
enabled = true
) )
agentContext.addModule(module.moduleName, moduleContext as ModuleContextData<AbstractAgentModule>) agentContext.addModule(module.moduleName, moduleContext as ModuleContextData<AbstractAgentModule>)
} }

View File

@@ -218,8 +218,7 @@ sealed class ModuleContextData<out T : AbstractAgentModule> {
override val launchTime: ZonedDateTime, override val launchTime: ZonedDateTime,
override val modelInfo: ModelInfo?, override val modelInfo: ModelInfo?,
val order: Int, val order: Int
val enabled: Boolean
) : ModuleContextData<T>() ) : ModuleContextData<T>()
data class Sub<T : AbstractAgentModule.Sub<*, *>>( data class Sub<T : AbstractAgentModule.Sub<*, *>>(

View File

@@ -1,14 +1,20 @@
package work.slhaf.partner.framework.agent.interaction package work.slhaf.partner.framework.agent.interaction
import com.alibaba.fastjson2.JSONObject
import com.alibaba.fastjson2.annotation.JSONField
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import work.slhaf.partner.framework.agent.config.Config
import work.slhaf.partner.framework.agent.config.ConfigRegistration
import work.slhaf.partner.framework.agent.config.Configurable
import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule
import work.slhaf.partner.framework.agent.factory.context.AgentContext import work.slhaf.partner.framework.agent.factory.context.AgentContext
import work.slhaf.partner.framework.agent.factory.context.ModuleContextData import work.slhaf.partner.framework.agent.factory.context.ModuleContextData
import work.slhaf.partner.framework.agent.interaction.data.InteractionEvent import work.slhaf.partner.framework.agent.interaction.data.InteractionEvent
import work.slhaf.partner.framework.agent.interaction.flow.RunningFlowContext import work.slhaf.partner.framework.agent.interaction.flow.RunningFlowContext
import java.nio.file.Path
object AgentRuntime { object AgentRuntime : Configurable, ConfigRegistration<ModuleMaskConfig> {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
@@ -23,7 +29,11 @@ object AgentRuntime {
@Volatile @Volatile
private var runningModules: Map<Int, List<AbstractAgentModule.Running<RunningFlowContext>>> = emptyMap() private var runningModules: Map<Int, List<AbstractAgentModule.Running<RunningFlowContext>>> = emptyMap()
@Volatile
private var maskedModules: Set<String> = emptySet()
init { init {
register()
scope.launch { scope.launch {
for (ctx in channel) { for (ctx in channel) {
executeTurn(ctx) executeTurn(ctx)
@@ -77,7 +87,7 @@ object AgentRuntime {
private fun refreshRunningModules() { private fun refreshRunningModules() {
runningModules = AgentContext.modules.values runningModules = AgentContext.modules.values
.filterIsInstance<ModuleContextData.Running<AbstractAgentModule.Running<RunningFlowContext>>>() .filterIsInstance<ModuleContextData.Running<AbstractAgentModule.Running<RunningFlowContext>>>()
.filter { it.enabled } .filterNot { maskedModules.contains(it.instance.moduleName) }
.groupBy { it.order } .groupBy { it.order }
.mapValues { it.value.map { contextData -> contextData.instance } } .mapValues { it.value.map { contextData -> contextData.instance } }
.toSortedMap() .toSortedMap()
@@ -100,4 +110,40 @@ object AgentRuntime {
} }
} }
override fun declare(): Map<Path, ConfigRegistration<out Config>> {
return mapOf(Path.of("masked_modules.json") to this)
}
override fun type(): Class<ModuleMaskConfig> {
return ModuleMaskConfig::class.java
}
override fun init(
config: ModuleMaskConfig,
json: JSONObject?
) {
applyModuleMask(config)
}
override fun onReload(
config: ModuleMaskConfig,
json: JSONObject?
) {
applyModuleMask(config)
}
override fun defaultConfig(): ModuleMaskConfig {
return ModuleMaskConfig(setOf())
}
private fun applyModuleMask(config: ModuleMaskConfig) {
maskedModules = config.maskedModules
refreshRunningModules()
}
} }
data class ModuleMaskConfig(
@field:JSONField(name = "masked_modules")
val maskedModules: Set<String>
) : Config()