Skip to content

Commit 3019110

Browse files
committed
OpenAI: use supportedCapabilities(RESPONSE_FORMAT_JSON_SCHEMA) instead of responseFormat("json_schema") to enable structured outputs with JSON schema
1 parent f6ce3c7 commit 3019110

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

langchain4j-open-ai-spring-boot-starter/src/main/java/dev/langchain4j/openai/spring/AutoConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ OpenAiChatModel openAiChatModel(
6767
.frequencyPenalty(chatModelProperties.frequencyPenalty())
6868
.logitBias(chatModelProperties.logitBias())
6969
.responseFormat(chatModelProperties.responseFormat())
70+
.supportedCapabilities(chatModelProperties.supportedCapabilities())
7071
.strictJsonSchema(chatModelProperties.strictJsonSchema())
7172
.seed(chatModelProperties.seed())
7273
.user(chatModelProperties.user())

langchain4j-open-ai-spring-boot-starter/src/main/java/dev/langchain4j/openai/spring/ChatModelProperties.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package dev.langchain4j.openai.spring;
22

3+
import dev.langchain4j.model.chat.Capability;
4+
35
import java.time.Duration;
46
import java.util.List;
57
import java.util.Map;
8+
import java.util.Set;
69

710
record ChatModelProperties(
811
String baseUrl,
@@ -19,6 +22,7 @@ record ChatModelProperties(
1922
Double frequencyPenalty,
2023
Map<String, Integer> logitBias,
2124
String responseFormat,
25+
Set<Capability> supportedCapabilities,
2226
Boolean strictJsonSchema,
2327
Integer seed,
2428
String user,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.langchain4j.service.spring.mode.automatic.withStructuredOutput;
2+
3+
import dev.langchain4j.service.spring.AiService;
4+
5+
@AiService
6+
interface AiServiceWithStructuredOutput {
7+
8+
Person extractPersonFrom(String text);
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.langchain4j.service.spring.mode.automatic.withStructuredOutput;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
class AiServiceWithStructuredOutputApplication {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(AiServiceWithStructuredOutputApplication.class, args);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.langchain4j.service.spring.mode.automatic.withStructuredOutput;
2+
3+
import dev.langchain4j.service.spring.AiServicesAutoConfig;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.boot.autoconfigure.AutoConfigurations;
6+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
7+
8+
import static dev.langchain4j.service.spring.mode.ApiKeys.OPENAI_API_KEY;
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
class AiServiceWithStructuredOutputIT {
12+
13+
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
14+
.withConfiguration(AutoConfigurations.of(AiServicesAutoConfig.class));
15+
16+
@Test
17+
void should_create_AI_service_with_structured_output() {
18+
contextRunner
19+
.withPropertyValues(
20+
"langchain4j.open-ai.chat-model.api-key=" + OPENAI_API_KEY,
21+
"langchain4j.open-ai.chat-model.model-name=gpt-4o-mini",
22+
"langchain4j.open-ai.chat-model.supported-capabilities=[RESPONSE_FORMAT_JSON_SCHEMA]",
23+
"langchain4j.open-ai.chat-model.strict-schema=true",
24+
"langchain4j.open-ai.chat-model.temperature=0.0"
25+
)
26+
.withUserConfiguration(AiServiceWithStructuredOutputApplication.class)
27+
.run(context -> {
28+
29+
// given
30+
AiServiceWithStructuredOutput aiService = context.getBean(AiServiceWithStructuredOutput.class);
31+
32+
// when
33+
Person person = aiService.extractPersonFrom("Klaus is 42 years old");
34+
35+
// then
36+
assertThat(person).isEqualTo(new Person("Klaus", 42));
37+
});
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package dev.langchain4j.service.spring.mode.automatic.withStructuredOutput;
2+
3+
public record Person(String name, int age) {
4+
}

0 commit comments

Comments
 (0)