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.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 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 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 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 result = WebIATWS.execute(is, xfProperties); Assert.isTrue(result.getSuccess(), result.getMsg()); return result.getData(); } catch (Exception e) { throw e; } finally { file.deleteOnExit(); } } 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 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 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 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 result = XfSparkProvider.httpChat(req); Assert.isTrue(result.getSuccess(), result.getMsg()); return result.getData(); } /** * 对话 * @param req * @return */ public static String chat(ChatReq req) { AlitaResult result = XfSparkProvider.httpChat(req); Assert.isTrue(result.getSuccess(), result.getMsg()); return result.getData(); } /** * 翻译 * @param req * @return */ public static String translate(TranslateReq req) { AlitaResult 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 result = RtasrClientApp.execute(is, reqDTO.getFrom(), xfProperties); Assert.isTrue(result.getSuccess(), result.getMsg()); return result.getData(); } catch (Exception e) { throw e; } finally { file.deleteOnExit(); } }catch (Exception e) { throw new BusinessException("语音听写异常:" + e.getMessage()); } } }