这是indexloc提供的服务,不要输入任何密码
Skip to content

make strict work for function definition #74

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ public FunctionDefinition build() {
}
FunctionDefinition functionDefinition = new FunctionDefinition();
functionDefinition.name = name;
functionDefinition.strict = strict;
functionDefinition.description = description;
functionDefinition.parametersDefinitionClass = parametersDefinitionClass;
functionDefinition.parametersDefinition = parametersDefinition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public void serialize(FunctionDefinition value, JsonGenerator gen, SerializerPro
parameterSchema.remove("$schema");
parameterSchema.remove("title");
parameterSchema.remove("additionalProperties");
if (Boolean.TRUE == value.getStrict()) {
parameterSchema.put("additionalProperties", Boolean.FALSE);
}
gen.writeRawValue(JsonUtil.writeValueAsString(parameterSchema));
} else {
gen.writeFieldName("parameters");
Expand Down
135 changes: 135 additions & 0 deletions api/src/test/java/com/theokanning/openai/FunctionDefinitionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package com.theokanning.openai;


import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.theokanning.openai.function.FunctionDefinition;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

class FunctionDefinitionTest {

private final ObjectMapper objectMapper = new ObjectMapper();

class TestParameters {
public String name;
}

@Test
void shouldSerializeWithStrictTrue() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.builder()
.name("test_function")
.description("Test function")
.strict(true)
.build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);

// then
assertEquals(jsonNode.get("name").asText(), "test_function");
assertEquals(jsonNode.get("description").asText(),"Test function");
assertTrue(jsonNode.get("strict").asBoolean());
}

@Test
void shouldSerializeWithStrictFalse() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.builder()
.name("test_function")
.description("Test function")
.strict(false)
.build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);

// then
assertEquals("test_function", jsonNode.get("name").asText());
assertEquals("Test function", jsonNode.get("description").asText());
assertFalse(jsonNode.get("strict").asBoolean());
}

@Test
void shouldSerializeWithoutStrict() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.builder().name("test_function").description("Test function").build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);

// then
assertEquals("test_function", jsonNode.get("name").asText());
assertEquals("Test function", jsonNode.get("description").asText());
assertFalse(jsonNode.has("strict"));
}

@Test
void shouldSetAdditionalPropertiesFalseWhenStrictIsTrue() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.<TestParameters>builder()
.name("test_function")
.description("Test function")
.strict(true)
.parametersDefinitionByClass(TestParameters.class)
.build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);
JsonNode parametersNode = jsonNode.get("parameters");

// then
assertFalse(parametersNode.get("additionalProperties").asBoolean());
}

@Test
void whenStrictIsFalse() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.<TestParameters>builder()
.name("test_function")
.description("Test function")
.strict(false)
.parametersDefinitionByClass(TestParameters.class)
.build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);
JsonNode parametersNode = jsonNode.get("parameters");

// then
assertFalse(parametersNode.has("additionalProperties"));
}

@Test
void shouldNotSetAdditionalPropertiesWhenStrictIsNull() throws Exception {
// given
FunctionDefinition function =
FunctionDefinition.<TestParameters>builder()
.name("test_function")
.description("Test function")
.parametersDefinitionByClass(TestParameters.class)
.build();

// when
String json = objectMapper.writeValueAsString(function);
JsonNode jsonNode = objectMapper.readTree(json);
JsonNode parametersNode = jsonNode.get("parameters");

// then
assertFalse(parametersNode.has("additionalProperties"));
}
}