diff --git a/liteflow-react-agent/liteflow-react-agent-core/src/main/java/com/yomahub/liteflow/agent/component/ReActAgentComponent.java b/liteflow-react-agent/liteflow-react-agent-core/src/main/java/com/yomahub/liteflow/agent/component/ReActAgentComponent.java
index 9e3a0791e..dfa28bf38 100644
--- a/liteflow-react-agent/liteflow-react-agent-core/src/main/java/com/yomahub/liteflow/agent/component/ReActAgentComponent.java
+++ b/liteflow-react-agent/liteflow-react-agent-core/src/main/java/com/yomahub/liteflow/agent/component/ReActAgentComponent.java
@@ -2,9 +2,11 @@ package com.yomahub.liteflow.agent.component;
import com.yomahub.liteflow.agent.exception.AgentConfigException;
import com.yomahub.liteflow.agent.hook.ReActLoggingHook;
+import com.yomahub.liteflow.agent.skill.SkillBoxFactory;
+import com.yomahub.liteflow.agent.skill.SkillLoadResult;
+import com.yomahub.liteflow.agent.skill.SkillTrackingHook;
import com.yomahub.liteflow.agent.session.AgentSession;
import com.yomahub.liteflow.agent.session.AgentSessionManager;
-import com.yomahub.liteflow.util.ConversationIdGenerator;
import com.yomahub.liteflow.agent.tool.ManagedShellCommandTool;
import com.yomahub.liteflow.agent.tool.WorkspaceFileTools;
import com.yomahub.liteflow.core.NodeComponent;
@@ -13,12 +15,14 @@ import com.yomahub.liteflow.property.agent.AgentConfig;
import com.yomahub.liteflow.property.agent.MemoryStorageConfig;
import com.yomahub.liteflow.property.agent.ShellMode;
import com.yomahub.liteflow.slot.Slot;
+import com.yomahub.liteflow.util.ConversationIdGenerator;
import io.agentscope.core.ReActAgent;
import io.agentscope.core.hook.Hook;
import io.agentscope.core.memory.InMemoryMemory;
import io.agentscope.core.message.Msg;
import com.yomahub.liteflow.agent.model.ModelSpec;
import io.agentscope.core.model.Model;
+import io.agentscope.core.skill.SkillBox;
import io.agentscope.core.tool.Toolkit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,6 +55,11 @@ import java.util.Map;
* 会在下一次 {@code process()} 时变成陈旧引用(其中的 slot 已经被回收)。
* 正确做法:持有组件实例引用,运行时通过 {@code component.ctx()} 动态获取。
*
+ *
技能相关的 {@link #skills()} 与 {@link #enableSkills()} 只在为某个
+ * {@code (conversationId, agentKey)} session 首次构建并缓存 ReActAgent 时求值。
+ * 它们表示组件能力声明,不应依赖单次请求数据;同一 session 复用缓存 agent 时不会
+ * 重新读取这些声明。
+ *
*
{@link #process()} 方法被声明为 {@code final},由框架统一保证 session
* 管理和 ctx 生命周期的正确性。
*/
@@ -64,11 +73,19 @@ public abstract class ReActAgentComponent extends NodeComponent {
/** 在 Slot attachment 上存储 ctx 时使用的 key 前缀,按 nodeId 隔离。 */
private static final String CTX_KEY_PREFIX = "_react_agent_ctx_";
+ /** 在 Slot attachment 上存储技能跟踪 Hook 时使用的 key 前缀,按 nodeId 隔离。 */
+ private static final String SKILL_HOOK_KEY_PREFIX = "_react_agent_skill_hook_";
+
private String ctxKey() {
String nodeId = getNodeId();
return CTX_KEY_PREFIX + (nodeId == null ? "default" : nodeId);
}
+ private String skillHookKey() {
+ String nodeId = getNodeId();
+ return SKILL_HOOK_KEY_PREFIX + (nodeId == null ? "default" : nodeId);
+ }
+
/* ===== 框架提供的 final 访问器 ===== */
/**
@@ -134,6 +151,37 @@ public abstract class ReActAgentComponent extends NodeComponent {
*/
protected List