Skip to content

Commit 731c4ba

Browse files
authored
Fix: Fix missing workflow event param and return more param when get messages (#49)
1 parent 6ec161c commit 731c4ba

File tree

11 files changed

+100
-31
lines changed

11 files changed

+100
-31
lines changed

api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
</parent>
4444

4545
<artifactId>coze-api</artifactId>
46-
<version>0.2.6</version>
46+
<version>0.2.7</version>
4747

4848
<scm>
4949
<connection>scm:git:git://github.com/coze-dev/coze-java.git</connection>

api/src/main/java/com/coze/openapi/client/common/pagination/PageResp.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class PageResp<T> {
1717
private List<T> items;
1818
private Iterator<T> iterator;
1919
private Boolean hasMore;
20-
private String lastID;
20+
private String lastID; // 当前页最后一条数据的 id
21+
private String firstID; // 当前页第一条数据的 id
2122
private String logID;
2223
}

api/src/main/java/com/coze/openapi/client/common/pagination/PageResponse.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ public class PageResponse<T> {
2424

2525
private String lastID;
2626

27-
private String nextID;
27+
private String firstID;
28+
29+
private String pageToken;
2830

2931
private String logID;
3032
}

api/src/main/java/com/coze/openapi/client/common/pagination/TokenBasedPaginator.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public class TokenBasedPaginator<T> implements Iterator<T> {
1818
public TokenBasedPaginator(PageFetcher<T> pageFetcher, int pageSize) {
1919
this.pageFetcher = pageFetcher;
2020
this.pageSize = pageSize;
21-
this.fetchNextPage();
2221
}
2322

2423
private void fetchNextPage() {
@@ -28,14 +27,24 @@ private void fetchNextPage() {
2827
logger.info(
2928
"Fetched page: " + pageToken + " success, got" + currentPage.getData().size() + " items");
3029
currentIterator = currentPage.getData().iterator();
31-
pageToken = currentPage.getNextID();
30+
pageToken = currentPage.getPageToken();
3231
} catch (Exception e) {
3332
throw new RuntimeException("Failed to fetch page", e);
3433
}
3534
}
3635

36+
public void setCurrentPage(PageResponse<T> currentPage) {
37+
this.currentPage = currentPage;
38+
this.pageToken = currentPage.getPageToken();
39+
this.currentIterator = currentPage.getData().iterator();
40+
}
41+
3742
@Override
3843
public boolean hasNext() {
44+
if (currentIterator == null) {
45+
fetchNextPage();
46+
return currentIterator.hasNext();
47+
}
3948
if (currentIterator.hasNext()) {
4049
return true;
4150
}

api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEvent.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public class WorkflowEvent extends BaseResp {
3434
@JsonProperty("error")
3535
private WorkflowEventError error;
3636

37+
@JsonProperty("debug_url")
38+
private WorkflowEventDebugURL debugUrl;
39+
3740
private static WorkflowEvent parseWorkflowEventMessage(Integer id, String data, String logID) {
3841
WorkflowEventMessage message = WorkflowEventMessage.fromJson(data);
3942
return WorkflowEvent.builder()
@@ -64,8 +67,14 @@ private static WorkflowEvent parseWorkflowEventError(Integer id, String data, St
6467
.build();
6568
}
6669

67-
private static WorkflowEvent parseWorkflowEventDone(Integer id, String logID) {
68-
return WorkflowEvent.builder().id(id).event(WorkflowEventType.DONE).logID(logID).build();
70+
private static WorkflowEvent parseWorkflowEventDone(Integer id, String data, String logID) {
71+
WorkflowEventDebugURL url = WorkflowEventDebugURL.fromJson(data);
72+
return WorkflowEvent.builder()
73+
.id(id)
74+
.event(WorkflowEventType.DONE)
75+
.debugUrl(url)
76+
.logID(logID)
77+
.build();
6978
}
7079

7180
public static WorkflowEvent parseEvent(Map<String, String> eventLine, String logID) {
@@ -80,7 +89,7 @@ public static WorkflowEvent parseEvent(Map<String, String> eventLine, String log
8089
} else if (WorkflowEventType.ERROR.equals(event)) {
8190
return parseWorkflowEventError(id, data, logID);
8291
} else if (WorkflowEventType.DONE.equals(event)) {
83-
return parseWorkflowEventDone(id, logID);
92+
return parseWorkflowEventDone(id, data, logID);
8493
}
8594
return parseWorkflowEventMessage(id, data, logID);
8695
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.coze.openapi.client.workflows.run.model;
2+
3+
import com.coze.openapi.service.utils.Utils;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class WorkflowEventDebugURL {
16+
@JsonProperty("debug_url")
17+
private String debugURL;
18+
19+
public static WorkflowEventDebugURL fromJson(String data) {
20+
return Utils.fromJson(data, WorkflowEventDebugURL.class);
21+
}
22+
}

api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventMessage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public class WorkflowEventMessage {
3434
@JsonProperty("node_is_finish")
3535
private boolean nodeIsFinish;
3636

37+
@JsonProperty("token")
38+
private Integer token;
39+
3740
/** Additional fields. */
3841
@JsonProperty("ext")
3942
private Map<String, Object> ext;

api/src/main/java/com/coze/openapi/service/service/conversation/MessageService.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,37 +70,48 @@ public PageResp<Message> list(@NotNull ListMessageReq req) {
7070

7171
String conversationID = req.getConversationID();
7272
Integer pageSize = req.getLimit();
73-
74-
// 创建分页获取器
75-
PageFetcher<Message> pageFetcher =
76-
request -> {
77-
req.setAfterID(request.getPageToken()); // 设置 lastID
78-
ListMessageResp resp = Utils.execute(api.list(conversationID, req, req));
79-
80-
return PageResponse.<Message>builder()
81-
.hasMore(resp.getData().size() >= pageSize)
82-
.data(resp.getData())
83-
.lastID(resp.getLastID()) // 使用 firstID 作为上一页的 token
84-
.nextID(resp.getFirstID()) // 使用 lastID 作为下一页的 token
85-
.build();
86-
};
73+
PageFetcher<Message> pageFetcher = getMessagePageFetcher(req, conversationID);
8774

8875
// 创建基于 token 的分页器
8976
TokenBasedPaginator<Message> paginator = new TokenBasedPaginator<>(pageFetcher, req.getLimit());
9077

9178
// 获取当前页数据
9279
PageRequest initialRequest =
93-
PageRequest.builder().pageSize(pageSize).pageToken(req.getBeforeID()).build();
80+
PageRequest.builder().pageSize(pageSize).pageToken(req.getAfterID()).build();
9481

9582
PageResponse<Message> currentPage = pageFetcher.fetch(initialRequest);
83+
paginator.setCurrentPage(currentPage);
9684

9785
return PageResp.<Message>builder()
9886
.items(currentPage.getData())
9987
.iterator(paginator)
100-
.lastID(currentPage.getNextID())
88+
.lastID(currentPage.getLastID())
89+
.firstID(currentPage.getFirstID())
90+
.hasMore(currentPage.isHasMore())
10191
.build();
10292
}
10393

94+
@NotNull
95+
private PageFetcher<Message> getMessagePageFetcher(
96+
@NotNull ListMessageReq req, String conversationID) {
97+
98+
// 创建分页获取器
99+
PageFetcher<Message> pageFetcher =
100+
request -> {
101+
// 当前迭代器仅支持向后翻页,若有向前翻页需求,请自行处理
102+
req.setAfterID(request.getPageToken());
103+
ListMessageResp resp = Utils.execute(api.list(conversationID, req, req));
104+
return PageResponse.<Message>builder()
105+
.hasMore(resp.isHasMore())
106+
.pageToken(resp.getLastID())
107+
.firstID(resp.getFirstID())
108+
.lastID(resp.getLastID())
109+
.data(resp.getData())
110+
.build();
111+
};
112+
return pageFetcher;
113+
}
114+
104115
/*
105116
* Get the detailed information of specified message.
106117

api/src/main/java/com/coze/openapi/service/utils/UserAgentInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public Response intercept(Chain chain) throws IOException {
2424
return chain.proceed(request);
2525
}
2626

27-
public static final String VERSION = "0.2.6";
27+
public static final String VERSION = "0.2.7";
2828
private static final ObjectMapper objectMapper = new ObjectMapper();
2929

3030
/** 获取操作系统版本 */

api/src/test/java/com/coze/openapi/service/service/workflow/WorkFlowRunServiceTest.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.coze.openapi.client.workflows.run.RunWorkflowReq;
1919
import com.coze.openapi.client.workflows.run.RunWorkflowResp;
2020
import com.coze.openapi.client.workflows.run.model.WorkflowEvent;
21+
import com.coze.openapi.client.workflows.run.model.WorkflowEventType;
2122
import com.coze.openapi.utils.Utils;
2223

2324
import io.reactivex.subscribers.TestSubscriber;
@@ -52,7 +53,7 @@ public class WorkFlowRunServiceTest {
5253
+ "\n"
5354
+ "id: 5\n"
5455
+ "event: Message\n"
55-
+ "data: {\"content\":\"{\\\"output\\\":\\\"为什么小明要带一把尺子去看电影?因为他听说电影很长,怕坐不下!\\\"}\",\"cost\":\"0.00\",\"node_is_finish\":true,\"node_seq_id\":\"0\",\"node_title\":\"\",\"token\":0}\n"
56+
+ "data: {\"content\":\"{\\\"output\\\":\\\"为什么小明要带一把尺子去看电影?因为他听说电影很长,怕坐不下!\\\"}\",\"cost\":\"0.00\",\"node_is_finish\":true,\"node_seq_id\":\"0\",\"node_title\":\"\",\"token\":1230}\n"
5657
+ "\n"
5758
+ "id: 0\n"
5859
+ "event: Error\n"
@@ -68,7 +69,7 @@ public class WorkFlowRunServiceTest {
6869
+ "\n"
6970
+ "id: 6\n"
7071
+ "event: Done\n"
71-
+ "data: {}";
72+
+ "data: {\"debug_url\":\"https://www.coze.cn/work_flow?***\"}";
7273

7374
@Mock private WorkflowRunAPI workflowRunAPI;
7475

@@ -84,9 +85,6 @@ public void setup() {
8485

8586
@Test
8687
void parseStreamEventTest() {
87-
// 准备请求数据
88-
RunWorkflowReq req = RunWorkflowReq.builder().workflowID("test-id").build();
89-
9088
// 准备 SSE 格式的响应数据
9189
// 使用 okio 的 Buffer 创建模拟的响应流
9290
ResponseBody responseBody =
@@ -101,6 +99,20 @@ void parseStreamEventTest() {
10199

102100
testSubscriber.assertNoErrors();
103101
testSubscriber.assertValueCount(10);
102+
testSubscriber
103+
.assertValueAt(
104+
5,
105+
event ->
106+
event.getEvent().equals(WorkflowEventType.MESSAGE)
107+
&& event.getMessage().getToken().equals(1230))
108+
.assertValueAt(
109+
9,
110+
event ->
111+
event.getEvent().equals(WorkflowEventType.DONE)
112+
&& event
113+
.getDebugUrl()
114+
.getDebugURL()
115+
.equals("https://www.coze.cn/work_flow?***"));
104116
}
105117

106118
@Test

0 commit comments

Comments
 (0)