Files
senmesh-zc/src/main/java/com/newyetai/sdk/xf/util/XfUtils.java
2025-08-22 15:52:49 +08:00

287 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.newyetai.sdk.xf.util;
import com.newyetai.sdk.xf.dto.RtasrReqDTO;
import com.newyetai.sdk.xf.model.TranslateReq;
import com.newyetai.sdk.xf.service.RtasrClientApp;
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.dto.TtsReqDTO;
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();
}
/**
* 语音听写
* @param fileCode
* @return
* @author sr on 2025-01-09
*/
public static String iat(String fileCode) {
try (InputStream fileis = fileRecordService.getFile(fileCode)){
File file = FileUtils.createTempFile("pcm");
try (InputStream is = FileUtils.copyToTempFile(fileis, file)) {
AlitaResult<String> result = WebIATWS.execute(is, xfProperties);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
} catch (Exception e) {
throw e;
} finally {
file.delete();
}
} catch (Exception e) {
throw new BusinessException("语音听写异常:" + e.getMessage());
}
}
/**
* 语音合成
* @return
* @author sr on 2025-01-09
*/
public static String tts(TtsReqDTO ttsReq) {
try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
AlitaResult<Void> result = WebTtsWS.execute(ttsReq, 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();
}
/**
* 对话
* @param req
* @return
*/
public static String chat(ChatReq req) {
AlitaResult<String> result = XfSparkProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 翻译
* @param req
* @return
*/
public static String translate(TranslateReq req) {
AlitaResult<String> result = XfSparkProvider.translate(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
/**
* 实时语音转写
* @param reqDTO
* @return
*/
public static String rtasr(RtasrReqDTO reqDTO) {
try (InputStream fileis = fileRecordService.getFile(reqDTO.getFileCode())){
File file = FileUtils.createTempFile("pcm");
try (InputStream is = FileUtils.copyToTempFile(fileis, file)) {
AlitaResult<String> result = RtasrClientApp.execute(is, reqDTO.getFrom(), xfProperties);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
} catch (Exception e) {
throw e;
} finally {
file.delete();
}
}catch (Exception e) {
throw new BusinessException("语音听写异常:" + e.getMessage());
}
}
}