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
2
Merge Requests
2
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
b48aa988
Commit
b48aa988
authored
Dec 22, 2025
by
youxiaoji
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* [增加差旅助手智能体]
parent
53570949
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
531 additions
and
16 deletions
+531
-16
AgentChatController.java
...n/java/pangea/hiagent/controller/AgentChatController.java
+11
-11
AgentChatService.java
...d/src/main/java/pangea/hiagent/core/AgentChatService.java
+1
-1
DefaultReactExecutor.java
.../main/java/pangea/hiagent/react/DefaultReactExecutor.java
+13
-2
InfoCollectorService.java
...ain/java/pangea/hiagent/service/InfoCollectorService.java
+47
-0
HisenseTripTool.java
...d/src/main/java/pangea/hiagent/tools/HisenseTripTool.java
+376
-0
Contants.java
backend/src/main/java/pangea/hiagent/utils/Contants.java
+81
-0
application.yml
backend/src/main/resources/application.yml
+2
-2
No files found.
backend/src/main/java/pangea/hiagent/controller/AgentChatController.java
View file @
b48aa988
package
pangea
.
hiagent
.
controller
;
package
pangea
.
hiagent
.
controller
;
import
jakarta.servlet.http.HttpServletRequest
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreAuthorize
;
...
@@ -29,22 +30,22 @@ import java.util.concurrent.Executors;
...
@@ -29,22 +30,22 @@ import java.util.concurrent.Executors;
@RestController
@RestController
@RequestMapping
(
"/api/v1/agent"
)
@RequestMapping
(
"/api/v1/agent"
)
public
class
AgentChatController
{
public
class
AgentChatController
{
@Autowired
@Autowired
private
AgentService
agentService
;
private
AgentService
agentService
;
@Autowired
@Autowired
private
AgentChatService
agentChatService
;
private
AgentChatService
agentChatService
;
@Autowired
@Autowired
private
SseEventManager
sseEventManager
;
private
SseEventManager
sseEventManager
;
private
final
ExecutorService
executorService
=
Executors
.
newFixedThreadPool
(
10
);
private
final
ExecutorService
executorService
=
Executors
.
newFixedThreadPool
(
10
);
/**
/**
* 流式对话接口
* 流式对话接口
* 支持 SSE (Server-Sent Events) 格式的流式输出
* 支持 SSE (Server-Sent Events) 格式的流式输出
*
*
* @param agentId Agent ID
* @param agentId Agent ID
* @param chatRequest 对话请求
* @param chatRequest 对话请求
* @return SSE emitter
* @return SSE emitter
...
@@ -55,13 +56,13 @@ public class AgentChatController {
...
@@ -55,13 +56,13 @@ public class AgentChatController {
@RequestParam
String
agentId
,
@RequestParam
String
agentId
,
@RequestBody
ChatRequest
chatRequest
,
@RequestBody
ChatRequest
chatRequest
,
HttpServletResponse
response
)
{
HttpServletResponse
response
)
{
// 将ChatRequest转换为AgentRequest
// 将ChatRequest转换为AgentRequest
AgentRequest
request
=
new
AgentRequest
();
AgentRequest
request
=
new
AgentRequest
();
request
.
setUserMessage
(
chatRequest
.
getMessage
());
request
.
setUserMessage
(
chatRequest
.
getMessage
());
log
.
info
(
"开始处理流式对话请求,AgentId: {}, 用户消息: {}"
,
agentId
,
request
.
getUserMessage
());
log
.
info
(
"开始处理流式对话请求,AgentId: {}, 用户消息: {}"
,
agentId
,
request
.
getUserMessage
());
// 检查用户消息是否为空
// 检查用户消息是否为空
if
(
request
.
getUserMessage
()
==
null
||
request
.
getUserMessage
().
trim
().
isEmpty
())
{
if
(
request
.
getUserMessage
()
==
null
||
request
.
getUserMessage
().
trim
().
isEmpty
())
{
log
.
error
(
"用户消息不能为空"
);
log
.
error
(
"用户消息不能为空"
);
...
@@ -70,7 +71,7 @@ public class AgentChatController {
...
@@ -70,7 +71,7 @@ public class AgentChatController {
log
.
warn
(
"响应已经提交,无法发送用户消息为空错误"
);
log
.
warn
(
"响应已经提交,无法发送用户消息为空错误"
);
return
new
SseEmitter
(
300000L
);
// 返回一个空的emitter
return
new
SseEmitter
(
300000L
);
// 返回一个空的emitter
}
}
SseEmitter
emitter
=
new
SseEmitter
(
300000L
);
SseEmitter
emitter
=
new
SseEmitter
(
300000L
);
try
{
try
{
emitter
.
send
(
SseEmitter
.
event
()
emitter
.
send
(
SseEmitter
.
event
()
...
@@ -84,7 +85,6 @@ public class AgentChatController {
...
@@ -84,7 +85,6 @@ public class AgentChatController {
}
}
return
emitter
;
return
emitter
;
}
}
String
userId
=
getCurrentUserId
();
String
userId
=
getCurrentUserId
();
if
(
userId
==
null
)
{
if
(
userId
==
null
)
{
log
.
error
(
"用户未认证"
);
log
.
error
(
"用户未认证"
);
...
...
backend/src/main/java/pangea/hiagent/core/AgentChatService.java
View file @
b48aa988
...
@@ -587,7 +587,7 @@ public class AgentChatService {
...
@@ -587,7 +587,7 @@ public class AgentChatService {
// 这里只需要等待足够的时间让异步的onComplete回调执行完成
// 这里只需要等待足够的时间让异步的onComplete回调执行完成
try
{
try
{
// 通过轮询检查是否已完成,最多等待5秒
// 通过轮询检查是否已完成,最多等待5秒
long
maxWaitTime
=
5
000
;
long
maxWaitTime
=
10
*
60
*
1
000
;
long
startTime
=
System
.
currentTimeMillis
();
long
startTime
=
System
.
currentTimeMillis
();
while
(!
isCompleted
.
get
()
&&
(
System
.
currentTimeMillis
()
-
startTime
)
<
maxWaitTime
)
{
while
(!
isCompleted
.
get
()
&&
(
System
.
currentTimeMillis
()
-
startTime
)
<
maxWaitTime
)
{
Thread
.
sleep
(
100
);
// 每100ms检查一次
Thread
.
sleep
(
100
);
// 每100ms检查一次
...
...
backend/src/main/java/pangea/hiagent/react/DefaultReactExecutor.java
View file @
b48aa988
...
@@ -8,6 +8,9 @@ import org.springframework.ai.chat.prompt.Prompt;
...
@@ -8,6 +8,9 @@ import org.springframework.ai.chat.prompt.Prompt;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.context.annotation.Lazy
;
import
pangea.hiagent.service.AgentService
;
import
pangea.hiagent.service.InfoCollectorService
;
import
pangea.hiagent.tools.HisenseTripTool
;
import
pangea.hiagent.workpanel.IWorkPanelDataCollector
;
import
pangea.hiagent.workpanel.IWorkPanelDataCollector
;
import
pangea.hiagent.core.AgentChatService
;
import
pangea.hiagent.core.AgentChatService
;
import
pangea.hiagent.memory.MemoryService
;
import
pangea.hiagent.memory.MemoryService
;
...
@@ -40,6 +43,12 @@ public class DefaultReactExecutor implements ReactExecutor {
...
@@ -40,6 +43,12 @@ public class DefaultReactExecutor implements ReactExecutor {
@Autowired
@Autowired
private
MemoryService
memoryService
;
private
MemoryService
memoryService
;
@Autowired
private
AgentService
agentService
;
@Autowired
private
InfoCollectorService
infoCollectorService
;
/**
/**
* 添加ReAct回调
* 添加ReAct回调
...
@@ -213,10 +222,12 @@ public class DefaultReactExecutor implements ReactExecutor {
...
@@ -213,10 +222,12 @@ public class DefaultReactExecutor implements ReactExecutor {
// 构建Prompt,包含历史对话记录
// 构建Prompt,包含历史对话记录
Prompt
prompt
=
buildPromptWithHistory
(
systemPrompt
,
userInput
,
agent
);
Prompt
prompt
=
buildPromptWithHistory
(
systemPrompt
,
userInput
,
agent
);
HisenseTripTool
tripTool
=
new
HisenseTripTool
(
agentService
,
infoCollectorService
);
tripTool
.
initialize
();
// 订阅流式响应
// 订阅流式响应
chatClient
.
prompt
(
prompt
)
chatClient
.
prompt
(
prompt
)
.
tools
(
t
ools
.
toArray
()
)
.
tools
(
t
ripTool
)
.
stream
()
.
stream
()
.
chatResponse
()
.
chatResponse
()
.
subscribe
(
.
subscribe
(
...
...
backend/src/main/java/pangea/hiagent/service/InfoCollectorService.java
0 → 100644
View file @
b48aa988
package
pangea
.
hiagent
.
service
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
pangea.hiagent.tools.HisenseTripTool
;
import
java.util.Set
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
@Service
@Slf4j
public
class
InfoCollectorService
{
private
static
final
ConcurrentHashMap
<
String
,
JSONArray
>
infos
=
new
ConcurrentHashMap
<>(
16
);
private
static
final
ConcurrentHashMap
<
String
,
Object
>
values
=
new
ConcurrentHashMap
<>(
16
);
public
void
register
(
String
pageId
,
JSONArray
info
)
{
infos
.
put
(
pageId
,
info
);
}
public
boolean
exists
(
String
pageId
)
{
return
infos
.
containsKey
(
pageId
);
}
public
JSONArray
getInfo
(
String
pageId
)
{
return
infos
.
get
(
pageId
);
}
public
void
saveValue
(
String
key
,
Object
value
)
{
log
.
info
(
"key {} value {}"
,
key
,
value
);
values
.
put
(
key
,
value
);
}
public
Object
getValue
(
String
key
)
{
return
values
.
get
(
key
);
}
public
Set
<
String
>
findLackInfo
()
{
Set
<
String
>
valueKeys
=
values
.
keySet
();
Set
<
String
>
allKeys
=
infos
.
get
(
HisenseTripTool
.
pageId
).
stream
().
map
(
t
->
((
JSONObject
)
t
).
getString
(
"field_name"
)).
collect
(
Collectors
.
toSet
());
allKeys
.
removeAll
(
valueKeys
);
log
.
info
(
"lack keys {}"
,
allKeys
);
return
allKeys
;
}
}
backend/src/main/java/pangea/hiagent/tools/HisenseTripTool.java
0 → 100644
View file @
b48aa988
This diff is collapsed.
Click to expand it.
backend/src/main/java/pangea/hiagent/utils/Contants.java
0 → 100644
View file @
b48aa988
package
pangea
.
hiagent
.
utils
;
public
class
Contants
{
public
static
final
String
LOCATOR_SCHEMA
=
"{\n"
+
" \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n"
+
" \"type\": \"array\",\n"
+
" \"items\": {\n"
+
" \"type\": \"object\",\n"
+
" \"properties\": {\n"
+
" \"field_name\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"locator\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"attributes\": {\n"
+
" \"type\": \"object\",\n"
+
" \"properties\": {\n"
+
" \"type\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"maxlength\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"class\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"name\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"value\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"autocomplete\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"placeholder\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"readonly\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"id\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"droptreeids\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"vetitle\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"contenteditable\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"style\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"tipstext\": {\n"
+
" \"type\": \"string\"\n"
+
" },\n"
+
" \"fylx\": {\n"
+
" \"type\": \"string\"\n"
+
" }\n"
+
" },\n"
+
" \"additionalProperties\": false,\n"
+
" \"required\": [\n"
+
" \"class\",\n"
+
" \"value\"\n"
+
" ]\n"
+
" }\n"
+
" },\n"
+
" \"additionalProperties\": false,\n"
+
" \"required\": [\n"
+
" \"field_name\",\n"
+
" \"locator\",\n"
+
" \"attributes\"\n"
+
" ]\n"
+
" }\n"
+
"}"
;
}
backend/src/main/resources/application.yml
View file @
b48aa988
...
@@ -4,7 +4,7 @@ spring:
...
@@ -4,7 +4,7 @@ spring:
# 数据源配置
# 数据源配置
datasource
:
datasource
:
url
:
jdbc:mysql://${DB_HOST:1
92.168.219.129
}:3306/hiagent?allowMultiQueries=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
url
:
jdbc:mysql://${DB_HOST:1
27.0.0.1
}:3306/hiagent?allowMultiQueries=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name
:
${DB_DRIVER:com.mysql.cj.jdbc.Driver}
driver-class-name
:
${DB_DRIVER:com.mysql.cj.jdbc.Driver}
username
:
${DB_NAME:root}
username
:
${DB_NAME:root}
password
:
${DB_PASSWORD:123456Aa?}
password
:
${DB_PASSWORD:123456Aa?}
...
@@ -195,7 +195,7 @@ hiagent:
...
@@ -195,7 +195,7 @@ hiagent:
llm
:
llm
:
providers
:
providers
:
deepseek
:
deepseek
:
default-api-key
:
${DEEPSEEK_API_KEY:}
default-api-key
:
${DEEPSEEK_API_KEY:
sk-e8ef4359d20b413696512db21c09db87
}
default-model
:
deepseek-chat
default-model
:
deepseek-chat
base-url
:
https://api.deepseek.com
base-url
:
https://api.deepseek.com
openai
:
openai
:
...
...
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