Skip to content

Commit cf35351

Browse files
authored
补全 aispeech 知识助理接口并新增单元测试
1 parent 117d88a commit cf35351

7 files changed

Lines changed: 323 additions & 3 deletions

File tree

weixin-java-aispeech/src/main/java/me/chanjar/weixin/aispeech/api/WxAispeechKnowledgeService.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,50 @@
11
package me.chanjar.weixin.aispeech.api;
22

3+
import java.io.File;
34
import java.util.List;
45
import java.util.Map;
56
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeInfo;
67
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeManualCreateRequest;
8+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeMoveProgress;
9+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeMoveRequest;
10+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeTagRequest;
711
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeUpdateRequest;
812
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeUrlCreateRequest;
913
import me.chanjar.weixin.common.error.WxErrorException;
1014

1115
public interface WxAispeechKnowledgeService {
16+
KnowledgeInfo createKnowledgeByFile(String knowledgeBaseId, File file, String title, String description, String metadata)
17+
throws WxErrorException;
18+
1219
KnowledgeInfo createKnowledgeByUrl(String knowledgeBaseId, KnowledgeUrlCreateRequest request) throws WxErrorException;
1320

1421
KnowledgeInfo createKnowledgeByManual(String knowledgeBaseId, KnowledgeManualCreateRequest request) throws WxErrorException;
1522

1623
List<KnowledgeInfo> listKnowledge(String knowledgeBaseId, Integer page, Integer pageSize) throws WxErrorException;
1724

25+
List<KnowledgeInfo> listKnowledgeByIds(List<String> knowledgeIds) throws WxErrorException;
26+
1827
KnowledgeInfo getKnowledge(String knowledgeId) throws WxErrorException;
1928

2029
KnowledgeInfo updateKnowledge(String knowledgeId, KnowledgeUpdateRequest request) throws WxErrorException;
2130

31+
KnowledgeInfo updateManualKnowledge(String knowledgeId, KnowledgeManualCreateRequest request) throws WxErrorException;
32+
2233
boolean deleteKnowledge(String knowledgeId) throws WxErrorException;
2334

35+
boolean updateKnowledgeTags(List<String> knowledgeIds, Long tagId) throws WxErrorException;
36+
2437
List<KnowledgeInfo> searchKnowledge(String keyword, String knowledgeBaseId, Integer page, Integer pageSize)
2538
throws WxErrorException;
2639

40+
String moveKnowledge(KnowledgeMoveRequest request) throws WxErrorException;
41+
42+
KnowledgeMoveProgress getMoveProgress(String taskId) throws WxErrorException;
43+
44+
boolean createKnowledgeBaseTag(String knowledgeBaseId, KnowledgeTagRequest request) throws WxErrorException;
45+
46+
boolean updateKnowledgeBaseTag(String knowledgeBaseId, String tagId, KnowledgeTagRequest request) throws WxErrorException;
47+
2748
String postRaw(String path, Object requestBody) throws WxErrorException;
2849

2950
String getRaw(String path, Map<String, String> queryParams) throws WxErrorException;

weixin-java-aispeech/src/main/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechKnowledgeServiceImpl.java

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package me.chanjar.weixin.aispeech.api.impl;
22

3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
35
import com.google.gson.reflect.TypeToken;
6+
import java.io.File;
47
import java.lang.reflect.Type;
58
import java.util.HashMap;
69
import java.util.List;
710
import java.util.Map;
11+
import java.util.StringJoiner;
812
import me.chanjar.weixin.aispeech.api.WxAispeechKnowledgeService;
913
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeInfo;
1014
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeListResult;
1115
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeManualCreateRequest;
16+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeMoveProgress;
17+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeMoveRequest;
18+
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeTagRequest;
1219
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeUpdateRequest;
1320
import me.chanjar.weixin.aispeech.bean.knowledge.KnowledgeUrlCreateRequest;
1421
import me.chanjar.weixin.common.error.WxErrorException;
@@ -22,6 +29,14 @@ public WxAispeechKnowledgeServiceImpl(WxAispeechServiceImpl service) {
2229
this.service = service;
2330
}
2431

32+
@Override
33+
public KnowledgeInfo createKnowledgeByFile(String knowledgeBaseId, File file, String title, String description, String metadata)
34+
throws WxErrorException {
35+
String response = service.executeKnowledgeMultipartPost("/api/v1/knowledge-bases/" + knowledgeBaseId + "/knowledge/file",
36+
file, title, description, metadata);
37+
return WxGsonBuilder.create().fromJson(response, KnowledgeInfo.class);
38+
}
39+
2540
@Override
2641
public KnowledgeInfo createKnowledgeByUrl(String knowledgeBaseId, KnowledgeUrlCreateRequest request)
2742
throws WxErrorException {
@@ -47,6 +62,27 @@ public List<KnowledgeInfo> listKnowledge(String knowledgeBaseId, Integer page, I
4762
return result == null ? null : result.getData();
4863
}
4964

65+
@Override
66+
public List<KnowledgeInfo> listKnowledgeByIds(List<String> knowledgeIds) throws WxErrorException {
67+
if (knowledgeIds == null || knowledgeIds.isEmpty()) {
68+
return null;
69+
}
70+
StringJoiner joiner = new StringJoiner(",");
71+
for (String knowledgeId : knowledgeIds) {
72+
if (StringUtils.isNotBlank(knowledgeId)) {
73+
joiner.add(knowledgeId);
74+
}
75+
}
76+
if (joiner.length() == 0) {
77+
return null;
78+
}
79+
80+
Map<String, String> query = new HashMap<>();
81+
query.put("ids", joiner.toString());
82+
String response = service.executeKnowledgeGet("/api/v1/knowledge/batch", query);
83+
return parseKnowledgeInfoList(response);
84+
}
85+
5086
@Override
5187
public KnowledgeInfo getKnowledge(String knowledgeId) throws WxErrorException {
5288
String response = service.executeKnowledgeGet("/api/v1/knowledge/" + knowledgeId, null);
@@ -59,12 +95,31 @@ public KnowledgeInfo updateKnowledge(String knowledgeId, KnowledgeUpdateRequest
5995
return WxGsonBuilder.create().fromJson(response, KnowledgeInfo.class);
6096
}
6197

98+
@Override
99+
public KnowledgeInfo updateManualKnowledge(String knowledgeId, KnowledgeManualCreateRequest request) throws WxErrorException {
100+
String response = service.executeKnowledgePut("/api/v1/knowledge/manual/" + knowledgeId, request);
101+
return WxGsonBuilder.create().fromJson(response, KnowledgeInfo.class);
102+
}
103+
62104
@Override
63105
public boolean deleteKnowledge(String knowledgeId) throws WxErrorException {
64106
String response = service.executeKnowledgeDelete("/api/v1/knowledge/" + knowledgeId);
65107
return StringUtils.isNotBlank(response);
66108
}
67109

110+
@Override
111+
public boolean updateKnowledgeTags(List<String> knowledgeIds, Long tagId) throws WxErrorException {
112+
if (knowledgeIds == null || knowledgeIds.isEmpty() || tagId == null) {
113+
return false;
114+
}
115+
116+
Map<String, Object> request = new HashMap<>();
117+
request.put("knowledge_ids", knowledgeIds);
118+
request.put("tag_id", tagId);
119+
String response = service.executeKnowledgePut("/api/v1/knowledge/tags", request);
120+
return StringUtils.isNotBlank(response);
121+
}
122+
68123
@Override
69124
public List<KnowledgeInfo> searchKnowledge(String keyword, String knowledgeBaseId, Integer page, Integer pageSize)
70125
throws WxErrorException {
@@ -74,9 +129,31 @@ public List<KnowledgeInfo> searchKnowledge(String keyword, String knowledgeBaseI
74129
query.put("page", page == null ? null : String.valueOf(page));
75130
query.put("page_size", pageSize == null ? null : String.valueOf(pageSize));
76131
String response = service.executeKnowledgeGet("/api/v1/knowledge/search", query);
132+
return parseKnowledgeInfoList(response);
133+
}
77134

78-
Type listType = new TypeToken<List<KnowledgeInfo>>() { } .getType();
79-
return WxGsonBuilder.create().fromJson(response, listType);
135+
@Override
136+
public String moveKnowledge(KnowledgeMoveRequest request) throws WxErrorException {
137+
return service.executeKnowledgePost("/api/v1/knowledge/move", request);
138+
}
139+
140+
@Override
141+
public KnowledgeMoveProgress getMoveProgress(String taskId) throws WxErrorException {
142+
String response = service.executeKnowledgeGet("/api/v1/knowledge/move/progress/" + taskId, null);
143+
return WxGsonBuilder.create().fromJson(response, KnowledgeMoveProgress.class);
144+
}
145+
146+
@Override
147+
public boolean createKnowledgeBaseTag(String knowledgeBaseId, KnowledgeTagRequest request) throws WxErrorException {
148+
String response = service.executeKnowledgePost("/api/v1/knowledge-bases/" + knowledgeBaseId + "/tags", request);
149+
return StringUtils.isNotBlank(response);
150+
}
151+
152+
@Override
153+
public boolean updateKnowledgeBaseTag(String knowledgeBaseId, String tagId, KnowledgeTagRequest request)
154+
throws WxErrorException {
155+
String response = service.executeKnowledgePut("/api/v1/knowledge-bases/" + knowledgeBaseId + "/tags/" + tagId, request);
156+
return StringUtils.isNotBlank(response);
80157
}
81158

82159
@Override
@@ -88,4 +165,20 @@ public String postRaw(String path, Object requestBody) throws WxErrorException {
88165
public String getRaw(String path, Map<String, String> queryParams) throws WxErrorException {
89166
return service.executeKnowledgeGet(path, queryParams);
90167
}
168+
169+
private List<KnowledgeInfo> parseKnowledgeInfoList(String response) {
170+
if (StringUtils.isBlank(response)) {
171+
return null;
172+
}
173+
174+
JsonElement element = WxGsonBuilder.create().fromJson(response, JsonElement.class);
175+
Type listType = new TypeToken<List<KnowledgeInfo>>() { } .getType();
176+
if (element != null && element.isJsonObject()) {
177+
JsonObject object = element.getAsJsonObject();
178+
if (object.has("data")) {
179+
return WxGsonBuilder.create().fromJson(object.get("data"), listType);
180+
}
181+
}
182+
return WxGsonBuilder.create().fromJson(element, listType);
183+
}
91184
}

weixin-java-aispeech/src/main/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechServiceImpl.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.chanjar.weixin.aispeech.api.impl;
22

33
import com.google.gson.Gson;
4+
import java.io.File;
45
import java.io.IOException;
56
import java.net.URI;
67
import java.nio.charset.StandardCharsets;
@@ -26,9 +27,11 @@
2627
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2728
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
2829
import org.apache.hc.core5.http.ContentType;
30+
import org.apache.hc.core5.http.HttpEntity;
2931
import org.apache.hc.core5.http.HttpHost;
3032
import org.apache.hc.core5.http.io.entity.StringEntity;
3133
import org.apache.hc.core5.net.URIBuilder;
34+
import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
3235

3336
public class WxAispeechServiceImpl implements WxAispeechService {
3437
private static final Gson GSON = new Gson();
@@ -134,6 +137,29 @@ protected String executeKnowledgePut(String path, Object requestBody) throws WxE
134137
return executeRequest(request);
135138
}
136139

140+
protected String executeKnowledgeMultipartPost(String path, File file, String title, String description, String metadata)
141+
throws WxErrorException {
142+
HttpPost request = new HttpPost(configStorage.getKnowledgeApiBaseUrl() + path);
143+
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
144+
builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName());
145+
if (StringUtils.isNotBlank(title)) {
146+
builder.addTextBody("title", title, ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8));
147+
}
148+
if (StringUtils.isNotBlank(description)) {
149+
builder.addTextBody("description", description, ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8));
150+
}
151+
if (StringUtils.isNotBlank(metadata)) {
152+
builder.addTextBody("metadata", metadata, ContentType.APPLICATION_JSON);
153+
}
154+
HttpEntity entity = builder.build();
155+
request.setEntity(entity);
156+
if (entity.getContentType() != null) {
157+
request.setHeader("Content-Type", entity.getContentType());
158+
}
159+
enrichKnowledgeHeaders(request, "");
160+
return executeRequest(request);
161+
}
162+
137163
protected String executeKnowledgeDelete(String path) throws WxErrorException {
138164
HttpUriRequestBase request = new HttpUriRequestBase("DELETE", URI.create(configStorage.getKnowledgeApiBaseUrl() + path));
139165
enrichKnowledgeHeaders(request, "");
@@ -159,7 +185,9 @@ private void enrichKnowledgeHeaders(HttpUriRequestBase request, String body) thr
159185
request.setHeader("X-Timestamp", String.valueOf(timestamp));
160186
request.setHeader("X-Nonce", nonce);
161187
request.setHeader("X-Signature", signature);
162-
request.setHeader("Content-Type", ContentType.APPLICATION_JSON.getMimeType());
188+
if (!request.containsHeader("Content-Type")) {
189+
request.setHeader("Content-Type", ContentType.APPLICATION_JSON.getMimeType());
190+
}
163191
}
164192

165193
private String executeRequest(HttpUriRequestBase request) throws WxErrorException {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.chanjar.weixin.aispeech.bean.knowledge;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
6+
@Data
7+
public class KnowledgeMoveProgress {
8+
@SerializedName("task_id")
9+
private String taskId;
10+
private String status;
11+
private Double progress;
12+
private Integer total;
13+
private Integer processed;
14+
private String message;
15+
private String error;
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.chanjar.weixin.aispeech.bean.knowledge;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import java.util.List;
5+
import lombok.Data;
6+
7+
@Data
8+
public class KnowledgeMoveRequest {
9+
@SerializedName("knowledge_ids")
10+
private List<String> knowledgeIds;
11+
@SerializedName("source_kb_id")
12+
private String sourceKnowledgeBaseId;
13+
@SerializedName("target_kb_id")
14+
private String targetKnowledgeBaseId;
15+
private String mode;
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.chanjar.weixin.aispeech.bean.knowledge;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
6+
@Data
7+
public class KnowledgeTagRequest {
8+
private String name;
9+
private String color;
10+
@SerializedName("sort_order")
11+
private Integer sortOrder;
12+
}

0 commit comments

Comments
 (0)