From d12f2114bee323601c87ef0e5c8f3cb71e25b0b8 Mon Sep 17 00:00:00 2001 From: Catchpowle Date: Tue, 21 Jul 2026 14:13:29 +0100 Subject: [PATCH] Add reason_code to Finish Conversation Add an optional reason_code field to FinishConversationRequest, mapped to the JSON key `reason_code`, so callers can set a validated finish reason code (e.g. customer-ended-chat, customer-unresponsive) alongside the existing free-text reason. The field is optional, so existing builder usages compile unchanged. Co-Authored-By: Claude Fable 5 --- .../request/FinishConversationRequest.java | 14 +++++++ .../FinishConversationRequestTest.java | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 gradient-labs-client/src/test/java/ai/gradientlabs/client/request/FinishConversationRequestTest.java diff --git a/gradient-labs-client/src/main/java/ai/gradientlabs/client/request/FinishConversationRequest.java b/gradient-labs-client/src/main/java/ai/gradientlabs/client/request/FinishConversationRequest.java index 19b7623..a06ac92 100644 --- a/gradient-labs-client/src/main/java/ai/gradientlabs/client/request/FinishConversationRequest.java +++ b/gradient-labs-client/src/main/java/ai/gradientlabs/client/request/FinishConversationRequest.java @@ -12,8 +12,12 @@ public class FinishConversationRequest { @JsonProperty("reason") private final String reason; + @JsonProperty("reason_code") + private final String reasonCode; + private FinishConversationRequest(Builder builder) { this.reason = builder.reason; + this.reasonCode = builder.reasonCode; } public static Builder builder() { @@ -28,8 +32,13 @@ public String getReason() { return reason; } + public String getReasonCode() { + return reasonCode; + } + public static class Builder { private String reason; + private String reasonCode; private Builder() { } @@ -39,6 +48,11 @@ public Builder reason(String reason) { return this; } + public Builder reasonCode(String reasonCode) { + this.reasonCode = reasonCode; + return this; + } + public FinishConversationRequest build() { return new FinishConversationRequest(this); } diff --git a/gradient-labs-client/src/test/java/ai/gradientlabs/client/request/FinishConversationRequestTest.java b/gradient-labs-client/src/test/java/ai/gradientlabs/client/request/FinishConversationRequestTest.java new file mode 100644 index 0000000..ccec68c --- /dev/null +++ b/gradient-labs-client/src/test/java/ai/gradientlabs/client/request/FinishConversationRequestTest.java @@ -0,0 +1,39 @@ +package ai.gradientlabs.client.request; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +class FinishConversationRequestTest { + + private final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + + @Test + void serializesReasonCode() throws Exception { + FinishConversationRequest request = FinishConversationRequest.builder() + .reason("The customer said goodbye") + .reasonCode("customer-ended-chat") + .build(); + + JsonNode json = objectMapper.valueToTree(request); + + assertEquals("The customer said goodbye", json.get("reason").asText()); + assertEquals("customer-ended-chat", json.get("reason_code").asText()); + assertEquals("customer-ended-chat", request.getReasonCode()); + } + + @Test + void omitsReasonCodeWhenNotSet() throws Exception { + FinishConversationRequest request = FinishConversationRequest.builder() + .reason("The customer said goodbye") + .build(); + + JsonNode json = objectMapper.valueToTree(request); + + assertFalse(json.has("reason_code")); + } +}