使用结构化输出控制模型响应格式。
// 在Agent级别设置输出格式
ReactAgent agent = ReactAgent.builder()
.name("structured_agent")
.model(chatModel)
.outputType(MyResponseClass.class) // 或 .outputSchema(jsonSchema)
.build();
// 也可以在Interceptor中动态调整
class DynamicFormatInterceptor extends ModelInterceptor {
@Override
public ModelResponse interceptModel(ModelRequest request, ModelCallHandler handler) {
// 根据请求内容决定输出格式
String outputSchema = determineOutputSchema(request);
// 在消息中添加格式说明
List<Message> updatedMessages = addFormatInstructions(
request.getMessages(),
outputSchema
);
ModelRequest enhancedRequest = ModelRequest.builder(request)
.messages(updatedMessages)
.build();
return handler.call(enhancedRequest);
}
private String determineOutputSchema(ModelRequest request) {
// 实现输出格式决定逻辑
return "";
}
private List<Message> addFormatInstructions(List<Message> messages, String schema) {
// 实现格式说明添加逻辑
return messages;
}
@Override
public String getName() {
return "DynamicFormatInterceptor";
}
}
控制工具可以访问和修改的内容。
工具中访问状态
class StatefulTool implements Function<StatefulTool.Request, StatefulTool.Response> {
public record Request(String query) {}
public record Response(String result) {}
@Override
public Response apply(Request request, ToolContext toolContext) {
// 从 Agent 持久状态读取信息
OverAllState currentState = (OverAllState) toolContext.getContext().get("state");
// 'messages' can be any key persisted in short memory
Optional<Object> messages = currentState.value("messages");
// 从 Agent 运行上下文读取信息
RunnableConfig config = (RunnableConfig) toolContext.getContext().get("config");
Optional<Object> userContext = config.metadata("user_context_key");
// 使用状态信息处理请求
String result = processWithContext(request.query(), messages, userContext);
return new Response(result);
}
private String processWithContext(String query, Optional<Object> messages, Optional<Object> userContext) {
// 实现处理逻辑
return "处理结果";
}
}
工具修改状态
class StateModifyingTool implements Function<StateModifyingTool.Request, StateModifyingTool.Response> {
public record Request(String data) {}
public record Response(String status) {}
@Override
public Response apply(Request request, ToolContext toolContext) {
// 从 Agent 持久状态读取信息
Map<String, Object> extraState = (Map<String, Object>) toolContext.getContext().get("extraState");
// 处理数据
String processed = process(request.data());
// extraState 是一个特殊设计,更新到 extraState 中的值会被持久化到 State 状态中,并被后续的 Loop 节点看到。
extraState.put("processed_data", processed);
return new Response("数据已处理并保存到状态");
}
private String process(String data) {
// 实现处理逻辑
return "处理后的数据";
}
}
本文整理自 Spring AI Alibaba 官方文档《上下文工程》:https://java2ai.com/docs/frameworks/agent-framework/advanced/context-engineering

AI项目博客






