...大约 2 分钟
一、本章介绍
本节将完成第一个节点 AiApiNode 的构建,其主要作用是对接 AI 接口,并建立请求通信连接。
二、流程设计
如图,智能体装配中 AiApiNode 部分;

AiApiNode节点的构建基于 Spring AI 框架提供的相关能力。在课程前面我们也介绍过 LangChain4j,如果你想进一步练习,也可以尝试替换实现方案。在后续进行 Agent 组装时,这两种方式都是可以做兼容处理的。
三、功能实现
1. 工程结构
本节处理第一个装配节点 AiApiNode 并把装配结果写入到上下文中。
2. 核心模块
2.1 节点装配
@Slf4j
@Service
public class AiApiNode extends AbstractArmorySupport {
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - AiApiNode");
AiAgentConfigTableVO aiAgentConfigTableVO = requestParameter.getAiAgentConfigTableVO();
AiAgentConfigTableVO.Module.AiApi aiApiConfig = aiAgentConfigTableVO.getModule().getAiApi();
OpenAiApi openAiApi = OpenAiApi.builder()
.baseUrl(aiApiConfig.getBaseUrl())
.apiKey(aiApiConfig.getApiKey())
.completionsPath(StringUtils.isNotBlank(aiApiConfig.getCompletionsPath()) ? aiApiConfig.getCompletionsPath() : "v1/chat/completions")
.embeddingsPath(StringUtils.isNotBlank(aiApiConfig.getEmbeddingsPath()) ? aiApiConfig.getEmbeddingsPath() : "v1/embeddings")
.build();
dynamicContext.setOpenAiApi(openAiApi);
return router(requestParameter, dynamicContext);
}
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
// 如果不需要下一个节点了,可以配置 defaultStrategyHandler
return defaultStrategyHandler;
}
}首先,从入参对象
ArmoryCommandEntity requestParameter中获取 AI Agent 的配置数据,并从中提取模型对应的 AI API 相关装配参数。接着,借助 Spring AI 提供的
OpenAiApi.builder()方法,对这些参数进行构建与填充。通常一个 API 的配置会包含baseUrl、apiKey,以及completionsPath、embeddingsPath(用于向量接口的请求路径)。需要特别注意的是,部分 AI 服务商的接口地址中自带类似xxx/v1的默认版本路径,此时要合理调整completionsPath和embeddingsPath,避免出现xxx/v1/v1这种重复拼接导致无法访问的问题。最后,将构建完成的
openAiApi对象写入上下文中:dynamicContext.setOpenAiApi(openAiApi),以便后续其他节点能够继续复用该配置。
2.2 上下文对象
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class DynamicContext {
/**
* LLM API
*/
private OpenAiApi openAiApi;
private Map<String, Object> dataObjects = new HashMap<>();
public <T> void setValue(String key, T value) {
dataObjects.put(key, value);
}
public <T> T getValue(String key) {
return (T) dataObjects.get(key);
}
}- 在
DynamicContext上下文中新增一个OpenAiApi对象,这样后续的节点就可以直接从上下文中获取并使用该实例。这正是上下文设计的意义所在——用于在不同节点之间传递和共享关键数据。
赞助