refactor(framework): migrate module abstracts/ActivateModel to Kotlin and introduce shared model/context structures

This commit is contained in:
2026-02-20 15:00:14 +08:00
parent 14e6d71ac9
commit e57c03e213
5 changed files with 148 additions and 139 deletions

View File

@@ -0,0 +1,27 @@
package work.slhaf.partner.api.agent.factory.context
import com.alibaba.fastjson2.JSONArray
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentModule
object AgentContext {
}
sealed class ModuleContextData<T : AbstractAgentModule> {
abstract val name: String
abstract val clazz: Class<T>
abstract val instance: T
abstract val prompt: JSONArray
abstract val modelActivated: Boolean
data class RunningModule<T : AbstractAgentModule>(
override val name: String,
override val clazz: Class<T>,
override val instance: T,
override val prompt: JSONArray,
override val modelActivated: Boolean,
val order: Int
) : ModuleContextData<T>()
}

View File

@@ -1,96 +0,0 @@
package work.slhaf.partner.api.agent.factory.module.abstracts;
import cn.hutool.core.bean.BeanUtil;
import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig;
import work.slhaf.partner.api.agent.factory.module.annotation.Init;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.Model;
import work.slhaf.partner.api.chat.ChatClient;
import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message;
import java.util.ArrayList;
import java.util.List;
public interface ActivateModel {
AgentConfigManager AGENT_CONFIG_MANAGER = AgentConfigManager.INSTANCE;
@Init(order = -1)
default void modelSettings() {
Model model = getModel();
ModelConfig modelConfig = AgentConfigManager.INSTANCE.loadModelConfig(modelKey());
model.setBaseMessages(withBasicPrompt() ? loadSpecificPromptAndBasicPrompt(modelKey()) : loadSpecificPrompt(modelKey()));
model.setChatClient(new ChatClient(modelConfig.getBaseUrl(), modelConfig.getApikey(), modelConfig.getModel()));
}
default void updateModelSettings(ChatClient newChatClient) {
BeanUtil.copyProperties(newChatClient, chatClient());
}
private List<Message> loadSpecificPrompt(String modelKey) {
return AGENT_CONFIG_MANAGER.loadModelPrompt(modelKey);
}
private List<Message> loadSpecificPromptAndBasicPrompt(String modelKey) {
List<Message> messages = new ArrayList<>();
messages.addAll(AGENT_CONFIG_MANAGER.loadModelPrompt("basic"));
messages.addAll(AGENT_CONFIG_MANAGER.loadModelPrompt(modelKey));
return messages;
}
default ChatResponse chat() {
Model model = getModel();
List<Message> temp = new ArrayList<>();
temp.addAll(model.getBaseMessages());
temp.addAll(model.getChatMessages());
return model.getChatClient().runChat(temp);
}
default ChatResponse singleChat(String input) {
Model model = getModel();
List<Message> temp = new ArrayList<>(model.getBaseMessages());
temp.add(new Message(ChatConstant.Character.USER, input));
return model.getChatClient().runChat(temp);
}
default void updateChatClientSettings() {
Model model = getModel();
model.getChatClient().setTemperature(0.4);
model.getChatClient().setTop_p(0.8);
}
default List<Message> chatMessages() {
return getModel().getChatMessages();
}
default List<Message> baseMessages() {
return getModel().getBaseMessages();
}
default ChatClient chatClient() {
return getModel().getChatClient();
}
/**
* 仅适用Module子类否则需要重写
*
* @return 持有的model实例
*/
default Model getModel() {
return ((AbstractAgentModule) this).getModel();
}
default void setModel(Model model) {
((AbstractAgentModule) this).setModel(model);
}
/**
* 对应调用的模型配置名称
*/
String modelKey();
boolean withBasicPrompt();
}

View File

@@ -1,16 +1,105 @@
package work.slhaf.partner.api.agent.factory.module.abstracts;
package work.slhaf.partner.api.agent.factory.module.abstracts
import lombok.Getter;
import lombok.Setter;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.Model;
import work.slhaf.partner.api.agent.factory.module.annotation.Init
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext
import work.slhaf.partner.api.chat.ChatClient
import work.slhaf.partner.api.chat.constant.ChatConstant
import work.slhaf.partner.api.chat.pojo.ChatResponse
import work.slhaf.partner.api.chat.pojo.Message
/**
* 模块基类
*/
public abstract class AbstractAgentModule {
abstract class AbstractAgentModule {
var moduleName: String = javaClass.simpleName
}
@Getter
@Setter
protected Model model = new Model();
data class Model(
val chatClient: ChatClient,
val chatMessages: MutableList<Message> = mutableListOf(),
val baseMessages: MutableList<Message> = mutableListOf()
)
interface RunningModule<T : RunningFlowContext> {
fun execute(context: T)
}
interface SubModule<I, O> {
fun execute(input: I): O
}
interface StandaloneModule
interface ActivateModel {
companion object {
val configManager: AgentConfigManager = AgentConfigManager.INSTANCE
val modelMap: MutableMap<String, Model> = mutableMapOf()
}
fun getModel(): Model {
fun buildModel(): Model {
val modelConfig = configManager.loadModelConfig(modelKey())
val chatClient = ChatClient(modelConfig.baseUrl, modelConfig.apikey, modelConfig.model)
val model = Model(chatClient)
val baseMessages = if (withBasicPrompt()) {
loadSpecificPromptAndBasicPrompt(modelKey())
} else {
configManager.loadModelPrompt(modelKey())
}
model.baseMessages.addAll(baseMessages)
return model
}
val model = modelMap.computeIfAbsent(modelKey()) {
buildModel()
}
return model
}
@Init(order = -1)
fun modelSettings() {
val model = getModel()
modelMap[modelKey()] = model
}
private fun loadSpecificPromptAndBasicPrompt(modelKey: String): MutableList<Message> {
val messages: MutableList<Message> = ArrayList()
messages.addAll(configManager.loadModelPrompt("basic"))
messages.addAll(configManager.loadModelPrompt(modelKey))
return messages
}
fun chat(): ChatResponse {
val model = this.getModel()
val temp = ArrayList<Message?>()
temp.addAll(model.baseMessages)
temp.addAll(model.chatMessages)
return model.chatClient.runChat(temp)
}
fun singleChat(input: String): ChatResponse {
val model = this.getModel()
val temp = ArrayList<Message>(model.baseMessages)
temp.add(Message(ChatConstant.Character.USER, input))
return model.chatClient.runChat(temp)
}
fun updateChatClientSettings() {
val model = this.getModel()
model.chatClient.temperature = 0.4
model.chatClient.top_p = 0.8
}
/**
* 对应调用的模型配置名称
*/
fun modelKey(): String {
return (this as AbstractAgentModule).moduleName
}
fun withBasicPrompt(): Boolean
}

View File

@@ -1,16 +0,0 @@
package work.slhaf.partner.api.agent.runtime.interaction.flow.entity;
import lombok.Data;
import work.slhaf.partner.api.chat.ChatClient;
import work.slhaf.partner.api.chat.pojo.Message;
import java.util.List;
@Data
public class Model {
protected ChatClient chatClient;
protected List<Message> chatMessages;
protected List<Message> baseMessages;
}