diff --git a/api/pom.xml b/api/pom.xml
index 76d9b865..786480ac 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -43,7 +43,7 @@
coze-api
- 0.2.6
+ 0.2.7
scm:git:git://github.com/coze-dev/coze-java.git
diff --git a/api/src/main/java/com/coze/openapi/client/common/pagination/PageResp.java b/api/src/main/java/com/coze/openapi/client/common/pagination/PageResp.java
index cba883d8..e7707e92 100644
--- a/api/src/main/java/com/coze/openapi/client/common/pagination/PageResp.java
+++ b/api/src/main/java/com/coze/openapi/client/common/pagination/PageResp.java
@@ -17,6 +17,7 @@ public class PageResp {
private List items;
private Iterator iterator;
private Boolean hasMore;
- private String lastID;
+ private String lastID; // 当前页最后一条数据的 id
+ private String firstID; // 当前页第一条数据的 id
private String logID;
}
diff --git a/api/src/main/java/com/coze/openapi/client/common/pagination/PageResponse.java b/api/src/main/java/com/coze/openapi/client/common/pagination/PageResponse.java
index b24b4024..795e01d9 100644
--- a/api/src/main/java/com/coze/openapi/client/common/pagination/PageResponse.java
+++ b/api/src/main/java/com/coze/openapi/client/common/pagination/PageResponse.java
@@ -24,7 +24,9 @@ public class PageResponse {
private String lastID;
- private String nextID;
+ private String firstID;
+
+ private String pageToken;
private String logID;
}
diff --git a/api/src/main/java/com/coze/openapi/client/common/pagination/TokenBasedPaginator.java b/api/src/main/java/com/coze/openapi/client/common/pagination/TokenBasedPaginator.java
index 85c229c7..eaaf01ad 100644
--- a/api/src/main/java/com/coze/openapi/client/common/pagination/TokenBasedPaginator.java
+++ b/api/src/main/java/com/coze/openapi/client/common/pagination/TokenBasedPaginator.java
@@ -18,7 +18,6 @@ public class TokenBasedPaginator implements Iterator {
public TokenBasedPaginator(PageFetcher pageFetcher, int pageSize) {
this.pageFetcher = pageFetcher;
this.pageSize = pageSize;
- this.fetchNextPage();
}
private void fetchNextPage() {
@@ -28,14 +27,24 @@ private void fetchNextPage() {
logger.info(
"Fetched page: " + pageToken + " success, got" + currentPage.getData().size() + " items");
currentIterator = currentPage.getData().iterator();
- pageToken = currentPage.getNextID();
+ pageToken = currentPage.getPageToken();
} catch (Exception e) {
throw new RuntimeException("Failed to fetch page", e);
}
}
+ public void setCurrentPage(PageResponse currentPage) {
+ this.currentPage = currentPage;
+ this.pageToken = currentPage.getPageToken();
+ this.currentIterator = currentPage.getData().iterator();
+ }
+
@Override
public boolean hasNext() {
+ if (currentIterator == null) {
+ fetchNextPage();
+ return currentIterator.hasNext();
+ }
if (currentIterator.hasNext()) {
return true;
}
diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEvent.java b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEvent.java
index 34b29839..10b57e6a 100644
--- a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEvent.java
+++ b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEvent.java
@@ -34,6 +34,9 @@ public class WorkflowEvent extends BaseResp {
@JsonProperty("error")
private WorkflowEventError error;
+ @JsonProperty("debug_url")
+ private WorkflowEventDebugURL debugUrl;
+
private static WorkflowEvent parseWorkflowEventMessage(Integer id, String data, String logID) {
WorkflowEventMessage message = WorkflowEventMessage.fromJson(data);
return WorkflowEvent.builder()
@@ -64,8 +67,14 @@ private static WorkflowEvent parseWorkflowEventError(Integer id, String data, St
.build();
}
- private static WorkflowEvent parseWorkflowEventDone(Integer id, String logID) {
- return WorkflowEvent.builder().id(id).event(WorkflowEventType.DONE).logID(logID).build();
+ private static WorkflowEvent parseWorkflowEventDone(Integer id, String data, String logID) {
+ WorkflowEventDebugURL url = WorkflowEventDebugURL.fromJson(data);
+ return WorkflowEvent.builder()
+ .id(id)
+ .event(WorkflowEventType.DONE)
+ .debugUrl(url)
+ .logID(logID)
+ .build();
}
public static WorkflowEvent parseEvent(Map eventLine, String logID) {
@@ -80,7 +89,7 @@ public static WorkflowEvent parseEvent(Map eventLine, String log
} else if (WorkflowEventType.ERROR.equals(event)) {
return parseWorkflowEventError(id, data, logID);
} else if (WorkflowEventType.DONE.equals(event)) {
- return parseWorkflowEventDone(id, logID);
+ return parseWorkflowEventDone(id, data, logID);
}
return parseWorkflowEventMessage(id, data, logID);
}
diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventDebugURL.java b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventDebugURL.java
new file mode 100644
index 00000000..26043fb7
--- /dev/null
+++ b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventDebugURL.java
@@ -0,0 +1,22 @@
+package com.coze.openapi.client.workflows.run.model;
+
+import com.coze.openapi.service.utils.Utils;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkflowEventDebugURL {
+ @JsonProperty("debug_url")
+ private String debugURL;
+
+ public static WorkflowEventDebugURL fromJson(String data) {
+ return Utils.fromJson(data, WorkflowEventDebugURL.class);
+ }
+}
diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventMessage.java b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventMessage.java
index 581690c6..a0a50bb7 100644
--- a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventMessage.java
+++ b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowEventMessage.java
@@ -34,6 +34,9 @@ public class WorkflowEventMessage {
@JsonProperty("node_is_finish")
private boolean nodeIsFinish;
+ @JsonProperty("token")
+ private Integer token;
+
/** Additional fields. */
@JsonProperty("ext")
private Map ext;
diff --git a/api/src/main/java/com/coze/openapi/service/service/conversation/MessageService.java b/api/src/main/java/com/coze/openapi/service/service/conversation/MessageService.java
index 8623a4d9..020b5e36 100644
--- a/api/src/main/java/com/coze/openapi/service/service/conversation/MessageService.java
+++ b/api/src/main/java/com/coze/openapi/service/service/conversation/MessageService.java
@@ -70,37 +70,48 @@ public PageResp list(@NotNull ListMessageReq req) {
String conversationID = req.getConversationID();
Integer pageSize = req.getLimit();
-
- // 创建分页获取器
- PageFetcher pageFetcher =
- request -> {
- req.setAfterID(request.getPageToken()); // 设置 lastID
- ListMessageResp resp = Utils.execute(api.list(conversationID, req, req));
-
- return PageResponse.builder()
- .hasMore(resp.getData().size() >= pageSize)
- .data(resp.getData())
- .lastID(resp.getLastID()) // 使用 firstID 作为上一页的 token
- .nextID(resp.getFirstID()) // 使用 lastID 作为下一页的 token
- .build();
- };
+ PageFetcher pageFetcher = getMessagePageFetcher(req, conversationID);
// 创建基于 token 的分页器
TokenBasedPaginator paginator = new TokenBasedPaginator<>(pageFetcher, req.getLimit());
// 获取当前页数据
PageRequest initialRequest =
- PageRequest.builder().pageSize(pageSize).pageToken(req.getBeforeID()).build();
+ PageRequest.builder().pageSize(pageSize).pageToken(req.getAfterID()).build();
PageResponse currentPage = pageFetcher.fetch(initialRequest);
+ paginator.setCurrentPage(currentPage);
return PageResp.builder()
.items(currentPage.getData())
.iterator(paginator)
- .lastID(currentPage.getNextID())
+ .lastID(currentPage.getLastID())
+ .firstID(currentPage.getFirstID())
+ .hasMore(currentPage.isHasMore())
.build();
}
+ @NotNull
+ private PageFetcher getMessagePageFetcher(
+ @NotNull ListMessageReq req, String conversationID) {
+
+ // 创建分页获取器
+ PageFetcher pageFetcher =
+ request -> {
+ // 当前迭代器仅支持向后翻页,若有向前翻页需求,请自行处理
+ req.setAfterID(request.getPageToken());
+ ListMessageResp resp = Utils.execute(api.list(conversationID, req, req));
+ return PageResponse.builder()
+ .hasMore(resp.isHasMore())
+ .pageToken(resp.getLastID())
+ .firstID(resp.getFirstID())
+ .lastID(resp.getLastID())
+ .data(resp.getData())
+ .build();
+ };
+ return pageFetcher;
+ }
+
/*
* Get the detailed information of specified message.
diff --git a/api/src/main/java/com/coze/openapi/service/utils/UserAgentInterceptor.java b/api/src/main/java/com/coze/openapi/service/utils/UserAgentInterceptor.java
index fda778cd..94e8596e 100644
--- a/api/src/main/java/com/coze/openapi/service/utils/UserAgentInterceptor.java
+++ b/api/src/main/java/com/coze/openapi/service/utils/UserAgentInterceptor.java
@@ -24,7 +24,7 @@ public Response intercept(Chain chain) throws IOException {
return chain.proceed(request);
}
- public static final String VERSION = "0.2.6";
+ public static final String VERSION = "0.2.7";
private static final ObjectMapper objectMapper = new ObjectMapper();
/** 获取操作系统版本 */
diff --git a/api/src/test/java/com/coze/openapi/service/service/workflow/WorkFlowRunServiceTest.java b/api/src/test/java/com/coze/openapi/service/service/workflow/WorkFlowRunServiceTest.java
index 6d291014..19064c66 100644
--- a/api/src/test/java/com/coze/openapi/service/service/workflow/WorkFlowRunServiceTest.java
+++ b/api/src/test/java/com/coze/openapi/service/service/workflow/WorkFlowRunServiceTest.java
@@ -18,6 +18,7 @@
import com.coze.openapi.client.workflows.run.RunWorkflowReq;
import com.coze.openapi.client.workflows.run.RunWorkflowResp;
import com.coze.openapi.client.workflows.run.model.WorkflowEvent;
+import com.coze.openapi.client.workflows.run.model.WorkflowEventType;
import com.coze.openapi.utils.Utils;
import io.reactivex.subscribers.TestSubscriber;
@@ -52,7 +53,7 @@ public class WorkFlowRunServiceTest {
+ "\n"
+ "id: 5\n"
+ "event: Message\n"
- + "data: {\"content\":\"{\\\"output\\\":\\\"为什么小明要带一把尺子去看电影?因为他听说电影很长,怕坐不下!\\\"}\",\"cost\":\"0.00\",\"node_is_finish\":true,\"node_seq_id\":\"0\",\"node_title\":\"\",\"token\":0}\n"
+ + "data: {\"content\":\"{\\\"output\\\":\\\"为什么小明要带一把尺子去看电影?因为他听说电影很长,怕坐不下!\\\"}\",\"cost\":\"0.00\",\"node_is_finish\":true,\"node_seq_id\":\"0\",\"node_title\":\"\",\"token\":1230}\n"
+ "\n"
+ "id: 0\n"
+ "event: Error\n"
@@ -68,7 +69,7 @@ public class WorkFlowRunServiceTest {
+ "\n"
+ "id: 6\n"
+ "event: Done\n"
- + "data: {}";
+ + "data: {\"debug_url\":\"https://www.coze.cn/work_flow?***\"}";
@Mock private WorkflowRunAPI workflowRunAPI;
@@ -84,9 +85,6 @@ public void setup() {
@Test
void parseStreamEventTest() {
- // 准备请求数据
- RunWorkflowReq req = RunWorkflowReq.builder().workflowID("test-id").build();
-
// 准备 SSE 格式的响应数据
// 使用 okio 的 Buffer 创建模拟的响应流
ResponseBody responseBody =
@@ -101,6 +99,20 @@ void parseStreamEventTest() {
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(10);
+ testSubscriber
+ .assertValueAt(
+ 5,
+ event ->
+ event.getEvent().equals(WorkflowEventType.MESSAGE)
+ && event.getMessage().getToken().equals(1230))
+ .assertValueAt(
+ 9,
+ event ->
+ event.getEvent().equals(WorkflowEventType.DONE)
+ && event
+ .getDebugUrl()
+ .getDebugURL()
+ .equals("https://www.coze.cn/work_flow?***"));
}
@Test
diff --git a/example/pom.xml b/example/pom.xml
index f59f3cc8..3c6fc613 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -16,7 +16,7 @@
com.coze
coze-api
- 0.2.6
+ 0.2.7