|
|
@@ -8,7 +8,11 @@ import com.sckw.ai.biz.util.OkHttpUtils;
|
|
|
import jakarta.annotation.PostConstruct;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import okhttp3.MediaType;
|
|
|
+import okhttp3.MultipartBody;
|
|
|
+import okhttp3.RequestBody;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
@@ -28,14 +32,19 @@ public class AiApiInvoker {
|
|
|
AiApiInvoker.properties = chatProperties;
|
|
|
}
|
|
|
|
|
|
+ public static String invoke(AiApiEnum apiEnum, Object[] pathParams, Map<String, String> para, MultipartFile file) {
|
|
|
+ return invoke(apiEnum, pathParams, null, para, file);
|
|
|
+ }
|
|
|
+
|
|
|
public static String invoke(AiApiEnum apiEnum, Object[] pathParams, Map<String, String> para) {
|
|
|
- return invoke(apiEnum, pathParams, null, para);
|
|
|
+ return invoke(apiEnum, pathParams, null, para, null);
|
|
|
}
|
|
|
|
|
|
public static String invoke(AiApiEnum apiEnum, Object[] pathParams, String requestBody) {
|
|
|
- return invoke(apiEnum, pathParams, requestBody, null);
|
|
|
+ return invoke(apiEnum, pathParams, requestBody, null, null);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 统一调用 AI 接口
|
|
|
*
|
|
|
@@ -44,21 +53,23 @@ public class AiApiInvoker {
|
|
|
* @param requestBody 请求体(POST/PUT 时使用),可为 String 或 Object(需序列化)
|
|
|
* @return 响应字符串
|
|
|
*/
|
|
|
- public static String invoke(AiApiEnum apiEnum, Object[] pathParams, String requestBody, Map<String, String> para) {
|
|
|
+ public static String invoke(AiApiEnum apiEnum, Object[] pathParams, String requestBody, Map<String, String> para, MultipartFile file) {
|
|
|
String url = pathParams != null && pathParams.length > 0
|
|
|
? apiEnum.formatUrl(pathParams)
|
|
|
: apiEnum.getUrl();
|
|
|
|
|
|
OkHttpUtils builder = OkHttpUtils.builder()
|
|
|
.url(properties.getUrl() + url)
|
|
|
- .addHeader("Authorization", properties.getHeaderPrefix() + " " + properties.getHeader())
|
|
|
- .addHeader("Content-Type", "application/json");
|
|
|
+ .addHeader("Authorization", properties.getHeaderPrefix() + " " + properties.getHeader());
|
|
|
+ if (!StrUtil.equals(apiEnum.getType(), "form")) {
|
|
|
+ builder.addHeader("Content-Type", "application/json");
|
|
|
+ }
|
|
|
|
|
|
String method = apiEnum.getMethod().toUpperCase();
|
|
|
try {
|
|
|
switch (method) {
|
|
|
case "GET" -> {
|
|
|
- if(CollUtil.isNotEmpty(para)){
|
|
|
+ if (CollUtil.isNotEmpty(para)) {
|
|
|
for (Map.Entry<String, String> map : para.entrySet()) {
|
|
|
builder.addPara(map.getKey(), map.getValue());
|
|
|
}
|
|
|
@@ -66,10 +77,26 @@ public class AiApiInvoker {
|
|
|
return builder.get().sync();
|
|
|
}
|
|
|
case "POST" -> {
|
|
|
- if (StrUtil.isNotBlank(requestBody)) {
|
|
|
- builder.addBodyJsonStr(requestBody);
|
|
|
+ if (StrUtil.equals(apiEnum.getType(), "form")) {
|
|
|
+ MultipartBody.Builder formBody = new MultipartBody.Builder();
|
|
|
+ formBody.setType(MultipartBody.FORM);
|
|
|
+ String fileName = file.getOriginalFilename();
|
|
|
+ byte[] bytes = file.getBytes();
|
|
|
+ if (CollUtil.isNotEmpty(para)) {
|
|
|
+ for (Map.Entry<String, String> map : para.entrySet()) {
|
|
|
+ formBody.addFormDataPart(map.getKey(), map.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ formBody.addFormDataPart("file", fileName, RequestBody.create(bytes, MediaType.parse(StrUtil.isNotBlank(file.getContentType()) ? file.getContentType() : "audio/wav")));
|
|
|
+ RequestBody body = formBody.build();
|
|
|
+ return builder.form(body).sync();
|
|
|
+ } else {
|
|
|
+ if (StrUtil.isNotBlank(requestBody)) {
|
|
|
+ builder.addBodyJsonStr(requestBody);
|
|
|
+ }
|
|
|
+ return builder.post(true).sync();
|
|
|
+
|
|
|
}
|
|
|
- return builder.post(true).sync();
|
|
|
}
|
|
|
case "DELETE" -> {
|
|
|
return builder.delete().sync();
|