Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Pangea-Agent
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Gavin-Group
Pangea-Agent
Commits
a92e8d6e
Commit
a92e8d6e
authored
Dec 16, 2025
by
ligaowei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加对LLM 401错误的处理,当接收到401 Unauthorized错误时提示用户配置API密钥
parent
b35d4689
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
252 additions
and
0 deletions
+252
-0
DefaultReactCallback.java
...c/main/java/pangea/hiagent/tool/DefaultReactCallback.java
+84
-0
ReactCallback.java
backend/src/main/java/pangea/hiagent/tool/ReactCallback.java
+15
-0
ReactExecutor.java
backend/src/main/java/pangea/hiagent/tool/ReactExecutor.java
+35
-0
ReactStep.java
backend/src/main/java/pangea/hiagent/tool/ReactStep.java
+92
-0
ReactStepType.java
backend/src/main/java/pangea/hiagent/tool/ReactStepType.java
+26
-0
No files found.
backend/src/main/java/pangea/hiagent/tool/DefaultReactCallback.java
0 → 100644
View file @
a92e8d6e
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
backend/src/main/java/pangea/hiagent/tool/ReactCallback.java
0 → 100644
View file @
a92e8d6e
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
backend/src/main/java/pangea/hiagent/tool/ReactExecutor.java
0 → 100644
View file @
a92e8d6e
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
backend/src/main/java/pangea/hiagent/tool/ReactStep.java
0 → 100644
View file @
a92e8d6e
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
backend/src/main/java/pangea/hiagent/tool/ReactStepType.java
0 → 100644
View file @
a92e8d6e
package
pangea
.
hiagent
.
tool
;
/**
* ReAct步骤类型枚举
*/
public
enum
ReactStepType
{
/**
* 思考步骤:模型思考是否需要调用工具、调用哪个工具、传递什么参数的过程
*/
THOUGHT
,
/**
* 动作步骤:模型执行工具调用的动作
*/
ACTION
,
/**
* 观察步骤:接收工具返回的结果
*/
OBSERVATION
,
/**
* 最终答案步骤:结合工具结果生成最终回答
*/
FINAL_ANSWER
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment