From 5cb2fa51db9ec93b892c7ce888f6a2385a211e91 Mon Sep 17 00:00:00 2001 From: chyroc Date: Tue, 5 Aug 2025 23:09:48 +0800 Subject: [PATCH 1/2] feat: Add usage field support to workflow interfaces - Add usage field to workflow run interface (RunWorkflowResp, WorkflowRunResult) - Add usage field to workflow stream_run interface (WorkflowEventMessage) - Add usage field to workflow get history interface (WorkflowRunHistory) - Update test cases to verify usage field functionality - Follow same pattern as existing ChatUsage class - Align with Python and Go SDK implementations Usage field provides token consumption information: - token_count: Total tokens used - input_count: Tokens used for input - output_count: Tokens used for output Fixes: Support for usage field in workflow APIs as per API documentation --- .gitignore | 6 +++++- api/pom.xml | 2 +- .../client/workflows/run/RunWorkflowResp.java | 5 +++++ .../run/model/WorkflowEventMessage.java | 5 +++++ .../workflows/run/model/WorkflowRunHistory.java | 5 +++++ .../workflows/run/model/WorkflowRunResult.java | 5 +++++ .../workflow/WorkFlowRunServiceTest.java | 16 ++++++++++++++-- .../workflow/WorkflowRunHistoryServiceTest.java | 17 +++++++++++++++-- example/pom.xml | 2 +- 9 files changed, 56 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 1fe5b781..ea6f27c2 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,8 @@ replay_pid* # BlueJ files *.ctxt -**/target \ No newline at end of file +**/target + +# ai +.serena/ +CLAUDE.md diff --git a/api/pom.xml b/api/pom.xml index 3a12a3d3..45b37212 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -43,7 +43,7 @@ coze-api - 0.4.1 + 0.5.0 scm:git:git://github.com/coze-dev/coze-java.git diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/RunWorkflowResp.java b/api/src/main/java/com/coze/openapi/client/workflows/run/RunWorkflowResp.java index 79d50c92..f098e013 100644 --- a/api/src/main/java/com/coze/openapi/client/workflows/run/RunWorkflowResp.java +++ b/api/src/main/java/com/coze/openapi/client/workflows/run/RunWorkflowResp.java @@ -1,5 +1,6 @@ package com.coze.openapi.client.workflows.run; +import com.coze.openapi.client.chat.model.ChatUsage; import com.coze.openapi.client.common.BaseResponse; import com.fasterxml.jackson.annotation.JsonProperty; @@ -36,4 +37,8 @@ public class RunWorkflowResp extends BaseResponse { @JsonProperty("cost") private String cost; + + /** Token usage information for the workflow execution. */ + @JsonProperty("usage") + private ChatUsage usage; } 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 a0a50bb7..47aa7015 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 @@ -2,6 +2,7 @@ import java.util.Map; +import com.coze.openapi.client.chat.model.ChatUsage; import com.coze.openapi.service.utils.Utils; import com.fasterxml.jackson.annotation.JsonProperty; @@ -41,6 +42,10 @@ public class WorkflowEventMessage { @JsonProperty("ext") private Map ext; + /** Token usage information for the workflow execution. */ + @JsonProperty("usage") + private ChatUsage usage; + public static WorkflowEventMessage fromJson(String data) { return Utils.fromJson(data, WorkflowEventMessage.class); } diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunHistory.java b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunHistory.java index 8e7b9946..5c58258d 100644 --- a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunHistory.java +++ b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunHistory.java @@ -1,5 +1,6 @@ package com.coze.openapi.client.workflows.run.model; +import com.coze.openapi.client.chat.model.ChatUsage; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -87,4 +88,8 @@ public class WorkflowRunHistory { */ @JsonProperty("debug_url") private String debugUrl; + + /** Token usage information for the workflow execution. */ + @JsonProperty("usage") + private ChatUsage usage; } diff --git a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunResult.java b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunResult.java index c929ca1b..31e8ca34 100644 --- a/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunResult.java +++ b/api/src/main/java/com/coze/openapi/client/workflows/run/model/WorkflowRunResult.java @@ -1,5 +1,6 @@ package com.coze.openapi.client.workflows.run.model; +import com.coze.openapi.client.chat.model.ChatUsage; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -29,4 +30,8 @@ public class WorkflowRunResult { */ @JsonProperty("execute_id") private String executeID; + + /** Token usage information for the workflow execution. */ + @JsonProperty("usage") + private ChatUsage usage; } 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 70dfccc0..f90845d6 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 @@ -15,6 +15,7 @@ import com.coze.openapi.api.WorkflowRunAPI; import com.coze.openapi.api.WorkflowRunHistoryAPI; +import com.coze.openapi.client.chat.model.ChatUsage; 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; @@ -53,7 +54,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\":1230}\n" + + "data: {\"content\":\"{\\\"output\\\":\\\"为什么小明要带一把尺子去看电影?因为他听说电影很长,怕坐不下!\\\"}\",\"cost\":\"0.00\",\"node_is_finish\":true,\"node_seq_id\":\"0\",\"node_title\":\"\",\"token\":1230,\"usage\":{\"token_count\":1230,\"input_count\":615,\"output_count\":615}}\n" + "\n" + "id: 0\n" + "event: Error\n" @@ -104,7 +105,11 @@ void parseStreamEventTest() { 5, event -> event.getEvent().equals(WorkflowEventType.MESSAGE) - && event.getMessage().getToken().equals(1230)) + && event.getMessage().getToken().equals(1230) + && event.getMessage().getUsage() != null + && event.getMessage().getUsage().getTokenCount() == 1230 + && event.getMessage().getUsage().getInputCount() == 615 + && event.getMessage().getUsage().getOutputCount() == 615) .assertValueAt( 9, event -> @@ -123,6 +128,8 @@ void testCreate() throws Exception { RunWorkflowReq req = RunWorkflowReq.builder().workflowID(workflowID).build(); + ChatUsage usage = ChatUsage.builder().tokenCount(100).inputCount(50).outputCount(50).build(); + RunWorkflowResp baseResponse = RunWorkflowResp.builder() .code(0) @@ -130,6 +137,7 @@ void testCreate() throws Exception { .executeID(executeID) .logID(Utils.TEST_LOG_ID) .data("data") + .usage(usage) .build(); // 创建 mock Call 对象 @@ -143,6 +151,10 @@ void testCreate() throws Exception { // 验证结果 assertNotNull(result); assertEquals(executeID, result.getExecuteID()); + assertNotNull(result.getUsage()); + assertEquals(100, result.getUsage().getTokenCount()); + assertEquals(50, result.getUsage().getInputCount()); + assertEquals(50, result.getUsage().getOutputCount()); } @Test diff --git a/api/src/test/java/com/coze/openapi/service/service/workflow/WorkflowRunHistoryServiceTest.java b/api/src/test/java/com/coze/openapi/service/service/workflow/WorkflowRunHistoryServiceTest.java index 54fa38a6..c00355cc 100644 --- a/api/src/test/java/com/coze/openapi/service/service/workflow/WorkflowRunHistoryServiceTest.java +++ b/api/src/test/java/com/coze/openapi/service/service/workflow/WorkflowRunHistoryServiceTest.java @@ -15,6 +15,7 @@ import org.mockito.MockitoAnnotations; import com.coze.openapi.api.WorkflowRunHistoryAPI; +import com.coze.openapi.client.chat.model.ChatUsage; import com.coze.openapi.client.common.BaseResponse; import com.coze.openapi.client.workflows.run.RetrieveRunHistoryReq; import com.coze.openapi.client.workflows.run.RetrieveRunHistoryResp; @@ -44,10 +45,14 @@ void testRetrieve() throws Exception { RetrieveRunHistoryReq req = RetrieveRunHistoryReq.builder().workflowID(workflowId).executeID(executeId).build(); + ChatUsage usage1 = ChatUsage.builder().tokenCount(150).inputCount(75).outputCount(75).build(); + + ChatUsage usage2 = ChatUsage.builder().tokenCount(200).inputCount(100).outputCount(100).build(); + List histories = Arrays.asList( - WorkflowRunHistory.builder().executeID("node1").build(), - WorkflowRunHistory.builder().executeID("node2").build()); + WorkflowRunHistory.builder().executeID("node1").usage(usage1).build(), + WorkflowRunHistory.builder().executeID("node2").usage(usage2).build()); BaseResponse> baseResponse = BaseResponse.>builder() @@ -71,5 +76,13 @@ void testRetrieve() throws Exception { assertEquals(2, result.getHistories().size()); assertEquals("node1", result.getHistories().get(0).getExecuteID()); assertEquals(Utils.TEST_LOG_ID, result.getLogID()); + assertNotNull(result.getHistories().get(0).getUsage()); + assertEquals(150, result.getHistories().get(0).getUsage().getTokenCount()); + assertEquals(75, result.getHistories().get(0).getUsage().getInputCount()); + assertEquals(75, result.getHistories().get(0).getUsage().getOutputCount()); + assertNotNull(result.getHistories().get(1).getUsage()); + assertEquals(200, result.getHistories().get(1).getUsage().getTokenCount()); + assertEquals(100, result.getHistories().get(1).getUsage().getInputCount()); + assertEquals(100, result.getHistories().get(1).getUsage().getOutputCount()); } } diff --git a/example/pom.xml b/example/pom.xml index 76914caa..41ea0544 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -16,7 +16,7 @@ com.coze coze-api - 0.4.1 + 0.5.0 From a2939590e69386bfe6dfbd060f6af3a91165737a Mon Sep 17 00:00:00 2001 From: chyroc Date: Wed, 6 Aug 2025 16:17:03 +0800 Subject: [PATCH 2/2] update --- api/pom.xml | 2 +- example/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 45b37212..57819e01 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -43,7 +43,7 @@ coze-api - 0.5.0 + 0.4.2 scm:git:git://github.com/coze-dev/coze-java.git diff --git a/example/pom.xml b/example/pom.xml index 41ea0544..c8579637 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -16,7 +16,7 @@ com.coze coze-api - 0.5.0 + 0.4.2