Files
senmesh-zc/src/main/java/com/newyetai/sdk/xf/util/XfUtils.java

272 lines
12 KiB
Java
Raw Normal View History

2025-06-11 09:42:13 +08:00
package com.newyetai.sdk.xf.util;
2025-06-25 18:11:39 +08:00
import com.newyetai.sdk.xf.dto.RtasrReqDTO;
2025-06-24 16:24:57 +08:00
import com.newyetai.sdk.xf.model.TranslateReq;
2025-06-25 18:11:39 +08:00
import com.newyetai.sdk.xf.service.RtasrClientApp;
2025-06-11 09:42:13 +08:00
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
import org.springframework.stereotype.Component;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.component.file.entity.FileRecord;
import com.newyetai.component.file.service.FileRecordService;
import com.newyetai.component.file.service.FileService;
import com.newyetai.component.file.util.FileUtils;
import com.newyetai.config.service.ConfigService;
import com.newyetai.sdk.xf.config.XfProperties;
import com.newyetai.sdk.xf.dto.InterviewContentDTO;
import com.newyetai.sdk.xf.model.ChatReq;
import com.newyetai.sdk.xf.model.MessageDTO;
import com.newyetai.sdk.xf.service.XfSparkProvider;
@Component
public class XfUtils {
private static ConfigService configService;
private static XfProperties xfProperties;
private static FileService fileService;
private static FileRecordService fileRecordService;
XfUtils(ConfigService configService, XfProperties xfProperties, FileService fileService, FileRecordService fileRecordService){
XfUtils.configService = configService;
XfUtils.xfProperties = xfProperties;
XfUtils.fileService = fileService;
XfUtils.fileRecordService = fileRecordService;
}
/**
* 生成面试问题
* @return InterviewContentDTO json
* @author sr on 2024-12-10
*/
public static String generateInterviewQuestion(InterviewContentDTO content) {
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content("你是一位专业的HR。目标任务:请根据我给出的positionName生成5个相关的面试中可能会问到的问题,并为每个问题都生成一个参考答案,并从1开始生成问题序号")
.build())
.message(MessageDTO.builder().role("system")
.content("全部数据以JSON模版的形式返回,格式为:{positionName:岗位信息, qas:[{qno:问题序号,q:问题,a:参考答案}]}").build())
.message(MessageDTO.builder().role("user").content(JsonUtils.toNoEmptyJson(content)).build()).build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 评分面试
* @return InterviewContentDTO json
* @author sr on 2024-12-10
*/
public static String gradeInterview(InterviewContentDTO content) {
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content("全部数据以JSON模版的形式返回,格式为:{positionName:岗位信息, qas:[{qno:问题序号,q:问题,a:参考答案,score:得分,根据问题q,结合参考答案a,对用户回答ua,在1-10分范围内为用户回答打分赋值,advice:作为资深的position_name提供该问题的回答建议,针对用户回答ua给出建议advice,建议内容包含不足之处+建议}]}")
.build())
.message(MessageDTO.builder().role("user")
.content(JsonUtils.toNoEmptyJson(content)).build())
.build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 生成简历
* @return
* @author sr on 2024-12-10
*/
public static String generateResume(String content) {
String key01 = configService.getConfigValue("ai_jianli_key01", CommonConstants.PLATFORM_ORG_ID, true);
String key02 = configService.getConfigValue("ai_jianli_key02", CommonConstants.PLATFORM_ORG_ID, true);
String key03 = configService.getConfigValue("ai_jianli_key03", CommonConstants.PLATFORM_ORG_ID, true);
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content(key01)
.build())
.message(MessageDTO.builder().role("system").content(key02).build())
.message(MessageDTO.builder().role("system").content(key03).build())
.message(MessageDTO.builder().role("user").content(content).build())
.build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 语音听写
2025-06-25 18:11:39 +08:00
* @param fileCode
2025-06-11 09:42:13 +08:00
* @return
* @author sr on 2025-01-09
*/
public static String iat(String fileCode) {
2025-07-03 10:33:18 +08:00
try (InputStream is = fileRecordService.getFile(fileCode)){
2025-06-11 09:42:13 +08:00
AlitaResult<String> result = WebIATWS.execute(is, xfProperties);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
} catch (Exception e) {
throw new BusinessException("语音听写异常:" + e.getMessage());
}
}
/**
* 语音合成
* @return
* @author sr on 2025-01-09
*/
public static String tts(String text) {
try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
AlitaResult<Void> result = WebTtsWS.execute(text, xfProperties, outputStream);
Assert.isTrue(result.getSuccess(), result.getMsg());
FileRecord fileRecord = fileService.upload("语音合成.mp3", outputStream.toByteArray());
return fileRecord.getFileCode();
} catch (IOException e) {
throw new BusinessException("语音合成异常:" + e.getMessage());
}
}
/**
* 生成自我评价
* @return
*/
public static String generateSelfEvaluate(String content) {
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content("你是一位专业的简历撰写专家。目标任务:请根据我给出的信息,生成指定的内容。需求说明:要求在与原文语意一致的基础上扩写内容,风格设定,简明扼要。")
.build())
.message(MessageDTO.builder().role("system")
.content("根据我输入的信息,输出1段自我评价,包含学习能力、工作态度、团队协作等方面,字数在300字左右")
.build())
.message(MessageDTO.builder().role("system")
.content("全部数据以JSON模版的形式返回, 格式为:{'selfEva':xxx}")
.build())
.message(MessageDTO.builder().role("user").content(content).build()).build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 生成工作经历
* @return
*/
public static String generateWorkExperience(String content) {
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content("你是一位专业的简历撰写专家。目标任务:请根据我给出的信息,生成一份履历丰富的简历。")
.build())
.message(MessageDTO.builder().role("system")
.content("简历内容包含个人信息简介、工作经历、教育背景、掌握技能、自我评价。以JSON格式返回,每个点作为一个对象。")
.build())
.message(MessageDTO.builder().role("system")
.content("个人信息输出格式为:{姓名:xxx, 年龄:xxx,联系电话:xxx,联系邮箱:xxx}")
.build())
.message(MessageDTO.builder().role("system")
.content("工作经历以数组的形式返回。输出格式为:[{企业名称:xxx, 岗位:xxx,工作职责:[xxx,xxx,xxx],工作时间:xxx-xxx}]")
.build())
.message(MessageDTO.builder().role("system")
.content("掌握技能必须作为数组输出")
.build())
.message(MessageDTO.builder().role("system")
.content("自我评价必须作为数组输出")
.build())
.message(MessageDTO.builder().role("user").content(content).build()).build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 分析简历
* @param content
* @return
*/
public static String analyseResume(String content) {
ChatReq req = ChatReq.builder()
.message(MessageDTO.builder().role("system")
.content("你是一位专业的简历分析专家。目标任务:请根据我给出的信息,分析得出简历信息,不要自己填充json信息。")
.build())
.message(MessageDTO.builder().role("system")
.content("请生成一个包含以下信息的 JSON 数据,根据用户给出的实际信息解析,值都可为空:\n"
+ "- name(字符串类型):表示用户的姓名。\n"
+ "- sex(字符串类型):表示用户的性别,值为 \"1\"(男)或 \"2\"(女),身份证号倒数第二位,奇数是男,偶数是女。\n"
+ "- phone(字符串类型):表示用户的联系电话,可为空,不为空的格式为 以 1 开头,共 11 位数字。\n"
+ "- email(字符串类型):表示用户的联系电子邮箱地址,可为空,不为空的格式为 包含 @ 符号,且 @ 前后至少有一个字符 及 域名部分至少包含一个 . 符号。\n"
+ "- intentionPosition(字符串类型):表示用户的意向职位。\n"
+ "- major(字符串类型):表示用户的专业。\n"
+ "- birthday(日期类型):表示用户的出生日期,格式为 YYYY-MM。\n"
+ "- jobTime(日期类型):表示用户的参加工作时间,格式为 YYYY-MM。\n"
+ "- school(字符串类型):表示用户的毕业院校。\n"
+ "- education(字符串类型):表示用户的学历,值为:\n"
+ " - \"1\":\"博士\"\n"
+ " - \"2\":\"硕士\"\n"
+ " - \"3\":\"本科\"\n"
+ " - \"4\":\"大专\"\n"
+ " - \"5\":\"中专\"\n"
+ " - \"6\":\"技校\"\n"
+ " - \"7\":\"职高\"\n"
+ " - \"9\":\"高中\"\n"
+ " - \"10\":\"初中\"\n"
+ " - \"11\":\"小学\"\n"
+ "- workExperience(字符串类型):表示用户的工作经历,格式为文本,包含以下信息:\n"
+ " - 企业名称\n"
+ " - 岗位\n"
+ " - 工作时间\n"
+ " - 工作职责\n"
+ "- selfEvaluation(字符串类型):表示用户的自我评价,格式为文本。")
.build())
.message(MessageDTO.builder().role("system").content("如果用户回答与简历无关,则返回空json,不回答其他无关问题,只返回能解析到的json数据。").build())
.message(MessageDTO.builder().role("user").content(content).build()).build();
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
2025-06-25 18:11:39 +08:00
/**
* 对话
* @param req
* @return
*/
2025-06-24 16:24:57 +08:00
public static String chat(ChatReq req) {
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
2025-06-25 18:11:39 +08:00
/**
* 翻译
* @param req
* @return
*/
2025-06-24 16:24:57 +08:00
public static String translate(TranslateReq req) {
AlitaResult<String> result = XfSparkProvider.translate(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
2025-06-25 18:11:39 +08:00
/**
* 实时语音转写
* @param reqDTO
* @return
*/
public static String rtasr(RtasrReqDTO reqDTO) {
try (InputStream is = fileRecordService.getFile(reqDTO.getFileCode())){
AlitaResult<String> result = RtasrClientApp.execute(is, reqDTO.getFrom(), xfProperties);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
} catch (Exception e) {
throw new BusinessException("语音听写异常:" + e.getMessage());
}
}
2025-06-11 09:42:13 +08:00
}