Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
sl-ai
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
zhouwei
sl-ai
Commits
36a6440c
Commit
36a6440c
authored
Apr 15, 2025
by
zhouwei
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' into 'master'
Dev See merge request
!5
parents
7ee87f51
c0d6a3b6
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
433 additions
and
62 deletions
+433
-62
Constant.java
src/main/java/com/nanyan/securitylink/common/Constant.java
+2
-0
WebConfig.java
src/main/java/com/nanyan/securitylink/config/WebConfig.java
+3
-1
AIController.java
...java/com/nanyan/securitylink/controller/AIController.java
+10
-6
AIInputDTO.java
src/main/java/com/nanyan/securitylink/dto/AIInputDTO.java
+3
-1
AIRequestDTO.java
src/main/java/com/nanyan/securitylink/dto/AIRequestDTO.java
+2
-2
UserHeader.java
src/main/java/com/nanyan/securitylink/entity/UserHeader.java
+5
-36
HeaderInterceptor.java
...om/nanyan/securitylink/interceptor/HeaderInterceptor.java
+7
-6
LogResponseTimeInterceptor.java
.../securitylink/interceptor/LogResponseTimeInterceptor.java
+3
-3
LoginInterceptor.java
...com/nanyan/securitylink/interceptor/LoginInterceptor.java
+1
-4
AIService.java
src/main/java/com/nanyan/securitylink/service/AIService.java
+5
-3
AIServiceImpl.java
...a/com/nanyan/securitylink/service/impl/AIServiceImpl.java
+392
-0
No files found.
src/main/java/com/nanyan/securitylink/common/Constant.java
View file @
36a6440c
...
@@ -5,6 +5,8 @@ public interface Constant {
...
@@ -5,6 +5,8 @@ public interface Constant {
int
picType
=
1
;
int
picType
=
1
;
int
textType
=
0
;
int
textType
=
0
;
String
ACCOUNT
=
"account"
;
String
ACCOUNT
=
"account"
;
String
MODEL
=
"model"
;
String
MODEL_KEY
=
"modelKey"
;
int
SUCCESS_STATUS
=
200
;
int
SUCCESS_STATUS
=
200
;
String
WEATHER_GROUP
=
"weatherType"
;
String
WEATHER_GROUP
=
"weatherType"
;
String
ADMIN_ROLE
=
"admin"
;
String
ADMIN_ROLE
=
"admin"
;
...
...
src/main/java/com/nanyan/securitylink/config/WebConfig.java
View file @
36a6440c
...
@@ -16,10 +16,12 @@ public class WebConfig extends WebMvcConfigurationSupport {
...
@@ -16,10 +16,12 @@ public class WebConfig extends WebMvcConfigurationSupport {
private
LoginInterceptor
loginInterceptor
;
private
LoginInterceptor
loginInterceptor
;
@Resource
@Resource
LogResponseTimeInterceptor
logResponseTimeInterceptor
;
LogResponseTimeInterceptor
logResponseTimeInterceptor
;
@Resource
HeaderInterceptor
headerInterceptor
;
@Override
@Override
protected
void
addInterceptors
(
InterceptorRegistry
registry
)
{
protected
void
addInterceptors
(
InterceptorRegistry
registry
)
{
//
registry
.
addInterceptor
(
headerInterceptor
);
registry
.
addInterceptor
(
loginInterceptor
);
registry
.
addInterceptor
(
loginInterceptor
);
registry
.
addInterceptor
(
logResponseTimeInterceptor
);
registry
.
addInterceptor
(
logResponseTimeInterceptor
);
super
.
addInterceptors
(
registry
);
super
.
addInterceptors
(
registry
);
...
...
src/main/java/com/nanyan/securitylink/controller/AIController.java
View file @
36a6440c
package
com
.
nanyan
.
securitylink
.
controller
;
package
com
.
nanyan
.
securitylink
.
controller
;
import
com.nanyan.securitylink.dto.
Translate
DTO
;
import
com.nanyan.securitylink.dto.
AIRequest
DTO
;
import
com.nanyan.securitylink.service.AIService
;
import
com.nanyan.securitylink.service.AIService
;
import
com.nanyan.securitylink.vo.AIResponse
;
import
com.nanyan.securitylink.vo.AIResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -14,11 +14,15 @@ public class AIController {
...
@@ -14,11 +14,15 @@ public class AIController {
@Autowired
@Autowired
AIService
aiService
;
AIService
aiService
;
@PostMapping
(
"/translate"
)
@PostMapping
(
"/translate"
)
public
Response
<
AIResponse
>
translate
(
@RequestBody
TranslateDTO
translate
DTO
)
{
public
Response
<
AIResponse
>
translate
(
@RequestBody
AIRequestDTO
AIRequest
DTO
)
{
return
Response
.
SUCCESS
(
aiService
.
translate
(
translate
DTO
));
return
Response
.
SUCCESS
(
aiService
.
translate
(
AIRequest
DTO
));
}
}
@PostMapping
(
"/tag"
)
@PostMapping
(
"/news/tag"
)
public
Response
<
AIResponse
>
newsTag
(
@RequestBody
TranslateDTO
translateDTO
)
{
public
Response
<
AIResponse
>
newsTag
(
@RequestBody
AIRequestDTO
AIRequestDTO
)
{
return
Response
.
SUCCESS
(
aiService
.
newsTags
(
translateDTO
));
return
Response
.
SUCCESS
(
aiService
.
newsTags
(
AIRequestDTO
));
}
@PostMapping
(
"/natural/disaster/tag"
)
public
Response
<
AIResponse
>
naturalDisasterTag
(
@RequestBody
AIRequestDTO
AIRequestDTO
)
{
return
Response
.
SUCCESS
(
aiService
.
naturalDisasterTag
(
AIRequestDTO
));
}
}
}
}
src/main/java/com/nanyan/securitylink/dto/
Translate
InputDTO.java
→
src/main/java/com/nanyan/securitylink/dto/
AI
InputDTO.java
View file @
36a6440c
...
@@ -3,7 +3,9 @@ package com.nanyan.securitylink.dto;
...
@@ -3,7 +3,9 @@ package com.nanyan.securitylink.dto;
import
lombok.Data
;
import
lombok.Data
;
@Data
@Data
public
class
Translate
InputDTO
{
public
class
AI
InputDTO
{
String
record_json
;
String
record_json
;
String
msg_info
;
String
warn_info
;
String
language
;
String
language
;
}
}
src/main/java/com/nanyan/securitylink/dto/
Translate
DTO.java
→
src/main/java/com/nanyan/securitylink/dto/
AIRequest
DTO.java
View file @
36a6440c
...
@@ -3,8 +3,8 @@ package com.nanyan.securitylink.dto;
...
@@ -3,8 +3,8 @@ package com.nanyan.securitylink.dto;
import
lombok.Data
;
import
lombok.Data
;
@Data
@Data
public
class
Translate
DTO
{
public
class
AIRequest
DTO
{
Translate
InputDTO
inputs
;
AI
InputDTO
inputs
;
String
response_mode
;
String
response_mode
;
String
user
;
String
user
;
}
}
src/main/java/com/nanyan/securitylink/entity/UserHeader.java
View file @
36a6440c
package
com
.
nanyan
.
securitylink
.
entity
;
package
com
.
nanyan
.
securitylink
.
entity
;
public
class
UserHeader
{
import
lombok.Data
;
String
userId
;
String
accountName
;
String
role
;
String
token
;
public
String
getToken
()
{
return
token
;
}
public
void
setToken
(
String
token
)
{
this
.
token
=
token
;
}
public
String
getUserId
()
{
return
userId
;
}
public
void
setUserId
(
String
userId
)
{
this
.
userId
=
userId
;
}
public
String
getAccountName
()
{
@Data
return
accountName
;
public
class
UserHeader
{
}
String
model
;
String
modelKey
;
public
void
setAccountName
(
String
accountName
)
{
this
.
accountName
=
accountName
;
}
public
String
getRole
()
{
return
role
;
}
public
void
setRole
(
String
role
)
{
this
.
role
=
role
;
}
}
}
src/main/java/com/nanyan/securitylink/interceptor/HeaderInterceptor.java
View file @
36a6440c
...
@@ -5,6 +5,7 @@ import com.nanyan.securitylink.common.MsgCode;
...
@@ -5,6 +5,7 @@ import com.nanyan.securitylink.common.MsgCode;
import
com.nanyan.securitylink.entity.UserHeader
;
import
com.nanyan.securitylink.entity.UserHeader
;
import
com.nanyan.securitylink.entity.UserThreadLocal
;
import
com.nanyan.securitylink.entity.UserThreadLocal
;
import
com.nanyan.securitylink.execption.HeaderException
;
import
com.nanyan.securitylink.execption.HeaderException
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StringUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.HandlerInterceptor
;
...
@@ -14,19 +15,21 @@ import javax.servlet.http.HttpServletResponse;
...
@@ -14,19 +15,21 @@ import javax.servlet.http.HttpServletResponse;
import
java.util.Base64
;
import
java.util.Base64
;
@Slf4j
@Component
@Component
public
class
HeaderInterceptor
implements
HandlerInterceptor
{
public
class
HeaderInterceptor
implements
HandlerInterceptor
{
@Override
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
try
{
try
{
String
accountName
=
getHeader
(
request
,
Constant
.
ACCOUNT
);
String
model
=
getHeader
(
request
,
Constant
.
MODEL
);
String
modelKey
=
getHeader
(
request
,
Constant
.
MODEL_KEY
);
UserHeader
userHeader
=
new
UserHeader
();
UserHeader
userHeader
=
new
UserHeader
();
userHeader
.
setAccountName
(
accountName
);
userHeader
.
setModel
(
model
);
userHeader
.
setModelKey
(
modelKey
);
UserThreadLocal
.
set
(
userHeader
);
UserThreadLocal
.
set
(
userHeader
);
}
catch
(
Exception
e
){
}
catch
(
Exception
e
){
e
.
printStackTrace
();
log
.
info
(
""
,
e
);
throw
new
HeaderException
(
MsgCode
.
LOGIN_FAILED
);
}
}
return
true
;
return
true
;
...
@@ -41,8 +44,6 @@ public class HeaderInterceptor implements HandlerInterceptor {
...
@@ -41,8 +44,6 @@ public class HeaderInterceptor implements HandlerInterceptor {
if
(
StringUtils
.
isEmpty
(
value
)){
if
(
StringUtils
.
isEmpty
(
value
)){
return
""
;
return
""
;
}
}
byte
[]
decodedBytes
=
Base64
.
getDecoder
().
decode
(
value
);
value
=
new
String
(
decodedBytes
);
return
value
;
return
value
;
}
}
}
}
src/main/java/com/nanyan/securitylink/interceptor/LogResponseTimeInterceptor.java
View file @
36a6440c
...
@@ -31,10 +31,10 @@ public class LogResponseTimeInterceptor implements HandlerInterceptor {
...
@@ -31,10 +31,10 @@ public class LogResponseTimeInterceptor implements HandlerInterceptor {
// System.out.println("接口耗时:" + time + "ms");
// System.out.println("接口耗时:" + time + "ms");
String
requestURI
=
request
.
getRequestURI
();
String
requestURI
=
request
.
getRequestURI
();
UserHeader
userHeader
=
UserThreadLocal
.
get
();
UserHeader
userHeader
=
UserThreadLocal
.
get
();
String
accountName
=
""
;
String
model
=
""
;
if
(
userHeader
!=
null
){
if
(
userHeader
!=
null
){
accountName
=
UserThreadLocal
.
get
().
getAccountName
();
model
=
UserThreadLocal
.
get
().
getModel
();
logger
.
info
(
"
account:{} 接口{}耗时{} ms"
,
accountName
,
requestURI
,
time
);
logger
.
info
(
"
model:{} 接口{}耗时{} ms"
,
model
,
requestURI
,
time
);
}
else
{
}
else
{
logger
.
info
(
"接口{}耗时{} ms"
,
requestURI
,
time
);
logger
.
info
(
"接口{}耗时{} ms"
,
requestURI
,
time
);
}
}
...
...
src/main/java/com/nanyan/securitylink/interceptor/LoginInterceptor.java
View file @
36a6440c
...
@@ -11,10 +11,7 @@ import java.io.IOException;
...
@@ -11,10 +11,7 @@ import java.io.IOException;
@Component
@Component
public
class
LoginInterceptor
implements
HandlerInterceptor
{
public
class
LoginInterceptor
implements
HandlerInterceptor
{
@Override
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
IOException
{
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
{
String
uri
=
request
.
getRequestURI
();
String
token
=
request
.
getHeader
(
"token"
);
// 从请求头中获取 token
return
true
;
return
true
;
}
}
}
}
src/main/java/com/nanyan/securitylink/service/AIService.java
View file @
36a6440c
package
com
.
nanyan
.
securitylink
.
service
;
package
com
.
nanyan
.
securitylink
.
service
;
import
com.nanyan.securitylink.dto.
Translate
DTO
;
import
com.nanyan.securitylink.dto.
AIRequest
DTO
;
import
com.nanyan.securitylink.vo.AIResponse
;
import
com.nanyan.securitylink.vo.AIResponse
;
public
interface
AIService
{
public
interface
AIService
{
AIResponse
translate
(
TranslateDTO
translateDTO
);
AIResponse
translate
(
AIRequestDTO
AIRequestDTO
);
AIResponse
newsTags
(
TranslateDTO
translateDTO
);
AIResponse
newsTags
(
AIRequestDTO
AIRequestDTO
);
AIResponse
naturalDisasterTag
(
AIRequestDTO
aiRequestDTO
);
}
}
src/main/java/com/nanyan/securitylink/service/impl/
DeepSeek
AIServiceImpl.java
→
src/main/java/com/nanyan/securitylink/service/impl/AIServiceImpl.java
View file @
36a6440c
...
@@ -5,10 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
...
@@ -5,10 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.nanyan.securitylink.common.MsgCode
;
import
com.nanyan.securitylink.common.MsgCode
;
import
com.nanyan.securitylink.config.AppConfig
;
import
com.nanyan.securitylink.config.AppConfig
;
import
com.nanyan.securitylink.dto.TranslateDTO
;
import
com.nanyan.securitylink.dto.AIRequestDTO
;
import
com.nanyan.securitylink.entity.ChatCompletionResponse
;
import
com.nanyan.securitylink.entity.*
;
import
com.nanyan.securitylink.entity.ChatInputData
;
import
com.nanyan.securitylink.entity.Message
;
import
com.nanyan.securitylink.execption.BaseException
;
import
com.nanyan.securitylink.execption.BaseException
;
import
com.nanyan.securitylink.service.AIService
;
import
com.nanyan.securitylink.service.AIService
;
import
com.nanyan.securitylink.vo.AIResponse
;
import
com.nanyan.securitylink.vo.AIResponse
;
...
@@ -33,51 +31,84 @@ import java.util.Map;
...
@@ -33,51 +31,84 @@ import java.util.Map;
@Slf4j
@Slf4j
@Service
@Service
public
class
DeepSeek
AIServiceImpl
implements
AIService
{
public
class
AIServiceImpl
implements
AIService
{
@Autowired
@Autowired
AppConfig
appConfig
;
AppConfig
appConfig
;
@Autowired
@Autowired
RestTemplate
restTemplate
;
RestTemplate
restTemplate
;
private
static
final
Map
<
String
,
String
>
LABEL_MAP
=
new
HashMap
<>();
private
static
final
Map
<
String
,
String
>
NEWS_LABEL_MAP
=
new
HashMap
<>();
private
static
final
Map
<
String
,
String
>
NATURAL_DISASTER_LABEL_MAP
=
new
HashMap
<>();
static
{
static
{
LABEL_MAP
.
put
(
"枪击"
,
"TagShooting"
);
NEWS_LABEL_MAP
.
put
(
"枪击"
,
"TagShooting"
);
LABEL_MAP
.
put
(
"抢劫"
,
"TagRobbery"
);
NEWS_LABEL_MAP
.
put
(
"抢劫"
,
"TagRobbery"
);
LABEL_MAP
.
put
(
"爆炸"
,
"TagExplosion"
);
NEWS_LABEL_MAP
.
put
(
"爆炸"
,
"TagExplosion"
);
LABEL_MAP
.
put
(
"恐怖袭击"
,
"TagTerroristAttack"
);
NEWS_LABEL_MAP
.
put
(
"恐怖袭击"
,
"TagTerroristAttack"
);
LABEL_MAP
.
put
(
"纵火"
,
"TagArson"
);
NEWS_LABEL_MAP
.
put
(
"纵火"
,
"TagArson"
);
LABEL_MAP
.
put
(
"大规模伤亡事件"
,
"TagMassCasualtyIncident"
);
NEWS_LABEL_MAP
.
put
(
"大规模伤亡事件"
,
"TagMassCasualtyIncident"
);
LABEL_MAP
.
put
(
"人质事件"
,
"TagHostageSituation"
);
NEWS_LABEL_MAP
.
put
(
"人质事件"
,
"TagHostageSituation"
);
LABEL_MAP
.
put
(
"毒气泄漏"
,
"TagToxicGasLeak"
);
NEWS_LABEL_MAP
.
put
(
"毒气泄漏"
,
"TagToxicGasLeak"
);
LABEL_MAP
.
put
(
"生物危害"
,
"TagBiologicalHazard"
);
NEWS_LABEL_MAP
.
put
(
"生物危害"
,
"TagBiologicalHazard"
);
LABEL_MAP
.
put
(
"交通意外"
,
"TagTrafficAccident"
);
NEWS_LABEL_MAP
.
put
(
"交通意外"
,
"TagTrafficAccident"
);
LABEL_MAP
.
put
(
"建筑物倒塌"
,
"TagBuildingCollapse"
);
NEWS_LABEL_MAP
.
put
(
"建筑物倒塌"
,
"TagBuildingCollapse"
);
LABEL_MAP
.
put
(
"食品安全"
,
"TagFoodSafety"
);
NEWS_LABEL_MAP
.
put
(
"食品安全"
,
"TagFoodSafety"
);
LABEL_MAP
.
put
(
"社会冲突"
,
"TagSocialConflict"
);
NEWS_LABEL_MAP
.
put
(
"社会冲突"
,
"TagSocialConflict"
);
LABEL_MAP
.
put
(
"群体性事件"
,
"TagMassGatheringIncident"
);
NEWS_LABEL_MAP
.
put
(
"群体性事件"
,
"TagMassGatheringIncident"
);
LABEL_MAP
.
put
(
"环境污染"
,
"TagEnvironmentalPollution"
);
NEWS_LABEL_MAP
.
put
(
"环境污染"
,
"TagEnvironmentalPollution"
);
LABEL_MAP
.
put
(
"重大事故"
,
"TagMajorAccident"
);
NEWS_LABEL_MAP
.
put
(
"重大事故"
,
"TagMajorAccident"
);
LABEL_MAP
.
put
(
"抗议示威"
,
"TagProtestDemonstration"
);
NEWS_LABEL_MAP
.
put
(
"抗议示威"
,
"TagProtestDemonstration"
);
LABEL_MAP
.
put
(
"集体维权"
,
"TagCollectiveAdvocacy"
);
NEWS_LABEL_MAP
.
put
(
"集体维权"
,
"TagCollectiveAdvocacy"
);
LABEL_MAP
.
put
(
"活动失控骚乱"
,
"TagUncontrolledEventRiot"
);
NEWS_LABEL_MAP
.
put
(
"活动失控骚乱"
,
"TagUncontrolledEventRiot"
);
LABEL_MAP
.
put
(
"地域冲突"
,
"TagTerritorialConflict"
);
NEWS_LABEL_MAP
.
put
(
"地域冲突"
,
"TagTerritorialConflict"
);
LABEL_MAP
.
put
(
"性别冲突"
,
"TagGenderConflict"
);
NEWS_LABEL_MAP
.
put
(
"性别冲突"
,
"TagGenderConflict"
);
LABEL_MAP
.
put
(
"宗教冲突"
,
"TagReligiousConflict"
);
NEWS_LABEL_MAP
.
put
(
"宗教冲突"
,
"TagReligiousConflict"
);
LABEL_MAP
.
put
(
"民族冲突"
,
"TagEthnicConflict"
);
NEWS_LABEL_MAP
.
put
(
"民族冲突"
,
"TagEthnicConflict"
);
LABEL_MAP
.
put
(
"阶级冲突"
,
"TagClassConflict"
);
NEWS_LABEL_MAP
.
put
(
"阶级冲突"
,
"TagClassConflict"
);
LABEL_MAP
.
put
(
"食物中毒"
,
"TagFoodPoisoning"
);
NEWS_LABEL_MAP
.
put
(
"食物中毒"
,
"TagFoodPoisoning"
);
LABEL_MAP
.
put
(
"公共卫生事件"
,
"PublicHealthEmergency"
);
NEWS_LABEL_MAP
.
put
(
"公共卫生事件"
,
"PublicHealthEmergency"
);
LABEL_MAP
.
put
(
"环境污染"
,
"TagEnvironmentalPollution"
);
NEWS_LABEL_MAP
.
put
(
"工业事故"
,
"IndustriaAccident"
);
LABEL_MAP
.
put
(
"活动失控骚乱"
,
"TagUncontrolledEventRiot"
);
NEWS_LABEL_MAP
.
put
(
"核事故"
,
"NuclearAccident"
);
LABEL_MAP
.
put
(
"抗议示威"
,
"TagProtestDemonstration"
);
NEWS_LABEL_MAP
.
put
(
"矿难"
,
"MiningAccident"
);
LABEL_MAP
.
put
(
"工业事故"
,
"IndustriaAccident"
);
NEWS_LABEL_MAP
.
put
(
"游行抗议"
,
"Protest"
);
LABEL_MAP
.
put
(
"核事故"
,
"NuclearAccident"
);
NEWS_LABEL_MAP
.
put
(
"水坝溃坝"
,
"DamBurst"
);
LABEL_MAP
.
put
(
"性别冲突"
,
"TagGenderConflict"
);
NEWS_LABEL_MAP
.
put
(
"油轮泄漏"
,
"OilSpill"
);
LABEL_MAP
.
put
(
"矿难"
,
"MiningAccident"
);
NEWS_LABEL_MAP
.
put
(
"火灾"
,
"Fire"
);
LABEL_MAP
.
put
(
"游行抗议"
,
"Protest"
);
LABEL_MAP
.
put
(
"水坝溃坝"
,
"DamBurst"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"地震"
,
"earthquake"
);
LABEL_MAP
.
put
(
"油轮泄漏"
,
"OilSpill"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"火山爆发"
,
"volcanicEruption"
);
LABEL_MAP
.
put
(
"火灾"
,
"Fire"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"海啸"
,
"tsunami"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"台风/飓风"
,
"typhoonHurricane"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"龙卷风"
,
"tornadowarning"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"洪水"
,
"flood"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"干旱"
,
"drought"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"山体滑坡"
,
"landslide"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"泥石流"
,
"mudslide"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"雪崩"
,
"avalanche"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"森林火灾"
,
"forestFire"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"冰川融化"
,
"glacialMelting"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"沙尘暴"
,
"dustStorm"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"高温热浪"
,
"heatWave"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"寒潮"
,
"coldWave"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"暴雨"
,
"rainstorm"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"工业事故"
,
"IndustriaAccident"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"交通事故"
,
"TrafficAccident"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"火灾"
,
"Fire"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"爆炸"
,
"Explosion"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"核事故"
,
"NuclearAccident"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"化学品泄漏"
,
"ChemicalSpill"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"油轮泄漏"
,
"OilSpill"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"矿难"
,
"MiningAccident"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"食物中毒"
,
"FoodPoisoning"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"公共卫生事件"
,
"PublicHealthEmergency"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"建筑物倒塌"
,
"BuildingCollapse"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"恐怖袭击"
,
"Terrorism"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"水坝溃坝"
,
"DamBurst"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"游行抗议"
,
"Protest"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"冰雹"
,
"hail"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"冻雨"
,
"freezingRain"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"霾"
,
"hazeWarning"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"雷暴"
,
"thunderstormWarning"
);
NATURAL_DISASTER_LABEL_MAP
.
put
(
"大风"
,
"HhighWind"
);
}
}
private
final
static
ObjectMapper
objectMapper
=
new
ObjectMapper
();
private
final
static
ObjectMapper
objectMapper
=
new
ObjectMapper
();
...
@@ -85,11 +116,12 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -85,11 +116,12 @@ public class DeepSeekAIServiceImpl implements AIService {
private
final
static
String
DEEP_SEEK_URL
=
"https://ark.cn-beijing.volces.com/api/v3/chat/completions"
;
private
final
static
String
DEEP_SEEK_URL
=
"https://ark.cn-beijing.volces.com/api/v3/chat/completions"
;
@Override
@Override
public
AIResponse
translate
(
TranslateDTO
translate
DTO
)
{
public
AIResponse
translate
(
AIRequestDTO
AIRequest
DTO
)
{
ChatInputData
chatInputData
=
new
ChatInputData
();
ChatInputData
chatInputData
=
new
ChatInputData
();
buildTranslate
(
chatInputData
,
translateDTO
);
buildTranslate
(
chatInputData
,
AIRequestDTO
);
ChatCompletionResponse
chatCompletionResponse
=
aiRequest
(
chatInputData
,
appConfig
.
getApiTranslateKey
());
String
apiKey
=
getModelApiKey
();
ChatCompletionResponse
chatCompletionResponse
=
aiRequest
(
chatInputData
,
apiKey
);
if
(
CollectionUtils
.
isNotEmpty
(
chatCompletionResponse
.
getChoices
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
chatCompletionResponse
.
getChoices
()))
{
AIResponse
aiResponse
=
new
AIResponse
();
AIResponse
aiResponse
=
new
AIResponse
();
...
@@ -99,11 +131,12 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -99,11 +131,12 @@ public class DeepSeekAIServiceImpl implements AIService {
return
null
;
return
null
;
}
}
public
AIResponse
newsTags
(
TranslateDTO
translate
DTO
)
{
public
AIResponse
newsTags
(
AIRequestDTO
aiRequest
DTO
)
{
ChatInputData
chatInputData
=
new
ChatInputData
();
ChatInputData
chatInputData
=
new
ChatInputData
();
buildNewsTag
(
chatInputData
,
translateDTO
);
buildNewsTag
(
chatInputData
,
aiRequestDTO
);
ChatCompletionResponse
chatCompletionResponse
=
aiRequest
(
chatInputData
,
appConfig
.
getApiTranslateKey
());
String
apiKey
=
getModelApiKey
();
ChatCompletionResponse
chatCompletionResponse
=
aiRequest
(
chatInputData
,
apiKey
);
if
(
CollectionUtils
.
isNotEmpty
(
chatCompletionResponse
.
getChoices
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
chatCompletionResponse
.
getChoices
()))
{
AIResponse
aiResponse
=
new
AIResponse
();
AIResponse
aiResponse
=
new
AIResponse
();
...
@@ -115,9 +148,9 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -115,9 +148,9 @@ public class DeepSeekAIServiceImpl implements AIService {
outputs
.
setResult
(
result
);
outputs
.
setResult
(
result
);
aiResponse
.
setOutputs
(
outputs
);
aiResponse
.
setOutputs
(
outputs
);
for
(
String
s
:
split
)
{
for
(
String
s
:
split
)
{
if
(
LABEL_MAP
.
containsKey
(
s
)){
if
(
NEWS_
LABEL_MAP
.
containsKey
(
s
)){
CodeVO
codeVO
=
new
CodeVO
();
CodeVO
codeVO
=
new
CodeVO
();
codeVO
.
setCode
(
LABEL_MAP
.
get
(
s
));
codeVO
.
setCode
(
NEWS_
LABEL_MAP
.
get
(
s
));
codeVO
.
setName
(
s
);
codeVO
.
setName
(
s
);
result
.
add
(
codeVO
);
result
.
add
(
codeVO
);
}
}
...
@@ -128,14 +161,72 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -128,14 +161,72 @@ public class DeepSeekAIServiceImpl implements AIService {
return
null
;
return
null
;
}
}
private
void
buildNewsTag
(
ChatInputData
chatInputData
,
TranslateDTO
translateDTO
)
{
@Override
public
AIResponse
naturalDisasterTag
(
AIRequestDTO
aiRequestDTO
)
{
ChatInputData
chatInputData
=
new
ChatInputData
();
buildNaturalDisasterTag
(
chatInputData
,
aiRequestDTO
);
String
apiKey
=
getModelApiKey
();
ChatCompletionResponse
chatCompletionResponse
=
aiRequest
(
chatInputData
,
apiKey
);
if
(
CollectionUtils
.
isNotEmpty
(
chatCompletionResponse
.
getChoices
()))
{
AIResponse
aiResponse
=
new
AIResponse
();
String
content
=
chatCompletionResponse
.
getChoices
().
get
(
0
).
getMessage
().
getContent
();
if
(
StringUtils
.
isNotEmpty
(
content
)){
String
[]
split
=
content
.
split
(
","
,
-
1
);
List
<
CodeVO
>
result
=
new
ArrayList
<>();
ResultVO
outputs
=
new
ResultVO
();
outputs
.
setResult
(
result
);
aiResponse
.
setOutputs
(
outputs
);
for
(
String
s
:
split
)
{
if
(
NATURAL_DISASTER_LABEL_MAP
.
containsKey
(
s
)){
CodeVO
codeVO
=
new
CodeVO
();
codeVO
.
setCode
(
NATURAL_DISASTER_LABEL_MAP
.
get
(
s
));
codeVO
.
setName
(
s
);
result
.
add
(
codeVO
);
}
}
}
return
aiResponse
;
}
return
null
;
}
private
String
getModelApiKey
()
{
UserHeader
userHeader
=
UserThreadLocal
.
get
();
String
apiKey
=
appConfig
.
getApiTranslateKey
();
if
(
StringUtils
.
isNotEmpty
(
userHeader
.
getModelKey
())){
apiKey
=
userHeader
.
getModelKey
();
}
return
apiKey
;
}
private
void
buildNaturalDisasterTag
(
ChatInputData
chatInputData
,
AIRequestDTO
aiRequestDTO
)
{
setModel
(
chatInputData
);
chatInputData
.
setStream
(
false
);
List
<
Message
>
messages
=
new
ArrayList
<>();
chatInputData
.
setMessages
(
messages
);
Message
systemRole
=
getSystemMessageForNatureDisaster
();
messages
.
add
(
systemRole
);
Message
userRole
=
getUserMessageForNaturalDisasterTag
(
aiRequestDTO
);
messages
.
add
(
userRole
);
}
private
static
void
setModel
(
ChatInputData
chatInputData
)
{
UserHeader
userHeader
=
UserThreadLocal
.
get
();
if
(
StringUtils
.
isNotEmpty
(
userHeader
.
getModel
())){
chatInputData
.
setModel
(
userHeader
.
getModel
());
}
else
{
chatInputData
.
setModel
(
"deepseek-v3-250324"
);
chatInputData
.
setModel
(
"deepseek-v3-250324"
);
}
}
private
void
buildNewsTag
(
ChatInputData
chatInputData
,
AIRequestDTO
AIRequestDTO
)
{
setModel
(
chatInputData
);
chatInputData
.
setStream
(
false
);
chatInputData
.
setStream
(
false
);
List
<
Message
>
messages
=
new
ArrayList
<>();
List
<
Message
>
messages
=
new
ArrayList
<>();
chatInputData
.
setMessages
(
messages
);
chatInputData
.
setMessages
(
messages
);
Message
systemRole
=
getSystem
TagDeepSeekMessage
();
Message
systemRole
=
getSystem
MessageForNewsTag
();
messages
.
add
(
systemRole
);
messages
.
add
(
systemRole
);
Message
userRole
=
getUser
TagDeepSeekMessage
(
translate
DTO
);
Message
userRole
=
getUser
MessageForNewsTag
(
AIRequest
DTO
);
messages
.
add
(
userRole
);
messages
.
add
(
userRole
);
}
}
...
@@ -147,7 +238,7 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -147,7 +238,7 @@ public class DeepSeekAIServiceImpl implements AIService {
}
catch
(
JsonProcessingException
e
)
{
}
catch
(
JsonProcessingException
e
)
{
throw
new
BaseException
(
MsgCode
.
JSON_ERROR
);
throw
new
BaseException
(
MsgCode
.
JSON_ERROR
);
}
}
log
.
info
(
"
translate
json:{}"
,
writeValueAsString
);
log
.
info
(
"json:{}"
,
writeValueAsString
);
HttpEntity
header
=
getHeader
(
apiKey
);
HttpEntity
header
=
getHeader
(
apiKey
);
HttpEntity
<
String
>
entity
=
new
HttpEntity
<>(
writeValueAsString
,
header
.
getHeaders
());
HttpEntity
<
String
>
entity
=
new
HttpEntity
<>(
writeValueAsString
,
header
.
getHeaders
());
ResponseEntity
<
ChatCompletionResponse
>
response
=
restTemplate
.
postForEntity
(
DEEP_SEEK_URL
,
entity
,
ChatCompletionResponse
.
class
);
ResponseEntity
<
ChatCompletionResponse
>
response
=
restTemplate
.
postForEntity
(
DEEP_SEEK_URL
,
entity
,
ChatCompletionResponse
.
class
);
...
@@ -158,22 +249,22 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -158,22 +249,22 @@ public class DeepSeekAIServiceImpl implements AIService {
throw
new
BaseException
(
MsgCode
.
TRANSLATE_ERROR
);
throw
new
BaseException
(
MsgCode
.
TRANSLATE_ERROR
);
}
}
private
void
buildTranslate
(
ChatInputData
chatInputData
,
TranslateDTO
translate
DTO
)
{
private
void
buildTranslate
(
ChatInputData
chatInputData
,
AIRequestDTO
AIRequest
DTO
)
{
chatInputData
.
setModel
(
"deepseek-v3-250324"
);
setModel
(
chatInputData
);
chatInputData
.
setStream
(
false
);
chatInputData
.
setStream
(
false
);
List
<
Message
>
messages
=
new
ArrayList
<>();
List
<
Message
>
messages
=
new
ArrayList
<>();
chatInputData
.
setMessages
(
messages
);
chatInputData
.
setMessages
(
messages
);
Message
systemRole
=
getDeepSeekMessage
(
translate
DTO
);
Message
systemRole
=
getDeepSeekMessage
(
AIRequest
DTO
);
messages
.
add
(
systemRole
);
messages
.
add
(
systemRole
);
}
}
@NotNull
@NotNull
private
static
Message
getDeepSeekMessage
(
TranslateDTO
translate
DTO
)
{
private
static
Message
getDeepSeekMessage
(
AIRequestDTO
AIRequest
DTO
)
{
Message
systemRole
=
new
Message
();
Message
systemRole
=
new
Message
();
systemRole
.
setRole
(
"user"
);
systemRole
.
setRole
(
"user"
);
systemRole
.
setContent
(
"需要翻译的JSON:"
+
translate
DTO
.
getInputs
().
getRecord_json
()
+
"\n"
+
systemRole
.
setContent
(
"需要翻译的JSON:"
+
AIRequest
DTO
.
getInputs
().
getRecord_json
()
+
"\n"
+
"\n"
+
"\n"
+
"你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `"
+
translate
DTO
.
getInputs
().
getLanguage
()
+
"`。\n"
+
"你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `"
+
AIRequest
DTO
.
getInputs
().
getLanguage
()
+
"`。\n"
+
"\n"
+
"\n"
+
"## 限制\n"
+
"## 限制\n"
+
"- 严格按照要求进行翻译,不改变 JSON 的结构和无意义的 key 的 value。\n"
+
"- 严格按照要求进行翻译,不改变 JSON 的结构和无意义的 key 的 value。\n"
+
...
@@ -184,15 +275,66 @@ public class DeepSeekAIServiceImpl implements AIService {
...
@@ -184,15 +275,66 @@ public class DeepSeekAIServiceImpl implements AIService {
return
systemRole
;
return
systemRole
;
}
}
private
static
Message
getUser
TagDeepSeekMessage
(
TranslateDTO
translate
DTO
)
{
private
static
Message
getUser
MessageForNaturalDisasterTag
(
AIRequestDTO
AIRequest
DTO
)
{
Message
userRole
=
new
Message
();
Message
userRole
=
new
Message
();
userRole
.
setRole
(
"user"
);
userRole
.
setRole
(
"user"
);
userRole
.
setContent
(
translateDTO
.
getInputs
().
getRecord_json
());
userRole
.
setContent
(
AIRequestDTO
.
getInputs
().
getWarn_info
());
return
userRole
;
return
userRole
;
}
}
private
static
Message
getUserMessageForNewsTag
(
AIRequestDTO
AIRequestDTO
)
{
Message
userRole
=
new
Message
();
userRole
.
setRole
(
"user"
);
userRole
.
setContent
(
AIRequestDTO
.
getInputs
().
getMsg_info
());
return
userRole
;
}
@NotNull
private
static
Message
getSystemMessageForNatureDisaster
()
{
Message
systemRole
=
new
Message
();
systemRole
.
setRole
(
"system"
);
systemRole
.
setContent
(
"```xml\n"
+
"<instruction>\n"
+
"根据给定的天气预警信息,打上相应的标签。标签列表包括:大风,雷暴,霾,冻雨,地震,火山爆发,海啸,台风/飓风,龙卷风,洪水,干旱,山体滑坡,泥石流,雪崩,森林火灾,冰川融化,沙尘暴,高温热浪,寒潮,暴雨,工业事故,交通事故,火灾,爆炸,核事故,化学品泄漏,油轮泄漏,矿难,食物中毒,公共卫生事件,建筑物倒塌,恐怖袭击,水坝溃坝,游行抗议,冰雹。\n"
+
"\n"
+
"<instructions>\n"
+
"1. 仔细阅读输入的天气预警信息,理解其描述的具体事件或现象。\n"
+
"2. 根据预警信息的内容,从提供的标签列表中选择最匹配的一个或多个标签。\n"
+
"3. 确保所选标签与预警信息描述的事件或现象完全一致,避免无关标签。\n"
+
"4. 如果预警信息描述的事件或现象不在标签列表中,则忽略该信息或选择最接近的标签。\n"
+
"5. 输出时仅列出匹配的标签,不要包含任何额外的解释或XML标签。\n"
+
"6. 如果预警信息包含多个事件或现象,请为每个事件或现象分别打上对应的标签。\n"
+
"\n"
+
"<examples>\n"
+
"<example>\n"
+
"输入:今日预计有强风,风速可达10级以上,请市民注意防范。\n"
+
"输出:大风\n"
+
"</example>\n"
+
"\n"
+
"<example>\n"
+
"输入:受台风影响,沿海地区将出现暴雨和大风天气,局部地区可能有洪水。\n"
+
"输出:台风/飓风,暴雨,洪水\n"
+
"</example>\n"
+
"\n"
+
"<example>\n"
+
"输入:某化工厂发生泄漏事故,导致周边空气质量下降,建议居民关闭门窗。\n"
+
"输出:化学品泄漏,工业事故\n"
+
"</example>\n"
+
"\n"
+
"<notes>\n"
+
"1. 标签之间用逗号分隔,不要使用空格或其他符号。\n"
+
"2. 如果预警信息描述的事件或现象与多个标签相关,请列出所有相关标签。\n"
+
"3. 确保标签的准确性,避免主观判断或猜测。\n"
+
"4. 输出格式应简洁明了,仅包含标签名称。\n"
+
"</notes>\n"
+
"</instruction>\n"
+
"```"
);
return
systemRole
;
}
@NotNull
@NotNull
private
static
Message
getSystem
TagDeepSeekMessage
()
{
private
static
Message
getSystem
MessageForNewsTag
()
{
Message
systemRole
=
new
Message
();
Message
systemRole
=
new
Message
();
systemRole
.
setRole
(
"system"
);
systemRole
.
setRole
(
"system"
);
systemRole
.
setContent
(
"```xml\n"
+
systemRole
.
setContent
(
"```xml\n"
+
...
...
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