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
d2f8d7c9
Commit
d2f8d7c9
authored
Dec 31, 2025
by
高如斌
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop_tmp' into 'feature/chat-form'
Develop tmp See merge request
!7
parents
a2b3a8c8
1ff00b03
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
165 additions
and
112 deletions
+165
-112
pom.xml
backend/pom.xml
+10
-0
DefaultReactExecutor.java
...java/pangea/hiagent/agent/react/DefaultReactExecutor.java
+22
-21
VisitorAppointmentTool.java
...java/pangea/hiagent/tool/impl/VisitorAppointmentTool.java
+30
-22
PlaywrightManagerImpl.java
...pangea/hiagent/tool/playwright/PlaywrightManagerImpl.java
+77
-59
AgentDialogueRepository.java
...angea/hiagent/web/repository/AgentDialogueRepository.java
+4
-0
ChatService.java
...src/main/java/pangea/hiagent/web/service/ChatService.java
+6
-0
InfoCollectorService.java
...java/pangea/hiagent/web/service/InfoCollectorService.java
+5
-5
application-dev.yml
backend/src/main/resources/application-dev.yml
+5
-5
vite.config.ts
frontend/vite.config.ts
+6
-0
No files found.
backend/pom.xml
View file @
d2f8d7c9
...
...
@@ -338,6 +338,16 @@
<artifactId>
lombok
</artifactId>
</exclude>
</excludes>
<requiresUnpack>
<dependency>
<groupId>
com.microsoft.playwright
</groupId>
<artifactId>
driver
</artifactId>
</dependency>
<dependency>
<groupId>
com.microsoft.playwright
</groupId>
<artifactId>
driver-bundle
</artifactId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
...
...
backend/src/main/java/pangea/hiagent/agent/react/DefaultReactExecutor.java
View file @
d2f8d7c9
...
...
@@ -125,29 +125,26 @@ public class DefaultReactExecutor implements ReactExecutor {
List
<
org
.
springframework
.
ai
.
chat
.
messages
.
Message
>
messages
=
new
ArrayList
<>();
messages
.
add
(
new
SystemMessage
(
systemPrompt
));
if
(!
newChat
)
{
if
(
agent
!=
null
)
{
try
{
// 如果没有提供用户ID,则尝试获取当前用户ID
if
(
userId
==
null
)
{
userId
=
UserUtils
.
getCurrentUserIdStatic
();
}
String
sessionId
=
memoryService
.
generateSessionId
(
agent
,
userId
);
if
(
agent
!=
null
)
{
try
{
// 如果没有提供用户ID,则尝试获取当前用户ID
if
(
userId
==
null
)
{
userId
=
UserUtils
.
getCurrentUserIdStatic
();
}
String
sessionId
=
memoryService
.
generateSessionId
(
agent
,
userId
);
int
historyLength
=
agent
.
getHistoryLength
()
!=
null
?
agent
.
getHistoryLength
()
:
10
;
int
historyLength
=
agent
.
getHistoryLength
()
!=
null
?
agent
.
getHistoryLength
()
:
10
;
List
<
org
.
springframework
.
ai
.
chat
.
messages
.
Message
>
historyMessages
=
memoryService
.
getHistoryMessages
(
sessionId
,
historyLength
);
if
(!
newChat
)
{
List
<
org
.
springframework
.
ai
.
chat
.
messages
.
Message
>
historyMessages
=
memoryService
.
getHistoryMessages
(
sessionId
,
historyLength
);
messages
.
addAll
(
historyMessages
);
memoryService
.
addUserMessageToMemory
(
sessionId
,
userInput
);
}
catch
(
Exception
e
)
{
log
.
warn
(
"获取历史对话记录时发生错误: {}"
,
e
.
getMessage
());
}
memoryService
.
addUserMessageToMemory
(
sessionId
,
userInput
);
}
catch
(
Exception
e
)
{
log
.
warn
(
"获取历史对话记录时发生错误: {}"
,
e
.
getMessage
());
}
}
messages
.
add
(
new
UserMessage
(
userInput
));
for
(
Message
message
:
messages
)
{
log
.
info
(
"message is {}"
,
message
);
...
...
@@ -179,13 +176,17 @@ public class DefaultReactExecutor implements ReactExecutor {
log
.
info
(
"agentTools {}"
,
agentTools
);
if
(
agent
.
getId
().
compareToIgnoreCase
(
"agent-8"
)
==
0
)
{
if
(!
chatService
.
chatExists
(
tmpUserId
,
agent
.
getId
()))
{
log
.
info
(
"new chat for {} {} "
,
userId
,
agent
.
getId
());
prompt
=
buildPromptWithHistory
(
defaultSystemPrompt
,
userInput
,
agent
,
tmpUserId
,
true
);
boolean
chatExists
=
chatService
.
chatExists
(
tmpUserId
,
agent
.
getId
());
String
newChat
=
"yes"
;
if
(
chatExists
){
newChat
=
"no"
;
}
// log.info("new chat for {} {} ", userId, agent.getId());
prompt
=
buildPromptWithHistory
(
agent
.
getSystemPrompt
(),
userInput
,
agent
,
tmpUserId
,
true
);
//}
chatClient
.
prompt
(
prompt
)
.
tools
(
agentTools
.
toArray
())
.
toolContext
(
Map
.
of
(
"emitterId"
,
emitterId
,
"userId"
,
sseTokenEmitter
.
getUserId
(),
"agentId"
,
agent
.
getId
()
))
.
toolContext
(
Map
.
of
(
"emitterId"
,
emitterId
,
"userId"
,
sseTokenEmitter
.
getUserId
(),
"agentId"
,
agent
.
getId
(),
"newChat"
,
newChat
))
.
stream
()
.
chatResponse
()
.
subscribe
(
...
...
backend/src/main/java/pangea/hiagent/tool/impl/VisitorAppointmentTool.java
View file @
d2f8d7c9
...
...
@@ -75,7 +75,7 @@ public class VisitorAppointmentTool {
// 登录状态有效期(毫秒),设置为30分钟
private
static
final
long
LOGIN_VALIDITY_PERIOD
=
30
*
60
*
1000
;
public
VisitorAppointmentTool
(
UserTokenService
userTokenService
,
AgentService
agentService
,
InfoCollectorService
infoCollectorService
,
UserSseService
userSseService
,
ChatService
chatService
)
{
public
VisitorAppointmentTool
(
UserTokenService
userTokenService
,
AgentService
agentService
,
InfoCollectorService
infoCollectorService
,
UserSseService
userSseService
,
ChatService
chatService
)
{
this
.
agentService
=
agentService
;
this
.
infoCollectorService
=
infoCollectorService
;
this
.
ssoToken
=
"33f667865c395f164d29487c15fe74bf76b463f2941ef6af55d14a35a11d60b1"
;
...
...
@@ -141,10 +141,11 @@ public class VisitorAppointmentTool {
log
.
error
(
"海信SSO认证工具的Playwright资源释放失败: "
,
e
);
}
}
private
String
setAccessToken
(
ToolContext
toolContext
)
{
String
userId
=
toolContext
.
getContext
().
get
(
"userId"
).
toString
();
log
.
info
(
"start set access token for {}"
,
userId
);
UserToken
userToken
=
userTokenService
.
getUserToken
(
userId
,
"pangea"
);
UserToken
userToken
=
userTokenService
.
getUserToken
(
userId
,
"pangea"
);
Cookie
tripCookie
=
new
Cookie
(
"jwtToken"
,
userToken
.
getTokenValue
());
tripCookie
.
setDomain
(
"vrms-proxy.hisense.com"
);
tripCookie
.
setPath
(
"/"
);
...
...
@@ -165,8 +166,6 @@ public class VisitorAppointmentTool {
// .setSources(true));
log
.
info
(
"submit apply info "
);
String
accessToken
=
setAccessToken
(
toolContext
);
JSONArray
jsonArray
=
infoCollectorService
.
getInfo
(
pageId
);
...
...
@@ -196,8 +195,8 @@ public class VisitorAppointmentTool {
log
.
info
(
"json {}"
,
obj
);
String
fieldName
=
obj
.
getString
(
"field_name"
);
String
fieldValue
=
infoCollectorService
.
getValue
(
obj
.
getString
(
"code"
)
).
toString
();
log
.
info
(
"fieldName {} fieldValue {} "
,
fieldName
,
fieldValue
);
String
fieldValue
=
infoCollectorService
.
getValue
(
fieldName
).
toString
();
log
.
info
(
"fieldName {} fieldValue {} "
,
fieldName
,
fieldValue
);
if
(
fieldName
.
compareToIgnoreCase
(
"访问园区"
)
==
0
)
{
parkValue
=
fieldValue
;
continue
;
...
...
@@ -234,7 +233,7 @@ public class VisitorAppointmentTool {
for
(
JSONObject
tmp
:
dateJson
)
{
String
fieldName
=
tmp
.
getString
(
"field_name"
);
String
fieldValue
=
infoCollectorService
.
getValue
(
tmp
.
getString
(
"code"
)
).
toString
();
String
fieldValue
=
infoCollectorService
.
getValue
(
fieldName
).
toString
();
String
[]
values
=
fieldValue
.
split
(
"-"
);
page
.
locator
(
".van-cell"
)
...
...
@@ -308,7 +307,7 @@ public class VisitorAppointmentTool {
infoCollectorService
.
saveValue
(
key
,
infos
.
get
(
key
));
});
infoCollectorService
.
saveDefaultValue
(
pageId
);
Map
<
String
,
String
>
keys
=
infoCollectorService
.
findLackInfo
(
pageId
);
Map
<
String
,
String
>
keys
=
infoCollectorService
.
findLackInfo
(
pageId
);
if
(!
keys
.
isEmpty
())
{
JSONArray
jsonArray
=
infoCollectorService
.
getInfo
(
pageId
);
JSONArray
lackJson
=
new
JSONArray
();
...
...
@@ -316,8 +315,12 @@ public class VisitorAppointmentTool {
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
tmp
=
jsonArray
.
getJSONObject
(
i
);
JSONObject
pangeJson
=
tmp
.
getJSONObject
(
"pangea_json"
);
if
(
infoCollectorService
.
getValue
(
tmp
.
getString
(
"code"
))
!=
null
){
pangeJson
.
getJSONObject
(
"props"
).
put
(
"value"
,
infoCollectorService
.
getValue
(
tmp
.
getString
(
"code"
)).
toString
());
if
(
infoCollectorService
.
getValue
(
tmp
.
getString
(
"field_name"
))
!=
null
)
{
pangeJson
.
getJSONObject
(
"props"
).
put
(
"value"
,
infoCollectorService
.
getValue
(
tmp
.
getString
(
"field_name"
)).
toString
());
}
if
(
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工手机号"
)
==
0
||
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工姓名"
)
==
0
)
{
continue
;
}
lackJson
.
add
(
pangeJson
);
}
...
...
@@ -331,18 +334,15 @@ public class VisitorAppointmentTool {
}
else
{
sb
.
append
(
"用户还有以下信息未提交:"
);
sb
.
append
(
"\n"
);
for
(
Map
.
Entry
<
String
,
String
>
key
:
keys
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
String
>
key
:
keys
.
entrySet
())
{
sb
.
append
(
key
.
getValue
());
sb
.
append
(
"("
);
sb
.
append
(
key
);
sb
.
append
(
")"
);
sb
.
append
(
","
);
sb
.
append
(
"\n"
);
}
sb
.
append
(
"\n"
);
sb
.
append
(
"提示用户继续提交信息"
);
}
log
.
info
(
"notice {}"
,
sb
.
toString
());
log
.
info
(
"notice {}"
,
sb
.
toString
());
return
sb
.
toString
();
}
...
...
@@ -367,14 +367,22 @@ public class VisitorAppointmentTool {
JSONArray
lackJson
=
new
JSONArray
();
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
tmp
=
jsonArray
.
getJSONObject
(
i
);
if
(
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工手机号"
)
==
0
||
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工姓名"
)
==
0
)
{
continue
;
}
lackJson
.
add
(
tmp
.
getJSONObject
(
"pangea_json"
));
}
JSONObject
formMessage
=
new
JSONObject
();
formMessage
.
put
(
"coms"
,
lackJson
);
try
{
sendFormMessage
(
formMessage
,
toolContext
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
boolean
newChat
=
toolContext
.
getContext
().
get
(
"newChat"
).
toString
().
compareToIgnoreCase
(
"yes"
)
==
0
;
log
.
info
(
"new chat {}"
,
newChat
);
if
(
newChat
)
{
try
{
sendFormMessage
(
formMessage
,
toolContext
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
stringBuilder
.
append
(
formMessage
.
toJSONString
());
stringBuilder
.
append
(
"提示用户以json格式提交信息;如果用户已提供部分信息,需要将这些信息与`props.name`属性的值进行匹配,并将匹配之后的信息以json格式提交到`applyInfoSave`以保存信息"
);
...
...
@@ -420,8 +428,8 @@ public class VisitorAppointmentTool {
JSONArray
result
=
new
JSONArray
();
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
tmp
=
jsonArray
.
getJSONObject
(
i
);
if
(
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工手机号"
)
==
0
||
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工姓名"
)
==
0
)
{
if
(
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工手机号"
)
==
0
||
tmp
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工姓名"
)
==
0
)
{
continue
;
}
result
.
add
(
tmp
);
...
...
backend/src/main/java/pangea/hiagent/tool/playwright/PlaywrightManagerImpl.java
View file @
d2f8d7c9
This diff is collapsed.
Click to expand it.
backend/src/main/java/pangea/hiagent/web/repository/AgentDialogueRepository.java
View file @
d2f8d7c9
package
pangea
.
hiagent
.
web
.
repository
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Delete
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Select
;
import
pangea.hiagent.model.AgentDialogue
;
/**
...
...
@@ -9,4 +11,6 @@ import pangea.hiagent.model.AgentDialogue;
*/
@Mapper
public
interface
AgentDialogueRepository
extends
BaseMapper
<
AgentDialogue
>
{
@Delete
(
"DELETE FROM agent_dialogue WHERE user_id = #{userId} AND agent_id=#{agentId} "
)
public
void
deleteDialogue
(
String
userId
,
String
agentId
);
}
backend/src/main/java/pangea/hiagent/web/service/ChatService.java
View file @
d2f8d7c9
package
pangea
.
hiagent
.
web
.
service
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
pangea.hiagent.web.repository.AgentDialogueRepository
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
...
...
@@ -10,6 +12,9 @@ import java.util.concurrent.ConcurrentMap;
@Service
public
class
ChatService
{
@Autowired
private
AgentDialogueRepository
agentDialogueRepository
;
private
final
ConcurrentMap
<
String
,
String
>
chatList
=
new
ConcurrentHashMap
<>(
1024
);
public
boolean
chatExists
(
String
userId
,
String
agentId
)
{
...
...
@@ -26,6 +31,7 @@ public class ChatService {
String
chatId
=
buildChatId
(
userId
,
agentId
);
log
.
info
(
"remove chatId:{}"
,
chatId
);
chatList
.
remove
(
chatId
);
agentDialogueRepository
.
deleteDialogue
(
userId
,
agentId
);
}
private
String
buildChatId
(
String
userId
,
String
agentId
)
{
...
...
backend/src/main/java/pangea/hiagent/web/service/InfoCollectorService.java
View file @
d2f8d7c9
...
...
@@ -52,15 +52,15 @@ public class InfoCollectorService {
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++){
JSONObject
object
=
jsonArray
.
getJSONObject
(
i
);
if
(
object
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工手机号"
)
==
0
){
String
code
=
object
.
getString
(
"
cod
e"
);
String
code
=
object
.
getString
(
"
field_nam
e"
);
saveValue
(
code
,
"15841169015"
);
}
if
(
object
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"接访员工姓名"
)
==
0
){
String
code
=
object
.
getString
(
"
cod
e"
);
String
code
=
object
.
getString
(
"
field_nam
e"
);
saveValue
(
code
,
"杜艺"
);
}
if
(
object
.
getString
(
"field_name"
).
compareToIgnoreCase
(
"证件类型"
)
==
0
){
String
code
=
object
.
getString
(
"
cod
e"
);
String
code
=
object
.
getString
(
"
field_nam
e"
);
saveValue
(
code
,
"居民身份证"
);
}
}
...
...
@@ -73,7 +73,7 @@ public class InfoCollectorService {
public
Map
<
String
,
String
>
findLackInfo
(
String
pageId
)
{
Set
<
String
>
valueKeys
=
values
.
keySet
();
log
.
info
(
"value keys {}"
,
valueKeys
);
Set
<
String
>
allKeys
=
infos
.
get
(
pageId
).
stream
().
map
(
t
->
((
JSONObject
)
t
).
getString
(
"
cod
e"
)).
collect
(
Collectors
.
toSet
());
Set
<
String
>
allKeys
=
infos
.
get
(
pageId
).
stream
().
map
(
t
->
((
JSONObject
)
t
).
getString
(
"
field_nam
e"
)).
collect
(
Collectors
.
toSet
());
log
.
info
(
"all keys {}"
,
allKeys
);
allKeys
.
removeAll
(
valueKeys
);
log
.
info
(
"lack keys {}"
,
allKeys
);
...
...
@@ -86,7 +86,7 @@ public class InfoCollectorService {
infos
.
get
(
pageId
).
stream
().
forEach
(
t
->
{
JSONObject
info
=
(
JSONObject
)
t
;
String
code
=
info
.
getString
(
"
cod
e"
);
String
code
=
info
.
getString
(
"
field_nam
e"
);
if
(
allKeys
.
contains
(
code
))
{
lackInfos
.
put
(
code
,
info
.
getString
(
"field_name"
));
}
...
...
backend/src/main/resources/application-dev.yml
View file @
d2f8d7c9
...
...
@@ -2,10 +2,10 @@
spring
:
# 开发环境数据源配置
datasource
:
url
:
jdbc:
h2:file:./data/hiagent_dev_db;DB_CLOSE_ON_EXIT=FALSE
driver-class-name
:
org.h2.Driver
username
:
sa
password
:
sa
url
:
jdbc:
mysql://${DB_HOST:127.0.0.1}:3306/hiagent?allowMultiQueries=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name
:
${DB_DRIVER:com.mysql.cj.jdbc.Driver}
username
:
${DB_NAME:root}
password
:
${DB_PASSWORD:password}
# 开发环境JPA配置
jpa
:
...
...
@@ -21,7 +21,7 @@ spring:
init
:
schema-locations
:
classpath:schema.sql
data-locations
:
classpath:data.sql
mode
:
always
# 总是执行创建表和数据脚本,实现重新初始化
mode
:
never
# 总是执行创建表和数据脚本,实现重新初始化
# 开启H2控制台
h2
:
...
...
frontend/vite.config.ts
View file @
d2f8d7c9
/*
* @Date: 2025-12-29 14:42:27
* @LastEditors: wangduo3 wangduo3@hisense.com
* @LastEditTime: 2025-12-29 16:56:52
* @FilePath: /pangea-agent/frontend/vite.config.ts
*/
import
{
defineConfig
}
from
"vite"
;
import
vue
from
"@vitejs/plugin-vue"
;
import
path
from
"path"
;
...
...
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