Commit a92e8d6e authored by ligaowei's avatar ligaowei

添加对LLM 401错误的处理,当接收到401 Unauthorized错误时提示用户配置API密钥

parent b35d4689
package pangea.hiagent.tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
import pangea.hiagent.workpanel.IWorkPanelDataCollector;
/**
* 自定义 ReAct 回调类,用于捕获并处理 ReAct 的每一步思维过程
* 适配项目现有的 ReAct 实现方式
*/
@Slf4j
@Component // 注册为 Spring 组件,方便注入
public class DefaultReactCallback implements ReactCallback {
@Autowired
private IWorkPanelDataCollector workPanelCollector;
/**
* ReAct 每执行一个步骤,该方法会被触发
* @param reactStep ReAct 步骤对象,包含步骤的所有核心信息
*/
@Override
public void onStep(ReactStep reactStep) {
// 将信息记录到工作面板
recordReactStepToWorkPanel(reactStep);
}
/**
* 处理 ReAct 最终答案步骤
* @param finalAnswer 最终答案
*/
@Override
public void onFinalAnswer(String finalAnswer) {
// 创建一个FINAL_ANSWER类型的ReactStep并处理
ReactStep finalStep = new ReactStep(0, ReactStepType.FINAL_ANSWER, finalAnswer);
recordReactStepToWorkPanel(finalStep);
}
/**
* 将ReAct步骤记录到工作面板
* @param reactStep ReAct步骤
*/
private void recordReactStepToWorkPanel(ReactStep reactStep) {
if (workPanelCollector == null) {
log.debug("无法记录到工作面板:collector为null");
return;
}
try {
switch (reactStep.getStepType()) {
case THOUGHT:
workPanelCollector.recordThinking(reactStep.getContent(), "reasoning");
break;
case ACTION:
if (reactStep.getAction() != null) {
workPanelCollector.recordToolCallStart(
reactStep.getAction().getToolName(),
"execute",
reactStep.getAction().getParameters()
);
}
break;
case OBSERVATION:
if (reactStep.getObservation() != null) {
workPanelCollector.recordToolCallComplete(
"Unknown",
reactStep.getObservation().getContent(),
"success"
);
}
break;
case FINAL_ANSWER:
workPanelCollector.recordThinking(reactStep.getContent(), "final_answer");
break;
default:
log.warn("未知的ReAct步骤类型: {}", reactStep.getStepType());
break;
}
} catch (Exception e) {
log.error("记录ReAct步骤到工作面板失败", e);
}
}
}
\ No newline at end of file
package pangea.hiagent.tool;
/**
* ReAct回调接口,用于捕获ReAct执行的每一步
*/
public interface ReactCallback {
/**
* ReAct每执行一个步骤,该方法会被触发
* @param reactStep ReAct步骤对象,包含步骤的所有核心信息
*/
void onStep(ReactStep reactStep);
void onFinalAnswer(String ragResponse);
}
\ No newline at end of file
package pangea.hiagent.tool;
import org.springframework.ai.chat.client.ChatClient;
import java.util.List;
import java.util.function.Consumer;
/**
* ReAct执行器接口
*/
public interface ReactExecutor {
/**
* 执行ReAct流程(同步方式)
* @param chatClient ChatClient实例
* @param userInput 用户输入
* @param tools 工具列表
* @return 最终答案
*/
String execute(ChatClient chatClient, String userInput, List<Object> tools);
/**
* 流式执行ReAct流程
* @param chatClient ChatClient实例
* @param userInput 用户输入
* @param tools 工具列表
* @param tokenConsumer token处理回调函数
*/
void executeStream(ChatClient chatClient, String userInput, List<Object> tools, Consumer<String> tokenConsumer);
/**
* 添加ReAct回调
* @param callback ReAct回调
*/
void addReactCallback(ReactCallback callback);
}
\ No newline at end of file
package pangea.hiagent.tool;
import lombok.Data;
/**
* ReAct步骤对象,包含步骤的所有核心信息
*/
@Data
public class ReactStep {
/**
* 步骤编号
*/
private int stepNumber;
/**
* 步骤类型
*/
private ReactStepType stepType;
/**
* 步骤核心内容(思维描述、动作指令、观察结果等)
*/
private String content;
/**
* 工具调用信息(仅在ACTION步骤时有值)
*/
private ToolCallAction action;
/**
* 工具观察结果(仅在OBSERVATION步骤时有值)
*/
private ToolObservation observation;
/**
* 构造函数
*/
public ReactStep() {}
/**
* 构造函数
* @param stepNumber 步骤编号
* @param stepType 步骤类型
* @param content 步骤内容
*/
public ReactStep(int stepNumber, ReactStepType stepType, String content) {
this.stepNumber = stepNumber;
this.stepType = stepType;
this.content = content;
}
/**
* 工具调用动作类
*/
@Data
public static class ToolCallAction {
/**
* 工具名称
*/
private String toolName;
/**
* 工具调用参数
*/
private Object parameters;
public ToolCallAction() {}
public ToolCallAction(String toolName, Object parameters) {
this.toolName = toolName;
this.parameters = parameters;
}
}
/**
* 工具观察结果类
*/
@Data
public static class ToolObservation {
/**
* 观察内容
*/
private String content;
public ToolObservation() {}
public ToolObservation(String content) {
this.content = content;
}
}
}
\ No newline at end of file
package pangea.hiagent.tool;
/**
* ReAct步骤类型枚举
*/
public enum ReactStepType {
/**
* 思考步骤:模型思考是否需要调用工具、调用哪个工具、传递什么参数的过程
*/
THOUGHT,
/**
* 动作步骤:模型执行工具调用的动作
*/
ACTION,
/**
* 观察步骤:接收工具返回的结果
*/
OBSERVATION,
/**
* 最终答案步骤:结合工具结果生成最终回答
*/
FINAL_ANSWER
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment