‹ 博客列表

Spring AI Alibaba 24|Hooks 与 Interceptors · 自定义 Hooks 和 Interceptors:ModelHook

在模型调用前后执行自定义逻辑: import com.alibaba.cloud.ai.graph.agent.hook.ModelHook; import com.alibaba.cloud.ai.graph.agent.hook.Hoo

在模型调用前后执行自定义逻辑:

import com.alibaba.cloud.ai.graph.agent.hook.ModelHook;
import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
import com.alibaba.cloud.ai.graph.agent.hook.HookPositions;
import java.util.concurrent.CompletableFuture;

@HookPositions({HookPosition.BEFORE_MODEL, HookPosition.AFTER_MODEL})
public class CustomModelHook extends ModelHook {

  @Override
  public String getName() {
      return "custom_model_hook";
  }

  @Override
  public CompletableFuture<Map<String, Object>> beforeModel(OverAllState state, RunnableConfig config) {
      // 在模型调用前执行
      System.out.println("准备调用模型...");

      // 可以修改状态
      // 例如:添加额外的上下文
      return CompletableFuture.completedFuture(Map.of("extra_context", "某些额外信息"));
  }

  @Override
  public CompletableFuture<Map<String, Object>> afterModel(OverAllState state, RunnableConfig config) {
      // 在模型调用后执行
      System.out.println("模型调用完成");

      // 可以记录响应信息
      return CompletableFuture.completedFuture(Map.of());
  }
}

删除消息:

使用 ModelHook 时,可以通过 RemoveByHash 来删除 messages 中的消息。重要提示:返回的消息列表必须保持原消息列表的顺序,不能打乱顺序。由于 ModelHook 的复杂度,因此我们更推荐直接使用 MessagesModelHook。

import com.alibaba.cloud.ai.graph.agent.hook.ModelHook;
import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
import com.alibaba.cloud.ai.graph.agent.hook.HookPositions;
import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import com.alibaba.cloud.ai.graph.state.RemoveByHash;
import org.springframework.ai.chat.messages.Message;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;

@HookPositions({HookPosition.BEFORE_MODEL})
public class MessageDeletionHook extends ModelHook {

  @Override
  public CompletableFuture<Map<String, Object>> beforeModel(OverAllState state, RunnableConfig config) {
      Optional<Object> messagesOpt = state.value("messages");
      if (!messagesOpt.isPresent()) {
          return CompletableFuture.completedFuture(Map.of());
      }

      List<Message> messages = (List<Message>) messagesOpt.get();
      
      // 构建新的消息列表,保持原顺序
      List<Object> newMessages = new ArrayList<>();
      for (Message msg : messages) {
          // 根据条件决定保留或删除
          if (shouldKeep(msg)) {
              newMessages.add(msg);  // 保留消息
          } else {
              newMessages.add(RemoveByHash.of(msg));  // 标记删除
          }
      }
      
      return CompletableFuture.completedFuture(Map.of("messages", newMessages));
  }
  
  private boolean shouldKeep(Message msg) {
      // 实现你的保留逻辑
      return true;
  }
}

本文整理自 Spring AI Alibaba 官方文档《Hooks 与 Interceptors》:https://java2ai.com/docs/frameworks/agent-framework/tutorials/hooks

本文来自 https://aimock.cn/blog,站内重新编排。
内容仅供学习交流,转载请注明出处。