luyie
3 months ago
18 changed files with 551 additions and 0 deletions
@ -0,0 +1,5 @@
|
||||
build.artifact=hzims-service-api |
||||
build.group=com.hnac.hzims |
||||
build.name=hzims-service-api |
||||
build.time=2024-08-12T06\:09\:01.772Z |
||||
build.version=4.0.0-SNAPSHOT |
@ -0,0 +1,26 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.config; |
||||
|
||||
import com.zhipu.oapi.ClientV4; |
||||
import lombok.AllArgsConstructor; |
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
import javax.annotation.Resource; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/9 17:01 |
||||
*/ |
||||
@Configuration |
||||
@EnableConfigurationProperties(ZhipuAiConfigProperties.class) |
||||
@AllArgsConstructor |
||||
public class ZhipuAiConfig { |
||||
|
||||
private ZhipuAiConfigProperties properties; |
||||
|
||||
@Bean("clientV4") |
||||
public ClientV4 clientV4() { |
||||
return new ClientV4.Builder(properties.getApiSecret()).build(); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.config; |
||||
|
||||
import lombok.Data; |
||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
import org.springframework.cloud.context.config.annotation.RefreshScope; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 14:03 |
||||
*/ |
||||
@Data |
||||
@ConfigurationProperties(prefix = "zhipuai") |
||||
public class ZhipuAiConfigProperties { |
||||
|
||||
private String apiSecret; |
||||
|
||||
private String url; |
||||
|
||||
} |
@ -0,0 +1,27 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.constants; |
||||
|
||||
import lombok.Getter; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/9 9:50 |
||||
*/ |
||||
@Getter |
||||
public enum AnalysisModel implements BaseEnum { |
||||
|
||||
GLM_4("glm-4", "GLM-4模型"), |
||||
GLM_4V("glm-4v", "GLM-4V模型"), |
||||
COG_VIDEO_X("cogvideox", "CogVideoX模型"), |
||||
COG_VIEW("cogvideox", "CogVideoX模型"), |
||||
GLM_4_ALL_TOOLS("glm-4-alltool", "GLM-4-AllTools模型"); |
||||
|
||||
private final String code; |
||||
|
||||
private final String msg; |
||||
|
||||
AnalysisModel(String code, String msg) { |
||||
this.code = code; |
||||
this.msg = msg; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.constants; |
||||
|
||||
import lombok.Getter; |
||||
import org.apache.poi.ss.formula.functions.T; |
||||
|
||||
import java.math.BigDecimal; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 15:27 |
||||
*/ |
||||
@Getter |
||||
public enum AnalysisResultType implements BaseEnum { |
||||
BOOLEAN("BOOLEAN", "是非判断", "是", Boolean.class), |
||||
NUMBER("NUMBER", "确定数量", null, Integer.class), |
||||
DECIMAL("DECIMAL", "获取数值", null, BigDecimal.class); |
||||
|
||||
private final String code; |
||||
|
||||
private final String msg; |
||||
|
||||
private final String condition; |
||||
|
||||
private final Class<T> clazz; |
||||
|
||||
AnalysisResultType(String code, String msg, String condition, Class clazz) { |
||||
this.code = code; |
||||
this.msg = msg; |
||||
this.condition = condition; |
||||
this.clazz = clazz; |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.constants; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 15:42 |
||||
*/ |
||||
public interface BaseEnum { |
||||
<U extends Object> U getCode(); |
||||
|
||||
String getMsg(); |
||||
|
||||
static <T extends BaseEnum, U extends Object> T getInstance(U code, Class<T> clazz) { |
||||
T[] baseEnums = clazz.getEnumConstants(); |
||||
for (T baseEnum : baseEnums) { |
||||
if (baseEnum.getCode().equals(code)) { |
||||
return baseEnum; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.controller; |
||||
|
||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
||||
import com.hnac.hzims.bigmodel.zhipuai.service.ZhipuAnalysisService; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisRequest; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisResponse; |
||||
import io.swagger.annotations.Api; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import lombok.AllArgsConstructor; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
import javax.validation.Valid; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 16:36 |
||||
*/ |
||||
@RestController |
||||
@RequestMapping("zhipu") |
||||
@Api(value = "智谱", tags = "智谱") |
||||
@AllArgsConstructor |
||||
public class ZhipuController { |
||||
|
||||
private final ZhipuAnalysisService analysisService; |
||||
|
||||
@PostMapping("/analysis") |
||||
@ApiOperation("分析") |
||||
@ApiOperationSupport(order = 1) |
||||
public R<ZhipuAnalysisResponse> analysis(@RequestBody @Valid ZhipuAnalysisRequest request) { |
||||
return R.data(analysisService.analysis(request)); |
||||
} |
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.entity; |
||||
|
||||
import lombok.Data; |
||||
import org.springblade.core.mp.base.BaseEntity; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 15:17 |
||||
*/ |
||||
@Data |
||||
public class ZhipuAnalysisInfoEntity extends BaseEntity { |
||||
|
||||
private String resultType; |
||||
|
||||
private String name; |
||||
|
||||
private String code; |
||||
|
||||
private String model; |
||||
|
||||
private String requestContent; |
||||
|
||||
private String resultStrategy; |
||||
|
||||
} |
@ -0,0 +1,23 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.handler; |
||||
|
||||
import com.zhipu.oapi.ClientV4; |
||||
|
||||
import javax.annotation.Resource; |
||||
import java.util.Base64; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 8:44 |
||||
*/ |
||||
public abstract class AbstractZhipuAnalysisHandler implements ZhipuAnalyser { |
||||
protected final String requestIdTemplate = "hzims-%d"; |
||||
protected final String resultKey = "结果"; |
||||
|
||||
@Resource |
||||
protected ClientV4 client; |
||||
|
||||
@Override |
||||
public String getBase64(String url) { |
||||
return Base64.getEncoder().encodeToString(getFileBytes(url)); |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.handler; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/8 14:45 |
||||
*/ |
||||
public interface ZhipuAnalyser<Req, Resp> { |
||||
|
||||
String getBase64(String url); |
||||
|
||||
byte[] getFileBytes(String url); |
||||
|
||||
String getAnalysisStrategy(); |
||||
|
||||
String getAnalysisModel(); |
||||
|
||||
default boolean isSupport(String modelName) { |
||||
return getAnalysisStrategy().equals(modelName); |
||||
} |
||||
|
||||
Resp sendRequest(ZhipuAnalysisInfoEntity info, String url); |
||||
|
||||
Req getRequest(ZhipuAnalysisInfoEntity info, String url); |
||||
|
||||
String getResult(ZhipuAnalysisInfoEntity info, String url); |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.handler; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Objects; |
||||
import java.util.Optional; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/9 10:47 |
||||
*/ |
||||
@Component |
||||
@AllArgsConstructor |
||||
@Slf4j |
||||
public class ZhipuAnalysisFactory { |
||||
private final List<ZhipuAnalyser> analysisStrategyList; |
||||
|
||||
private static final Map<String, ZhipuAnalyser> analysisStrategyMap = new ConcurrentHashMap<>(); |
||||
|
||||
public ZhipuAnalyser getAnalysisStrategy(final String modelName) { |
||||
ZhipuAnalyser result = ZhipuAnalysisFactory.analysisStrategyMap.get(modelName); |
||||
if (Objects.nonNull(result)) { |
||||
return result; |
||||
} |
||||
Optional<ZhipuAnalyser> strategyOptional = analysisStrategyList.stream().filter(strategy -> strategy.isSupport(modelName)).findFirst(); |
||||
if (strategyOptional.isPresent()) { |
||||
result = strategyOptional.get(); |
||||
ZhipuAnalysisFactory.analysisStrategyMap.put(modelName, result); |
||||
} |
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,95 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.handler; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.constants.AnalysisModel; |
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
import com.zhipu.oapi.ClientV4; |
||||
import com.zhipu.oapi.Constants; |
||||
import com.zhipu.oapi.service.v4.model.ChatCompletionRequest; |
||||
import com.zhipu.oapi.service.v4.model.ChatMessage; |
||||
import com.zhipu.oapi.service.v4.model.ChatMessageRole; |
||||
import com.zhipu.oapi.service.v4.model.ModelApiResponse; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springblade.core.tool.jackson.JsonUtil; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 9:20 |
||||
*/ |
||||
@Service |
||||
@AllArgsConstructor |
||||
@Slf4j |
||||
public class ZhipuAnalysisHandlerGlm4v extends AbstractZhipuAnalysisHandler { |
||||
|
||||
@Override |
||||
public String getAnalysisStrategy() { |
||||
return AnalysisModel.GLM_4V.getCode(); |
||||
} |
||||
|
||||
@Override |
||||
public String getAnalysisModel() { |
||||
return AnalysisModel.GLM_4V.getCode(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public byte[] getFileBytes(String url) { |
||||
return new byte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public ModelApiResponse sendRequest(ZhipuAnalysisInfoEntity info, String url) { |
||||
ChatCompletionRequest request = getRequest(info, url); |
||||
log.info("send zhipu ai request :{}", request); |
||||
return client.invokeModelApi(request); |
||||
} |
||||
|
||||
@Override |
||||
public ChatCompletionRequest getRequest(ZhipuAnalysisInfoEntity info, String url) { |
||||
List<ChatMessage> messages = new ArrayList<>(); |
||||
List<Map<String, Object>> contentList = new ArrayList<>(); |
||||
Map<String, Object> textMap = new HashMap<>(); |
||||
textMap.put("type", "text"); |
||||
textMap.put("text", info.getRequestContent()); |
||||
Map<String, Object> typeMap = new HashMap<>(); |
||||
typeMap.put("type", "image_url"); |
||||
Map<String, Object> urlMap = new HashMap<>(); |
||||
urlMap.put("url", getBase64(url)); |
||||
typeMap.put("image_url", urlMap); |
||||
contentList.add(textMap); |
||||
contentList.add(typeMap); |
||||
ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), contentList); |
||||
messages.add(chatMessage); |
||||
String requestId = String.format(requestIdTemplate, System.currentTimeMillis()); |
||||
|
||||
ChatCompletionRequest request = ChatCompletionRequest.builder() |
||||
.model(getAnalysisModel()) |
||||
.stream(Boolean.FALSE) |
||||
.invokeMethod(Constants.invokeMethod) |
||||
.messages(messages) |
||||
.requestId(requestId) |
||||
.build(); |
||||
return request; |
||||
} |
||||
|
||||
@Override |
||||
public String getResult(ZhipuAnalysisInfoEntity info, String url) { |
||||
ModelApiResponse response = sendRequest(info, url); |
||||
log.info("get zhi pu ai response : {}", JsonUtil.toJson(response)); |
||||
if (response.isSuccess()) { |
||||
String resultJson = response.getData().getChoices().get(0).getMessage().getContent().toString(); |
||||
resultJson = resultJson.substring(resultJson.indexOf("{"), resultJson.indexOf("}") + 1).trim(); |
||||
Map<String, Object> resultMap = JsonUtil.toMap(resultJson); |
||||
return resultMap.get(resultKey).toString(); |
||||
} else { |
||||
return "访问失败"; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,57 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.handler; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
import com.zhipu.oapi.Constants; |
||||
import com.zhipu.oapi.service.v4.model.ChatCompletionRequest; |
||||
import com.zhipu.oapi.service.v4.model.ChatMessage; |
||||
import com.zhipu.oapi.service.v4.model.ChatMessageRole; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 10:11 |
||||
*/ |
||||
@Service |
||||
@AllArgsConstructor |
||||
@Slf4j |
||||
public class ZhipuAnalysisHandlerTest extends ZhipuAnalysisHandlerGlm4v { |
||||
private final String model = "test"; |
||||
|
||||
@Override |
||||
public String getAnalysisStrategy() { |
||||
return model; |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getFileBytes(String url) { |
||||
File file = new File(url); |
||||
FileInputStream fileInputStream = null; |
||||
try { |
||||
fileInputStream = new FileInputStream(file); |
||||
byte[] bytes = new byte[(int) file.length()]; |
||||
fileInputStream.read(bytes); |
||||
return bytes; |
||||
} catch (Exception e) { |
||||
log.error("读取文件出错", e); |
||||
} finally { |
||||
if (null != fileInputStream) { |
||||
try { |
||||
fileInputStream.close(); |
||||
} catch (IOException ignore) { |
||||
} |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.service; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisRequest; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisResponse; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 10:25 |
||||
*/ |
||||
public interface ZhipuAnalysisService { |
||||
|
||||
ZhipuAnalysisResponse analysis(ZhipuAnalysisRequest request); |
||||
|
||||
ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisRequest request); |
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.service.impl; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
import com.hnac.hzims.bigmodel.zhipuai.handler.ZhipuAnalyser; |
||||
import com.hnac.hzims.bigmodel.zhipuai.handler.ZhipuAnalysisFactory; |
||||
import com.hnac.hzims.bigmodel.zhipuai.service.ZhipuAnalysisService; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisRequest; |
||||
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisResponse; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 10:26 |
||||
*/ |
||||
@Service |
||||
@AllArgsConstructor |
||||
@Slf4j |
||||
public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService { |
||||
private final ZhipuAnalysisFactory analysisFactory; |
||||
|
||||
@Override |
||||
public ZhipuAnalysisResponse analysis(ZhipuAnalysisRequest request) { |
||||
ZhipuAnalysisInfoEntity info = getAnalysisInfo(request); |
||||
ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(info.getModel()); |
||||
String resultStr = analyser.getResult(info, request.getUrl()); |
||||
ZhipuAnalysisResponse response = new ZhipuAnalysisResponse(); |
||||
response.setResultStr(resultStr); |
||||
return response; |
||||
} |
||||
|
||||
@Override |
||||
public ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisRequest request) { |
||||
if (Objects.isNull(request.getCode())) { |
||||
return request.toAnalysisInfo(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.vo; |
||||
|
||||
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 10:23 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "智谱分析请求", description = "智谱分析请求") |
||||
public class ZhipuAnalysisRequest { |
||||
@ApiModelProperty("模型编码") |
||||
private String code; |
||||
|
||||
@ApiModelProperty("模型名称") |
||||
private String model; |
||||
|
||||
@ApiModelProperty("文件地址") |
||||
private String url; |
||||
|
||||
@ApiModelProperty("发送内容") |
||||
private String content; |
||||
|
||||
@ApiModelProperty("额外信息") |
||||
private String message; |
||||
|
||||
public ZhipuAnalysisInfoEntity toAnalysisInfo() { |
||||
ZhipuAnalysisInfoEntity info = new ZhipuAnalysisInfoEntity(); |
||||
info.setModel(this.getModel()); |
||||
info.setRequestContent(this.content); |
||||
info.setModel(this.getModel()); |
||||
return info; |
||||
} |
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.hnac.hzims.bigmodel.zhipuai.vo; |
||||
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* @Author: ypj |
||||
* @Date: 2024/8/12 10:23 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "智谱分析返回",description = "智谱分析返回") |
||||
public class ZhipuAnalysisResponse { |
||||
|
||||
@ApiModelProperty("返回结果") |
||||
String resultStr; |
||||
} |
Loading…
Reference in new issue