Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
elleai
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
ai-tech
E
ellehuis-group
backend
elleai
Commits
c8dc39c8
You need to sign in or sign up before continuing.
Commit
c8dc39c8
authored
Mar 25, 2025
by
陈立彬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ai问答接入deepseek
parent
4ac33135
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
135 additions
and
1 deletion
+135
-1
pom.xml
pom.xml
+5
-0
AppChatCompletionService.java
.../elleai/application/service/AppChatCompletionService.java
+124
-0
ChatCompletionMobileController.java
...leai/controller/front/ChatCompletionMobileController.java
+1
-1
application.yml
src/main/resources/application.yml
+5
-0
No files found.
pom.xml
View file @
c8dc39c8
...
...
@@ -196,6 +196,11 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-webflux
</artifactId>
</dependency>
<dependency>
<groupId>
com.tencentcloudapi
</groupId>
<artifactId>
tencentcloud-sdk-java-lke
</artifactId>
<version>
3.1.1221
</version>
</dependency>
</dependencies>
<build>
...
...
src/main/java/cn/breeze/elleai/application/service/AppChatCompletionService.java
View file @
c8dc39c8
...
...
@@ -14,12 +14,14 @@ import cn.hutool.core.bean.BeanUtil;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.common.collect.Lists
;
import
com.mybatisflex.core.paginate.Page
;
import
jakarta.annotation.PostConstruct
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.*
;
import
org.springframework.http.codec.ServerSentEvent
;
...
...
@@ -46,6 +48,18 @@ public class AppChatCompletionService {
@Value
(
"${dify.chat_api_key}"
)
private
String
apiKey
;
@Value
(
"${deepseek.api_base}"
)
private
String
dsApiBase
;
@Value
(
"${deepseek.app_key}"
)
private
String
dsAppKey
;
@Value
(
"${deepseek.secret_id}"
)
private
String
dsSecretId
;
@Value
(
"${deepseek.app_id}"
)
private
String
dsAppId
;
private
final
RestTemplate
restTemplate
=
new
RestTemplate
();
private
final
ChatCompletionService
chatCompletionService
;
...
...
@@ -484,6 +498,116 @@ public class AppChatCompletionService {
).
map
(
v
->
ServerSentEvent
.
builder
(
v
).
build
());
}
/**
* 用户提问
* @param request
* @return
*/
public
Flux
<
ServerSentEvent
<
UserAskResultMobileDto
>>
userAsk4Stream2
(
UserPrincipal
userPrincipal
,
UserQaMobileRequestDto
request
)
{
// 获取会话详情
UserQaRequestModel
requestModel
=
new
UserQaRequestModel
();
requestModel
.
setChatCompletionId
(
request
.
getChatCompletionId
());
requestModel
.
setUserId
(
userPrincipal
.
getUserId
());
UserChatCompletionResponseModel
ccModel
=
chatCompletionService
.
userQaDetail
(
requestModel
);
String
sessionId
=
""
;
if
(
Objects
.
nonNull
(
ccModel
)
&&
StrUtil
.
isNotEmpty
(
ccModel
.
getSessionId
()))
{
sessionId
=
ccModel
.
getSessionId
();
}
if
(
StringUtils
.
isEmpty
(
sessionId
))
{
sessionId
=
UUID
.
randomUUID
().
toString
();
}
// 更新会话信息
UserChatCompletionSaveModel
saveModel
=
new
UserChatCompletionSaveModel
();
saveModel
.
setUserId
(
userPrincipal
.
getUserId
());
saveModel
.
setUserName
(
userPrincipal
.
getUserName
());
saveModel
.
setId
(
request
.
getChatCompletionId
());
saveModel
.
setLastQuestion
(
request
.
getContent
());
saveModel
.
setShopId
(
userPrincipal
.
getShopId
());
saveModel
.
setShopName
(
userPrincipal
.
getShopName
());
// 首次提问
if
(
Objects
.
isNull
(
request
.
getChatCompletionId
())
||
(
Objects
.
nonNull
(
ccModel
)
&&
StrUtil
.
isEmpty
(
ccModel
.
getFirstQuestion
())))
{
saveModel
.
setCreateTime
(
new
Date
());
saveModel
.
setFirstQuestion
(
request
.
getContent
());
}
Integer
chatCompletionId
=
chatCompletionService
.
saveUserQaSession
(
saveModel
);
// 保存问答详情
Integer
userQaRecordId
=
chatCompletionService
.
saveUserQaRecord
(
chatCompletionId
,
0
,
null
,
request
.
getContent
(),
request
.
getAssistantId
());
// 获取随机问题
final
List
<
HotQaMobileDto
>
hots
=
Lists
.
newArrayList
();
PageResult
<
HotQaMobileDto
>
pageResult
=
this
.
hotQaList
(
new
QaAssistantRequestDto
());
if
(
Objects
.
nonNull
(
pageResult
)
&&
CollectionUtil
.
isNotEmpty
(
pageResult
.
getItems
()))
{
List
<
HotQaMobileDto
>
items
=
pageResult
.
getItems
();
if
(
items
.
size
()
>
2
){
Collections
.
shuffle
(
items
);
items
=
items
.
subList
(
0
,
2
);
}
hots
.
addAll
(
items
);
}
List
<
HotQaResponseModel
>
hotQaList
=
chatCompletionService
.
hotQaList
(
new
HotQaRequestModel
());
if
(
CollectionUtil
.
isNotEmpty
(
hotQaList
))
{
Collections
.
shuffle
(
hotQaList
);
if
(
hotQaList
.
size
()
>
2
)
{
hotQaList
=
hotQaList
.
subList
(
0
,
2
);
}
hotQaList
.
forEach
(
v
->
{
HotQaMobileDto
dto
=
new
HotQaMobileDto
();
dto
.
setQuestion
(
v
.
getQuestion
());
hots
.
add
(
dto
);
});
}
JSONObject
reqBody
=
new
JSONObject
();
reqBody
.
put
(
"content"
,
request
.
getContent
());
reqBody
.
put
(
"bot_app_key"
,
dsAppKey
);
reqBody
.
put
(
"visitor_biz_id"
,
userPrincipal
.
getUserId
());
reqBody
.
put
(
"session_id"
,
sessionId
);
final
StringBuffer
buffer
=
new
StringBuffer
();
final
String
[]
replyContent
=
{
""
};
final
String
[]
difySessionId
=
{
""
};
String
finalSessionId
=
sessionId
;
return
webClient
.
post
().
uri
(
dsApiBase
).
accept
(
MediaType
.
TEXT_EVENT_STREAM
).
bodyValue
(
reqBody
.
toJSONString
()).
exchangeToFlux
(
r
->
r
.
bodyToFlux
(
String
.
class
))
.
mapNotNull
(
v
->
{
JSONObject
json
=
JSONObject
.
parseObject
(
v
);
JSONObject
payload
=
json
.
getJSONObject
(
"payload"
);
if
(
Objects
.
nonNull
(
payload
))
{
JSONArray
procedures
=
payload
.
getJSONArray
(
"procedures"
);
if
(
CollectionUtil
.
isNotEmpty
(
procedures
)
&&
procedures
.
size
()
>
1
)
{
String
answer
=
procedures
.
getJSONObject
(
1
).
getJSONObject
(
"debugging"
).
getString
(
"display_content"
);
if
(
StringUtils
.
isNotEmpty
(
answer
))
{
replyContent
[
0
]
=
answer
;
}
}
if
(
ObjectUtil
.
isEmpty
(
difySessionId
[
0
])
&&
ObjectUtil
.
isNotEmpty
(
payload
.
getString
(
"session_id"
)))
{
difySessionId
[
0
]
=
payload
.
getString
(
"session_id"
);
}
}
UserAskResultMobileDto
result
=
new
UserAskResultMobileDto
();
result
.
setReplyContent
(
replyContent
[
0
]);
result
.
setChatCompletionId
(
chatCompletionId
);
result
.
setMessageId
(
userQaRecordId
);
result
.
setHots
(
hots
);
return
result
;
}).
doOnComplete
(
()
->
{
// 更新DIFY会话ID
if
(
StrUtil
.
isEmpty
(
finalSessionId
))
{
UserChatCompletionSaveModel
updateModel
=
new
UserChatCompletionSaveModel
();
updateModel
.
setId
(
chatCompletionId
);
updateModel
.
setSessionId
(
difySessionId
[
0
]);
chatCompletionService
.
saveUserQaSession
(
updateModel
);
}
// 保存AI问答详情
chatCompletionService
.
saveUserQaRecord
(
chatCompletionId
,
1
,
userQaRecordId
,
replyContent
[
0
],
request
.
getAssistantId
());
}
).
map
(
v
->
ServerSentEvent
.
builder
(
v
).
build
());
}
/**
* 新会话
* @return
...
...
src/main/java/cn/breeze/elleai/controller/front/ChatCompletionMobileController.java
View file @
c8dc39c8
...
...
@@ -60,7 +60,7 @@ public class ChatCompletionMobileController {
public
Flux
<
ServerSentEvent
<
UserAskResultMobileDto
>>
askStream
(
@Parameter
(
hidden
=
true
)
UserPrincipal
userPrincipal
,
@RequestBody
UserQaMobileRequestDto
request
)
{
request
.
setContent
(
commonService
.
sentenceWordCorrect
(
request
.
getContent
()));
return
chatCompletionService
.
userAsk4Stream
(
userPrincipal
,
request
);
return
chatCompletionService
.
userAsk4Stream
2
(
userPrincipal
,
request
);
}
@Operation
(
summary
=
"切换助手"
)
...
...
src/main/resources/application.yml
View file @
c8dc39c8
...
...
@@ -23,6 +23,11 @@ dify:
api_key
:
app-mJFu7K2wl3qEYsILkQBgRAKO
chat_api_base
:
https://ai-api.tech.breezeai.cn/v1
chat_api_key
:
app-ZpEcSEDYl3A8NoQJcR1dgYYg
deepseek
:
app_id
:
1304653544
secret_id
:
AKIDHMA2jAKD6dwzpPikWR5TbT5RWLtAAuNZ
app_key
:
imNDldBw
api_base
:
https://wss.lke.cloud.tencent.com/v1/qbot/chat/sse
---
spring
:
config
:
...
...
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