Skip to content

Commit bd94a0b

Browse files
feat(api): adds GPT-5 and new API features: platform.openai.com/docs/guides/gpt-5
1 parent b95b355 commit bd94a0b

File tree

345 files changed

+106313
-1024
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

345 files changed

+106313
-1024
lines changed

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 88
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-d6a16b25b969c3e5382e7d413de15bf83d5f7534d5c3ecce64d3a7e847418f9e.yml
3-
openapi_spec_hash: 0c0bcf4aee9ca2a948dd14b890dfe728
4-
config_hash: aeff9289bd7f8c8482e4d738c3c2fde1
1+
configured_endpoints: 111
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-f5c45f4ae5c2075cbc603d6910bba3da31c23714c209fbd3fd82a94f634a126b.yml
3+
openapi_spec_hash: 3eb8d86c06f0bb5e1190983e5acfc9ba
4+
config_hash: 9a64321968e21ed72f5c0e02164ea00d

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ OpenAIClient client = OpenAIOkHttpClient.fromEnv();
8282

8383
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
8484
.addUserMessage("Say this is a test")
85-
.model(ChatModel.GPT_4_1)
85+
.model(ChatModel.GPT_5)
8686
.build();
8787
ChatCompletion chatCompletion = client.chat().completions().create(params);
8888
```
@@ -188,7 +188,7 @@ OpenAIClient client = OpenAIOkHttpClient.fromEnv();
188188

189189
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
190190
.addUserMessage("Say this is a test")
191-
.model(ChatModel.GPT_4_1)
191+
.model(ChatModel.GPT_5)
192192
.build();
193193
CompletableFuture<ChatCompletion> chatCompletion = client.async().chat().completions().create(params);
194194
```
@@ -209,7 +209,7 @@ OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv();
209209

210210
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
211211
.addUserMessage("Say this is a test")
212-
.model(ChatModel.GPT_4_1)
212+
.model(ChatModel.GPT_5)
213213
.build();
214214
CompletableFuture<ChatCompletion> chatCompletion = client.chat().completions().create(params);
215215
```
@@ -1131,7 +1131,7 @@ import com.openai.models.chat.completions.ChatCompletionCreateParams;
11311131

11321132
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
11331133
.addUserMessage("Say this is a test")
1134-
.model(ChatModel.GPT_4_1)
1134+
.model(ChatModel.GPT_5)
11351135
.build();
11361136
HttpResponseFor<ChatCompletion> chatCompletion = client.chat().completions().withRawResponse().create(params);
11371137

@@ -1597,7 +1597,7 @@ import com.openai.models.chat.completions.ChatCompletionCreateParams;
15971597

15981598
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
15991599
.messages(JsonValue.from(42))
1600-
.model(ChatModel.GPT_4_1)
1600+
.model(ChatModel.GPT_5)
16011601
.build();
16021602
```
16031603

@@ -1650,7 +1650,7 @@ import com.openai.models.ChatModel;
16501650
import com.openai.models.chat.completions.ChatCompletionCreateParams;
16511651

16521652
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
1653-
.model(ChatModel.GPT_4_1)
1653+
.model(ChatModel.GPT_5)
16541654
.messages(JsonMissing.of())
16551655
.build();
16561656
```

openai-java-core/src/main/kotlin/com/openai/core/StructuredOutputs.kt

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.github.victools.jsonschema.module.swagger2.Swagger2Module
1616
import com.openai.errors.OpenAIInvalidDataException
1717
import com.openai.models.FunctionDefinition
1818
import com.openai.models.ResponseFormatJsonSchema
19+
import com.openai.models.chat.completions.ChatCompletionFunctionTool
1920
import com.openai.models.chat.completions.ChatCompletionTool
2021
import com.openai.models.responses.FunctionTool
2122
import com.openai.models.responses.ResponseFormatTextJsonSchemaConfig
@@ -149,19 +150,21 @@ internal fun functionToolFromClass(
149150
): ChatCompletionTool {
150151
val functionInfo = extractFunctionInfo(parametersType, localValidation)
151152

152-
return ChatCompletionTool.builder()
153-
.function(
154-
FunctionDefinition.builder()
155-
.name(functionInfo.name)
156-
.apply { functionInfo.description?.let(::description) }
157-
.parameters(JsonValue.fromJsonNode(functionInfo.schema))
158-
// OpenAI: "Setting strict to true will ensure function calls reliably adhere to the
159-
// function schema, instead of being best effort. We recommend always enabling
160-
// strict mode."
161-
.strict(true)
162-
.build()
163-
)
164-
.build()
153+
return ChatCompletionTool.ofFunction(
154+
ChatCompletionFunctionTool.builder()
155+
.function(
156+
FunctionDefinition.builder()
157+
.name(functionInfo.name)
158+
.apply { functionInfo.description?.let(::description) }
159+
.parameters(JsonValue.fromJsonNode(functionInfo.schema))
160+
// OpenAI: "Setting strict to true will ensure function calls reliably adhere to
161+
// the function schema, instead of being best effort. We recommend always
162+
// enabling strict mode."
163+
.strict(true)
164+
.build()
165+
)
166+
.build()
167+
)
165168
}
166169

167170
/**

openai-java-core/src/main/kotlin/com/openai/core/handlers/SseHandler.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,10 @@ private class SseState(
134134
}
135135

136136
@JvmSynthetic
137-
internal inline fun <reified T> Handler<StreamResponse<SseMessage>>.mapJson():
138-
Handler<StreamResponse<T>> =
137+
internal inline fun <reified T> Handler<StreamResponse<SseMessage>>.mapJson(
138+
includeEventAndData: Boolean = false
139+
): Handler<StreamResponse<T>> =
139140
object : Handler<StreamResponse<T>> {
140141
override fun handle(response: HttpResponse): StreamResponse<T> =
141-
this@mapJson.handle(response).map { it.json<T>() }
142+
this@mapJson.handle(response).map { it.json<T>(includeEventAndData) }
142143
}

openai-java-core/src/main/kotlin/com/openai/core/http/SseMessage.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,21 @@ private constructor(
4141
fun build(): SseMessage = SseMessage(jsonMapper!!, event, data, id, retry)
4242
}
4343

44-
inline fun <reified T> json(): T =
44+
inline fun <reified T> json(includeEventAndData: Boolean = false): T {
45+
var jsonNode = jsonNode
46+
if (includeEventAndData) {
47+
val newJsonNode = jsonMapper.createObjectNode()
48+
event?.let { newJsonNode.put("event", event) }
49+
newJsonNode.replace("data", jsonNode)
50+
jsonNode = newJsonNode
51+
}
52+
4553
try {
46-
jsonMapper.readerFor(jacksonTypeRef<T>()).readValue(jsonNode)
54+
return jsonMapper.readerFor(jacksonTypeRef<T>()).readValue(jsonNode)
4755
} catch (e: Exception) {
4856
throw OpenAIInvalidDataException("Error reading response", e)
4957
}
58+
}
5059

5160
private val jsonNode by lazy {
5261
try {

openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ package com.openai.helpers
33
import com.openai.core.JsonNull
44
import com.openai.core.JsonValue
55
import com.openai.errors.OpenAIInvalidDataException
6-
import com.openai.models.chat.completions.ChatCompletion
7-
import com.openai.models.chat.completions.ChatCompletionChunk
8-
import com.openai.models.chat.completions.ChatCompletionMessage
9-
import com.openai.models.chat.completions.ChatCompletionMessageToolCall
10-
import com.openai.models.chat.completions.StructuredChatCompletion
6+
import com.openai.models.chat.completions.*
117
import java.util.Optional
128
import kotlin.jvm.optionals.getOrNull
139

@@ -74,14 +70,17 @@ class ChatCompletionAccumulator private constructor() {
7470
* of each tool call in the message's list of tool calls (the tool call index).
7571
*/
7672
private val toolCallBuilders =
77-
mutableMapOf<Long, MutableMap<Long, ChatCompletionMessageToolCall.Builder>>()
73+
mutableMapOf<Long, MutableMap<Long, ChatCompletionMessageFunctionToolCall.Builder>>()
7874

7975
/**
8076
* The accumulated tool call function builders for the tool call builders of each message. The
8177
* entries correspond to those in [toolCallBuilders].
8278
*/
8379
private val toolCallFunctionBuilders =
84-
mutableMapOf<Long, MutableMap<Long, ChatCompletionMessageToolCall.Function.Builder>>()
80+
mutableMapOf<
81+
Long,
82+
MutableMap<Long, ChatCompletionMessageFunctionToolCall.Function.Builder>,
83+
>()
8584

8685
/**
8786
* The accumulated tool call function arguments that will be set on the function builders when
@@ -278,7 +277,7 @@ class ChatCompletionAccumulator private constructor() {
278277
val messageToolCallBuilders = toolCallBuilders.getOrPut(index) { mutableMapOf() }
279278

280279
messageToolCallBuilders.getOrPut(deltaToolCall.index()) {
281-
ChatCompletionMessageToolCall.builder()
280+
ChatCompletionMessageFunctionToolCall.builder()
282281
.id(deltaToolCall._id())
283282
.additionalProperties(deltaToolCall._additionalProperties())
284283
// Must wait until the `function` is accumulated and built before adding it to
@@ -289,7 +288,7 @@ class ChatCompletionAccumulator private constructor() {
289288
toolCallFunctionBuilders.getOrPut(index) { mutableMapOf() }
290289

291290
messageToolCallFunctionBuilders.getOrPut(deltaToolCall.index()) {
292-
ChatCompletionMessageToolCall.Function.builder()
291+
ChatCompletionMessageFunctionToolCall.Function.builder()
293292
.name(ensureFunction(deltaToolCall.function())._name())
294293
.additionalProperties(deltaToolCall._additionalProperties())
295294
}
@@ -338,10 +337,10 @@ class ChatCompletionAccumulator private constructor() {
338337
toolCallBuilders[index]
339338
?.entries
340339
?.sortedBy { it.key }
341-
?.map { messageToolCallBuilderEntry ->
342-
messageToolCallBuilderEntry.value
343-
.function(buildFunction(index, messageToolCallBuilderEntry.key))
344-
.build()
340+
?.map { (toolCallIndex, toolCallBuilder) ->
341+
ChatCompletionMessageToolCall.ofFunction(
342+
toolCallBuilder.function(buildFunction(index, toolCallIndex)).build()
343+
)
345344
} ?: listOf()
346345

347346
private fun buildFunction(index: Long, toolCallIndex: Long) =

openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import com.openai.models.responses.ResponseCompletedEvent
1515
import com.openai.models.responses.ResponseContentPartAddedEvent
1616
import com.openai.models.responses.ResponseContentPartDoneEvent
1717
import com.openai.models.responses.ResponseCreatedEvent
18+
import com.openai.models.responses.ResponseCustomToolCallInputDeltaEvent
19+
import com.openai.models.responses.ResponseCustomToolCallInputDoneEvent
1820
import com.openai.models.responses.ResponseErrorEvent
1921
import com.openai.models.responses.ResponseFailedEvent
2022
import com.openai.models.responses.ResponseFileSearchCallCompletedEvent
@@ -40,12 +42,12 @@ import com.openai.models.responses.ResponseOutputItemAddedEvent
4042
import com.openai.models.responses.ResponseOutputItemDoneEvent
4143
import com.openai.models.responses.ResponseOutputTextAnnotationAddedEvent
4244
import com.openai.models.responses.ResponseQueuedEvent
43-
import com.openai.models.responses.ResponseReasoningSummaryDeltaEvent
44-
import com.openai.models.responses.ResponseReasoningSummaryDoneEvent
4545
import com.openai.models.responses.ResponseReasoningSummaryPartAddedEvent
4646
import com.openai.models.responses.ResponseReasoningSummaryPartDoneEvent
4747
import com.openai.models.responses.ResponseReasoningSummaryTextDeltaEvent
4848
import com.openai.models.responses.ResponseReasoningSummaryTextDoneEvent
49+
import com.openai.models.responses.ResponseReasoningTextDeltaEvent
50+
import com.openai.models.responses.ResponseReasoningTextDoneEvent
4951
import com.openai.models.responses.ResponseRefusalDeltaEvent
5052
import com.openai.models.responses.ResponseRefusalDoneEvent
5153
import com.openai.models.responses.ResponseStreamEvent
@@ -137,6 +139,14 @@ class ResponseAccumulator private constructor() {
137139
// stored.
138140
}
139141

142+
override fun visitCustomToolCallInputDelta(
143+
customToolCallInputDelta: ResponseCustomToolCallInputDeltaEvent
144+
) {}
145+
146+
override fun visitCustomToolCallInputDone(
147+
customToolCallInputDone: ResponseCustomToolCallInputDoneEvent
148+
) {}
149+
140150
override fun visitFailed(failed: ResponseFailedEvent) {
141151
// TODO: Confirm that this is a "terminal" event and will occur _instead of_
142152
// `ResponseCompletedEvent` or `ResponseIncompleteEvent`.
@@ -234,6 +244,14 @@ class ResponseAccumulator private constructor() {
234244
reasoningSummaryTextDone: ResponseReasoningSummaryTextDoneEvent
235245
) {}
236246

247+
override fun visitReasoningTextDelta(
248+
reasoningTextDelta: ResponseReasoningTextDeltaEvent
249+
) {}
250+
251+
override fun visitReasoningTextDone(
252+
reasoningTextDone: ResponseReasoningTextDoneEvent
253+
) {}
254+
237255
override fun visitRefusalDelta(refusalDelta: ResponseRefusalDeltaEvent) {}
238256

239257
override fun visitRefusalDone(refusalDone: ResponseRefusalDoneEvent) {}
@@ -303,14 +321,6 @@ class ResponseAccumulator private constructor() {
303321
override fun visitOutputTextAnnotationAdded(
304322
outputTextAnnotationAdded: ResponseOutputTextAnnotationAddedEvent
305323
) {}
306-
307-
override fun visitReasoningSummaryDelta(
308-
reasoningSummaryDelta: ResponseReasoningSummaryDeltaEvent
309-
) {}
310-
311-
override fun visitReasoningSummaryDone(
312-
reasoningSummaryDone: ResponseReasoningSummaryDoneEvent
313-
) {}
314324
}
315325
)
316326

openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField<St
2020

2121
companion object {
2222

23+
@JvmField val GPT_5 = of("gpt-5")
24+
25+
@JvmField val GPT_5_MINI = of("gpt-5-mini")
26+
27+
@JvmField val GPT_5_NANO = of("gpt-5-nano")
28+
29+
@JvmField val GPT_5_2025_08_07 = of("gpt-5-2025-08-07")
30+
31+
@JvmField val GPT_5_MINI_2025_08_07 = of("gpt-5-mini-2025-08-07")
32+
33+
@JvmField val GPT_5_NANO_2025_08_07 = of("gpt-5-nano-2025-08-07")
34+
35+
@JvmField val GPT_5_CHAT_LATEST = of("gpt-5-chat-latest")
36+
2337
@JvmField val GPT_4_1 = of("gpt-4.1")
2438

2539
@JvmField val GPT_4_1_MINI = of("gpt-4.1-mini")
@@ -137,6 +151,13 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField<St
137151

138152
/** An enum containing [ChatModel]'s known values. */
139153
enum class Known {
154+
GPT_5,
155+
GPT_5_MINI,
156+
GPT_5_NANO,
157+
GPT_5_2025_08_07,
158+
GPT_5_MINI_2025_08_07,
159+
GPT_5_NANO_2025_08_07,
160+
GPT_5_CHAT_LATEST,
140161
GPT_4_1,
141162
GPT_4_1_MINI,
142163
GPT_4_1_NANO,
@@ -204,6 +225,13 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField<St
204225
* - It was constructed with an arbitrary value using the [of] method.
205226
*/
206227
enum class Value {
228+
GPT_5,
229+
GPT_5_MINI,
230+
GPT_5_NANO,
231+
GPT_5_2025_08_07,
232+
GPT_5_MINI_2025_08_07,
233+
GPT_5_NANO_2025_08_07,
234+
GPT_5_CHAT_LATEST,
207235
GPT_4_1,
208236
GPT_4_1_MINI,
209237
GPT_4_1_NANO,
@@ -272,6 +300,13 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField<St
272300
*/
273301
fun value(): Value =
274302
when (this) {
303+
GPT_5 -> Value.GPT_5
304+
GPT_5_MINI -> Value.GPT_5_MINI
305+
GPT_5_NANO -> Value.GPT_5_NANO
306+
GPT_5_2025_08_07 -> Value.GPT_5_2025_08_07
307+
GPT_5_MINI_2025_08_07 -> Value.GPT_5_MINI_2025_08_07
308+
GPT_5_NANO_2025_08_07 -> Value.GPT_5_NANO_2025_08_07
309+
GPT_5_CHAT_LATEST -> Value.GPT_5_CHAT_LATEST
275310
GPT_4_1 -> Value.GPT_4_1
276311
GPT_4_1_MINI -> Value.GPT_4_1_MINI
277312
GPT_4_1_NANO -> Value.GPT_4_1_NANO
@@ -340,6 +375,13 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField<St
340375
*/
341376
fun known(): Known =
342377
when (this) {
378+
GPT_5 -> Known.GPT_5
379+
GPT_5_MINI -> Known.GPT_5_MINI
380+
GPT_5_NANO -> Known.GPT_5_NANO
381+
GPT_5_2025_08_07 -> Known.GPT_5_2025_08_07
382+
GPT_5_MINI_2025_08_07 -> Known.GPT_5_MINI_2025_08_07
383+
GPT_5_NANO_2025_08_07 -> Known.GPT_5_NANO_2025_08_07
384+
GPT_5_CHAT_LATEST -> Known.GPT_5_CHAT_LATEST
343385
GPT_4_1 -> Known.GPT_4_1
344386
GPT_4_1_MINI -> Known.GPT_4_1_MINI
345387
GPT_4_1_NANO -> Known.GPT_4_1_NANO

0 commit comments

Comments
 (0)